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