version 0.2.0
[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                                         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=m_minlocalmessagetrust;\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         tempval="50";\r
292         Option::Instance()->Get("MinLocalMessageTrust",tempval);\r
293         StringFunctions::Convert(tempval,m_minlocalmessagetrust);\r
294         tempval="51";\r
295         Option::Instance()->Get("MinLocalTrustListTrust",tempval);\r
296         StringFunctions::Convert(tempval,m_minlocaltrustlisttrust);\r
297 }\r
298 \r
299 const bool Message::Load(const long messageid, const long boardid)\r
300 {\r
301         \r
302         Initialize();\r
303 \r
304         std::string sql;\r
305         \r
306         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
307         if(boardid!=-1)\r
308         {\r
309                 sql+=" AND tblMessageBoard.BoardID=?";\r
310         }\r
311         sql+=";";\r
312 \r
313         SQLite3DB::Statement st=m_db->Prepare(sql);\r
314         st.Bind(0,messageid);\r
315         if(boardid!=-1)\r
316         {\r
317                 st.Bind(1,boardid);\r
318         }\r
319         st.Step();\r
320 \r
321         if(st.RowReturned())\r
322         {\r
323                 std::string tempdate;\r
324                 std::string temptime;\r
325                 int tempint=-1;\r
326                 st.ResultInt(0,tempint);\r
327                 m_messageid=tempint;\r
328                 st.ResultText(1,m_messageuuid);\r
329                 st.ResultText(2,m_subject);\r
330                 st.ResultText(3,m_body);\r
331                 st.ResultText(4,m_replyboardname);\r
332                 st.ResultText(5,tempdate);\r
333                 st.ResultText(6,temptime);\r
334                 m_datetime.Set(tempdate + " " + temptime);\r
335                 st.ResultText(7,m_fromname);\r
336                 st.Finalize();\r
337 \r
338                 // strip off any \r\n in subject\r
339                 m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
340 \r
341                 // get board list\r
342                 st=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblMessageBoard.MessageID=?;");\r
343                 st.Bind(0,messageid);\r
344                 st.Step();\r
345                 while(st.RowReturned())\r
346                 {\r
347                         std::string tempval;\r
348                         st.ResultText(0,tempval);\r
349                         m_boards.push_back(tempval);\r
350                         st.Step();\r
351                 }\r
352                 st.Finalize();\r
353 \r
354                 // get in reply to list\r
355                 st=m_db->Prepare("SELECT ReplyToMessageUUID, ReplyOrder FROM tblMessageReplyTo INNER JOIN tblMessage ON tblMessageReplyTo.MessageID=tblMessage.MessageID WHERE tblMessage.MessageID=?;");\r
356                 st.Bind(0,messageid);\r
357                 st.Step();\r
358                 while(st.RowReturned())\r
359                 {\r
360                         std::string tempval;\r
361                         int tempint;\r
362                         st.ResultText(0,tempval);\r
363                         st.ResultInt(1,tempint);\r
364                         m_inreplyto[tempint]=tempval;\r
365                         st.Step();\r
366                 }\r
367                 st.Finalize();\r
368 \r
369                 return true;\r
370         }\r
371         else\r
372         {\r
373                 return false;\r
374         }\r
375 \r
376 }\r
377 \r
378 const bool Message::Load(const std::string &messageuuid)\r
379 {\r
380 \r
381         std::string uuid=messageuuid;\r
382 \r
383         if(uuid.size()>0 && uuid[0]=='<')\r
384         {\r
385                 uuid.erase(0,1);\r
386         }\r
387         if(uuid.size()>0 && uuid[uuid.size()-1]=='>')\r
388         {\r
389                 uuid.erase(uuid.size()-1);\r
390         }\r
391         if(uuid.find("@freenetproject.org")!=std::string::npos)\r
392         {\r
393                 uuid.erase(uuid.find("@freenetproject.org"));\r
394         }\r
395 \r
396         SQLite3DB::Statement st=m_db->Prepare("SELECT MessageID FROM tblMessage WHERE MessageUUID=?;");\r
397         st.Bind(0,uuid);\r
398         st.Step();\r
399 \r
400         if(st.RowReturned())\r
401         {\r
402                 int messageid;\r
403                 st.ResultInt(0,messageid);\r
404 \r
405                 return Load(messageid);\r
406         }\r
407         else\r
408         {\r
409                 return false;\r
410         }\r
411 }\r
412 \r
413 const bool Message::LoadNext(const long messageid, const long boardid)\r
414 {\r
415         std::string sql="SELECT tblMessage.MessageID FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID WHERE tblMessage.MessageID>?";\r
416         if(boardid!=-1)\r
417         {\r
418                 sql+=" AND tblMessageBoard.BoardID=?";\r
419         }\r
420         sql+=";";\r
421 \r
422         SQLite3DB::Statement st=m_db->Prepare(sql);\r
423 \r
424         st.Bind(0,messageid);\r
425         if(boardid!=-1)\r
426         {\r
427                 st.Bind(1,boardid);\r
428         }\r
429         st.Step();\r
430 \r
431         if(st.RowReturned())\r
432         {\r
433                 int result;\r
434                 st.ResultInt(0,result);\r
435                 return Load(result,boardid);\r
436         }\r
437         else\r
438         {\r
439                 return false;\r
440         }\r
441 }\r
442 \r
443 const bool Message::LoadPrevious(const long messageid, const long boardid)\r
444 {\r
445         std::string sql="SELECT tblMessage.MessageID FROM tblMessage INNER JOIN tblMessageBoard ON tblMessage.MessageID=tblMessageBoard.MessageID WHERE tblMessage.MessageID<?";\r
446         if(boardid!=-1)\r
447         {\r
448                 sql+=" AND tblMessageBoard.BoardID=?";\r
449         }\r
450         sql+=" ORDER BY tblMessage.MessageID DESC;";\r
451 \r
452         SQLite3DB::Statement st=m_db->Prepare(sql);\r
453 \r
454         st.Bind(0,messageid);\r
455         if(boardid!=-1)\r
456         {\r
457                 st.Bind(1,boardid);\r
458         }\r
459         st.Step();\r
460 \r
461         if(st.RowReturned())\r
462         {\r
463                 int result;\r
464                 st.ResultInt(0,result);\r
465                 return Load(result,boardid);\r
466         }\r
467         else\r
468         {\r
469                 return false;\r
470         }\r
471 }\r
472 \r
473 const bool Message::ParseNNTPMessage(const std::string &nntpmessage)\r
474 {\r
475 \r
476         Initialize();\r
477 \r
478         UUIDGenerator uuid;\r
479         CMimeMessage mime;\r
480         mime.Load(nntpmessage.c_str(),nntpmessage.size());\r
481 \r
482         // get header info\r
483         // date is always set to now regardless of what message has\r
484         m_datetime.SetToGMTime();\r
485 \r
486         // messageuuid is always a unique id we generate regardless of message message-id\r
487         m_messageuuid=uuid.Generate();\r
488         \r
489         // get from\r
490         if(mime.GetFieldValue("From"))\r
491         {\r
492                 m_fromname=mime.GetFieldValue("From");\r
493                 // remove any path folding\r
494                 m_fromname=StringFunctions::Replace(m_fromname,"\r\n","");\r
495                 // strip off everything between () and <> and any whitespace\r
496                 std::string::size_type startpos=m_fromname.find("(");\r
497                 std::string::size_type endpos;\r
498                 if(startpos!=std::string::npos)\r
499                 {\r
500                         endpos=m_fromname.find(")",startpos);\r
501                         if(endpos!=std::string::npos)\r
502                         {\r
503                                 m_fromname.erase(startpos,(endpos-startpos)+1);\r
504                         }\r
505                 }\r
506                 startpos=m_fromname.find("<");\r
507                 if(startpos!=std::string::npos)\r
508                 {\r
509                         endpos=m_fromname.find(">",startpos);\r
510                         if(endpos!=std::string::npos)\r
511                         {\r
512                                 m_fromname.erase(startpos,(endpos-startpos)+1);\r
513                         }\r
514                 }\r
515                 m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
516 \r
517                 // trim off " from beginning and end\r
518                 if(m_fromname.size()>0 && m_fromname[0]=='\"')\r
519                 {\r
520                         m_fromname.erase(0,1);\r
521                 }\r
522                 if(m_fromname.size()>0 && m_fromname[m_fromname.size()-1]=='\"')\r
523                 {\r
524                         m_fromname.erase(m_fromname.size()-1,1);\r
525                 }\r
526 \r
527                 m_fromname=StringFunctions::TrimWhitespace(m_fromname);\r
528         }\r
529         else\r
530         {\r
531                 m_fromname="Anonymous";\r
532         }\r
533         // get boards posted to\r
534         if(mime.GetFieldValue("Newsgroups"))\r
535         {\r
536                 std::string temp=mime.GetFieldValue("Newsgroups");\r
537                 // remove any path folding\r
538                 temp=StringFunctions::Replace(temp,"\r\n","");\r
539                 std::vector<std::string> parts;\r
540                 StringFunctions::SplitMultiple(temp,", \t",parts);\r
541                 for(std::vector<std::string>::iterator i=parts.begin(); i!=parts.end(); i++)\r
542                 {\r
543                         (*i)=StringFunctions::Replace((*i),"<","");\r
544                         (*i)=StringFunctions::Replace((*i),">","");\r
545                         (*i)=StringFunctions::TrimWhitespace((*i));\r
546                         if((*i)!="")\r
547                         {\r
548                                 m_boards.push_back((*i));\r
549                         }\r
550                 }\r
551         }\r
552         // followup-to board - must be done after board vector populated\r
553         if(mime.GetFieldValue("Followup-To"))\r
554         {\r
555                 m_replyboardname=mime.GetFieldValue("Followup-To");\r
556                 // remove any path folding\r
557                 m_replyboardname=StringFunctions::Replace(m_replyboardname,"\r\n","");\r
558         }\r
559         else\r
560         {\r
561                 if(m_boards.size()>0)\r
562                 {\r
563                         m_replyboardname=m_boards[0];\r
564                 }\r
565         }\r
566         // subject\r
567         if(mime.GetFieldValue("Subject"))\r
568         {\r
569                 m_subject=mime.GetFieldValue("Subject");\r
570                 // remove any path folding\r
571                 m_subject=StringFunctions::Replace(m_subject,"\r\n","");\r
572         }\r
573         else\r
574         {\r
575                 m_subject="No Subject";\r
576         }\r
577         // references\r
578         if(mime.GetFieldValue("References"))\r
579         {\r
580                 std::string temp=mime.GetFieldValue("References");\r
581                 // remove any path folding\r
582                 temp=StringFunctions::Replace(temp,"\r\n","");\r
583                 std::vector<std::string> parts;\r
584                 int count=0;\r
585                 StringFunctions::SplitMultiple(temp,", \t",parts);\r
586                 for(std::vector<std::string>::reverse_iterator i=parts.rbegin(); i!=parts.rend(); i++)\r
587                 {\r
588                         // get rid of < and > and any whitespace\r
589                         (*i)=StringFunctions::Replace((*i),"<","");\r
590                         (*i)=StringFunctions::Replace((*i),">","");\r
591                         (*i)=StringFunctions::TrimWhitespace((*i));\r
592                         /*\r
593                         // erase @ and everything after\r
594                         if((*i).find("@")!=std::string::npos)\r
595                         {\r
596                                 (*i).erase((*i).find("@"));\r
597                         }\r
598                         */\r
599                         // only erase after @ if message is old type with @freenetproject.org\r
600                         if((*i).find("@freenetproject.org")!=std::string::npos)\r
601                         {\r
602                                 (*i).erase((*i).find("@"));\r
603                         }\r
604                         if((*i)!="")\r
605                         {\r
606                                 m_inreplyto[count++]=(*i);\r
607                         }\r
608                 }\r
609         }\r
610 \r
611         CMimeBody::CBodyList mbl;\r
612         mime.GetBodyPartList(mbl);\r
613 \r
614         // append all text parts of nntp message to body\r
615         for(CMimeBody::CBodyList::iterator i=mbl.begin(); i!=mbl.end(); i++)\r
616         {\r
617                 if((*i)->IsText() && (*i)->GetContent())\r
618                 {\r
619                         m_body+=(char *)(*i)->GetContent();\r
620                 }\r
621         }\r
622 \r
623         return true;\r
624 }\r
625 \r
626 const bool Message::StartFreenetInsert()\r
627 {\r
628 \r
629         MessageXML xml;\r
630         int localidentityid=-1;\r
631 \r
632         xml.SetMessageID(m_messageuuid);\r
633         xml.SetSubject(m_subject);\r
634         xml.SetBody(m_body);\r
635         xml.SetReplyBoard(m_replyboardname);\r
636         xml.SetDate(m_datetime.Format("%Y-%m-%d"));\r
637         xml.SetTime(m_datetime.Format("%H:%M:%S"));\r
638         \r
639         StripAdministrationBoards();\r
640         for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
641         {\r
642                 xml.AddBoard((*i));\r
643         }\r
644         \r
645         for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)\r
646         {\r
647                 xml.AddInReplyTo((*j).first,(*j).second);\r
648         }\r
649 \r
650         // find identity to insert with\r
651         SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity WHERE Name=?;");\r
652         st.Bind(0,m_fromname);\r
653         st.Step();\r
654 \r
655         // couldn't find identity with this name - insert a new identity\r
656         if(!st.RowReturned())\r
657         {\r
658                 if(m_addnewpostfromidentities==true)\r
659                 {\r
660                         DateTime now;\r
661                         now.SetToGMTime();\r
662                         st=m_db->Prepare("INSERT INTO tblLocalIdentity(Name) VALUES(?);");\r
663                         st.Bind(0,m_fromname);\r
664                         st.Step(true);\r
665                         localidentityid=st.GetLastInsertRowID();\r
666                 }\r
667                 else\r
668                 {\r
669                         return false;\r
670                 }\r
671         }\r
672         else\r
673         {\r
674                 st.ResultInt(0,localidentityid);\r
675         }\r
676 \r
677         st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,MessageUUID,MessageXML) VALUES(?,?,?);");\r
678         st.Bind(0,localidentityid);\r
679         st.Bind(1,m_messageuuid);\r
680         st.Bind(2,xml.GetXML());\r
681         st.Step();\r
682 \r
683         HandleChangeTrust();\r
684 \r
685         return true;\r
686 \r
687 }\r
688 \r
689 void Message::StripAdministrationBoards()\r
690 {\r
691         SQLite3DB::Statement st=m_db->Prepare("SELECT tblBoard.BoardID FROM tblBoard INNER JOIN tblAdministrationBoard ON tblBoard.BoardID=tblAdministrationBoard.BoardID WHERE BoardName=?;");\r
692         for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); )\r
693         {\r
694                 st.Bind(0,(*i));\r
695                 st.Step();\r
696                 if(st.RowReturned())\r
697                 {\r
698                         i=m_boards.erase(i);\r
699                 }\r
700                 else\r
701                 {\r
702                         i++;\r
703                 }\r
704                 st.Reset();\r
705         }\r
706 }\r