version 0.1.14
[fms.git] / src / message.cpp
1 #include "../include/message.h"\r
2 #include "../include/nntp/mime/Mime.h"\r
3 #include "../include/uuidgenerator.h"\r
4 #include "../include/stringfunctions.h"\r
5 #include "../include/freenet/messagexml.h"\r
6 #include "../include/option.h"\r
7 \r
8 #include <algorithm>\r
9 \r
10 #ifdef XMEM\r
11         #include <xmem.h>\r
12 #endif\r
13 \r
14 Message::Message()\r
15 {\r
16         Initialize();\r
17 }\r
18 \r
19 Message::Message(const long messageid)\r
20 {\r
21         Load(messageid);\r
22 }\r
23 \r
24 const bool Message::CheckForAdministrationBoard(const std::vector<std::string> &boards)\r
25 {\r
26         std::string name;\r
27         SQLite3DB::Statement st=m_db->Prepare("SELECT BoardName FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID;");\r
28         st.Step();\r
29         \r
30         while(st.RowReturned())\r
31         {\r
32                 st.ResultText(0,name);\r
33 \r
34                 if(std::find(boards.begin(),boards.end(),name)!=boards.end())\r
35                 {\r
36                         return true;\r
37                 }\r
38                 \r
39                 st.Step();\r
40         }\r
41 \r
42         return false;\r
43 }\r
44 \r
45 const std::string Message::GetNNTPArticleID() const\r
46 {\r
47         // old message - before 0.1.12 - doesn't have @domain so add @freenetproject.org\r
48         if(m_messageuuid.find("@")==std::string::npos)\r
49         {\r
50                 return "<"+m_messageuuid+"@freenetproject.org>";\r
51         }\r
52         else\r
53         {\r
54                 return "<"+m_messageuuid+">";\r
55         }\r
56 }\r
57 \r
58 const std::string Message::GetNNTPBody() const\r
59 {\r
60         return m_body;\r
61 }\r
62 \r
63 const std::string Message::GetNNTPHeaders() const\r
64 {\r
65         std::string rval("");\r
66 \r
67         rval+="From: "+m_fromname+"\r\n";\r
68         rval+="Newsgroups: ";\r
69         for(std::vector<std::string>::const_iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
70         {\r
71                 if(i!=m_boards.begin())\r
72                 {\r
73                         rval+=",";\r
74                 }\r
75                 rval+=(*i);\r
76         }\r
77         rval+="\r\n";\r
78         rval+="Subject: "+m_subject+"\r\n";\r
79         // format time as  : Wdy, DD Mon YY HH:MM:SS TIMEZONE\r
80         rval+="Date: "+m_datetime.Format("%a, %d %b %y %H:%M:%S -0000")+"\r\n";\r
81         if(m_inreplyto.size()>0)\r
82         {\r
83                 rval+="References: ";\r
84                 for(std::map<long,std::string>::const_reverse_iterator j=m_inreplyto.rbegin(); j!=m_inreplyto.rend(); j++)\r
85                 {\r
86                         if(j!=m_inreplyto.rend())\r
87                         {\r
88                                 rval+=" ";\r
89                         }\r
90                         // old message - before 0.1.12 - doesn't have @domain so add @freenetproject.org\r
91                         if((*j).second.find("@")==std::string::npos)\r
92                         {\r
93                                 rval+="<"+(*j).second+"@freenetproject.org>";\r
94                         }\r
95                         else\r
96                         {\r
97                                 rval+="<"+(*j).second+">";\r
98                         }\r
99                 }\r
100                 rval+="\r\n";\r
101         }\r
102         rval+="Followup-To: "+m_replyboardname+"\r\n";\r
103         rval+="Path: freenet\r\n";\r
104         rval+="Message-ID: "+GetNNTPArticleID()+"\r\n";\r
105         rval+="Content-Type: text/plain; charset=UTF-8\r\n";\r
106 \r
107         return rval;\r
108 }\r
109 \r
110 void Message::HandleAdministrationMessage()\r
111 {\r
112         // only continue if this message was actually a reply to another message\r
113         if(m_inreplyto.size()>0)\r
114         {\r
115                 int boardid=0;\r
116                 std::string boardname="";\r
117                 std::string identityname="";\r
118                 int identityid;\r
119                 int changemessagetrust=0;\r
120                 int changetrustlisttrust=0;\r
121                 int origmessagetrust=0;\r
122                 int origtrustlisttrust=0;\r
123                 SQLite3DB::Statement st=m_db->Prepare("SELECT tblBoard.BoardID,BoardName,ModifyLocalMessageTrust,ModifyLocalTrustListTrust FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID;");\r
124                 st.Step();\r
125 \r
126                 while(st.RowReturned())\r
127                 {\r
128                         st.ResultInt(0,boardid);\r
129                         st.ResultText(1,boardname);\r
130                         st.ResultInt(2,changemessagetrust);\r
131                         st.ResultInt(3,changetrustlisttrust);\r
132 \r
133                         if(std::find(m_boards.begin(),m_boards.end(),boardname)!=m_boards.end())\r
134                         {\r
135                                 SQLite3DB::Statement origmess=m_db->Prepare("SELECT tblIdentity.IdentityID,tblIdentity.Name,tblIdentity.LocalMessageTrust,tblIdentity.LocalTrustListTrust FROM tblIdentity INNER JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID WHERE tblMessage.MessageUUID=?;");\r
136                                 origmess.Bind(0,m_inreplyto[0]);\r
137                                 origmess.Step();\r
138 \r
139                                 if(origmess.RowReturned())\r
140                                 {\r
141                                         origmess.ResultInt(0,identityid);\r
142                                         origmess.ResultText(1,identityname);\r
143                                         if(origmess.ResultNull(2)==false)\r
144                                         {\r
145                                                 origmess.ResultInt(2,origmessagetrust);\r
146                                         }\r
147                                         else\r
148                                         {\r
149                                                 origmessagetrust=50;\r
150                                         }\r
151                                         if(origmess.ResultNull(3)==false)\r
152                                         {\r
153                                                 origmess.ResultInt(3,origtrustlisttrust);\r
154                                         }\r
155                                         else\r
156                                         {\r
157                                                 origtrustlisttrust=50;\r
158                                         }\r
159 \r
160                                         origmessagetrust+=changemessagetrust;\r
161                                         origtrustlisttrust+=changetrustlisttrust;\r
162 \r
163                                         if(origmessagetrust<0)\r
164                                         {\r
165                                                 origmessagetrust=0;\r
166                                         }\r
167                                         if(origmessagetrust>100)\r
168                                         {\r
169                                                 origmessagetrust=100;\r
170                                         }\r
171                                         if(origtrustlisttrust<0)\r
172                                         {\r
173                                                 origtrustlisttrust=0;\r
174                                         }\r
175                                         if(origtrustlisttrust>100)\r
176                                         {\r
177                                                 origtrustlisttrust=100;\r
178                                         }\r
179 \r
180                                         // update new trust levels\r
181                                         SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=?, LocalTrustListTrust=? WHERE IdentityID=?;");\r
182                                         update.Bind(0,origmessagetrust);\r
183                                         update.Bind(1,origtrustlisttrust);\r
184                                         update.Bind(2,identityid);\r
185                                         update.Step();\r
186 \r
187                                         // insert message to show what id was changed and what current levels are\r
188                                         int lastid=0;\r
189                                         std::string messagebody;\r
190                                         std::string messagetruststr="";\r
191                                         std::string trustlisttruststr="";\r
192                                         UUIDGenerator uuid;\r
193                                         DateTime now;\r
194                                         now.SetToGMTime();\r
195                                         StringFunctions::Convert(origmessagetrust,messagetruststr);\r
196                                         StringFunctions::Convert(origtrustlisttrust,trustlisttruststr);\r
197                                         messagebody="Trust Changed for "+identityname+"\r\n";\r
198                                         messagebody+="Local Message Trust : "+messagetruststr+"\r\n";\r
199                                         messagebody+="Local Trust List Trust : "+trustlisttruststr+"\r\n";\r
200                                         SQLite3DB::Statement insert=m_db->Prepare("INSERT INTO tblMessage(FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body) VALUES('FMS',?,?,?,?,?,?);");\r
201                                         insert.Bind(0,now.Format("%Y-%m-%d"));\r
202                                         insert.Bind(1,now.Format("%H:%M:%S"));\r
203                                         insert.Bind(2,identityname+" Trust Changed");\r
204                                         insert.Bind(3,uuid.Generate());\r
205                                         insert.Bind(4,boardid);\r
206                                         insert.Bind(5,messagebody);\r
207                                         insert.Step(true);\r
208                                         lastid=insert.GetLastInsertRowID();\r
209 \r
210                                         insert=m_db->Prepare("INSERT INTO tblMessageBoard(MessageID,BoardID) VALUES(?,?);");\r
211                                         insert.Bind(0,lastid);\r
212                                         insert.Bind(1,boardid);\r
213                                         insert.Step();\r
214 \r
215                                         m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"Message::HandleAdministrationMessage updated "+identityname+" to "+messagetruststr+" , "+trustlisttruststr);\r
216 \r
217                                 }\r
218                         }\r
219 \r
220                         st.Step();\r
221                 }\r
222         }\r
223 \r
224 }\r
225 \r
226 void Message::HandleChangeTrust()\r
227 {\r
228         if(m_changemessagetrustonreply!=0 && m_inreplyto.size()>0)\r
229         {\r
230                 SQLite3DB::Statement st=m_db->Prepare("SELECT tblIdentity.IdentityID,tblIdentity.LocalMessageTrust FROM tblIdentity INNER JOIN tblMessage ON tblIdentity.IdentityID=tblMessage.IdentityID WHERE tblMessage.MessageUUID=?;");\r
231                 st.Bind(0,m_inreplyto[0]);\r
232                 st.Step();\r
233                 if(st.RowReturned())\r
234                 {\r
235                         int identityid=0;\r
236                         int localmessagetrust=0;\r
237 \r
238                         st.ResultInt(0,identityid);\r
239                         if(st.ResultNull(1)==false)\r
240                         {\r
241                                 st.ResultInt(1,localmessagetrust);\r
242                         }\r
243                         else\r
244                         {\r
245                                 localmessagetrust=50;\r
246                         }\r
247 \r
248                         localmessagetrust+=m_changemessagetrustonreply;\r
249                         if(localmessagetrust<0)\r
250                         {\r
251                                 localmessagetrust=0;\r
252                         }\r
253                         if(localmessagetrust>100)\r
254                         {\r
255                                 localmessagetrust=100;\r
256                         }\r
257 \r
258                         SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=? WHERE IdentityID=?;");\r
259                         st2.Bind(0,localmessagetrust);\r
260                         st2.Bind(1,identityid);\r
261                         st2.Step();\r
262 \r
263                 }\r
264         }\r
265 }\r
266 \r
267 void Message::Initialize()\r
268 {\r
269         std::string tempval="";\r
270         m_messageid=-1;\r
271         m_messageuuid="";\r
272         m_subject="";\r
273         m_body="";\r
274         m_replyboardname="";\r
275         m_datetime.Set();\r
276         m_fromname="";\r
277         m_boards.clear();\r
278         m_inreplyto.clear();\r
279         m_changemessagetrustonreply=0;\r
280         Option::Instance()->Get("ChangeMessageTrustOnReply",tempval);\r
281         StringFunctions::Convert(tempval,m_changemessagetrustonreply);\r
282         Option::Instance()->Get("AddNewPostFromIdentities",tempval);\r
283         if(tempval=="true")\r
284         {\r
285                 m_addnewpostfromidentities=true;\r
286         }\r
287         else\r
288         {\r
289                 m_addnewpostfromidentities=false;\r
290         }\r
291 }\r
292 \r
293 const bool Message::Load(const long messageid, const long boardid)\r
294 {\r
295         \r
296         Initialize();\r
297 \r
298         std::string sql;\r
299         \r
300         sql="SELECT tblMessage.MessageID, MessageUUID, Subject, Body, tblBoard.BoardName, MessageDate, MessageTime, FromName FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID INNER JOIN tblBoard ON tblMessage.ReplyBoardID=tblBoard.BoardID WHERE tblMessage.MessageID=?";\r
301         if(boardid!=-1)\r
302         {\r
303                 sql+=" AND tblMessageBoard.BoardID=?";\r
304         }\r
305         sql+=";";\r
306 \r
307         SQLite3DB::Statement st=m_db->Prepare(sql);\r
308         st.Bind(0,messageid);\r
309         if(boardid!=-1)\r
310         {\r
311                 st.Bind(1,boardid);\r
312         }\r
313         st.Step();\r
314 \r
315         if(st.RowReturned())\r
316         {\r
317                 std::string tempdate;\r
318                 std::string temptime;\r
319                 int tempint=-1;\r
320                 st.ResultInt(0,tempint);\r
321                 m_messageid=tempint;\r
322                 st.ResultText(1,m_messageuuid);\r
323                 st.ResultText(2,m_subject);\r
324                 st.ResultText(3,m_body);\r
325                 st.ResultText(4,m_replyboardname);\r
326                 st.ResultText(5,tempdate);\r
327                 st.ResultText(6,temptime);\r
328                 m_datetime.Set(tempdate + " " + temptime);\r
329                 st.ResultText(7,m_fromname);\r
330                 st.Finalize();\r
331 \r
332                 // strip off any \r\n in subject\r
333                 m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
334 \r
335                 // get board list\r
336                 st=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblMessageBoard.MessageID=?;");\r
337                 st.Bind(0,messageid);\r
338                 st.Step();\r
339                 while(st.RowReturned())\r
340                 {\r
341                         std::string tempval;\r
342                         st.ResultText(0,tempval);\r
343                         m_boards.push_back(tempval);\r
344                         st.Step();\r
345                 }\r
346                 st.Finalize();\r
347 \r
348                 // get in reply to list\r
349                 st=m_db->Prepare("SELECT ReplyToMessageUUID, ReplyOrder FROM tblMessageReplyTo INNER JOIN tblMessage ON tblMessageReplyTo.MessageID=tblMessage.MessageID WHERE tblMessage.MessageID=?;");\r
350                 st.Bind(0,messageid);\r
351                 st.Step();\r
352                 while(st.RowReturned())\r
353                 {\r
354                         std::string tempval;\r
355                         int tempint;\r
356                         st.ResultText(0,tempval);\r
357                         st.ResultInt(1,tempint);\r
358                         m_inreplyto[tempint]=tempval;\r
359                         st.Step();\r
360                 }\r
361                 st.Finalize();\r
362 \r
363                 return true;\r
364         }\r
365         else\r
366         {\r
367                 return false;\r
368         }\r
369 \r
370 }\r
371 \r
372 const bool Message::Load(const std::string &messageuuid)\r
373 {\r
374 \r
375         std::string uuid=messageuuid;\r
376 \r
377         if(uuid.size()>0 && uuid[0]=='<')\r
378         {\r
379                 uuid.erase(0,1);\r
380         }\r
381         if(uuid.size()>0 && uuid[uuid.size()-1]=='>')\r
382         {\r
383                 uuid.erase(uuid.size()-1);\r
384         }\r
385         if(uuid.find("@freenetproject.org")!=std::string::npos)\r
386         {\r
387                 uuid.erase(uuid.find("@freenetproject.org"));\r
388         }\r
389 \r
390         SQLite3DB::Statement st=m_db->Prepare("SELECT MessageID FROM tblMessage WHERE MessageUUID=?;");\r
391         st.Bind(0,uuid);\r
392         st.Step();\r
393 \r
394         if(st.RowReturned())\r
395         {\r
396                 int messageid;\r
397                 st.ResultInt(0,messageid);\r
398 \r
399                 return Load(messageid);\r
400         }\r
401         else\r
402         {\r
403                 return false;\r
404         }\r
405 }\r
406 \r
407 const bool Message::LoadNext(const long messageid, const long boardid)\r
408 {\r
409         std::string sql="SELECT tblMessage.MessageID FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID WHERE tblMessage.MessageID>?";\r
410         if(boardid!=-1)\r
411         {\r
412                 sql+=" AND tblMessageBoard.BoardID=?";\r
413         }\r
414         sql+=";";\r
415 \r
416         SQLite3DB::Statement st=m_db->Prepare(sql);\r
417 \r
418         st.Bind(0,messageid);\r
419         if(boardid!=-1)\r
420         {\r
421                 st.Bind(1,boardid);\r
422         }\r
423         st.Step();\r
424 \r
425         if(st.RowReturned())\r
426         {\r
427                 int result;\r
428                 st.ResultInt(0,result);\r
429                 return Load(result,boardid);\r
430         }\r
431         else\r
432         {\r
433                 return false;\r
434         }\r
435 }\r
436 \r
437 const bool Message::LoadPrevious(const long messageid, const long boardid)\r
438 {\r
439         std::string sql="SELECT tblMessage.MessageID FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID WHERE tblMessage.MessageID<?";\r
440         if(boardid!=-1)\r
441         {\r
442                 sql+=" AND tblMessageBoard.BoardID=?";\r
443         }\r
444         sql+=" ORDER BY tblMessage.MessageID DESC;";\r
445 \r
446         SQLite3DB::Statement st=m_db->Prepare(sql);\r
447 \r
448         st.Bind(0,messageid);\r
449         if(boardid!=-1)\r
450         {\r
451                 st.Bind(1,boardid);\r
452         }\r
453         st.Step();\r
454 \r
455         if(st.RowReturned())\r
456         {\r
457                 int result;\r
458                 st.ResultInt(0,result);\r
459                 return Load(result,boardid);\r
460         }\r
461         else\r
462         {\r
463                 return false;\r
464         }\r
465 }\r
466 \r
467 const bool Message::ParseNNTPMessage(const std::string &nntpmessage)\r
468 {\r
469 \r
470         Initialize();\r
471 \r
472         UUIDGenerator uuid;\r
473         CMimeMessage mime;\r
474         mime.Load(nntpmessage.c_str(),nntpmessage.size());\r
475 \r
476         // get header info\r
477         // date is always set to now regardless of what message has\r
478         m_datetime.SetToGMTime();\r
479 \r
480         // messageuuid is always a unique id we generate regardless of message message-id\r
481         m_messageuuid=uuid.Generate();\r
482         \r
483         // get from\r
484         if(mime.GetFieldValue("From"))\r
485         {\r
486                 m_fromname=mime.GetFieldValue("From");\r
487                 // remove any path folding\r
488                 m_fromname=StringFunctions::Replace(m_fromname,"\r\n","");\r
489                 // strip off everything between () and <> and any whitespace\r
490                 std::string::size_type startpos=m_fromname.find("(");\r
491                 std::string::size_type endpos;\r
492                 if(startpos!=std::string::npos)\r
493                 {\r
494                         endpos=m_fromname.find(")",startpos);\r
495                         if(endpos!=std::string::npos)\r
496                         {\r
497                                 m_fromname.erase(startpos,(endpos-startpos)+1);\r
498                         }\r
499                 }\r
500                 startpos=m_fromname.find("<");\r
501                 if(startpos!=std::string::npos)\r
502                 {\r
503                         endpos=m_fromname.find(">",startpos);\r
504                         if(endpos!=std::string::npos)\r
505                         {\r
506                                 m_fromname.erase(startpos,(endpos-startpos)+1);\r
507                         }\r
508                 }\r
509                 m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
510 \r
511                 // trim off " from beginning and end\r
512                 if(m_fromname.size()>0 && m_fromname[0]=='\"')\r
513                 {\r
514                         m_fromname.erase(0,1);\r
515                 }\r
516                 if(m_fromname.size()>0 && m_fromname[m_fromname.size()-1]=='\"')\r
517                 {\r
518                         m_fromname.erase(m_fromname.size()-1,1);\r
519                 }\r
520 \r
521                 m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
522         }\r
523         else\r
524         {\r
525                 m_fromname="Anonymous";\r
526         }\r
527         // get boards posted to\r
528         if(mime.GetFieldValue("Newsgroups"))\r
529         {\r
530                 std::string temp=mime.GetFieldValue("Newsgroups");\r
531                 // remove any path folding\r
532                 temp=StringFunctions::Replace(temp,"\r\n","");\r
533                 std::vector<std::string> parts;\r
534                 StringFunctions::SplitMultiple(temp,", \t",parts);\r
535                 for(std::vector<std::string>::iterator i=parts.begin(); i!=parts.end(); i++)\r
536                 {\r
537                         (*i)=StringFunctions::Replace((*i),"<","");\r
538                         (*i)=StringFunctions::Replace((*i),">","");\r
539                         (*i)=StringFunctions::TrimWhitespace((*i));\r
540                         if((*i)!="")\r
541                         {\r
542                                 m_boards.push_back((*i));\r
543                         }\r
544                 }\r
545         }\r
546         // followup-to board - must be done after board vector populated\r
547         if(mime.GetFieldValue("Followup-To"))\r
548         {\r
549                 m_replyboardname=mime.GetFieldValue("Followup-To");\r
550                 // remove any path folding\r
551                 m_replyboardname=StringFunctions::Replace(m_replyboardname,"\r\n","");\r
552         }\r
553         else\r
554         {\r
555                 if(m_boards.size()>0)\r
556                 {\r
557                         m_replyboardname=m_boards[0];\r
558                 }\r
559         }\r
560         // subject\r
561         if(mime.GetFieldValue("Subject"))\r
562         {\r
563                 m_subject=mime.GetFieldValue("Subject");\r
564                 // remove any path folding\r
565                 m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
566         }\r
567         else\r
568         {\r
569                 m_subject="No Subject";\r
570         }\r
571         // references\r
572         if(mime.GetFieldValue("References"))\r
573         {\r
574                 std::string temp=mime.GetFieldValue("References");\r
575                 // remove any path folding\r
576                 temp=StringFunctions::Replace(temp,"\r\n","");\r
577                 std::vector<std::string> parts;\r
578                 int count=0;\r
579                 StringFunctions::SplitMultiple(temp,", \t",parts);\r
580                 for(std::vector<std::string>::reverse_iterator i=parts.rbegin(); i!=parts.rend(); i++)\r
581                 {\r
582                         // get rid of < and > and any whitespace\r
583                         (*i)=StringFunctions::Replace((*i),"<","");\r
584                         (*i)=StringFunctions::Replace((*i),">","");\r
585                         (*i)=StringFunctions::TrimWhitespace((*i));\r
586                         /*\r
587                         // erase @ and everything after\r
588                         if((*i).find("@")!=std::string::npos)\r
589                         {\r
590                                 (*i).erase((*i).find("@"));\r
591                         }\r
592                         */\r
593                         // only erase after @ if message is old type with @freenetproject.org\r
594                         if((*i).find("@freenetproject.org")!=std::string::npos)\r
595                         {\r
596                                 (*i).erase((*i).find("@"));\r
597                         }\r
598                         if((*i)!="")\r
599                         {\r
600                                 m_inreplyto[count++]=(*i);\r
601                         }\r
602                 }\r
603         }\r
604 \r
605         CMimeBody::CBodyList mbl;\r
606         mime.GetBodyPartList(mbl);\r
607 \r
608         // append all text parts of nntp message to body\r
609         for(CMimeBody::CBodyList::iterator i=mbl.begin(); i!=mbl.end(); i++)\r
610         {\r
611                 if((*i)->IsText() && (*i)->GetContent())\r
612                 {\r
613                         m_body+=(char *)(*i)->GetContent();\r
614                 }\r
615         }\r
616 \r
617         return true;\r
618 }\r
619 \r
620 const bool Message::StartFreenetInsert()\r
621 {\r
622 \r
623         MessageXML xml;\r
624         int localidentityid=-1;\r
625 \r
626         xml.SetMessageID(m_messageuuid);\r
627         xml.SetSubject(m_subject);\r
628         xml.SetBody(m_body);\r
629         xml.SetReplyBoard(m_replyboardname);\r
630         xml.SetDate(m_datetime.Format("%Y-%m-%d"));\r
631         xml.SetTime(m_datetime.Format("%H:%M:%S"));\r
632         \r
633         StripAdministrationBoards();\r
634         for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
635         {\r
636                 xml.AddBoard((*i));\r
637         }\r
638         \r
639         for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)\r
640         {\r
641                 xml.AddInReplyTo((*j).first,(*j).second);\r
642         }\r
643 \r
644         // find identity to insert with\r
645         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity WHERE Name=?;");\r
646         st.Bind(0,m_fromname);\r
647         st.Step();\r
648 \r
649         // couldn't find identity with this name - insert a new identity\r
650         if(!st.RowReturned())\r
651         {\r
652                 if(m_addnewpostfromidentities==true)\r
653                 {\r
654                         DateTime now;\r
655                         now.SetToGMTime();\r
656                         st=m_db->Prepare("INSERT INTO tblLocalIdentity(Name) VALUES(?);");\r
657                         st.Bind(0,m_fromname);\r
658                         st.Step(true);\r
659                         localidentityid=st.GetLastInsertRowID();\r
660                 }\r
661                 else\r
662                 {\r
663                         return false;\r
664                 }\r
665         }\r
666         else\r
667         {\r
668                 st.ResultInt(0,localidentityid);\r
669         }\r
670 \r
671         st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,MessageUUID,MessageXML) VALUES(?,?,?);");\r
672         st.Bind(0,localidentityid);\r
673         st.Bind(1,m_messageuuid);\r
674         st.Bind(2,xml.GetXML());\r
675         st.Step();\r
676 \r
677         HandleChangeTrust();\r
678 \r
679         return true;\r
680 \r
681 }\r
682 \r
683 void Message::StripAdministrationBoards()\r
684 {\r
685         SQLite3DB::Statement st=m_db->Prepare("SELECT tblBoard.BoardID FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID WHERE BoardName=?;");\r
686         for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); )\r
687         {\r
688                 st.Bind(0,(*i));\r
689                 st.Step();\r
690                 if(st.RowReturned())\r
691                 {\r
692                         i=m_boards.erase(i);\r
693                 }\r
694                 else\r
695                 {\r
696                         i++;\r
697                 }\r
698                 st.Reset();\r
699         }\r
700 }\r