--- /dev/null
+#include "../../../include/http/pages/browsemessagespage.h"\r
+#include "../../../include/stringfunctions.h"\r
+#include "../../../include/global.h"\r
+#include "../../../include/messagethread.h"\r
+\r
+#ifdef XMEM\r
+ #include <xmem.h>\r
+#endif\r
+\r
+const std::string BrowseMessagesPage::BuildQueryString(const long startrow, const std::string &boardidstr, const std::string &messageidstr)\r
+{\r
+ std::string returnval="";\r
+ std::string tempval="";\r
+\r
+ if(startrow>=0)\r
+ {\r
+ StringFunctions::Convert(startrow,tempval);\r
+ returnval+="startrow="+tempval;\r
+ }\r
+\r
+ if(boardidstr!="")\r
+ {\r
+ if(returnval!="")\r
+ {\r
+ returnval+="&";\r
+ }\r
+ returnval+="boardid="+boardidstr;\r
+ }\r
+\r
+ if(messageidstr!="")\r
+ {\r
+ if(returnval!="")\r
+ {\r
+ returnval+="&";\r
+ } \r
+ returnval+="messageid="+messageidstr;\r
+ }\r
+\r
+ return returnval;\r
+\r
+}\r
+\r
+const std::string BrowseMessagesPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
+{\r
+ std::string content="";\r
+ long boardid=-1;\r
+ std::string boardidstr="";\r
+ std::string messageidstr="";\r
+ int startrow=0;\r
+ std::string startrowstr="0";\r
+ int rowsperpage=50;\r
+ std::string rowsperpagestr="51"; // one more than rowsperpage so we can know if there are more messages\r
+ std::string sql="";\r
+ int rowcount=0;\r
+ int page=0;\r
+\r
+ // if startrow is specified\r
+ if(queryvars.find("startrow")!=queryvars.end())\r
+ {\r
+ startrowstr=(*queryvars.find("startrow")).second;\r
+ // convert back and forth, just in case a number wasn't passed in startrow\r
+ StringFunctions::Convert(startrowstr,startrow);\r
+ if(startrow<0)\r
+ {\r
+ startrow=0;\r
+ }\r
+ StringFunctions::Convert(startrow,startrowstr);\r
+ }\r
+ if(queryvars.find("boardid")!=queryvars.end())\r
+ {\r
+ boardidstr=(*queryvars.find("boardid")).second;\r
+ StringFunctions::Convert(boardidstr,boardid);\r
+ }\r
+ if(queryvars.find("messageid")!=queryvars.end())\r
+ {\r
+ messageidstr=(*queryvars.find("messageid")).second;\r
+ page=1;\r
+ }\r
+\r
+ if(page==0)\r
+ {\r
+ sql="SELECT Subject, FromName, MessageDate || ' ' || MessageTime, Body, tblMessage.MessageID ";\r
+ sql+="FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID ";\r
+ if(boardidstr!="")\r
+ {\r
+ sql+="WHERE tblMessageBoard.BoardID=? ";\r
+ }\r
+ sql+="ORDER BY MessageDate || ' ' || MessageTime DESC ";\r
+ sql+="LIMIT "+startrowstr+","+rowsperpagestr+";";\r
+\r
+ SQLite3DB::Statement st=m_db->Prepare(sql);\r
+ if(boardidstr!="")\r
+ {\r
+ st.Bind(0,boardidstr);\r
+ }\r
+ st.Step();\r
+\r
+ content+="<table class=\"small90\">";\r
+ content+="<tr><th>Subject</th><th>From</th><th>Date</th></tr>";\r
+\r
+ rowcount=0;\r
+ while(st.RowReturned() && rowcount++<rowsperpage)\r
+ {\r
+ std::string subject="";\r
+ std::string fromname="";\r
+ std::string messagedate="";\r
+ std::string body="";\r
+ std::string messageidstr="";\r
+\r
+ st.ResultText(0,subject);\r
+ st.ResultText(1,fromname);\r
+ st.ResultText(2,messagedate);\r
+ st.ResultText(3,body);\r
+ st.ResultText(4,messageidstr);\r
+\r
+ if(body.size()>400)\r
+ {\r
+ body.erase(400);\r
+ body+="...";\r
+ }\r
+\r
+ content+="<tr>";\r
+ content+="<td title=\""+StringFunctions::Replace(SanitizeOutput(body),"\n","\r\n")+"\"><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardidstr,messageidstr)+"\">"+SanitizeOutput(subject)+"</a></td>";\r
+ content+="<td>"+fromname+"</td>";\r
+ content+="<td>"+SanitizeOutput(messagedate)+"</td>";\r
+ content+="</tr>\r\n";\r
+\r
+ st.Step();\r
+ }\r
+ \r
+ if(startrow>0 || st.RowReturned())\r
+ {\r
+ content+="<tr>";\r
+\r
+ if(startrow>0)\r
+ {\r
+ int thisstartrow=startrow-rowsperpage;\r
+ if(thisstartrow<0)\r
+ {\r
+ thisstartrow=0;\r
+ }\r
+ content+="<td><a href=\""+m_pagename+"?"+BuildQueryString(thisstartrow,boardidstr,"")+"\"><--</a></td>";\r
+ }\r
+ else\r
+ {\r
+ content+="<td></td>";\r
+ }\r
+\r
+ content+="<td></td>";\r
+\r
+ if(st.RowReturned())\r
+ {\r
+ int thisstartrow=startrow+rowsperpage;\r
+ content+="<td><a href=\""+m_pagename+"?"+BuildQueryString(thisstartrow,boardidstr,"")+"\">--></a></td>";\r
+ }\r
+ content+="</tr>";\r
+ }\r
+\r
+ content+="</table>";\r
+ }\r
+ else if(page==1)\r
+ {\r
+ sql="SELECT Body, FromName, MessageDate || ' ' || MessageTime, Subject FROM tblMessage WHERE MessageID=?;";\r
+ SQLite3DB::Statement st=m_db->Prepare(sql);\r
+ st.Bind(0,messageidstr);\r
+\r
+ st.Step();\r
+ if(st.RowReturned())\r
+ {\r
+ std::string body="";\r
+ std::string fromname="";\r
+ std::string messagedate="";\r
+ std::string subject="";\r
+ std::string boards="";\r
+\r
+ st.ResultText(0,body);\r
+ st.ResultText(1,fromname);\r
+ st.ResultText(2,messagedate);\r
+ st.ResultText(3,subject);\r
+\r
+ // get boards message was posted to\r
+ SQLite3DB::Statement st2=m_db->Prepare("SELECT tblBoard.BoardID, tblBoard.BoardName FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblMessageBoard.MessageID=?;");\r
+ st2.Bind(0,messageidstr);\r
+ st2.Step();\r
+ while(st2.RowReturned())\r
+ {\r
+ std::string boardname="";\r
+ std::string innerboardidstr="";\r
+\r
+ st2.ResultText(0,innerboardidstr);\r
+ st2.ResultText(1,boardname);\r
+ \r
+ if(boards!="")\r
+ {\r
+ boards+=", ";\r
+ }\r
+\r
+ boards+="<a href=\""+m_pagename+"?"+BuildQueryString(0,innerboardidstr,"")+"\">"+SanitizeOutput(boardname)+"</a>";\r
+\r
+ st2.Step();\r
+ }\r
+\r
+ content+="<div class=\"post\">";\r
+ content+="<div class=\"postboards\">";\r
+ content+=boards;\r
+ content+="</div>";\r
+ content+="<div class=\"postsubject\">";\r
+ content+=SanitizeOutput(subject);\r
+ content+="</div>";\r
+ content+="<div class=\"postfrom\">";\r
+ content+=SanitizeOutput(fromname);\r
+ content+="</div>";\r
+ content+="<div class=\"postdate\">";\r
+ content+=SanitizeOutput(messagedate);\r
+ content+="</div>";\r
+ content+="<div class=\"postbody\">";\r
+ content+=SanitizeOutput(body);\r
+ content+="</div>";\r
+ content+="</div>\r\n";\r
+\r
+ long currentlevel=0;\r
+ MessageThread thread;\r
+ thread.Load(messageidstr,boardid);\r
+\r
+ std::vector<MessageThread::threadnode> nodes=thread.GetNodes();\r
+ if(nodes.size()>1)\r
+ {\r
+ content+="<ul class=\"messagethread\">";\r
+ for(std::vector<MessageThread::threadnode>::const_iterator i=nodes.begin(); i!=nodes.end(); i++)\r
+ {\r
+ if((*i).m_level>currentlevel)\r
+ {\r
+ content+="<ul class=\"messagethread\">";\r
+ }\r
+ else if((*i).m_level<currentlevel)\r
+ {\r
+ content+="</ul>";\r
+ }\r
+ currentlevel=(*i).m_level;\r
+\r
+ std::string tempstr="";\r
+ StringFunctions::Convert((*i).m_messageid,tempstr);\r
+\r
+ content+="<li>";\r
+ if(tempstr!=messageidstr)\r
+ {\r
+ content+="<a href=\""+m_pagename+"?"+BuildQueryString(0,boardidstr,tempstr)+"\">"+SanitizeOutput((*i).m_subject)+"</a> - "+SanitizeOutput((*i).m_fromname);\r
+ }\r
+ else\r
+ {\r
+ content+=SanitizeOutput((*i).m_subject)+" - "+SanitizeOutput((*i).m_fromname);\r
+ }\r
+ content+="</li>\r\n";\r
+ }\r
+ while(currentlevel-->0)\r
+ {\r
+ content+="</ul>";\r
+ }\r
+ content+="</ul>\r\n";\r
+ }\r
+ }\r
+ }\r
+\r
+ return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r