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
18 Message::Message(const long messageid)
\r
23 const std::string Message::GetNNTPArticleID() const
\r
25 return "<"+m_messageuuid+">";
\r
28 const std::string Message::GetNNTPBody() const
\r
33 const std::string Message::GetNNTPHeaders() const
\r
35 std::string rval("");
\r
37 rval+="From: "+m_fromname+"\r\n";
\r
38 rval+="Newsgroups: ";
\r
39 for(std::vector<std::string>::const_iterator i=m_boards.begin(); i!=m_boards.end(); i++)
\r
41 if(i!=m_boards.begin())
\r
48 rval+="Subject: "+m_subject+"\r\n";
\r
49 // format time as : Wdy, DD Mon YY HH:MM:SS TIMEZONE
\r
50 rval+="Date: "+m_datetime.Format("%a, %d %b %y %H:%M:%S -0000")+"\r\n";
\r
51 if(m_inreplyto.size()>0)
\r
53 rval+="References: ";
\r
54 for(std::map<long,std::string>::const_reverse_iterator j=m_inreplyto.rbegin(); j!=m_inreplyto.rend(); j++)
\r
56 if(j!=m_inreplyto.rend())
\r
60 rval+="<"+(*j).second+">";
\r
64 rval+="Followup-To: "+m_replyboardname+"\r\n";
\r
65 rval+="Path: freenet\r\n";
\r
66 rval+="Message-ID: "+GetNNTPArticleID()+"\r\n";
\r
67 rval+="Content-Type: text/plain; charset=UTF-8\r\n";
\r
72 void Message::Initialize()
\r
78 m_replyboardname="";
\r
82 m_inreplyto.clear();
\r
85 const bool Message::Load(const long messageid, const long boardid)
\r
92 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
95 sql+=" AND tblMessageBoard.BoardID=?";
\r
99 SQLite3DB::Statement st=m_db->Prepare(sql);
\r
100 st.Bind(0,messageid);
\r
103 st.Bind(1,boardid);
\r
107 if(st.RowReturned())
\r
109 std::string tempdate;
\r
110 std::string temptime;
\r
112 st.ResultInt(0,tempint);
\r
113 m_messageid=tempint;
\r
114 st.ResultText(1,m_messageuuid);
\r
115 st.ResultText(2,m_subject);
\r
116 st.ResultText(3,m_body);
\r
117 st.ResultText(4,m_replyboardname);
\r
118 st.ResultText(5,tempdate);
\r
119 st.ResultText(6,temptime);
\r
120 m_datetime.Set(tempdate + " " + temptime);
\r
121 st.ResultText(7,m_fromname);
\r
125 st=m_db->Prepare("SELECT tblBoard.BoardName FROM tblBoard INNER JOIN tblMessageBoard ON tblBoard.BoardID=tblMessageBoard.BoardID WHERE tblMessageBoard.MessageID=?;");
\r
126 st.Bind(0,messageid);
\r
128 while(st.RowReturned())
\r
130 std::string tempval;
\r
131 st.ResultText(0,tempval);
\r
132 m_boards.push_back(tempval);
\r
137 // get in reply to list
\r
138 st=m_db->Prepare("SELECT ReplyToMessageUUID, ReplyOrder FROM tblMessageReplyTo INNER JOIN tblMessage ON tblMessageReplyTo.MessageID=tblMessage.MessageID WHERE tblMessage.MessageID=?;");
\r
139 st.Bind(0,messageid);
\r
141 while(st.RowReturned())
\r
143 std::string tempval;
\r
145 st.ResultText(0,tempval);
\r
146 st.ResultInt(1,tempint);
\r
147 m_inreplyto[tempint]=tempval;
\r
161 const bool Message::Load(const std::string &messageuuid)
\r
163 SQLite3DB::Statement st=m_db->Prepare("SELECT MessageID FROM tblMessage WHERE MessageUUID=?;");
\r
164 st.Bind(0,messageuuid);
\r
167 if(st.RowReturned())
\r
170 st.ResultInt(0,messageid);
\r
172 return Load(messageid);
\r
180 const bool Message::LoadNext(const long messageid, const long boardid)
\r
182 std::string sql="SELECT MessageID FROM tblMessage WHERE MessageID>?";
\r
185 sql+=" AND BoardID=?";
\r
189 SQLite3DB::Statement st=m_db->Prepare(sql);
\r
191 st.Bind(0,messageid);
\r
194 st.Bind(1,boardid);
\r
198 if(st.RowReturned())
\r
201 st.ResultInt(0,result);
\r
202 return Load(result,boardid);
\r
210 const bool Message::LoadPrevious(const long messageid, const long boardid)
\r
212 std::string sql="SELECT MessageID FROM tblMessage WHERE MessageID<?";
\r
215 sql+=" AND BoardID=?";
\r
219 SQLite3DB::Statement st=m_db->Prepare(sql);
\r
221 st.Bind(0,messageid);
\r
224 st.Bind(1,boardid);
\r
228 if(st.RowReturned())
\r
231 st.ResultInt(0,result);
\r
232 return Load(result,boardid);
\r
240 const bool Message::ParseNNTPMessage(const std::string &nntpmessage)
\r
245 UUIDGenerator uuid;
\r
247 mime.Load(nntpmessage.c_str(),nntpmessage.size());
\r
250 // date is always set to now regardless of what message has
\r
251 m_datetime.SetToGMTime();
\r
252 // messageuuid is always a unique id we generate regardless of message message-id
\r
253 m_messageuuid=uuid.Generate();
\r
255 if(mime.GetFieldValue("From"))
\r
257 m_fromname=mime.GetFieldValue("From");
\r
258 // strip off everything between () and <> and any whitespace
\r
259 std::string::size_type startpos=m_fromname.find("(");
\r
260 std::string::size_type endpos;
\r
261 if(startpos!=std::string::npos)
\r
263 endpos=m_fromname.find(")",startpos);
\r
264 if(endpos!=std::string::npos)
\r
266 m_fromname.erase(startpos,(endpos-startpos)+1);
\r
269 startpos=m_fromname.find("<");
\r
270 if(startpos!=std::string::npos)
\r
272 endpos=m_fromname.find(">",startpos);
\r
273 if(endpos!=std::string::npos)
\r
275 m_fromname.erase(startpos,(endpos-startpos)+1);
\r
278 m_fromname=StringFunctions::TrimWhitespace(m_fromname);
\r
282 m_fromname="Anonymous";
\r
284 // get boards posted to
\r
285 if(mime.GetFieldValue("Newsgroups"))
\r
287 std::string temp=mime.GetFieldValue("Newsgroups");
\r
288 std::vector<std::string> parts;
\r
289 StringFunctions::SplitMultiple(temp,", \t",parts);
\r
290 for(std::vector<std::string>::iterator i=parts.begin(); i!=parts.end(); i++)
\r
292 (*i)=StringFunctions::Replace((*i),"<","");
\r
293 (*i)=StringFunctions::Replace((*i),">","");
\r
294 (*i)=StringFunctions::TrimWhitespace((*i));
\r
297 m_boards.push_back((*i));
\r
301 // followup-to board - must be done after board vector populated
\r
302 if(mime.GetFieldValue("Followup-To"))
\r
304 m_replyboardname=mime.GetFieldValue("Followup-To");
\r
308 if(m_boards.size()>0)
\r
310 m_replyboardname=m_boards[0];
\r
314 if(mime.GetFieldValue("Subject"))
\r
316 m_subject=mime.GetFieldValue("Subject");
\r
320 m_subject="No Subject";
\r
323 if(mime.GetFieldValue("References"))
\r
325 std::string temp=mime.GetFieldValue("References");
\r
326 std::vector<std::string> parts;
\r
328 StringFunctions::SplitMultiple(temp,", \t",parts);
\r
329 for(std::vector<std::string>::reverse_iterator i=parts.rbegin(); i!=parts.rend(); i++)
\r
331 (*i)=StringFunctions::Replace((*i),"<","");
\r
332 (*i)=StringFunctions::Replace((*i),">","");
\r
333 (*i)=StringFunctions::TrimWhitespace((*i));
\r
336 m_inreplyto[count++]=(*i);
\r
341 CMimeBody::CBodyList mbl;
\r
342 mime.GetBodyPartList(mbl);
\r
344 // append all text parts of nntp message to body
\r
345 for(CMimeBody::CBodyList::iterator i=mbl.begin(); i!=mbl.end(); i++)
\r
347 if((*i)->IsText() && (*i)->GetContent())
\r
349 m_body+=(char *)(*i)->GetContent();
\r
356 void Message::StartFreenetInsert()
\r
359 int localidentityid=-1;
\r
361 xml.SetMessageID(m_messageuuid);
\r
362 xml.SetSubject(m_subject);
\r
363 xml.SetBody(m_body);
\r
364 xml.SetReplyBoard(m_replyboardname);
\r
365 xml.SetDate(m_datetime.Format("%Y-%m-%d"));
\r
366 xml.SetTime(m_datetime.Format("%H:%M:%S"));
\r
368 for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)
\r
370 xml.AddBoard((*i));
\r
373 for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)
\r
375 xml.AddInReplyTo((*j).first,(*j).second);
\r
378 // find identity to insert with
\r
379 SQLite3DB::Statement st=m_db->Prepare("SELECT LocalIdentityID FROM tblLocalIdentity WHERE Name=?;");
\r
380 st.Bind(0,m_fromname);
\r
383 // couldn't find identity with this name - insert a new identity
\r
384 if(!st.RowReturned())
\r
388 st=m_db->Prepare("INSERT INTO tblLocalIdentity(Name) VALUES(?);");
\r
389 st.Bind(0,m_fromname);
\r
391 localidentityid=st.GetLastInsertRowID();
\r
395 st.ResultInt(0,localidentityid);
\r
398 st=m_db->Prepare("INSERT INTO tblMessageInserts(LocalIdentityID,MessageUUID,MessageXML) VALUES(?,?,?);");
\r
399 st.Bind(0,localidentityid);
\r
400 st.Bind(1,m_messageuuid);
\r
401 st.Bind(2,xml.GetXML());
\r