version 0.3.25
[fms.git] / src / http / pages / forumcreatepostpage.cpp
1 #include "../../../include/http/pages/forumcreatepostpage.h"\r
2 #include "../../../include/stringfunctions.h"\r
3 #include "../../../include/message.h"\r
4 #include "../../../include/unicode/unicodeformatter.h"\r
5 \r
6 #ifdef XMEM\r
7         #include <xmem.h>\r
8 #endif\r
9 \r
10 const std::string ForumCreatePostPage::GeneratePage(const std::string &method, const std::map<std::string,std::string> &queryvars)\r
11 {\r
12         int page=0;\r
13         std::string content="";\r
14         std::string boardidstr="";\r
15         std::string currentpagestr="";\r
16         std::string threadidstr="";\r
17         std::string replytomessageidstr="";\r
18         std::string error="";\r
19         std::string boardname="";\r
20         std::string subject="";\r
21         std::string body="";\r
22         std::string localidentityidstr="";\r
23 \r
24         if(queryvars.find("boardid")!=queryvars.end())\r
25         {\r
26                 boardidstr=(*queryvars.find("boardid")).second;\r
27         }\r
28         if(queryvars.find("currentpage")!=queryvars.end())\r
29         {\r
30                 currentpagestr=(*queryvars.find("currentpage")).second;\r
31         }\r
32         if(queryvars.find("threadid")!=queryvars.end())\r
33         {\r
34                 threadidstr=(*queryvars.find("threadid")).second;\r
35         }\r
36         if(queryvars.find("replytomessageid")!=queryvars.end())\r
37         {\r
38                 replytomessageidstr=(*queryvars.find("replytomessageid")).second;\r
39         }\r
40 \r
41         if(queryvars.find("formaction")!=queryvars.end() && (*queryvars.find("formaction")).second=="send")\r
42         {\r
43                 if(queryvars.find("localidentityid")!=queryvars.end() && (*queryvars.find("localidentityid")).second!="")\r
44                 {\r
45                         localidentityidstr=(*queryvars.find("localidentityid")).second;\r
46                 }\r
47                 else\r
48                 {\r
49                         error="You must select a local identity as the sender<br />";\r
50                 }\r
51 \r
52                 if(queryvars.find("subject")!=queryvars.end() && (*queryvars.find("subject")).second!="")\r
53                 {\r
54                         subject=(*queryvars.find("subject")).second;\r
55                 }\r
56                 else\r
57                 {\r
58                         error+="You must enter a subject<br />";\r
59                 }\r
60 \r
61                 if(queryvars.find("body")!=queryvars.end() && (*queryvars.find("body")).second!="")\r
62                 {\r
63                         body=(*queryvars.find("body")).second;\r
64                         body=StringFunctions::Replace(body,"\r\n","\n");\r
65                         UnicodeFormatter::LineWrap(body,80,">",body);\r
66                 }\r
67                 else\r
68                 {\r
69                         error+="You must enter a message body</br />";\r
70                 }\r
71 \r
72                 if(error=="")\r
73                 {\r
74                         Message mess;\r
75                         \r
76                         long localidentityid=-1;\r
77                         long boardid=-1;\r
78                         std::string references="";\r
79 \r
80                         StringFunctions::Convert(localidentityidstr,localidentityid);\r
81                         StringFunctions::Convert(boardidstr,boardid);\r
82 \r
83                         if(replytomessageidstr!="")\r
84                         {\r
85                                 SQLite3DB::Statement st=m_db->Prepare("SELECT MessageUUID FROM tblMessage WHERE MessageID=?;");\r
86                                 st.Bind(0,replytomessageidstr);\r
87                                 st.Step();\r
88                                 if(st.RowReturned())\r
89                                 {\r
90                                         st.ResultText(0,references);\r
91                                 }\r
92                         }\r
93 \r
94                         if(mess.Create(localidentityid,boardid,subject,body,references))\r
95                         {\r
96                                 if(mess.PostedToAdministrationBoard()==true)\r
97                                 {\r
98                                         mess.HandleAdministrationMessage();\r
99                                 }\r
100                                 if(mess.StartFreenetInsert())\r
101                                 {\r
102                                         page=1;\r
103                                 }\r
104                         }\r
105                         else\r
106                         {\r
107                                 error="Could not create message";\r
108                         }\r
109                 }\r
110         }\r
111         else\r
112         {\r
113                 if(replytomessageidstr!="")\r
114                 {\r
115                         SQLite3DB::Statement replyst=m_db->Prepare("SELECT Subject, Body FROM tblMessage WHERE MessageID=?;");\r
116                         replyst.Bind(0,replytomessageidstr);\r
117                         replyst.Step();\r
118                         if(replyst.RowReturned())\r
119                         {\r
120                                 replyst.ResultText(0,subject);\r
121                                 replyst.ResultText(1,body);\r
122 \r
123                                 if(subject.size()<3 || (subject.substr(0,3)!="re:" && subject.substr(0,3)!="Re:"))\r
124                                 {\r
125                                         subject="Re: "+subject;\r
126                                 }\r
127 \r
128                                 if(body.size()>0)\r
129                                 {\r
130                                         if(body[0]=='>')\r
131                                         {\r
132                                                 body=">"+body;\r
133                                         }\r
134                                         else\r
135                                         {\r
136                                                 body="> "+body;\r
137                                         }\r
138                                         std::string::size_type pos=body.find("\n");\r
139                                         while(pos!=std::string::npos)\r
140                                         {\r
141                                                 if(pos+1<body.size() && body[pos+1]=='>')\r
142                                                 {\r
143                                                         body.insert(pos+1,">");\r
144                                                 }\r
145                                                 else\r
146                                                 {\r
147                                                         body.insert(pos+1,"> ");\r
148                                                 }\r
149                                                 pos=body.find("\n",pos+2);\r
150                                         }\r
151                                         body+="\n";\r
152                                 }\r
153 \r
154                         }\r
155                 }\r
156         }\r
157 \r
158         SQLite3DB::Statement boardnamest=m_db->Prepare("SELECT BoardName FROM tblBoard WHERE BoardID=?;");\r
159         boardnamest.Bind(0,boardidstr);\r
160         boardnamest.Step();\r
161         if(boardnamest.RowReturned())\r
162         {\r
163                 boardnamest.ResultText(0,boardname);\r
164         }\r
165 \r
166         content+=CreateForumHeader();\r
167 \r
168         content+="<table class=\"forumheader\">";\r
169         content+="<tr>";\r
170         content+="<td>Forum : <a href=\"forumthreads.htm?boardid="+boardidstr+"&currentpage="+currentpagestr+"\">"+SanitizeOutput(boardname)+"</a></td>";\r
171         content+="</tr>";\r
172         content+="</table>\r\n";\r
173 \r
174         if(error!="")\r
175         {\r
176                 content+="<div class=\"error\">"+error+"</div>\r\n";\r
177         }\r
178 \r
179         if(page==0)\r
180         {\r
181                 content+="<form name=\"frmcreatemessage\" method=\"post\" action=\"forumcreatepost.htm\">";\r
182                 content+="<input type=\"hidden\" name=\"boardid\" value=\""+boardidstr+"\">";\r
183                 content+="<input type=\"hidden\" name=\"currentpage\" value=\""+currentpagestr+"\">";\r
184                 content+="<input type=\"hidden\" name=\"threadid\" value=\""+threadidstr+"\">";\r
185                 content+="<input type=\"hidden\" name=\"replytomessageid\" value=\""+replytomessageidstr+"\">";\r
186                 content+="<input type=\"hidden\" name=\"formaction\" value=\"send\">";\r
187                 content+="<table class=\"createpost\">";\r
188                 content+="<tr><td class=\"identity\">From</td><td>"+LocalIdentityDropDown("localidentityid",localidentityidstr)+"</td></tr>";\r
189                 content+="<tr><td class=\"subject\">Subject</td><td><input type=\"text\" name=\"subject\" maxlength=\"60\" size=\"60\" value=\""+SanitizeOutput(subject)+"\"></td></tr>";\r
190                 content+="<tr><td class=\"body\">Message</td><td><textarea name=\"body\" cols=\"80\" rows=\"30\">"+SanitizeTextAreaOutput(body)+"</textarea></td></tr>";\r
191                 content+="<tr><td colspan=\"2\" class=\"send\"><input type=\"submit\" value=\"Send\"></td></tr>";\r
192                 content+="</table>\r\n";\r
193                 content+="</form>";\r
194         }\r
195         else if(page==1)\r
196         {\r
197                 content+="You have sent your message.  It will show up in the thread after it has been successfully inserted and retrieved by FMS.";\r
198         }\r
199 \r
200         return StringFunctions::Replace(m_template,"[CONTENT]",content);\r
201 }\r
202 \r
203 const std::string ForumCreatePostPage::LocalIdentityDropDown(const std::string &name, const std::string &selectedid)\r
204 {\r
205         std::string html="<select name=\""+name+"\">";\r
206         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID, Name FROM tblLocalIdentity ORDER BY Name COLLATE NOCASE ASC;");\r
207 \r
208         if(selectedid=="")\r
209         {\r
210                 html+="<option value=\"\" selected></option>";\r
211         }\r
212 \r
213         st.Step();\r
214         while(st.RowReturned())\r
215         {\r
216                 std::string id="";\r
217                 std::string name="";\r
218                 st.ResultText(0,id);\r
219                 st.ResultText(1,name);\r
220                 html+="<option value=\""+id+"\"";\r
221                 if(id==selectedid)\r
222                 {\r
223                         html+=" selected";\r
224                 }\r
225                 html+=">"+FixFromName(name)+"</option>";\r
226                 st.Step();\r
227         }\r
228         html+="</select>";\r
229         return html;\r
230 }\r