c35e10f7aea356761ff0265ff1e508168ee8f543
[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         //TiXmlDocument td;\r
139         //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
140         Poco::XML::Element *root=doc->createElement("MessageList");\r
141         //TiXmlElement *tid;\r
142         //TiXmlPrinter tp;\r
143 \r
144         doc->appendChild(root);\r
145         //td.LinkEndChild(tdec);\r
146         //tid=new TiXmlElement("MessageList");\r
147         //td.LinkEndChild(tid);\r
148 \r
149         for(std::vector<message>::iterator i=m_messages.begin(); i!=m_messages.end(); i++)\r
150         {\r
151                 Poco::XML::Element *tr=doc->createElement("Message");\r
152                 //TiXmlElement *tr=new TiXmlElement("Message");\r
153                 root->appendChild(tr);\r
154                 //tid->LinkEndChild(tr);\r
155                 tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
156                 //tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
157                 tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
158                 //tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
159                 Poco::XML::Element *boards=doc->createElement("Boards");\r
160                 //TiXmlElement *brds=new TiXmlElement("Boards");\r
161                 tr->appendChild(boards);\r
162                 //tr->LinkEndChild(brds);\r
163                 for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
164                 {\r
165                         boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
166                         //brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
167                 }\r
168         }\r
169 \r
170         for(std::vector<externalmessage>::iterator i=m_externalmessages.begin(); i!=m_externalmessages.end(); i++)\r
171         {\r
172                 Poco::XML::Element *tr=doc->createElement("ExternalMessage");\r
173                 //TiXmlElement *tr=new TiXmlElement("ExternalMessage");\r
174                 root->appendChild(tr);\r
175                 //tid->LinkEndChild(tr);\r
176                 tr->appendChild(XMLCreateTextElement(doc,"Type",(*i).m_type));\r
177                 //tr->LinkEndChild(XMLCreateTextElement("Type",(*i).m_type));\r
178                 if((*i).m_type=="Keyed")\r
179                 {\r
180                         tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity));\r
181                         //tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
182                         tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
183                         //tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
184                 }\r
185                 else\r
186                 {\r
187                         tr->appendChild(XMLCreateCDATAElement(doc,"MessageKey",(*i).m_messagekey));\r
188                         //tr->LinkEndChild(XMLCreateCDATAElement("MessageKey",(*i).m_messagekey));\r
189                 }\r
190                 tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
191                 //tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
192                 Poco::XML::Element *boards=doc->createElement("Boards");\r
193                 //TiXmlElement *brds=new TiXmlElement("Boards");\r
194                 tr->appendChild(boards);\r
195                 //tr->LinkEndChild(brds);\r
196                 for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
197                 {\r
198                         boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
199                         //brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
200                 }\r
201         }\r
202 \r
203         //td.Accept(&tp);\r
204         //return std::string(tp.CStr());\r
205         return GenerateXML(doc);\r
206 }\r
207 \r
208 void MessageListXML::Initialize()\r
209 {\r
210         m_messages.clear();\r
211         m_externalmessages.clear();\r
212 }\r
213 \r
214 const bool MessageListXML::ParseXML(const std::string &xml)\r
215 {\r
216 \r
217         bool parsed=false;\r
218         Poco::XML::DOMParser dp;\r
219 \r
220         Initialize();\r
221 \r
222         try\r
223         {\r
224                 Poco::AutoPtr<Poco::XML::Document> doc=dp.parseString(FixCDATA(xml));\r
225                 Poco::XML::Element *root=XMLGetFirstChild(doc,"MessageList");\r
226 \r
227                 Poco::XML::Element *node=XMLGetFirstChild(root,"Message");\r
228                 while(node)\r
229                 {\r
230                         std::string date="";\r
231                         int index=-1;\r
232                         std::vector<std::string> boards;\r
233 \r
234                         Poco::XML::Element *node2=XMLGetFirstChild(node,"Date");\r
235                         if(node2 && node2->firstChild())\r
236                         {\r
237                                 date=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
238                         }\r
239                         node2=XMLGetFirstChild(node,"Index");\r
240                         if(node2 && node2->firstChild())\r
241                         {\r
242                                 std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
243                                 StringFunctions::Convert(indexstr,index);\r
244                         }\r
245                         node2=XMLGetFirstChild(node,"Boards");\r
246                         if(node2)\r
247                         {\r
248                                 Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board");\r
249                                 while(node3)\r
250                                 {\r
251                                         if(node3 && node3->firstChild())\r
252                                         {\r
253                                                 std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue());\r
254                                                 StringFunctions::LowerCase(boardname,boardname);\r
255                                                 if(boardname.size()>40)\r
256                                                 {\r
257                                                         boardname.erase(40);\r
258                                                 }\r
259                                                 boards.push_back(boardname);\r
260                                         }\r
261                                         node3=XMLGetNextSibling(node3,"Board");\r
262                                 }\r
263                         }\r
264 \r
265                         m_messages.push_back(message(date,index,boards));\r
266 \r
267                         node=XMLGetNextSibling(node,"Message");\r
268                 }\r
269 \r
270                 node=XMLGetFirstChild(root,"ExternalMessage");\r
271                 while(node)\r
272                 {\r
273                         std::string type="";\r
274                         std::string identity="";\r
275                         std::string date="";\r
276                         int index=-1;\r
277                         std::vector<std::string> boards;\r
278 \r
279                         Poco::XML::Element *node2=XMLGetFirstChild(node,"Type");\r
280                         if(node2 && node2->firstChild())\r
281                         {\r
282                                 type=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
283                         }\r
284 \r
285                         if(type=="Keyed")\r
286                         {\r
287                                 node2=XMLGetFirstChild(node,"Identity");\r
288                                 if(node2 && node2->firstChild())\r
289                                 {\r
290                                         identity=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
291                                 }\r
292                                 node2=XMLGetFirstChild(node,"Date");\r
293                                 if(node2 && node2->firstChild())\r
294                                 {\r
295                                         date=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
296                                 }\r
297                                 node2=XMLGetFirstChild(node,"Index");\r
298                                 if(node2 && node2->firstChild())\r
299                                 {\r
300                                         std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
301                                         StringFunctions::Convert(indexstr,index);\r
302                                 }\r
303                                 node2=XMLGetFirstChild(node,"Boards");\r
304                                 if(node2)\r
305                                 {\r
306                                         Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board");\r
307                                         while(node3)\r
308                                         {\r
309                                                 if(node3 && node3->firstChild())\r
310                                                 {\r
311                                                         std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue());\r
312                                                         StringFunctions::LowerCase(boardname,boardname);\r
313                                                         if(boardname.size()>40)\r
314                                                         {\r
315                                                                 boardname.erase(40);\r
316                                                         }\r
317                                                         boards.push_back(boardname);\r
318                                                 }\r
319                                                 node3=XMLGetNextSibling(node3,"Board");\r
320                                         }\r
321                                 }\r
322                                 m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
323                         }\r
324 \r
325                         node=XMLGetNextSibling(node,"ExternalMessage");\r
326                 }\r
327                 parsed=true;\r
328         }\r
329         catch(...)\r
330         {\r
331         }\r
332 \r
333         return parsed;\r
334 \r
335         /*\r
336         TiXmlDocument td;\r
337         td.Parse(xml.c_str());\r
338 \r
339         if(!td.Error())\r
340         {\r
341                 std::string tempstr;\r
342                 std::string date;\r
343                 long index;\r
344                 std::vector<std::string> boards;\r
345                 TiXmlText *txt;\r
346                 TiXmlHandle hnd(&td);\r
347                 TiXmlNode *node;\r
348                 TiXmlNode *node2;\r
349 \r
350                 Initialize();\r
351 \r
352                 node=hnd.FirstChild("MessageList").FirstChild("Message").ToNode();\r
353                 while(node)\r
354                 {\r
355                         date="";\r
356                         index=-1;\r
357                         boards.clear();\r
358 \r
359                         TiXmlHandle hnd2(node);\r
360                         txt=hnd2.FirstChild("Date").FirstChild().ToText();\r
361                         if(txt)\r
362                         {\r
363                                 date=SanitizeSingleString(txt->ValueStr());\r
364                         }\r
365                         txt=hnd2.FirstChild("Index").FirstChild().ToText();\r
366                         if(txt)\r
367                         {\r
368                                 tempstr=SanitizeSingleString(txt->ValueStr());\r
369                                 StringFunctions::Convert(tempstr,index);\r
370                         }\r
371                         node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode();\r
372                         while(node2)\r
373                         {\r
374                                 if(node2->FirstChild())\r
375                                 {\r
376                                         std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());\r
377                                         StringFunctions::LowerCase(boardname,boardname);\r
378                                         boards.push_back(boardname);\r
379                                 }\r
380                                 node2=node2->NextSibling("Board");\r
381                         }\r
382 \r
383                         m_messages.push_back(message(date,index,boards));\r
384 \r
385                         node=node->NextSibling("Message");\r
386                 }\r
387 \r
388                 node=hnd.FirstChild("MessageList").FirstChild("ExternalMessage").ToNode();\r
389                 while(node)\r
390                 {\r
391                         std::string type="";\r
392                         std::string identity="";\r
393                         date="";\r
394                         index=-1;\r
395                         boards.clear();\r
396 \r
397                         TiXmlHandle hnd2(node);\r
398                         txt=hnd2.FirstChild("Type").FirstChild().ToText();\r
399                         if(txt)\r
400                         {\r
401                                 type=SanitizeSingleString(txt->ValueStr());\r
402                         }\r
403 \r
404                         if(type=="Keyed")\r
405                         {\r
406                                 txt=hnd2.FirstChild("Identity").FirstChild().ToText();\r
407                                 if(txt)\r
408                                 {\r
409                                         identity=SanitizeSingleString(txt->ValueStr());\r
410                                 }\r
411                                 txt=hnd2.FirstChild("Date").FirstChild().ToText();\r
412                                 if(txt)\r
413                                 {\r
414                                         date=SanitizeSingleString(txt->ValueStr());\r
415                                 }\r
416                                 txt=hnd2.FirstChild("Index").FirstChild().ToText();\r
417                                 if(txt)\r
418                                 {\r
419                                         tempstr=SanitizeSingleString(txt->ValueStr());\r
420                                         StringFunctions::Convert(tempstr,index);\r
421                                 }\r
422                                 node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode();\r
423                                 while(node2)\r
424                                 {\r
425                                         if(node2->FirstChild())\r
426                                         {\r
427                                                 std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());\r
428                                                 StringFunctions::LowerCase(boardname,boardname);\r
429                                                 boards.push_back(boardname);\r
430                                         }\r
431                                         node2=node2->NextSibling("Board");\r
432                                 }\r
433                                 m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
434                         }\r
435 \r
436                         node=node->NextSibling("ExternalMessage");\r
437                 }\r
438 \r
439                 return true;\r
440         }\r
441         else\r
442         {\r
443                 return false;\r
444         }\r
445         */\r
446 }\r