1 #include "../../include/freenet/messagexml.h"
\r
7 MessageXML::MessageXML()
\r
12 std::string MessageXML::GetXML()
\r
15 TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");
\r
19 td.LinkEndChild(tdec);
\r
20 tid=new TiXmlElement("Message");
\r
21 td.LinkEndChild(tid);
\r
23 tid->LinkEndChild(XMLCreateTextElement("Date",m_date));
\r
24 tid->LinkEndChild(XMLCreateTextElement("Time",m_time));
\r
25 tid->LinkEndChild(XMLCreateCDATAElement("Subject",m_subject));
\r
26 tid->LinkEndChild(XMLCreateCDATAElement("MessageID",m_messageid));
\r
27 tid->LinkEndChild(XMLCreateCDATAElement("ReplyBoard",m_replyboard));
\r
28 // a little hack because TinyXML doesn't handle ]]> inside a CDATA section - manually separate into multiple CDATA sections
\r
29 // TinyXML still won't be able to parse past the 1st CDATA section, but other implementations might
\r
30 tid->LinkEndChild(XMLCreateCDATAElement("Body",StringFunctions::Replace(m_body,"]]>","]]]]><![CDATA[>")));
\r
32 TiXmlElement *brds=new TiXmlElement("Boards");
\r
33 tid->LinkEndChild(brds);
\r
34 for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)
\r
36 std::string boardname=(*i);
\r
37 StringFunctions::Convert(boardname,boardname);
\r
38 brds->LinkEndChild(XMLCreateCDATAElement("Board",boardname));
\r
41 if(m_inreplyto.size()>0)
\r
43 TiXmlElement *rply=new TiXmlElement("InReplyTo");
\r
44 tid->LinkEndChild(rply);
\r
45 for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)
\r
47 TiXmlElement *mess=new TiXmlElement("Message");
\r
48 rply->LinkEndChild(mess);
\r
49 mess->LinkEndChild(XMLCreateTextElement("Order",(*j).first));
\r
50 mess->LinkEndChild(XMLCreateCDATAElement("MessageID",(*j).second));
\r
54 // add attachemnt node if we have attachments
\r
55 if(m_fileattachments.size()>0)
\r
57 TiXmlElement *attachments=new TiXmlElement("Attachments");
\r
58 tid->LinkEndChild(attachments);
\r
59 for(std::vector<fileattachment>::iterator j=m_fileattachments.begin(); j!=m_fileattachments.end(); j++)
\r
61 TiXmlElement *f=new TiXmlElement("File");
\r
62 attachments->LinkEndChild(f);
\r
63 f->LinkEndChild(XMLCreateCDATAElement("Key",(*j).m_key));
\r
64 f->LinkEndChild(XMLCreateTextElement("Size",(*j).m_size));
\r
69 return std::string(tp.CStr());
\r
72 void MessageXML::Initialize()
\r
79 m_inreplyto.clear();
\r
81 m_fileattachments.clear();
\r
84 const bool MessageXML::ParseXML(const std::string &xml)
\r
87 td.Parse(xml.c_str());
\r
91 TiXmlHandle hnd(&td);
\r
97 txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText();
\r
100 m_date=SanitizeSingleString(txt->ValueStr());
\r
102 txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText();
\r
105 m_time=SanitizeSingleString(txt->ValueStr());
\r
107 txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText();
\r
110 m_subject=SanitizeSingleString(txt->ValueStr());
\r
112 txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText();
\r
115 m_messageid=SanitizeSingleString(txt->ValueStr());
\r
117 txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText();
\r
120 m_replyboard=SanitizeSingleString(txt->ValueStr());
\r
121 StringFunctions::LowerCase(m_replyboard,m_replyboard);
\r
122 if(m_replyboard.size()>40)
\r
124 m_replyboard.erase(40);
\r
127 txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText();
\r
130 m_body=txt->ValueStr();
\r
133 node2=hnd.FirstChild("Message").FirstChild("Boards").FirstChild("Board").ToNode();
\r
136 if(node2->FirstChild())
\r
138 std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());
\r
139 StringFunctions::LowerCase(boardname,boardname);
\r
140 if(boardname.size()>40)
\r
142 boardname.erase(40);
\r
144 m_boards.push_back(boardname);
\r
146 node2=node2->NextSibling("Board");
\r
149 node2=hnd.FirstChild("Message").FirstChild("InReplyTo").FirstChild("Message").ToNode();
\r
152 std::string orderstr;
\r
154 std::string messageid="";
\r
155 TiXmlHandle hnd2(node2);
\r
156 txt=hnd2.FirstChild("Order").FirstChild().ToText();
\r
159 orderstr=SanitizeSingleString(txt->ValueStr());
\r
160 StringFunctions::Convert(orderstr,order);
\r
162 txt=hnd2.FirstChild("MessageID").FirstChild().ToText();
\r
165 messageid=SanitizeSingleString(txt->ValueStr());
\r
168 if(order!=-1 && messageid!="")
\r
170 m_inreplyto[order]=messageid;
\r
173 node2=node2->NextSibling("Message");
\r
176 node2=hnd.FirstChild("Message").FirstChild("Attachments").FirstChild("File").ToNode();
\r
179 std::string key="";
\r
180 std::string sizestr="-1";
\r
183 TiXmlHandle hnd2(node2);
\r
185 txt=hnd2.FirstChild("Key").FirstChild().ToText();
\r
188 key=SanitizeSingleString(txt->ValueStr());
\r
191 txt=hnd2.FirstChild("Size").FirstChild().ToText();
\r
194 sizestr=SanitizeSingleString(txt->ValueStr());
\r
195 StringFunctions::Convert(sizestr,size);
\r
198 if(key!="" && size>0)
\r
200 m_fileattachments.push_back(fileattachment(key,size));
\r
203 node2=node2->NextSibling("File");
\r