version 0.3.23
[fms.git] / src / http / pages / forumviewthreadpage.cpp
diff --git a/src/http/pages/forumviewthreadpage.cpp b/src/http/pages/forumviewthreadpage.cpp
new file mode 100644 (file)
index 0000000..0b69926
--- /dev/null
@@ -0,0 +1,158 @@
+#include "../../../include/http/pages/forumviewthreadpage.h"\r
+#include "../../../include/stringfunctions.h"\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+const std::string ForumViewThreadPage::FixBody(const std::string &body)\r
+{\r
+       static std::string whitespace=" \t\r\n";\r
+       std::string output=body;\r
+\r
+       // put \n after 80 contiguous characters in the body\r
+       std::string::size_type prevpos=0;\r
+       std::string::size_type pos=output.find_first_of(whitespace);\r
+       while(pos!=std::string::npos)\r
+       {\r
+               while(pos-prevpos>80)\r
+               {\r
+                       output.insert(prevpos+80,"\n");\r
+                       prevpos+=81;    // 81 because of the extra newline we just inserted\r
+               }\r
+               prevpos=pos;\r
+               pos=output.find_first_of(whitespace,pos+1);\r
+       }\r
+       while(output.size()-prevpos>80) // check the last line of the message (no whitespace after it)\r
+       {\r
+               output.insert(prevpos+80,"\n");\r
+               prevpos+=81;\r
+       }\r
+\r
+       output=StringFunctions::Replace(output,"<","&lt;");\r
+       output=StringFunctions::Replace(output,">","&gt;");\r
+       output=StringFunctions::Replace(output,"\n","<br />");\r
+       return output;\r
+}\r
+\r
+const std::string ForumViewThreadPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
+{\r
+       std::string content="";\r
+       std::string threadidstr="";\r
+       std::string boardidstr="";\r
+       std::string currentpagestr="";\r
+       std::string boardname="";\r
+\r
+       if(queryvars.find("threadid")!=queryvars.end())\r
+       {\r
+               threadidstr=(*queryvars.find("threadid")).second;\r
+       }\r
+       if(queryvars.find("currentpage")!=queryvars.end())\r
+       {\r
+               currentpagestr=(*queryvars.find("currentpage")).second;\r
+       }\r
+       if(queryvars.find("boardid")!=queryvars.end())\r
+       {\r
+               boardidstr=(*queryvars.find("boardid")).second;\r
+       }\r
+\r
+       content+=CreateForumHeader();\r
+\r
+       SQLite3DB::Statement updateread=m_db->Prepare("UPDATE tblMessage SET Read=1 WHERE tblMessage.MessageID IN (SELECT MessageID FROM tblThreadPost WHERE ThreadID=?);");\r
+       updateread.Bind(0,threadidstr);\r
+       updateread.Step();\r
+\r
+       SQLite3DB::Statement trustst=m_db->Prepare("SELECT LocalMessageTrust, LocalTrustListTrust, PeerMessageTrust, PeerTrustListTrust, Name FROM tblIdentity WHERE IdentityID=?;");\r
+\r
+       SQLite3DB::Statement boardnamest=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblThread ON tblBoard.BoardID=tblThread.BoardID WHERE tblThread.ThreadID=?;");\r
+       boardnamest.Bind(0,threadidstr);\r
+       boardnamest.Step();\r
+\r
+       if(boardnamest.RowReturned())\r
+       {\r
+               boardnamest.ResultText(0,boardname);\r
+       }\r
+\r
+       content+="<table class=\"forumheader\">";\r
+       content+="<tr>";\r
+       content+="<td> Forum : <a href=\"forumthreads.htm?boardid="+boardidstr+"&currentpage="+currentpagestr+"\">"+SanitizeOutput(boardname)+"</a></td>";\r
+       content+="</tr>";\r
+       content+="</table>\r\n";\r
+\r
+       SQLite3DB::Statement st=m_db->Prepare("SELECT tblMessage.MessageID, tblMessage.IdentityID, tblMessage.FromName, tblMessage.Subject, tblMessage.MessageDate || ' ' || tblMessage.MessageTime, tblMessage.Body FROM tblMessage INNER JOIN tblThreadPost ON tblMessage.MessageID=tblThreadPost.MessageID WHERE tblThreadPost.ThreadID=? ORDER BY tblThreadPost.PostOrder;");\r
+       st.Bind(0,threadidstr);\r
+\r
+       content+="<table class=\"thread\">";\r
+       st.Step();\r
+       while(st.RowReturned())\r
+       {\r
+               std::string messageidstr="";\r
+               std::string identityidstr="";\r
+               std::string fromname="";\r
+               std::string subject="";\r
+               std::string datetime="";\r
+               std::string body="";\r
+               \r
+               st.ResultText(0,messageidstr);\r
+               st.ResultText(1,identityidstr);\r
+               st.ResultText(2,fromname);\r
+               st.ResultText(3,subject);\r
+               st.ResultText(4,datetime);\r
+               st.ResultText(5,body);\r
+\r
+               content+="<tr>";\r
+               content+="<td rowspan=\"2\" class=\"from\">";\r
+               content+="<a name=\""+messageidstr+"\"></a>";\r
+               content+="<a href=\"peerdetails.htm?identityid="+identityidstr+"\">"+FixFromName(fromname)+"</a><br />";\r
+\r
+               trustst.Bind(0,identityidstr);\r
+               trustst.Step();\r
+               if(trustst.RowReturned())\r
+               {\r
+                       std::string localmessagetrust="";\r
+                       std::string localtrustlisttrust="";\r
+                       std::string peermessagetrust="";\r
+                       std::string peertrustlisttrust="";\r
+                       std::string name="";\r
+\r
+                       trustst.ResultText(0,localmessagetrust);\r
+                       trustst.ResultText(1,localtrustlisttrust);\r
+                       trustst.ResultText(2,peermessagetrust);\r
+                       trustst.ResultText(3,peertrustlisttrust);\r
+                       trustst.ResultText(4,name);\r
+\r
+                       content+="<table class=\"trust\">";\r
+                       content+="<tr>";\r
+                       content+="<td colspan=\"3\" style=\"text-align:center;\"><a href=\"peertrust.htm?namesearch="+name+"\">Trust</a></td>";\r
+                       content+="</tr>";\r
+                       content+="<tr>";\r
+                       content+="<td></td><td>Local</td><td>Peer</td>";\r
+                       content+="</tr>";\r
+                       content+="<tr>";\r
+                       content+="<td>Message</td><td>"+localmessagetrust+"</td><td>"+peermessagetrust+"</td>";\r
+                       content+="</tr>";\r
+                       content+="<tr>";\r
+                       content+="<td>Trust List</td><td>"+localtrustlisttrust+"</td><td>"+peertrustlisttrust+"</td>";\r
+                       content+="</tr>";\r
+                       content+="</table>";\r
+               }\r
+\r
+               content+="</td>";\r
+               content+="<td class=\"subject\">";\r
+               content+=SanitizeOutput(subject)+" on "+datetime;\r
+               content+="</td>";\r
+               content+="<td><a href=\"forumcreatepost.htm?replytomessageid="+messageidstr+"&threadid="+threadidstr+"&boardid="+boardidstr+"&currentpage="+currentpagestr+"\">Reply</a></td>";\r
+               content+="</tr>\r\n";\r
+               content+="<tr>";\r
+               content+="<td class=\"body\" colspan=\"2\">";\r
+               content+=FixBody(body);\r
+               content+="</td>";\r
+               content+="</tr>";\r
+               trustst.Reset();\r
+\r
+               st.Step();\r
+       }\r
+       content+="</table>";\r
+\r
+       return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r