version 0.3.23
[fms.git] / src / http / pages / browsemessagespage.cpp
diff --git a/src/http/pages/browsemessagespage.cpp b/src/http/pages/browsemessagespage.cpp
new file mode 100644 (file)
index 0000000..9601064
--- /dev/null
@@ -0,0 +1,265 @@
+#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,"")+"\">&lt;--</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,"")+"\">--&gt;</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+=",&nbsp;";\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