version 0.1.13
[fms.git] / src / http / pages / boardspage.cpp
diff --git a/src/http/pages/boardspage.cpp b/src/http/pages/boardspage.cpp
new file mode 100644 (file)
index 0000000..8d10aa6
--- /dev/null
@@ -0,0 +1,258 @@
+#include "../../../include/http/pages/boardspage.h"\r
+#include "../../../include/stringfunctions.h"\r
+#include "../../../include/datetime.h"\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+const std::string BoardsPage::BuildQueryString(const long startrow, const std::string &boardsearch)\r
+{\r
+       std::string returnval="";\r
+       std::string tempval="";\r
+\r
+       if(startrow>=0)\r
+       {\r
+               StringFunctions::Convert(startrow,tempval);\r
+               returnval+="startrow="+tempval;\r
+       }\r
+\r
+       if(boardsearch!="")\r
+       {\r
+               if(returnval!="")\r
+               {\r
+                       returnval+="&";\r
+               }\r
+               returnval+="boardsearch="+boardsearch;\r
+       }\r
+\r
+       return returnval;\r
+\r
+}\r
+\r
+const std::string BoardsPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
+{\r
+       int boardcount=0;\r
+       std::string content="";\r
+       int rownum=0;\r
+       int rowsperpage=25;\r
+       std::string rowsperpagestr="25";\r
+       int startrow=0;\r
+       std::string startrowstr="0";\r
+       std::string boardsearch="";\r
+       std::string sql="";\r
+       DateTime now;\r
+       now.SetToGMTime();\r
+\r
+       if(queryvars.find("formaction")!=queryvars.end())\r
+       {\r
+               if((*queryvars.find("formaction")).second=="addboard" && queryvars.find("boardname")!=queryvars.end() && queryvars.find("boarddescription")!=queryvars.end())\r
+               {\r
+                       std::string boardname="";\r
+                       std::string boarddescription="";\r
+\r
+                       boardname=(*queryvars.find("boardname")).second;\r
+                       boarddescription=(*queryvars.find("boarddescription")).second;\r
+\r
+                       SQLite3DB::Statement addst=m_db->Prepare("INSERT INTO tblBoard(BoardName,BoardDescription,DateAdded) VALUES(?,?,?);");\r
+                       addst.Bind(0,boardname);\r
+                       addst.Bind(1,boarddescription);\r
+                       addst.Bind(2,now.Format("%Y-%m-%d %H:%M:%S"));\r
+                       addst.Step();\r
+               }\r
+               if((*queryvars.find("formaction")).second=="update")\r
+               {\r
+                       int boardid;\r
+                       std::vector<std::string> boardids;\r
+                       std::vector<std::string> olddescriptions;\r
+                       std::vector<std::string> descriptions;\r
+                       std::vector<std::string> oldsavemessages;\r
+                       std::vector<std::string> savemessages;\r
+\r
+                       CreateArgArray(queryvars,"boardid",boardids);\r
+                       CreateArgArray(queryvars,"oldboarddescription",olddescriptions);\r
+                       CreateArgArray(queryvars,"boarddescription",descriptions);\r
+                       CreateArgArray(queryvars,"oldsavereceivedmessages",oldsavemessages);\r
+                       CreateArgArray(queryvars,"savereceivedmessages",savemessages);\r
+\r
+                       olddescriptions.resize(boardids.size(),"");\r
+                       descriptions.resize(boardids.size(),"");\r
+                       oldsavemessages.resize(boardids.size(),"");\r
+                       savemessages.resize(boardids.size(),"");\r
+\r
+                       SQLite3DB::Statement updatest=m_db->Prepare("UPDATE tblBoard SET BoardDescription=?, SaveReceivedMessages=? WHERE BoardID=?;");\r
+                       \r
+                       for(int i=0; i<boardids.size(); i++)\r
+                       {\r
+                               if(olddescriptions[i]!=descriptions[i] || oldsavemessages[i]!=savemessages[i])\r
+                               {\r
+                                       updatest.Bind(0,descriptions[i]);\r
+                                       if(savemessages[i]!="true")\r
+                                       {\r
+                                               updatest.Bind(1,"false");\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               updatest.Bind(1,"true");\r
+                                       }\r
+                                       boardid=0;\r
+                                       StringFunctions::Convert(boardids[i],boardid);\r
+                                       updatest.Bind(2,boardid);\r
+                                       updatest.Step();\r
+                                       updatest.Reset();\r
+                               }\r
+                       }\r
+\r
+               }\r
+       }\r
+\r
+       // if startrow is specified\r
+       if(queryvars.find("startrow")!=queryvars.end())\r
+       {\r
+               startrowstr=(*queryvars.find("startrow")).second;\r
+               // convert back and forth, just in case a number wasn't passed in startrow\r
+               StringFunctions::Convert(startrowstr,startrow);\r
+               if(startrow<0)\r
+               {\r
+                       startrow=0;\r
+               }\r
+               StringFunctions::Convert(startrow,startrowstr);\r
+       }\r
+\r
+       // if we are searching by name\r
+       if(queryvars.find("boardsearch")!=queryvars.end())\r
+       {\r
+               boardsearch=(*queryvars.find("boardsearch")).second;\r
+       }\r
+\r
+       content+="<h2>Boards</h2>";\r
+\r
+       sql="SELECT COUNT(*) FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";\r
+       if(boardsearch!="")\r
+       {\r
+               sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";\r
+       }\r
+       sql+=";";\r
+       SQLite3DB::Statement st=m_db->Prepare(sql);\r
+       if(boardsearch!="")\r
+       {\r
+               st.Bind(0,boardsearch);\r
+               st.Bind(1,boardsearch);\r
+       }\r
+       st.Step();\r
+       if(st.RowReturned())\r
+       {\r
+               st.ResultInt(0,boardcount);\r
+       }\r
+       st.Finalize();\r
+\r
+\r
+       sql="SELECT BoardID,BoardName,BoardDescription,SaveReceivedMessages FROM tblBoard WHERE BoardID NOT IN (SELECT BoardID FROM tblAdministrationBoard)";\r
+       if(boardsearch!="")\r
+       {\r
+               sql+=" AND (BoardName LIKE '%' || ? || '%' OR BoardDescription LIKE '%' || ? || '%')";\r
+       }\r
+       sql+=" ORDER BY BoardName COLLATE NOCASE";\r
+       sql+=" LIMIT "+startrowstr+","+rowsperpagestr+";";\r
+\r
+       st=m_db->Prepare(sql);\r
+       if(boardsearch!="")\r
+       {\r
+               st.Bind(0,boardsearch);\r
+               st.Bind(1,boardsearch);\r
+       }\r
+       st.Step();\r
+\r
+       content+="<table>";\r
+\r
+       content+="<tr>";\r
+       content+="<td colspan=\"3\"><center>";\r
+       content+="<form name=\"frmboardsearch\" action=\"boards.htm\" method=\"POST\"><input type=\"text\" name=\"boardsearch\" value=\""+SanitizeOutput(boardsearch)+"\"><input type=\"submit\" value=\"Search\"></form>";\r
+       content+="</center></td>";\r
+       content+="</tr>";\r
+\r
+       content+="<tr>";\r
+       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\"></td><td><input type=\"submit\" value=\"Add Board\"></form></td>";\r
+       content+="</tr>";\r
+\r
+       content+="<tr><td colspan=\"3\"><hr><form name=\"frmboards\" method=\"POST\"><input type=\"hidden\" name=\"formaction\" value=\"update\"></td></tr>";\r
+       content+="<tr>";\r
+       content+="<th>Name</th><th>Description</th><th>Save Received Messages</th>";\r
+       content+="</tr>";       \r
+       while(st.RowReturned() && rownum<rowsperpage)\r
+       {\r
+               std::string rownumstr="";\r
+               std::string boardidstr="";\r
+               std::string boardname="";\r
+               std::string boarddescription="";\r
+               std::string savereceivedmessages="";\r
+\r
+               st.ResultText(0,boardidstr);\r
+               st.ResultText(1,boardname);\r
+               st.ResultText(2,boarddescription);\r
+               st.ResultText(3,savereceivedmessages);\r
+\r
+               StringFunctions::Convert(rownum,rownumstr);\r
+\r
+               content+="<tr>";\r
+               content+="<td>"+SanitizeOutput(boardname)+"</td>";\r
+               content+="<td><input type=\"hidden\" name=\"boardid["+rownumstr+"]\" value=\""+boardidstr+"\">";\r
+               content+="<input type=\"hidden\" name=\"oldboarddescription["+rownumstr+"]\" value=\""+StringFunctions::Replace(SanitizeOutput(boarddescription),"&nbsp;"," ")+"\">";\r
+               content+="<input type=\"text\" name=\"boarddescription["+rownumstr+"]\" value=\""+SanitizeOutput(boarddescription)+"\" size=\"40\"></td>";\r
+               content+="<td>";\r
+               content+="<input type=\"hidden\" name=\"oldsavereceivedmessages["+rownumstr+"]\" value=\""+savereceivedmessages+"\">";\r
+               content+="<input type=\"checkbox\" name=\"savereceivedmessages["+rownumstr+"]\" value=\"true\"";\r
+               if(savereceivedmessages=="true")\r
+               {\r
+                       content+=" CHECKED";\r
+               }\r
+               content+=">";\r
+               content+="</td>";\r
+               content+="</tr>\r\n";\r
+               st.Step();\r
+               rownum++;\r
+       }\r
+\r
+       if(startrow>0 || startrow+rowsperpage<boardcount)\r
+       {\r
+               std::string tempstr;\r
+               int cols=0;\r
+\r
+               content+="<tr>";\r
+               if(startrow>0)\r
+               {\r
+                       StringFunctions::Convert(startrow-rowsperpage,tempstr);\r
+                       content+="<td colspan=\"1\" align=\"left\"><a href=\"boards.htm?"+BuildQueryString(startrow-rowsperpage,boardsearch)+"\"><-- Previous Page</a></td>";\r
+                       cols+=1;\r
+               }\r
+               if(startrow+rowsperpage<boardcount)\r
+               {\r
+                       while(cols<2)\r
+                       {\r
+                               content+="<td></td>";\r
+                               cols++;\r
+                       }\r
+                       content+="<td colspan=\"1\" align=\"right\"><a href=\"boards.htm?"+BuildQueryString(startrow+rowsperpage,boardsearch)+"\">Next Page --></a></td>";\r
+               }\r
+               content+="</tr>";\r
+       }\r
+\r
+       content+="<tr>";\r
+       content+="<td colspan=\"3\"><center><input type=\"submit\" value=\"Update\"></center></form></td>";\r
+       content+="</tr>";\r
+       content+="</table>";\r
+\r
+       return "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"+StringFunctions::Replace(m_template,"[CONTENT]",content);\r
+}\r
+\r
+const bool BoardsPage::WillHandleURI(const std::string &uri)\r
+{\r
+       if(uri.find("boards.")!=std::string::npos)\r
+       {\r
+               return true;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+}\r