43870cec605c50e6b56af4b06fd6c6d423e40a05
[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())\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")\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")\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 \r
79                         CreateArgArray(queryvars,"boardid",boardids);\r
80                         CreateArgArray(queryvars,"oldboarddescription",olddescriptions);\r
81                         CreateArgArray(queryvars,"boarddescription",descriptions);\r
82                         CreateArgArray(queryvars,"oldsavereceivedmessages",oldsavemessages);\r
83                         CreateArgArray(queryvars,"savereceivedmessages",savemessages);\r
84 \r
85                         olddescriptions.resize(boardids.size(),"");\r
86                         descriptions.resize(boardids.size(),"");\r
87                         oldsavemessages.resize(boardids.size(),"");\r
88                         savemessages.resize(boardids.size(),"");\r
89 \r
90                         SQLite3DB::Statement updatest=m_db->Prepare("UPDATE tblBoard SET BoardDescription=?, SaveReceivedMessages=? WHERE BoardID=?;");\r
91                         \r
92                         for(int i=0; i<boardids.size(); i++)\r
93                         {\r
94                                 if(olddescriptions[i]!=descriptions[i] || oldsavemessages[i]!=savemessages[i])\r
95                                 {\r
96                                         updatest.Bind(0,descriptions[i]);\r
97                                         if(savemessages[i]!="true")\r
98                                         {\r
99                                                 updatest.Bind(1,"false");\r
100                                         }\r
101                                         else\r
102                                         {\r
103                                                 updatest.Bind(1,"true");\r
104                                         }\r
105                                         boardid=0;\r
106                                         StringFunctions::Convert(boardids[i],boardid);\r
107                                         updatest.Bind(2,boardid);\r
108                                         updatest.Step();\r
109                                         updatest.Reset();\r
110                                 }\r
111                         }\r
112 \r
113                 }\r
114         }\r
115 \r
116         // if startrow is specified\r
117         if(queryvars.find("startrow")!=queryvars.end())\r
118         {\r
119                 startrowstr=(*queryvars.find("startrow")).second;\r
120                 // convert back and forth, just in case a number wasn't passed in startrow\r
121                 StringFunctions::Convert(startrowstr,startrow);\r
122                 if(startrow<0)\r
123                 {\r
124                         startrow=0;\r
125                 }\r
126                 StringFunctions::Convert(startrow,startrowstr);\r
127         }\r
128 \r
129         // if we are searching by name\r
130         if(queryvars.find("boardsearch")!=queryvars.end())\r
131         {\r
132                 boardsearch=(*queryvars.find("boardsearch")).second;\r
133         }\r
134 \r
135         content+="<h2>Boards</h2>";\r
136 \r
137         sql="SELECT COUNT(*) FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";\r
138         if(boardsearch!="")\r
139         {\r
140                 sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";\r
141         }\r
142         sql+=";";\r
143         SQLite3DB::Statement st=m_db->Prepare(sql);\r
144         if(boardsearch!="")\r
145         {\r
146                 st.Bind(0,boardsearch);\r
147                 st.Bind(1,boardsearch);\r
148         }\r
149         st.Step();\r
150         if(st.RowReturned())\r
151         {\r
152                 st.ResultInt(0,boardcount);\r
153         }\r
154         st.Finalize();\r
155 \r
156 \r
157         sql="SELECT BoardID,BoardName,BoardDescription,SaveReceivedMessages,AddedMethod FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";\r
158         if(boardsearch!="")\r
159         {\r
160                 sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";\r
161         }\r
162         sql+=" ORDER BY BoardName COLLATE NOCASE";\r
163         sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
164 \r
165         st=m_db->Prepare(sql);\r
166         if(boardsearch!="")\r
167         {\r
168                 st.Bind(0,boardsearch);\r
169                 st.Bind(1,boardsearch);\r
170         }\r
171         st.Step();\r
172 \r
173         content+="<table>";\r
174 \r
175         content+="<tr>";\r
176         content+="<td colspan=\"3\"><center>";\r
177         content+="<form name=\"frmboardsearch\" action=\"boards.htm\" method=\"POST\"><input type=\"text\" name=\"boardsearch\" value=\""+SanitizeOutput(boardsearch)+"\"><input type=\"submit\" value=\"Search\"></form>";\r
178         content+="</center></td>";\r
179         content+="</tr>";\r
180 \r
181         content+="<tr>";\r
182         content+="<td colspan=\"3\"><center>";\r
183         content+="<form name=\"frmremoveboard\" action=\"boards.htm\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"remove0messages\">Remove boards with 0 messages<input type=\"submit\" value=\"Remove\"></form>";\r
184         content+="</center></td>";\r
185         content+="</tr>";\r
186 \r
187         content+="<tr>";\r
188         content+="<td><form name=\"frmaddboard\" method=\"POST\"><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
189         content+="</tr>";\r
190 \r
191         content+="<tr><td colspan=\"4\"><hr><form name=\"frmboards\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"update\"></td></tr>";\r
192         content+="<tr>";\r
193         content+="<th>Name</th><th>Description</th><th>Save Received Messages *</th><th>Added Method</th>";\r
194         content+="</tr>";       \r
195         while(st.RowReturned() && rownum<rowsperpage)\r
196         {\r
197                 std::string rownumstr="";\r
198                 std::string boardidstr="";\r
199                 std::string boardname="";\r
200                 std::string boarddescription="";\r
201                 std::string savereceivedmessages="";\r
202                 std::string addedmethod="";\r
203 \r
204                 st.ResultText(0,boardidstr);\r
205                 st.ResultText(1,boardname);\r
206                 st.ResultText(2,boarddescription);\r
207                 st.ResultText(3,savereceivedmessages);\r
208                 st.ResultText(4,addedmethod);\r
209 \r
210                 StringFunctions::Convert(rownum,rownumstr);\r
211 \r
212                 content+="<tr>";\r
213                 content+="<td>"+SanitizeOutput(boardname)+"</td>";\r
214                 content+="<td><input type=\"hidden\" name=\"boardid["+rownumstr+"]\" value=\""+boardidstr+"\">";\r
215                 content+="<input type=\"hidden\" name=\"oldboarddescription["+rownumstr+"]\" value=\""+StringFunctions::Replace(SanitizeOutput(boarddescription),"&nbsp;"," ")+"\">";\r
216                 content+="<input type=\"text\" name=\"boarddescription["+rownumstr+"]\" value=\""+SanitizeOutput(boarddescription)+"\" size=\"40\" maxlength=\"50\"></td>";\r
217                 content+="<td>";\r
218                 content+="<input type=\"hidden\" name=\"oldsavereceivedmessages["+rownumstr+"]\" value=\""+savereceivedmessages+"\">";\r
219                 content+="<input type=\"checkbox\" name=\"savereceivedmessages["+rownumstr+"]\" value=\"true\"";\r
220                 if(savereceivedmessages=="true")\r
221                 {\r
222                         content+=" CHECKED";\r
223                 }\r
224                 content+=">";\r
225                 content+="</td>";\r
226                 content+="<td class=\"smaller\">"+SanitizeOutput(addedmethod)+"</td>";\r
227                 content+="</tr>\r\n";\r
228                 st.Step();\r
229                 rownum++;\r
230         }\r
231 \r
232         if(startrow>0 || startrow+rowsperpage<boardcount)\r
233         {\r
234                 std::string tempstr;\r
235                 int cols=0;\r
236 \r
237                 content+="<tr>";\r
238                 if(startrow>0)\r
239                 {\r
240                         StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
241                         content+="<td colspan=\"1\" align=\"left\"><a href=\"boards.htm?"+BuildQueryString(startrow-rowsperpage,boardsearch)+"\"><-- Previous Page</a></td>";\r
242                         cols+=1;\r
243                 }\r
244                 if(startrow+rowsperpage<boardcount)\r
245                 {\r
246                         while(cols<3)\r
247                         {\r
248                                 content+="<td></td>";\r
249                                 cols++;\r
250                         }\r
251                         content+="<td colspan=\"1\" align=\"right\"><a href=\"boards.htm?"+BuildQueryString(startrow+rowsperpage,boardsearch)+"\">Next Page --></a></td>";\r
252                 }\r
253                 content+="</tr>";\r
254         }\r
255 \r
256         content+="<tr>";\r
257         content+="<td colspan=\"4\"><center><input type=\"submit\" value=\"Update\"></center></form></td>";\r
258         content+="</tr>";\r
259         content+="</table>";\r
260         content+="<p class=\"paragraph\">";\r
261         content+="* If you uncheck this box, any new messages you download that are posted to this board will be discarded.";\r
262         content+="</p>";\r
263 \r
264         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
265 }\r
266 \r
267 const bool BoardsPage::WillHandleURI(const std::string &uri)\r
268 {\r
269         if(uri.find("boards.")!=std::string::npos)\r
270         {\r
271                 return true;\r
272         }\r
273         else\r
274         {\r
275                 return false;\r
276         }\r
277 }\r