version 0.3.23
[fms.git] / src / http / pages / boardspage.cpp
1 #include "../../../include/http/pages/boardspage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 \r
4 #include <Poco/DateTime.h>\r
5 #include <Poco/DateTimeFormatter.h>\r
6 \r
7 #ifdef XMEM\r
8         #include <xmem.h>\r
9 #endif\r
10 \r
11 const std::string BoardsPage::BuildQueryString(const long startrow, const std::string &boardsearch)\r
12 {\r
13         std::string returnval="";\r
14         std::string tempval="";\r
15 \r
16         if(startrow>=0)\r
17         {\r
18                 StringFunctions::Convert(startrow,tempval);\r
19                 returnval+="startrow="+tempval;\r
20         }\r
21 \r
22         if(boardsearch!="")\r
23         {\r
24                 if(returnval!="")\r
25                 {\r
26                         returnval+="&";\r
27                 }\r
28                 returnval+="boardsearch="+boardsearch;\r
29         }\r
30 \r
31         return returnval;\r
32 \r
33 }\r
34 \r
35 const std::string BoardsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
36 {\r
37         int boardcount=0;\r
38         std::string content="";\r
39         int rownum=0;\r
40         int rowsperpage=25;\r
41         std::string rowsperpagestr="25";\r
42         int startrow=0;\r
43         std::string startrowstr="0";\r
44         std::string boardsearch="";\r
45         std::string sql="";\r
46         Poco::DateTime now;\r
47 \r
48         if(queryvars.find("formaction")!=queryvars.end())\r
49         {\r
50                 if((*queryvars.find("formaction")).second=="addboard" && queryvars.find("boardname")!=queryvars.end() && queryvars.find("boarddescription")!=queryvars.end() && ValidateFormPassword(queryvars))\r
51                 {\r
52                         std::string boardname="";\r
53                         std::string boarddescription="";\r
54 \r
55                         boardname=(*queryvars.find("boardname")).second;\r
56                         StringFunctions::LowerCase(boardname,boardname);\r
57                         boarddescription=(*queryvars.find("boarddescription")).second;\r
58 \r
59                         SQLite3DB::Statement addst=m_db->Prepare("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded,AddedMethod) VALUES(?,?,?,?);");\r
60                         addst.Bind(0,boardname);\r
61                         addst.Bind(1,boarddescription);\r
62                         addst.Bind(2,Poco::DateTimeFormatter::format(now,"%Y-%m-%d %H:%M:%S"));\r
63                         addst.Bind(3,"Added manually");\r
64                         addst.Step();\r
65                 }\r
66                 if((*queryvars.find("formaction")).second=="remove0messages" && ValidateFormPassword(queryvars))\r
67                 {\r
68                         m_db->Execute("DELETE FROM tblBoard WHERE BoardID IN (SELECT BoardID FROM vwBoardStats WHERE MessageCount=0 AND BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard));");\r
69                 }\r
70                 if((*queryvars.find("formaction")).second=="update" && ValidateFormPassword(queryvars))\r
71                 {\r
72                         int boardid;\r
73                         std::vector<std::string> boardids;\r
74                         std::vector<std::string> olddescriptions;\r
75                         std::vector<std::string> descriptions;\r
76                         std::vector<std::string> oldsavemessages;\r
77                         std::vector<std::string> savemessages;\r
78                         std::vector<std::string> oldforums;\r
79                         std::vector<std::string> forums;\r
80 \r
81                         CreateArgArray(queryvars,"boardid",boardids);\r
82                         CreateArgArray(queryvars,"oldboarddescription",olddescriptions);\r
83                         CreateArgArray(queryvars,"boarddescription",descriptions);\r
84                         CreateArgArray(queryvars,"oldsavereceivedmessages",oldsavemessages);\r
85                         CreateArgArray(queryvars,"savereceivedmessages",savemessages);\r
86                         CreateArgArray(queryvars,"oldforum",oldforums);\r
87                         CreateArgArray(queryvars,"forum",forums);\r
88 \r
89                         olddescriptions.resize(boardids.size(),"");\r
90                         descriptions.resize(boardids.size(),"");\r
91                         oldsavemessages.resize(boardids.size(),"");\r
92                         savemessages.resize(boardids.size(),"");\r
93                         oldforums.resize(boardids.size(),"");\r
94                         forums.resize(boardids.size(),"");\r
95 \r
96                         SQLite3DB::Statement updatest=m_db->Prepare("UPDATE tblBoard SET BoardDescription=?, SaveReceivedMessages=?, Forum=? WHERE BoardID=?;");\r
97                         \r
98                         for(int i=0; i<boardids.size(); i++)\r
99                         {\r
100                                 if(olddescriptions[i]!=descriptions[i] || oldsavemessages[i]!=savemessages[i] || oldforums[i]!=forums[i])\r
101                                 {\r
102                                         updatest.Bind(0,descriptions[i]);\r
103                                         if(savemessages[i]!="true")\r
104                                         {\r
105                                                 updatest.Bind(1,"false");\r
106                                         }\r
107                                         else\r
108                                         {\r
109                                                 updatest.Bind(1,"true");\r
110                                         }\r
111                                         if(forums[i]!="true")\r
112                                         {\r
113                                                 updatest.Bind(2,"false");\r
114                                         }\r
115                                         else\r
116                                         {\r
117                                                 updatest.Bind(2,"true");\r
118                                         }\r
119                                         boardid=0;\r
120                                         StringFunctions::Convert(boardids[i],boardid);\r
121                                         updatest.Bind(3,boardid);\r
122                                         updatest.Step();\r
123                                         updatest.Reset();\r
124                                 }\r
125                         }\r
126 \r
127                 }\r
128         }\r
129 \r
130         // if startrow is specified\r
131         if(queryvars.find("startrow")!=queryvars.end())\r
132         {\r
133                 startrowstr=(*queryvars.find("startrow")).second;\r
134                 // convert back and forth, just in case a number wasn't passed in startrow\r
135                 StringFunctions::Convert(startrowstr,startrow);\r
136                 if(startrow<0)\r
137                 {\r
138                         startrow=0;\r
139                 }\r
140                 StringFunctions::Convert(startrow,startrowstr);\r
141         }\r
142 \r
143         // if we are searching by name\r
144         if(queryvars.find("boardsearch")!=queryvars.end())\r
145         {\r
146                 boardsearch=(*queryvars.find("boardsearch")).second;\r
147         }\r
148 \r
149         content+="<h2>Boards</h2>";\r
150 \r
151         sql="SELECT COUNT(*) FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";\r
152         if(boardsearch!="")\r
153         {\r
154                 sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";\r
155         }\r
156         sql+=";";\r
157         SQLite3DB::Statement st=m_db->Prepare(sql);\r
158         if(boardsearch!="")\r
159         {\r
160                 st.Bind(0,boardsearch);\r
161                 st.Bind(1,boardsearch);\r
162         }\r
163         st.Step();\r
164         if(st.RowReturned())\r
165         {\r
166                 st.ResultInt(0,boardcount);\r
167         }\r
168         st.Finalize();\r
169 \r
170 \r
171         sql="SELECT BoardID,BoardName,BoardDescription,SaveReceivedMessages,AddedMethod,Forum FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";\r
172         if(boardsearch!="")\r
173         {\r
174                 sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";\r
175         }\r
176         sql+=" ORDER BY BoardName COLLATE NOCASE";\r
177         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
178 \r
179         st=m_db->Prepare(sql);\r
180         if(boardsearch!="")\r
181         {\r
182                 st.Bind(0,boardsearch);\r
183                 st.Bind(1,boardsearch);\r
184         }\r
185         st.Step();\r
186 \r
187         content+="<table class=\"small90\">";\r
188 \r
189         content+="<tr>";\r
190         content+="<td colspan=\"3\"><center>";\r
191         content+="<form name=\"frmboardsearch\" action=\"boards.htm\" method=\"POST\"><input type=\"text\" name=\"boardsearch\" value=\""+SanitizeOutput(boardsearch)+"\">"+CreateFormPassword()+"<input type=\"submit\" value=\"Search\"></form>";\r
192         content+="</center></td>";\r
193         content+="</tr>";\r
194 \r
195         content+="<tr>";\r
196         content+="<td colspan=\"3\"><center>";\r
197         content+="<form name=\"frmremoveboard\" action=\"boards.htm\" method=\"POST\">"+CreateFormPassword()+"<input type=\"hidden\" name=\"formaction\" value=\"remove0messages\">Remove boards with 0 messages<input type=\"submit\" value=\"Remove\"></form>";\r
198         content+="</center></td>";\r
199         content+="</tr>";\r
200 \r
201         content+="<tr>";\r
202         content+="<td><form name=\"frmaddboard\" method=\"POST\">"+CreateFormPassword()+"<input type=\"hidden\" name=\"formaction\" value=\"addboard\"><input type=\"text\" name=\"boardname\"></td><td><input type=\"text\" name=\"boarddescription\" size=\"40\" maxlength=\"50\"></td><td><input type=\"submit\" value=\"Add Board\"></form></td>";\r
203         content+="</tr>";\r
204 \r
205         content+="<tr><td colspan=\"4\"><hr><form name=\"frmboards\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"update\">"+CreateFormPassword()+"</td></tr>";\r
206         content+="<tr>";\r
207         content+="<th>Name</th><th>Description</th><th>Save Received Messages *</th><th>Forum</th><th>Added Method</th>";\r
208         content+="</tr>";       \r
209         while(st.RowReturned() && rownum<rowsperpage)\r
210         {\r
211                 std::string rownumstr="";\r
212                 std::string boardidstr="";\r
213                 std::string boardname="";\r
214                 std::string boarddescription="";\r
215                 std::string savereceivedmessages="";\r
216                 std::string addedmethod="";\r
217                 std::string forum="";\r
218 \r
219                 st.ResultText(0,boardidstr);\r
220                 st.ResultText(1,boardname);\r
221                 st.ResultText(2,boarddescription);\r
222                 st.ResultText(3,savereceivedmessages);\r
223                 st.ResultText(4,addedmethod);\r
224                 st.ResultText(5,forum);\r
225 \r
226                 StringFunctions::Convert(rownum,rownumstr);\r
227 \r
228                 content+="<tr>";\r
229                 content+="<td>"+SanitizeOutput(boardname)+"</td>";\r
230                 content+="<td><input type=\"hidden\" name=\"boardid["+rownumstr+"]\" value=\""+boardidstr+"\">";\r
231                 content+="<input type=\"hidden\" name=\"oldboarddescription["+rownumstr+"]\" value=\""+StringFunctions::Replace(SanitizeOutput(boarddescription),"&nbsp;"," ")+"\">";\r
232                 content+="<input type=\"text\" name=\"boarddescription["+rownumstr+"]\" value=\""+SanitizeOutput(boarddescription)+"\" size=\"40\" maxlength=\"50\"></td>";\r
233                 content+="<td>";\r
234                 content+="<input type=\"hidden\" name=\"oldsavereceivedmessages["+rownumstr+"]\" value=\""+savereceivedmessages+"\">";\r
235                 content+="<input type=\"checkbox\" name=\"savereceivedmessages["+rownumstr+"]\" value=\"true\"";\r
236                 if(savereceivedmessages=="true")\r
237                 {\r
238                         content+=" CHECKED";\r
239                 }\r
240                 content+=">";\r
241                 content+="</td>";\r
242                 content+="<td>";\r
243                 content+="<input type=\"hidden\" name=\"oldforum["+rownumstr+"]\" value=\""+forum+"\">";\r
244                 content+="<input type=\"checkbox\" name=\"forum["+rownumstr+"]\" value=\"true\"";\r
245                 if(forum=="true")\r
246                 {\r
247                         content+=" CHECKED";\r
248                 }\r
249                 content+=">";\r
250                 content+="</td>";\r
251                 content+="<td>"+SanitizeOutput(addedmethod)+"</td>";\r
252                 content+="</tr>\r\n";\r
253                 st.Step();\r
254                 rownum++;\r
255         }\r
256 \r
257         if(startrow>0 || startrow+rowsperpage<boardcount)\r
258         {\r
259                 std::string tempstr;\r
260                 int cols=0;\r
261 \r
262                 content+="<tr>";\r
263                 if(startrow>0)\r
264                 {\r
265                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
266                         content+="<td colspan=\"2\" style=\"text-align:left;\"><a href=\"boards.htm?"+BuildQueryString(startrow-rowsperpage,boardsearch)+"\"><-- Previous Page</a></td>";\r
267                         cols+=2;\r
268                 }\r
269                 if(startrow+rowsperpage<boardcount)\r
270                 {\r
271                         while(cols<4)\r
272                         {\r
273                                 content+="<td></td>";\r
274                                 cols++;\r
275                         }\r
276                         content+="<td colspan=\"1\" style=\"text-align:left;\"><a href=\"boards.htm?"+BuildQueryString(startrow+rowsperpage,boardsearch)+"\">Next Page --></a></td>";\r
277                 }\r
278                 content+="</tr>";\r
279         }\r
280 \r
281         content+="<tr>";\r
282         content+="<td colspan=\"4\"><center><input type=\"submit\" value=\"Update\"></center></form></td>";\r
283         content+="</tr>";\r
284         content+="</table>";\r
285         content+="<p class=\"paragraph\">";\r
286         content+="* If you uncheck this box, any new messages you download that are posted to this board will be discarded.  When multiple local identities are used, it is best not to discard messages from any boards, as identifying which identities are the same person is much easier when their message lists are missing messages from the same boards.";\r
287         content+="</p>";\r
288 \r
289         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
290 }\r
291 \r
292 const bool BoardsPage::WillHandleURI(const std::string &uri)\r
293 {\r
294         if(uri.find("boards.")!=std::string::npos)\r
295         {\r
296                 return true;\r
297         }\r
298         else\r
299         {\r
300                 return false;\r
301         }\r
302 }\r