version 0.3.33
[fms.git] / src / freenet / messagelistxml.cpp
1 #include "../../include/freenet/messagelistxml.h"\r
2 \r
3 #ifdef XMEM\r
4         #include <xmem.h>\r
5 #endif\r
6 \r
7 MessageListXML::MessageListXML()\r
8 {\r
9         Initialize();\r
10 }\r
11 \r
12 void MessageListXML::AddMessage(const std::string &date, const long index, const std::vector<std::string> &boards)\r
13 {\r
14         m_messages.push_back(message(date,index,boards));\r
15 }\r
16 \r
17 void MessageListXML::AddExternalMessage(const std::string &identity, const std::string &date, const long index, const std::vector<std::string> &boards)\r
18 {\r
19         m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
20 }\r
21 \r
22 void MessageListXML::AddExternalMessage(const std::string &messagekey, const std::string &date, const std::vector<std::string> &boards)\r
23 {\r
24         m_externalmessages.push_back(externalmessage("Anonymous",messagekey,date,boards));\r
25 }\r
26 \r
27 std::vector<std::string> MessageListXML::GetBoards(const long index)\r
28 {\r
29         if(index>=0 && index<m_messages.size())\r
30         {\r
31                 return m_messages[index].m_boards;\r
32         }\r
33         else\r
34         {\r
35                 return std::vector<std::string>();\r
36         }\r
37 }\r
38 \r
39 std::string MessageListXML::GetDate(const long index)\r
40 {\r
41         if(index>=0 && index<m_messages.size())\r
42         {\r
43                 return m_messages[index].m_date;\r
44         }\r
45         else\r
46         {\r
47                 return "";\r
48         }\r
49 }\r
50 \r
51 std::vector<std::string> MessageListXML::GetExternalBoards(const long index)\r
52 {\r
53         if(index>=0 && index<m_externalmessages.size())\r
54         {\r
55                 return m_externalmessages[index].m_boards;\r
56         }\r
57         else\r
58         {\r
59                 return std::vector<std::string>();\r
60         }\r
61 }\r
62 \r
63 std::string MessageListXML::GetExternalDate(const long index)\r
64 {\r
65         if(index>=0 && index<m_externalmessages.size())\r
66         {\r
67                 return m_externalmessages[index].m_date;\r
68         }\r
69         else\r
70         {\r
71                 return "";\r
72         }\r
73 }\r
74 \r
75 std::string MessageListXML::GetExternalIdentity(const long index)\r
76 {\r
77         if(index>=0 && index<m_externalmessages.size())\r
78         {\r
79                 return m_externalmessages[index].m_identity;\r
80         }\r
81         else\r
82         {\r
83                 return "";\r
84         }\r
85 }\r
86 \r
87 const long MessageListXML::GetExternalIndex(const long index)\r
88 {\r
89         if(index>=0 && index<m_externalmessages.size())\r
90         {\r
91                 return m_externalmessages[index].m_index;\r
92         }\r
93         else\r
94         {\r
95                 return-1;\r
96         }\r
97 }\r
98 \r
99 std::string MessageListXML::GetExternalMessageKey(const long index)\r
100 {\r
101         if(index>=0 && index<m_externalmessages.size())\r
102         {\r
103                 return m_externalmessages[index].m_messagekey;\r
104         }\r
105         else\r
106         {\r
107                 return "";\r
108         }\r
109 }\r
110 \r
111 std::string MessageListXML::GetExternalType(const long index)\r
112 {\r
113         if(index>=0 && index<m_externalmessages.size())\r
114         {\r
115                 return m_externalmessages[index].m_type;\r
116         }\r
117         else\r
118         {\r
119                 return "";\r
120         }\r
121 }\r
122 \r
123 const long MessageListXML::GetIndex(const long index)\r
124 {\r
125         if(index>=0 && index<m_messages.size())\r
126         {\r
127                 return m_messages[index].m_index;\r
128         }\r
129         else\r
130         {\r
131                 return -1;\r
132         }\r
133 }\r
134 \r
135 std::string MessageListXML::GetXML()\r
136 {\r
137         Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
138         Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("MessageList");\r
139 \r
140         doc->appendChild(root);\r
141 \r
142         for(std::vector<message>::iterator i=m_messages.begin(); i!=m_messages.end(); i++)\r
143         {\r
144                 Poco::AutoPtr<Poco::XML::Element> tr=doc->createElement("Message");\r
145                 root->appendChild(tr);\r
146                 tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
147                 tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
148                 \r
149                 Poco::AutoPtr<Poco::XML::Element> boards=doc->createElement("Boards");\r
150                 tr->appendChild(boards);\r
151                 for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
152                 {\r
153                         boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
154                 }\r
155         }\r
156 \r
157         for(std::vector<externalmessage>::iterator i=m_externalmessages.begin(); i!=m_externalmessages.end(); i++)\r
158         {\r
159                 Poco::AutoPtr<Poco::XML::Element> tr=doc->createElement("ExternalMessage");\r
160                 root->appendChild(tr);\r
161                 tr->appendChild(XMLCreateTextElement(doc,"Type",(*i).m_type));\r
162                 if((*i).m_type=="Keyed")\r
163                 {\r
164                         tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity));\r
165                         tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
166                 }\r
167                 else\r
168                 {\r
169                         tr->appendChild(XMLCreateCDATAElement(doc,"MessageKey",(*i).m_messagekey));\r
170                 }\r
171                 tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
172 \r
173                 Poco::AutoPtr<Poco::XML::Element> boards=doc->createElement("Boards");\r
174                 tr->appendChild(boards);\r
175                 for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
176                 {\r
177                         boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
178                 }\r
179         }\r
180 \r
181         return GenerateXML(doc);\r
182 }\r
183 \r
184 void MessageListXML::Initialize()\r
185 {\r
186         m_messages.clear();\r
187         m_externalmessages.clear();\r
188 }\r
189 \r
190 const bool MessageListXML::ParseXML(const std::string &xml)\r
191 {\r
192 \r
193         bool parsed=false;\r
194         Poco::XML::DOMParser dp;\r
195 \r
196         Initialize();\r
197 \r
198         try\r
199         {\r
200                 Poco::AutoPtr<Poco::XML::Document> doc=dp.parseString(FixCDATA(xml));\r
201                 Poco::XML::Element *root=XMLGetFirstChild(doc,"MessageList");\r
202 \r
203                 Poco::XML::Element *node=XMLGetFirstChild(root,"Message");\r
204                 while(node)\r
205                 {\r
206                         std::string date="";\r
207                         int index=-1;\r
208                         std::vector<std::string> boards;\r
209 \r
210                         Poco::XML::Element *node2=XMLGetFirstChild(node,"Date");\r
211                         if(node2 && node2->firstChild())\r
212                         {\r
213                                 date=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
214                         }\r
215                         node2=XMLGetFirstChild(node,"Index");\r
216                         if(node2 && node2->firstChild())\r
217                         {\r
218                                 std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
219                                 StringFunctions::Convert(indexstr,index);\r
220                         }\r
221                         node2=XMLGetFirstChild(node,"Boards");\r
222                         if(node2)\r
223                         {\r
224                                 Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board");\r
225                                 while(node3)\r
226                                 {\r
227                                         if(node3 && node3->firstChild())\r
228                                         {\r
229                                                 std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue());\r
230                                                 StringFunctions::LowerCase(boardname,boardname);\r
231                                                 if(boardname.size()>40)\r
232                                                 {\r
233                                                         boardname.erase(40);\r
234                                                 }\r
235                                                 boards.push_back(boardname);\r
236                                         }\r
237                                         node3=XMLGetNextSibling(node3,"Board");\r
238                                 }\r
239                         }\r
240 \r
241                         m_messages.push_back(message(date,index,boards));\r
242 \r
243                         node=XMLGetNextSibling(node,"Message");\r
244                 }\r
245 \r
246                 node=XMLGetFirstChild(root,"ExternalMessage");\r
247                 while(node)\r
248                 {\r
249                         std::string type="";\r
250                         std::string identity="";\r
251                         std::string date="";\r
252                         int index=-1;\r
253                         std::vector<std::string> boards;\r
254 \r
255                         Poco::XML::Element *node2=XMLGetFirstChild(node,"Type");\r
256                         if(node2 && node2->firstChild())\r
257                         {\r
258                                 type=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
259                         }\r
260 \r
261                         if(type=="Keyed")\r
262                         {\r
263                                 node2=XMLGetFirstChild(node,"Identity");\r
264                                 if(node2 && node2->firstChild())\r
265                                 {\r
266                                         identity=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
267                                 }\r
268                                 node2=XMLGetFirstChild(node,"Date");\r
269                                 if(node2 && node2->firstChild())\r
270                                 {\r
271                                         date=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
272                                 }\r
273                                 node2=XMLGetFirstChild(node,"Index");\r
274                                 if(node2 && node2->firstChild())\r
275                                 {\r
276                                         std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
277                                         StringFunctions::Convert(indexstr,index);\r
278                                 }\r
279                                 node2=XMLGetFirstChild(node,"Boards");\r
280                                 if(node2)\r
281                                 {\r
282                                         Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board");\r
283                                         while(node3)\r
284                                         {\r
285                                                 if(node3 && node3->firstChild())\r
286                                                 {\r
287                                                         std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue());\r
288                                                         StringFunctions::LowerCase(boardname,boardname);\r
289                                                         if(boardname.size()>40)\r
290                                                         {\r
291                                                                 boardname.erase(40);\r
292                                                         }\r
293                                                         boards.push_back(boardname);\r
294                                                 }\r
295                                                 node3=XMLGetNextSibling(node3,"Board");\r
296                                         }\r
297                                 }\r
298                                 m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
299                         }\r
300 \r
301                         node=XMLGetNextSibling(node,"ExternalMessage");\r
302                 }\r
303                 parsed=true;\r
304         }\r
305         catch(...)\r
306         {\r
307         }\r
308 \r
309         return parsed;\r
310 }\r