1 #include "../../../include/http/pages/boardspage.h"
\r
2 #include "../../../include/stringfunctions.h"
\r
4 #include <Poco/DateTime.h>
\r
5 #include <Poco/DateTimeFormatter.h>
\r
11 const std::string BoardsPage::BuildQueryString(const long startrow, const std::string &boardsearch)
\r
13 std::string returnval="";
\r
14 std::string tempval="";
\r
18 StringFunctions::Convert(startrow,tempval);
\r
19 returnval+="startrow="+tempval;
\r
28 returnval+="boardsearch="+boardsearch;
\r
35 const std::string BoardsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)
\r
38 std::string content="";
\r
41 std::string rowsperpagestr="25";
\r
43 std::string startrowstr="0";
\r
44 std::string boardsearch="";
\r
48 if(queryvars.find("formaction")!=queryvars.end())
\r
50 if((*queryvars.find("formaction")).second=="addboard" && queryvars.find("boardname")!=queryvars.end() && queryvars.find("boarddescription")!=queryvars.end() && ValidateFormPassword(queryvars))
\r
52 std::string boardname="";
\r
53 std::string boarddescription="";
\r
55 boardname=(*queryvars.find("boardname")).second;
\r
56 StringFunctions::LowerCase(boardname,boardname);
\r
57 boarddescription=(*queryvars.find("boarddescription")).second;
\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
66 if((*queryvars.find("formaction")).second=="remove0messages" && ValidateFormPassword(queryvars))
\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
70 if((*queryvars.find("formaction")).second=="update" && ValidateFormPassword(queryvars))
\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
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
85 olddescriptions.resize(boardids.size(),"");
\r
86 descriptions.resize(boardids.size(),"");
\r
87 oldsavemessages.resize(boardids.size(),"");
\r
88 savemessages.resize(boardids.size(),"");
\r
90 SQLite3DB::Statement updatest=m_db->Prepare("UPDATE tblBoard SET BoardDescription=?, SaveReceivedMessages=? WHERE BoardID=?;");
\r
92 for(int i=0; i<boardids.size(); i++)
\r
94 if(olddescriptions[i]!=descriptions[i] || oldsavemessages[i]!=savemessages[i])
\r
96 updatest.Bind(0,descriptions[i]);
\r
97 if(savemessages[i]!="true")
\r
99 updatest.Bind(1,"false");
\r
103 updatest.Bind(1,"true");
\r
106 StringFunctions::Convert(boardids[i],boardid);
\r
107 updatest.Bind(2,boardid);
\r
116 // if startrow is specified
\r
117 if(queryvars.find("startrow")!=queryvars.end())
\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
126 StringFunctions::Convert(startrow,startrowstr);
\r
129 // if we are searching by name
\r
130 if(queryvars.find("boardsearch")!=queryvars.end())
\r
132 boardsearch=(*queryvars.find("boardsearch")).second;
\r
135 content+="<h2>Boards</h2>";
\r
137 sql="SELECT COUNT(*) FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";
\r
138 if(boardsearch!="")
\r
140 sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";
\r
143 SQLite3DB::Statement st=m_db->Prepare(sql);
\r
144 if(boardsearch!="")
\r
146 st.Bind(0,boardsearch);
\r
147 st.Bind(1,boardsearch);
\r
150 if(st.RowReturned())
\r
152 st.ResultInt(0,boardcount);
\r
157 sql="SELECT BoardID,BoardName,BoardDescription,SaveReceivedMessages,AddedMethod FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";
\r
158 if(boardsearch!="")
\r
160 sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";
\r
162 sql+=" ORDER BY BoardName COLLATE NOCASE";
\r
163 sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";
\r
165 st=m_db->Prepare(sql);
\r
166 if(boardsearch!="")
\r
168 st.Bind(0,boardsearch);
\r
169 st.Bind(1,boardsearch);
\r
173 content+="<table>";
\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)+"\">"+CreateFormPassword()+"<input type=\"submit\" value=\"Search\"></form>";
\r
178 content+="</center></td>";
\r
182 content+="<td colspan=\"3\"><center>";
\r
183 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
184 content+="</center></td>";
\r
188 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
191 content+="<tr><td colspan=\"4\"><hr><form name=\"frmboards\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"update\">"+CreateFormPassword()+"</td></tr>";
\r
193 content+="<th>Name</th><th>Description</th><th>Save Received Messages *</th><th>Added Method</th>";
\r
195 while(st.RowReturned() && rownum<rowsperpage)
\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
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
210 StringFunctions::Convert(rownum,rownumstr);
\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)," "," ")+"\">";
\r
216 content+="<input type=\"text\" name=\"boarddescription["+rownumstr+"]\" value=\""+SanitizeOutput(boarddescription)+"\" size=\"40\" maxlength=\"50\"></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
222 content+=" CHECKED";
\r
226 content+="<td class=\"smaller\">"+SanitizeOutput(addedmethod)+"</td>";
\r
227 content+="</tr>\r\n";
\r
232 if(startrow>0 || startrow+rowsperpage<boardcount)
\r
234 std::string tempstr;
\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
244 if(startrow+rowsperpage<boardcount)
\r
248 content+="<td></td>";
\r
251 content+="<td colspan=\"1\" align=\"right\"><a href=\"boards.htm?"+BuildQueryString(startrow+rowsperpage,boardsearch)+"\">Next Page --></a></td>";
\r
257 content+="<td colspan=\"4\"><center><input type=\"submit\" value=\"Update\"></center></form></td>";
\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
264 return StringFunctions::Replace(m_template,"[CONTENT]",content);
\r
267 const bool BoardsPage::WillHandleURI(const std::string &uri)
\r
269 if(uri.find("boards.")!=std::string::npos)
\r