version 0.1.12
[fms.git] / src / freenet / messagexml.cpp
1 #include "../../include/freenet/messagexml.h"\r
2 \r
3 #ifdef XMEM\r
4         #include <xmem.h>\r
5 #endif\r
6 \r
7 MessageXML::MessageXML()\r
8 {\r
9         Initialize();\r
10 }\r
11 \r
12 std::string MessageXML::GetXML()\r
13 {\r
14         TiXmlDocument td;\r
15         TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
16         TiXmlElement *tid;\r
17         TiXmlPrinter tp;\r
18 \r
19         td.LinkEndChild(tdec);\r
20         tid=new TiXmlElement("Message");\r
21         td.LinkEndChild(tid);\r
22 \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
31 \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
35         {\r
36                 brds->LinkEndChild(XMLCreateCDATAElement("Board",(*i)));\r
37         }\r
38 \r
39         if(m_inreplyto.size()>0)\r
40         {\r
41                 TiXmlElement *rply=new TiXmlElement("InReplyTo");\r
42                 tid->LinkEndChild(rply);\r
43                 for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)\r
44                 {\r
45                         TiXmlElement *mess=new TiXmlElement("Message");\r
46                         rply->LinkEndChild(mess);\r
47                         mess->LinkEndChild(XMLCreateTextElement("Order",(*j).first));\r
48                         mess->LinkEndChild(XMLCreateCDATAElement("MessageID",(*j).second));\r
49                 }\r
50         }\r
51 \r
52         td.Accept(&tp);\r
53         return std::string(tp.CStr());\r
54 }\r
55 \r
56 void MessageXML::Initialize()\r
57 {\r
58         m_date="";\r
59         m_time="";\r
60         m_subject="";\r
61         m_boards.clear();\r
62         m_replyboard="";\r
63         m_inreplyto.clear();\r
64         m_body="";\r
65 }\r
66 \r
67 const bool MessageXML::ParseXML(const std::string &xml)\r
68 {\r
69         TiXmlDocument td;\r
70         td.Parse(xml.c_str());\r
71 \r
72         if(!td.Error())\r
73         {\r
74                 TiXmlHandle hnd(&td);\r
75                 TiXmlNode *node2;\r
76                 TiXmlText *txt;\r
77 \r
78                 Initialize();\r
79 \r
80                 txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText();\r
81                 if(txt)\r
82                 {\r
83                         m_date=txt->ValueStr();\r
84                 }\r
85                 txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText();\r
86                 if(txt)\r
87                 {\r
88                         m_time=txt->ValueStr();\r
89                 }\r
90                 txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText();\r
91                 if(txt)\r
92                 {\r
93                         m_subject=txt->ValueStr();\r
94                 }\r
95                 txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText();\r
96                 if(txt)\r
97                 {\r
98                         m_messageid=txt->ValueStr();\r
99                 }\r
100                 txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText();\r
101                 if(txt)\r
102                 {\r
103                         m_replyboard=txt->ValueStr();\r
104                 }\r
105                 txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText();\r
106                 if(txt)\r
107                 {\r
108                         m_body=txt->ValueStr();\r
109                 }\r
110 \r
111                 node2=hnd.FirstChild("Message").FirstChild("Boards").FirstChild("Board").ToNode();\r
112                 while(node2)\r
113                 {\r
114                         if(node2->FirstChild())\r
115                         {\r
116                                 m_boards.push_back(node2->FirstChild()->ValueStr());\r
117                         }\r
118                         node2=node2->NextSibling("Board");\r
119                 }\r
120 \r
121                 node2=hnd.FirstChild("Message").FirstChild("InReplyTo").FirstChild("Message").ToNode();\r
122                 while(node2)\r
123                 {\r
124                         std::string orderstr;\r
125                         long order=-1;\r
126                         std::string messageid="";\r
127                         TiXmlHandle hnd2(node2);\r
128                         txt=hnd2.FirstChild("Order").FirstChild().ToText();\r
129                         if(txt)\r
130                         {\r
131                                 orderstr=txt->ValueStr();\r
132                                 StringFunctions::Convert(orderstr,order);\r
133                         }\r
134                         txt=hnd2.FirstChild("MessageID").FirstChild().ToText();\r
135                         if(txt)\r
136                         {\r
137                                 messageid=txt->ValueStr();\r
138                         }\r
139 \r
140                         if(order!=-1 && messageid!="")\r
141                         {\r
142                                 m_inreplyto[order]=messageid;\r
143                         }\r
144 \r
145                         node2=node2->NextSibling("Message");\r
146                 }\r
147 \r
148                 return true;\r
149         }\r
150         else\r
151         {\r
152                 return false;\r
153         }\r
154 }\r