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