96010643872a8e96e7c3b9a2865114f72ee589f5
[fms.git] / src / http / pages / browsemessagespage.cpp
1 #include "../../../include/http/pages/browsemessagespage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 #include "../../../include/global.h"\r
4 #include "../../../include/messagethread.h"\r
5 \r
6 #ifdef XMEM\r
7         #include <xmem.h>\r
8 #endif\r
9 \r
10 const std::string BrowseMessagesPage::BuildQueryString(const long startrow, const std::string &boardidstr, const std::string &messageidstr)\r
11 {\r
12         std::string returnval="";\r
13         std::string tempval="";\r
14 \r
15         if(startrow>=0)\r
16         {\r
17                 StringFunctions::Convert(startrow,tempval);\r
18                 returnval+="startrow="+tempval;\r
19         }\r
20 \r
21         if(boardidstr!="")\r
22         {\r
23                 if(returnval!="")\r
24                 {\r
25                         returnval+="&";\r
26                 }\r
27                 returnval+="boardid="+boardidstr;\r
28         }\r
29 \r
30         if(messageidstr!="")\r
31         {\r
32                 if(returnval!="")\r
33                 {\r
34                         returnval+="&";\r
35                 }       \r
36                 returnval+="messageid="+messageidstr;\r
37         }\r
38 \r
39         return returnval;\r
40 \r
41 }\r
42 \r
43 const std::string BrowseMessagesPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
44 {\r
45         std::string content="";\r
46         long boardid=-1;\r
47         std::string boardidstr="";\r
48         std::string messageidstr="";\r
49         int startrow=0;\r
50         std::string startrowstr="0";\r
51         int rowsperpage=50;\r
52         std::string rowsperpagestr="51";        // one more than rowsperpage so we can know if there are more messages\r
53         std::string sql="";\r
54         int rowcount=0;\r
55         int page=0;\r
56 \r
57         // if startrow is specified\r
58         if(queryvars.find("startrow")!=queryvars.end())\r
59         {\r
60                 startrowstr=(*queryvars.find("startrow")).second;\r
61                 // convert back and forth, just in case a number wasn't passed in startrow\r
62                 StringFunctions::Convert(startrowstr,startrow);\r
63                 if(startrow<0)\r
64                 {\r
65                         startrow=0;\r
66                 }\r
67                 StringFunctions::Convert(startrow,startrowstr);\r
68         }\r
69         if(queryvars.find("boardid")!=queryvars.end())\r
70         {\r
71                 boardidstr=(*queryvars.find("boardid")).second;\r
72                 StringFunctions::Convert(boardidstr,boardid);\r
73         }\r
74         if(queryvars.find("messageid")!=queryvars.end())\r
75         {\r
76                 messageidstr=(*queryvars.find("messageid")).second;\r
77                 page=1;\r
78         }\r
79 \r
80         if(page==0)\r
81         {\r
82                 sql="SELECT Subject, FromName, MessageDate || ' ' || MessageTime, Body, tblMessage.MessageID ";\r
83                 sql+="FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID ";\r
84                 if(boardidstr!="")\r
85                 {\r
86                         sql+="WHERE tblMessageBoard.BoardID=? ";\r
87                 }\r
88                 sql+="ORDER BY MessageDate || ' ' || MessageTime DESC ";\r
89                 sql+="LIMIT "+startrowstr+","+rowsperpagestr+";";\r
90 \r
91                 SQLite3DB::Statement st=m_db->Prepare(sql);\r
92                 if(boardidstr!="")\r
93                 {\r
94                         st.Bind(0,boardidstr);\r
95                 }\r
96                 st.Step();\r
97 \r
98                 content+="<table class=\"small90\">";\r
99                 content+="<tr><th>Subject</th><th>From</th><th>Date</th></tr>";\r
100 \r
101                 rowcount=0;\r
102                 while(st.RowReturned() && rowcount++<rowsperpage)\r
103                 {\r
104                         std::string subject="";\r
105                         std::string fromname="";\r
106                         std::string messagedate="";\r
107                         std::string body="";\r
108                         std::string messageidstr="";\r
109 \r
110                         st.ResultText(0,subject);\r
111                         st.ResultText(1,fromname);\r
112                         st.ResultText(2,messagedate);\r
113                         st.ResultText(3,body);\r
114                         st.ResultText(4,messageidstr);\r
115 \r
116                         if(body.size()>400)\r
117                         {\r
118                                 body.erase(400);\r
119                                 body+="...";\r
120                         }\r
121 \r
122                         content+="<tr>";\r
123                         content+="<td title=\""+StringFunctions::Replace(SanitizeOutput(body),"\n","\r\n")+"\"><a href=\""+m_pagename+"?"+BuildQueryString(startrow,boardidstr,messageidstr)+"\">"+SanitizeOutput(subject)+"</a></td>";\r
124                         content+="<td>"+fromname+"</td>";\r
125                         content+="<td>"+SanitizeOutput(messagedate)+"</td>";\r
126                         content+="</tr>\r\n";\r
127 \r
128                         st.Step();\r
129                 }\r
130                 \r
131                 if(startrow>0 || st.RowReturned())\r
132                 {\r
133                         content+="<tr>";\r
134 \r
135                         if(startrow>0)\r
136                         {\r
137                                 int thisstartrow=startrow-rowsperpage;\r
138                                 if(thisstartrow<0)\r
139                                 {\r
140                                         thisstartrow=0;\r
141                                 }\r
142                                 content+="<td><a href=\""+m_pagename+"?"+BuildQueryString(thisstartrow,boardidstr,"")+"\">&lt;--</a></td>";\r
143                         }\r
144                         else\r
145                         {\r
146                                 content+="<td></td>";\r
147                         }\r
148 \r
149                         content+="<td></td>";\r
150 \r
151                         if(st.RowReturned())\r
152                         {\r
153                                 int thisstartrow=startrow+rowsperpage;\r
154                                 content+="<td><a href=\""+m_pagename+"?"+BuildQueryString(thisstartrow,boardidstr,"")+"\">--&gt;</a></td>";\r
155                         }\r
156                         content+="</tr>";\r
157                 }\r
158 \r
159                 content+="</table>";\r
160         }\r
161         else if(page==1)\r
162         {\r
163                 sql="SELECT Body, FromName, MessageDate || ' ' || MessageTime, Subject FROM tblMessage WHERE MessageID=?;";\r
164                 SQLite3DB::Statement st=m_db->Prepare(sql);\r
165                 st.Bind(0,messageidstr);\r
166 \r
167                 st.Step();\r
168                 if(st.RowReturned())\r
169                 {\r
170                         std::string body="";\r
171                         std::string fromname="";\r
172                         std::string messagedate="";\r
173                         std::string subject="";\r
174                         std::string boards="";\r
175 \r
176                         st.ResultText(0,body);\r
177                         st.ResultText(1,fromname);\r
178                         st.ResultText(2,messagedate);\r
179                         st.ResultText(3,subject);\r
180 \r
181                         // get boards message was posted to\r
182                         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
183                         st2.Bind(0,messageidstr);\r
184                         st2.Step();\r
185                         while(st2.RowReturned())\r
186                         {\r
187                                 std::string boardname="";\r
188                                 std::string innerboardidstr="";\r
189 \r
190                                 st2.ResultText(0,innerboardidstr);\r
191                                 st2.ResultText(1,boardname);\r
192                                 \r
193                                 if(boards!="")\r
194                                 {\r
195                                         boards+=",&nbsp;";\r
196                                 }\r
197 \r
198                                 boards+="<a href=\""+m_pagename+"?"+BuildQueryString(0,innerboardidstr,"")+"\">"+SanitizeOutput(boardname)+"</a>";\r
199 \r
200                                 st2.Step();\r
201                         }\r
202 \r
203                         content+="<div class=\"post\">";\r
204                         content+="<div class=\"postboards\">";\r
205                         content+=boards;\r
206                         content+="</div>";\r
207                         content+="<div class=\"postsubject\">";\r
208                         content+=SanitizeOutput(subject);\r
209                         content+="</div>";\r
210                         content+="<div class=\"postfrom\">";\r
211                         content+=SanitizeOutput(fromname);\r
212                         content+="</div>";\r
213                         content+="<div class=\"postdate\">";\r
214                         content+=SanitizeOutput(messagedate);\r
215                         content+="</div>";\r
216                         content+="<div class=\"postbody\">";\r
217                         content+=SanitizeOutput(body);\r
218                         content+="</div>";\r
219                         content+="</div>\r\n";\r
220 \r
221                         long currentlevel=0;\r
222                         MessageThread thread;\r
223                         thread.Load(messageidstr,boardid);\r
224 \r
225                         std::vector<MessageThread::threadnode> nodes=thread.GetNodes();\r
226                         if(nodes.size()>1)\r
227                         {\r
228                                 content+="<ul class=\"messagethread\">";\r
229                                 for(std::vector<MessageThread::threadnode>::const_iterator i=nodes.begin(); i!=nodes.end(); i++)\r
230                                 {\r
231                                         if((*i).m_level>currentlevel)\r
232                                         {\r
233                                                 content+="<ul class=\"messagethread\">";\r
234                                         }\r
235                                         else if((*i).m_level<currentlevel)\r
236                                         {\r
237                                                 content+="</ul>";\r
238                                         }\r
239                                         currentlevel=(*i).m_level;\r
240 \r
241                                         std::string tempstr="";\r
242                                         StringFunctions::Convert((*i).m_messageid,tempstr);\r
243 \r
244                                         content+="<li>";\r
245                                         if(tempstr!=messageidstr)\r
246                                         {\r
247                                                 content+="<a href=\""+m_pagename+"?"+BuildQueryString(0,boardidstr,tempstr)+"\">"+SanitizeOutput((*i).m_subject)+"</a> - "+SanitizeOutput((*i).m_fromname);\r
248                                         }\r
249                                         else\r
250                                         {\r
251                                                 content+=SanitizeOutput((*i).m_subject)+" - "+SanitizeOutput((*i).m_fromname);\r
252                                         }\r
253                                         content+="</li>\r\n";\r
254                                 }\r
255                                 while(currentlevel-->0)\r
256                                 {\r
257                                         content+="</ul>";\r
258                                 }\r
259                                 content+="</ul>\r\n";\r
260                         }\r
261                 }\r
262         }\r
263 \r
264         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
265 }\r