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
55 return std::string(tp.CStr());
\r
58 void MessageXML::Initialize()
\r
65 m_inreplyto.clear();
\r
69 const bool MessageXML::ParseXML(const std::string &xml)
\r
72 td.Parse(xml.c_str());
\r
76 TiXmlHandle hnd(&td);
\r
82 txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText();
\r
85 m_date=txt->ValueStr();
\r
87 txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText();
\r
90 m_time=txt->ValueStr();
\r
92 txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText();
\r
95 m_subject=txt->ValueStr();
\r
97 txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText();
\r
100 m_messageid=txt->ValueStr();
\r
102 txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText();
\r
105 m_replyboard=txt->ValueStr();
\r
106 StringFunctions::LowerCase(m_replyboard,m_replyboard);
\r
108 txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText();
\r
111 m_body=txt->ValueStr();
\r
114 node2=hnd.FirstChild("Message").FirstChild("Boards").FirstChild("Board").ToNode();
\r
117 if(node2->FirstChild())
\r
119 std::string boardname=node2->FirstChild()->ValueStr();
\r
120 StringFunctions::LowerCase(boardname,boardname);
\r
121 m_boards.push_back(boardname);
\r
123 node2=node2->NextSibling("Board");
\r
126 node2=hnd.FirstChild("Message").FirstChild("InReplyTo").FirstChild("Message").ToNode();
\r
129 std::string orderstr;
\r
131 std::string messageid="";
\r
132 TiXmlHandle hnd2(node2);
\r
133 txt=hnd2.FirstChild("Order").FirstChild().ToText();
\r
136 orderstr=txt->ValueStr();
\r
137 StringFunctions::Convert(orderstr,order);
\r
139 txt=hnd2.FirstChild("MessageID").FirstChild().ToText();
\r
142 messageid=txt->ValueStr();
\r
145 if(order!=-1 && messageid!="")
\r
147 m_inreplyto[order]=messageid;
\r
150 node2=node2->NextSibling("Message");
\r