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