version 0.2.4
[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=m_minlocalmessagetrust;\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=m_minlocaltrustlisttrust;\r
158                                         }\r
159 \r
160                                         origmessagetrust+=changemessagetrust;\r
161                                         origtrustlisttrust+=changetrustlisttrust;\r
162 \r
163                                         origmessagetrust<0 ? origmessagetrust=0 : false;\r
164                                         origmessagetrust>100 ? origmessagetrust=100 : false;\r
165                                         origtrustlisttrust<0 ? origtrustlisttrust=0 : false;\r
166                                         origtrustlisttrust>100 ? origtrustlisttrust=100 : false;\r
167 \r
168                                         // update new trust levels\r
169                                         SQLite3DB::Statement update=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=?, LocalTrustListTrust=? WHERE IdentityID=?;");\r
170                                         update.Bind(0,origmessagetrust);\r
171                                         update.Bind(1,origtrustlisttrust);\r
172                                         update.Bind(2,identityid);\r
173                                         update.Step();\r
174 \r
175                                         // insert message to show what id was changed and what current levels are\r
176                                         int lastid=0;\r
177                                         std::string messagebody;\r
178                                         std::string messagetruststr="";\r
179                                         std::string trustlisttruststr="";\r
180                                         UUIDGenerator uuid;\r
181                                         DateTime now;\r
182                                         now.SetToGMTime();\r
183                                         StringFunctions::Convert(origmessagetrust,messagetruststr);\r
184                                         StringFunctions::Convert(origtrustlisttrust,trustlisttruststr);\r
185                                         messagebody="Trust Changed for "+identityname+"\r\n";\r
186                                         messagebody+="Local Message Trust : "+messagetruststr+"\r\n";\r
187                                         messagebody+="Local Trust List Trust : "+trustlisttruststr+"\r\n";\r
188                                         SQLite3DB::Statement insert=m_db->Prepare("INSERT INTO tblMessage(FromName,MessageDate,MessageTime,Subject,MessageUUID,ReplyBoardID,Body) VALUES('FMS',?,?,?,?,?,?);");\r
189                                         insert.Bind(0,now.Format("%Y-%m-%d"));\r
190                                         insert.Bind(1,now.Format("%H:%M:%S"));\r
191                                         insert.Bind(2,identityname+" Trust Changed");\r
192                                         insert.Bind(3,uuid.Generate());\r
193                                         insert.Bind(4,boardid);\r
194                                         insert.Bind(5,messagebody);\r
195                                         insert.Step(true);\r
196                                         lastid=insert.GetLastInsertRowID();\r
197 \r
198                                         insert=m_db->Prepare("INSERT INTO tblMessageBoard(MessageID,BoardID) VALUES(?,?);");\r
199                                         insert.Bind(0,lastid);\r
200                                         insert.Bind(1,boardid);\r
201                                         insert.Step();\r
202 \r
203                                         m_log->WriteLog(LogFile::LOGLEVEL_DEBUG,"Message::HandleAdministrationMessage updated "+identityname+" to "+messagetruststr+" , "+trustlisttruststr);\r
204 \r
205                                 }\r
206                         }\r
207 \r
208                         st.Step();\r
209                 }\r
210         }\r
211 \r
212 }\r
213 \r
214 void Message::HandleChangeTrust()\r
215 {\r
216         if(m_changemessagetrustonreply!=0 && m_inreplyto.size()>0)\r
217         {\r
218                 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
219                 st.Bind(0,m_inreplyto[0]);\r
220                 st.Step();\r
221                 if(st.RowReturned())\r
222                 {\r
223                         int identityid=0;\r
224                         int localmessagetrust=0;\r
225 \r
226                         st.ResultInt(0,identityid);\r
227                         if(st.ResultNull(1)==false)\r
228                         {\r
229                                 st.ResultInt(1,localmessagetrust);\r
230                         }\r
231                         else\r
232                         {\r
233                                 localmessagetrust=m_minlocalmessagetrust;\r
234                         }\r
235 \r
236                         localmessagetrust+=m_changemessagetrustonreply;\r
237                         if(localmessagetrust<0)\r
238                         {\r
239                                 localmessagetrust=0;\r
240                         }\r
241                         if(localmessagetrust>100)\r
242                         {\r
243                                 localmessagetrust=100;\r
244                         }\r
245 \r
246                         SQLite3DB::Statement st2=m_db->Prepare("UPDATE tblIdentity SET LocalMessageTrust=? WHERE IdentityID=?;");\r
247                         st2.Bind(0,localmessagetrust);\r
248                         st2.Bind(1,identityid);\r
249                         st2.Step();\r
250 \r
251                 }\r
252         }\r
253 }\r
254 \r
255 void Message::Initialize()\r
256 {\r
257         std::string tempval="";\r
258         m_messageid=-1;\r
259         m_messageuuid="";\r
260         m_subject="";\r
261         m_body="";\r
262         m_replyboardname="";\r
263         m_datetime.Set();\r
264         m_fromname="";\r
265         m_boards.clear();\r
266         m_inreplyto.clear();\r
267         m_changemessagetrustonreply=0;\r
268         Option::Instance()->Get("ChangeMessageTrustOnReply",tempval);\r
269         StringFunctions::Convert(tempval,m_changemessagetrustonreply);\r
270         Option::Instance()->Get("AddNewPostFromIdentities",tempval);\r
271         if(tempval=="true")\r
272         {\r
273                 m_addnewpostfromidentities=true;\r
274         }\r
275         else\r
276         {\r
277                 m_addnewpostfromidentities=false;\r
278         }\r
279         tempval="50";\r
280         Option::Instance()->Get("MinLocalMessageTrust",tempval);\r
281         StringFunctions::Convert(tempval,m_minlocalmessagetrust);\r
282         tempval="51";\r
283         Option::Instance()->Get("MinLocalTrustListTrust",tempval);\r
284         StringFunctions::Convert(tempval,m_minlocaltrustlisttrust);\r
285 }\r
286 \r
287 const bool Message::Load(const long messageid, const long boardid)\r
288 {\r
289         \r
290         Initialize();\r
291 \r
292         std::string sql;\r
293         \r
294         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
295         if(boardid!=-1)\r
296         {\r
297                 sql+=" AND tblMessageBoard.BoardID=?";\r
298         }\r
299         sql+=";";\r
300 \r
301         SQLite3DB::Statement st=m_db->Prepare(sql);\r
302         st.Bind(0,messageid);\r
303         if(boardid!=-1)\r
304         {\r
305                 st.Bind(1,boardid);\r
306         }\r
307         st.Step();\r
308 \r
309         if(st.RowReturned())\r
310         {\r
311                 std::string tempdate;\r
312                 std::string temptime;\r
313                 int tempint=-1;\r
314                 st.ResultInt(0,tempint);\r
315                 m_messageid=tempint;\r
316                 st.ResultText(1,m_messageuuid);\r
317                 st.ResultText(2,m_subject);\r
318                 st.ResultText(3,m_body);\r
319                 st.ResultText(4,m_replyboardname);\r
320                 st.ResultText(5,tempdate);\r
321                 st.ResultText(6,temptime);\r
322                 m_datetime.Set(tempdate + " " + temptime);\r
323                 st.ResultText(7,m_fromname);\r
324                 st.Finalize();\r
325 \r
326                 // strip off any \r\n in subject\r
327                 m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
328 \r
329                 // get board list\r
330                 st=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblMessageBoard.MessageID=?;");\r
331                 st.Bind(0,messageid);\r
332                 st.Step();\r
333                 while(st.RowReturned())\r
334                 {\r
335                         std::string tempval;\r
336                         st.ResultText(0,tempval);\r
337                         m_boards.push_back(tempval);\r
338                         st.Step();\r
339                 }\r
340                 st.Finalize();\r
341 \r
342                 // get in reply to list\r
343                 st=m_db->Prepare("SELECT ReplyToMessageUUID, ReplyOrder FROM tblMessageReplyTo INNER JOIN tblMessage ON tblMessageReplyTo.MessageID=tblMessage.MessageID WHERE tblMessage.MessageID=?;");\r
344                 st.Bind(0,messageid);\r
345                 st.Step();\r
346                 while(st.RowReturned())\r
347                 {\r
348                         std::string tempval;\r
349                         int tempint;\r
350                         st.ResultText(0,tempval);\r
351                         st.ResultInt(1,tempint);\r
352                         m_inreplyto[tempint]=tempval;\r
353                         st.Step();\r
354                 }\r
355                 st.Finalize();\r
356 \r
357                 return true;\r
358         }\r
359         else\r
360         {\r
361                 return false;\r
362         }\r
363 \r
364 }\r
365 \r
366 const bool Message::Load(const std::string &messageuuid)\r
367 {\r
368 \r
369         std::string uuid=messageuuid;\r
370 \r
371         if(uuid.size()>0 && uuid[0]=='<')\r
372         {\r
373                 uuid.erase(0,1);\r
374         }\r
375         if(uuid.size()>0 && uuid[uuid.size()-1]=='>')\r
376         {\r
377                 uuid.erase(uuid.size()-1);\r
378         }\r
379         if(uuid.find("@freenetproject.org")!=std::string::npos)\r
380         {\r
381                 uuid.erase(uuid.find("@freenetproject.org"));\r
382         }\r
383 \r
384         SQLite3DB::Statement st=m_db->Prepare("SELECT MessageID FROM tblMessage WHERE MessageUUID=?;");\r
385         st.Bind(0,uuid);\r
386         st.Step();\r
387 \r
388         if(st.RowReturned())\r
389         {\r
390                 int messageid;\r
391                 st.ResultInt(0,messageid);\r
392 \r
393                 return Load(messageid);\r
394         }\r
395         else\r
396         {\r
397                 return false;\r
398         }\r
399 }\r
400 \r
401 const bool Message::LoadNext(const long messageid, const long boardid)\r
402 {\r
403         std::string sql="SELECT tblMessage.MessageID FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID WHERE tblMessage.MessageID>?";\r
404         if(boardid!=-1)\r
405         {\r
406                 sql+=" AND tblMessageBoard.BoardID=?";\r
407         }\r
408         sql+=";";\r
409 \r
410         SQLite3DB::Statement st=m_db->Prepare(sql);\r
411 \r
412         st.Bind(0,messageid);\r
413         if(boardid!=-1)\r
414         {\r
415                 st.Bind(1,boardid);\r
416         }\r
417         st.Step();\r
418 \r
419         if(st.RowReturned())\r
420         {\r
421                 int result;\r
422                 st.ResultInt(0,result);\r
423                 return Load(result,boardid);\r
424         }\r
425         else\r
426         {\r
427                 return false;\r
428         }\r
429 }\r
430 \r
431 const bool Message::LoadPrevious(const long messageid, const long boardid)\r
432 {\r
433         std::string sql="SELECT tblMessage.MessageID FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID WHERE tblMessage.MessageID<?";\r
434         if(boardid!=-1)\r
435         {\r
436                 sql+=" AND tblMessageBoard.BoardID=?";\r
437         }\r
438         sql+=" ORDER BY tblMessage.MessageID DESC;";\r
439 \r
440         SQLite3DB::Statement st=m_db->Prepare(sql);\r
441 \r
442         st.Bind(0,messageid);\r
443         if(boardid!=-1)\r
444         {\r
445                 st.Bind(1,boardid);\r
446         }\r
447         st.Step();\r
448 \r
449         if(st.RowReturned())\r
450         {\r
451                 int result;\r
452                 st.ResultInt(0,result);\r
453                 return Load(result,boardid);\r
454         }\r
455         else\r
456         {\r
457                 return false;\r
458         }\r
459 }\r
460 \r
461 const bool Message::ParseNNTPMessage(const std::string &nntpmessage)\r
462 {\r
463 \r
464         Initialize();\r
465 \r
466         UUIDGenerator uuid;\r
467         CMimeMessage mime;\r
468         mime.Load(nntpmessage.c_str(),nntpmessage.size());\r
469 \r
470         // get header info\r
471         // date is always set to now regardless of what message has\r
472         m_datetime.SetToGMTime();\r
473 \r
474         // messageuuid is always a unique id we generate regardless of message message-id\r
475         m_messageuuid=uuid.Generate();\r
476         \r
477         // get from\r
478         if(mime.GetFieldValue("From"))\r
479         {\r
480                 m_fromname=mime.GetFieldValue("From");\r
481                 // remove any path folding\r
482                 m_fromname=StringFunctions::Replace(m_fromname,"\r\n","");\r
483                 // strip off everything between () and <> and any whitespace\r
484                 std::string::size_type startpos=m_fromname.find("(");\r
485                 std::string::size_type endpos;\r
486                 if(startpos!=std::string::npos)\r
487                 {\r
488                         endpos=m_fromname.find(")",startpos);\r
489                         if(endpos!=std::string::npos)\r
490                         {\r
491                                 m_fromname.erase(startpos,(endpos-startpos)+1);\r
492                         }\r
493                 }\r
494                 startpos=m_fromname.find("<");\r
495                 if(startpos!=std::string::npos)\r
496                 {\r
497                         endpos=m_fromname.find(">",startpos);\r
498                         if(endpos!=std::string::npos)\r
499                         {\r
500                                 m_fromname.erase(startpos,(endpos-startpos)+1);\r
501                         }\r
502                 }\r
503                 m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
504 \r
505                 // trim off " from beginning and end\r
506                 if(m_fromname.size()>0 && m_fromname[0]=='\"')\r
507                 {\r
508                         m_fromname.erase(0,1);\r
509                 }\r
510                 if(m_fromname.size()>0 && m_fromname[m_fromname.size()-1]=='\"')\r
511                 {\r
512                         m_fromname.erase(m_fromname.size()-1,1);\r
513                 }\r
514 \r
515                 m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
516         }\r
517         else\r
518         {\r
519                 m_fromname="Anonymous";\r
520         }\r
521         // get boards posted to\r
522         if(mime.GetFieldValue("Newsgroups"))\r
523         {\r
524                 std::string temp=mime.GetFieldValue("Newsgroups");\r
525                 // remove any path folding\r
526                 temp=StringFunctions::Replace(temp,"\r\n","");\r
527                 std::vector<std::string> parts;\r
528                 StringFunctions::SplitMultiple(temp,", \t",parts);\r
529                 for(std::vector<std::string>::iterator i=parts.begin(); i!=parts.end(); i++)\r
530                 {\r
531                         (*i)=StringFunctions::Replace((*i),"<","");\r
532                         (*i)=StringFunctions::Replace((*i),">","");\r
533                         (*i)=StringFunctions::TrimWhitespace((*i));\r
534                         if((*i)!="")\r
535                         {\r
536                                 m_boards.push_back((*i));\r
537                         }\r
538                 }\r
539         }\r
540         // followup-to board - must be done after board vector populated\r
541         if(mime.GetFieldValue("Followup-To"))\r
542         {\r
543                 m_replyboardname=mime.GetFieldValue("Followup-To");\r
544                 // remove any path folding\r
545                 m_replyboardname=StringFunctions::Replace(m_replyboardname,"\r\n","");\r
546         }\r
547         else\r
548         {\r
549                 if(m_boards.size()>0)\r
550                 {\r
551                         m_replyboardname=m_boards[0];\r
552                 }\r
553         }\r
554         // subject\r
555         if(mime.GetFieldValue("Subject"))\r
556         {\r
557                 m_subject=mime.GetFieldValue("Subject");\r
558                 // remove any path folding\r
559                 m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
560         }\r
561         else\r
562         {\r
563                 m_subject="No Subject";\r
564         }\r
565         // references\r
566         if(mime.GetFieldValue("References"))\r
567         {\r
568                 std::string temp=mime.GetFieldValue("References");\r
569                 // remove any path folding\r
570                 temp=StringFunctions::Replace(temp,"\r\n","");\r
571                 std::vector<std::string> parts;\r
572                 int count=0;\r
573                 StringFunctions::SplitMultiple(temp,", \t",parts);\r
574                 for(std::vector<std::string>::reverse_iterator i=parts.rbegin(); i!=parts.rend(); i++)\r
575                 {\r
576                         // get rid of < and > and any whitespace\r
577                         (*i)=StringFunctions::Replace((*i),"<","");\r
578                         (*i)=StringFunctions::Replace((*i),">","");\r
579                         (*i)=StringFunctions::TrimWhitespace((*i));\r
580                         /*\r
581                         // erase @ and everything after\r
582                         if((*i).find("@")!=std::string::npos)\r
583                         {\r
584                                 (*i).erase((*i).find("@"));\r
585                         }\r
586                         */\r
587                         // only erase after @ if message is old type with @freenetproject.org\r
588                         if((*i).find("@freenetproject.org")!=std::string::npos)\r
589                         {\r
590                                 (*i).erase((*i).find("@"));\r
591                         }\r
592                         if((*i)!="")\r
593                         {\r
594                                 m_inreplyto[count++]=(*i);\r
595                         }\r
596                 }\r
597         }\r
598 \r
599         CMimeBody::CBodyList mbl;\r
600         mime.GetBodyPartList(mbl);\r
601 \r
602         // append all text parts of nntp message to body\r
603         for(CMimeBody::CBodyList::iterator i=mbl.begin(); i!=mbl.end(); i++)\r
604         {\r
605                 if((*i)->IsText() && (*i)->GetContent())\r
606                 {\r
607                         m_body+=(char *)(*i)->GetContent();\r
608                 }\r
609         }\r
610 \r
611         return true;\r
612 }\r
613 \r
614 const bool Message::StartFreenetInsert()\r
615 {\r
616 \r
617         MessageXML xml;\r
618         int localidentityid=-1;\r
619 \r
620         xml.SetMessageID(m_messageuuid);\r
621         xml.SetSubject(m_subject);\r
622         xml.SetBody(m_body);\r
623         xml.SetReplyBoard(m_replyboardname);\r
624         xml.SetDate(m_datetime.Format("%Y-%m-%d"));\r
625         xml.SetTime(m_datetime.Format("%H:%M:%S"));\r
626         \r
627         StripAdministrationBoards();\r
628         for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
629         {\r
630                 xml.AddBoard((*i));\r
631         }\r
632         \r
633         for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)\r
634         {\r
635                 xml.AddInReplyTo((*j).first,(*j).second);\r
636         }\r
637 \r
638         // find identity to insert with\r
639         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity WHERE Name=?;");\r
640         st.Bind(0,m_fromname);\r
641         st.Step();\r
642 \r
643         // couldn't find identity with this name - insert a new identity\r
644         if(!st.RowReturned())\r
645         {\r
646                 if(m_addnewpostfromidentities==true)\r
647                 {\r
648                         DateTime now;\r
649                         now.SetToGMTime();\r
650                         st=m_db->Prepare("INSERT INTO tblLocalIdentity(Name) VALUES(?);");\r
651                         st.Bind(0,m_fromname);\r
652                         st.Step(true);\r
653                         localidentityid=st.GetLastInsertRowID();\r
654                 }\r
655                 else\r
656                 {\r
657                         return false;\r
658                 }\r
659         }\r
660         else\r
661         {\r
662                 st.ResultInt(0,localidentityid);\r
663         }\r
664 \r
665         st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,MessageUUID,MessageXML) VALUES(?,?,?);");\r
666         st.Bind(0,localidentityid);\r
667         st.Bind(1,m_messageuuid);\r
668         st.Bind(2,xml.GetXML());\r
669         st.Step();\r
670 \r
671         HandleChangeTrust();\r
672 \r
673         return true;\r
674 \r
675 }\r
676 \r
677 void Message::StripAdministrationBoards()\r
678 {\r
679         SQLite3DB::Statement st=m_db->Prepare("SELECT tblBoard.BoardID FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID WHERE BoardName=?;");\r
680         for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); )\r
681         {\r
682                 st.Bind(0,(*i));\r
683                 st.Step();\r
684                 if(st.RowReturned())\r
685                 {\r
686                         i=m_boards.erase(i);\r
687                 }\r
688                 else\r
689                 {\r
690                         i++;\r
691                 }\r
692                 st.Reset();\r
693         }\r
694 }\r