0b69926bffc3baabe58a61f87fed81b72bd7a45d
[fms.git] / src / http / pages / forumviewthreadpage.cpp
1 #include "../../../include/http/pages/forumviewthreadpage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 \r
4 #ifdef XMEM\r
5         #include <xmem.h>\r
6 #endif\r
7 \r
8 const std::string ForumViewThreadPage::FixBody(const std::string &body)\r
9 {\r
10         static std::string whitespace=" \t\r\n";\r
11         std::string output=body;\r
12 \r
13         // put \n after 80 contiguous characters in the body\r
14         std::string::size_type prevpos=0;\r
15         std::string::size_type pos=output.find_first_of(whitespace);\r
16         while(pos!=std::string::npos)\r
17         {\r
18                 while(pos-prevpos>80)\r
19                 {\r
20                         output.insert(prevpos+80,"\n");\r
21                         prevpos+=81;    // 81 because of the extra newline we just inserted\r
22                 }\r
23                 prevpos=pos;\r
24                 pos=output.find_first_of(whitespace,pos+1);\r
25         }\r
26         while(output.size()-prevpos>80) // check the last line of the message (no whitespace after it)\r
27         {\r
28                 output.insert(prevpos+80,"\n");\r
29                 prevpos+=81;\r
30         }\r
31 \r
32         output=StringFunctions::Replace(output,"<","&lt;");\r
33         output=StringFunctions::Replace(output,">","&gt;");\r
34         output=StringFunctions::Replace(output,"\n","<br />");\r
35         return output;\r
36 }\r
37 \r
38 const std::string ForumViewThreadPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
39 {\r
40         std::string content="";\r
41         std::string threadidstr="";\r
42         std::string boardidstr="";\r
43         std::string currentpagestr="";\r
44         std::string boardname="";\r
45 \r
46         if(queryvars.find("threadid")!=queryvars.end())\r
47         {\r
48                 threadidstr=(*queryvars.find("threadid")).second;\r
49         }\r
50         if(queryvars.find("currentpage")!=queryvars.end())\r
51         {\r
52                 currentpagestr=(*queryvars.find("currentpage")).second;\r
53         }\r
54         if(queryvars.find("boardid")!=queryvars.end())\r
55         {\r
56                 boardidstr=(*queryvars.find("boardid")).second;\r
57         }\r
58 \r
59         content+=CreateForumHeader();\r
60 \r
61         SQLite3DB::Statement updateread=m_db->Prepare("UPDATE tblMessage SET Read=1 WHERE tblMessage.MessageID IN (SELECT MessageID FROM tblThreadPost WHERE ThreadID=?);");\r
62         updateread.Bind(0,threadidstr);\r
63         updateread.Step();\r
64 \r
65         SQLite3DB::Statement trustst=m_db->Prepare("SELECT LocalMessageTrust, LocalTrustListTrust, PeerMessageTrust, PeerTrustListTrust, Name FROM tblIdentity WHERE IdentityID=?;");\r
66 \r
67         SQLite3DB::Statement boardnamest=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblThread ON tblBoard.BoardID=tblThread.BoardID WHERE tblThread.ThreadID=?;");\r
68         boardnamest.Bind(0,threadidstr);\r
69         boardnamest.Step();\r
70 \r
71         if(boardnamest.RowReturned())\r
72         {\r
73                 boardnamest.ResultText(0,boardname);\r
74         }\r
75 \r
76         content+="<table class=\"forumheader\">";\r
77         content+="<tr>";\r
78         content+="<td> Forum : <a href=\"forumthreads.htm?boardid="+boardidstr+"&currentpage="+currentpagestr+"\">"+SanitizeOutput(boardname)+"</a></td>";\r
79         content+="</tr>";\r
80         content+="</table>\r\n";\r
81 \r
82         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
83         st.Bind(0,threadidstr);\r
84 \r
85         content+="<table class=\"thread\">";\r
86         st.Step();\r
87         while(st.RowReturned())\r
88         {\r
89                 std::string messageidstr="";\r
90                 std::string identityidstr="";\r
91                 std::string fromname="";\r
92                 std::string subject="";\r
93                 std::string datetime="";\r
94                 std::string body="";\r
95                 \r
96                 st.ResultText(0,messageidstr);\r
97                 st.ResultText(1,identityidstr);\r
98                 st.ResultText(2,fromname);\r
99                 st.ResultText(3,subject);\r
100                 st.ResultText(4,datetime);\r
101                 st.ResultText(5,body);\r
102 \r
103                 content+="<tr>";\r
104                 content+="<td rowspan=\"2\" class=\"from\">";\r
105                 content+="<a name=\""+messageidstr+"\"></a>";\r
106                 content+="<a href=\"peerdetails.htm?identityid="+identityidstr+"\">"+FixFromName(fromname)+"</a><br />";\r
107 \r
108                 trustst.Bind(0,identityidstr);\r
109                 trustst.Step();\r
110                 if(trustst.RowReturned())\r
111                 {\r
112                         std::string localmessagetrust="";\r
113                         std::string localtrustlisttrust="";\r
114                         std::string peermessagetrust="";\r
115                         std::string peertrustlisttrust="";\r
116                         std::string name="";\r
117 \r
118                         trustst.ResultText(0,localmessagetrust);\r
119                         trustst.ResultText(1,localtrustlisttrust);\r
120                         trustst.ResultText(2,peermessagetrust);\r
121                         trustst.ResultText(3,peertrustlisttrust);\r
122                         trustst.ResultText(4,name);\r
123 \r
124                         content+="<table class=\"trust\">";\r
125                         content+="<tr>";\r
126                         content+="<td colspan=\"3\" style=\"text-align:center;\"><a href=\"peertrust.htm?namesearch="+name+"\">Trust</a></td>";\r
127                         content+="</tr>";\r
128                         content+="<tr>";\r
129                         content+="<td></td><td>Local</td><td>Peer</td>";\r
130                         content+="</tr>";\r
131                         content+="<tr>";\r
132                         content+="<td>Message</td><td>"+localmessagetrust+"</td><td>"+peermessagetrust+"</td>";\r
133                         content+="</tr>";\r
134                         content+="<tr>";\r
135                         content+="<td>Trust List</td><td>"+localtrustlisttrust+"</td><td>"+peertrustlisttrust+"</td>";\r
136                         content+="</tr>";\r
137                         content+="</table>";\r
138                 }\r
139 \r
140                 content+="</td>";\r
141                 content+="<td class=\"subject\">";\r
142                 content+=SanitizeOutput(subject)+" on "+datetime;\r
143                 content+="</td>";\r
144                 content+="<td><a href=\"forumcreatepost.htm?replytomessageid="+messageidstr+"&threadid="+threadidstr+"&boardid="+boardidstr+"&currentpage="+currentpagestr+"\">Reply</a></td>";\r
145                 content+="</tr>\r\n";\r
146                 content+="<tr>";\r
147                 content+="<td class=\"body\" colspan=\"2\">";\r
148                 content+=FixBody(body);\r
149                 content+="</td>";\r
150                 content+="</tr>";\r
151                 trustst.Reset();\r
152 \r
153                 st.Step();\r
154         }\r
155         content+="</table>";\r
156 \r
157         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
158 }\r