version 0.3.6
[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.  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
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