version 0.1.14
[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         TiXmlDocument td;\r
138         TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
139         TiXmlElement *tid;\r
140         TiXmlPrinter tp;\r
141 \r
142         td.LinkEndChild(tdec);\r
143         tid=new TiXmlElement("MessageList");\r
144         td.LinkEndChild(tid);\r
145 \r
146         for(std::vector<message>::iterator i=m_messages.begin(); i!=m_messages.end(); i++)\r
147         {\r
148                 TiXmlElement *tr=new TiXmlElement("Message");\r
149                 tid->LinkEndChild(tr);\r
150                 tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
151                 tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
152                 TiXmlElement *brds=new TiXmlElement("Boards");\r
153                 tr->LinkEndChild(brds);\r
154                 for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
155                 {\r
156                         brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
157                 }\r
158         }\r
159 \r
160         for(std::vector<externalmessage>::iterator i=m_externalmessages.begin(); i!=m_externalmessages.end(); i++)\r
161         {\r
162                 TiXmlElement *tr=new TiXmlElement("ExternalMessage");\r
163                 tid->LinkEndChild(tr);\r
164                 tr->LinkEndChild(XMLCreateTextElement("Type",(*i).m_type));\r
165                 if((*i).m_type=="Keyed")\r
166                 {\r
167                         tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
168                         tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
169                 }\r
170                 else\r
171                 {\r
172                         tr->LinkEndChild(XMLCreateCDATAElement("MessageKey",(*i).m_messagekey));\r
173                 }\r
174                 tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
175                 TiXmlElement *brds=new TiXmlElement("Boards");\r
176                 tr->LinkEndChild(brds);\r
177                 for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
178                 {\r
179                         brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
180                 }\r
181         }\r
182 \r
183         td.Accept(&tp);\r
184         return std::string(tp.CStr());\r
185 }\r
186 \r
187 void MessageListXML::Initialize()\r
188 {\r
189         m_messages.clear();\r
190         m_externalmessages.clear();\r
191 }\r
192 \r
193 const bool MessageListXML::ParseXML(const std::string &xml)\r
194 {\r
195         TiXmlDocument td;\r
196         td.Parse(xml.c_str());\r
197 \r
198         if(!td.Error())\r
199         {\r
200                 std::string tempstr;\r
201                 std::string date;\r
202                 long index;\r
203                 std::vector<std::string> boards;\r
204                 TiXmlText *txt;\r
205                 TiXmlHandle hnd(&td);\r
206                 TiXmlNode *node;\r
207                 TiXmlNode *node2;\r
208 \r
209                 Initialize();\r
210 \r
211                 node=hnd.FirstChild("MessageList").FirstChild("Message").ToNode();\r
212                 while(node)\r
213                 {\r
214                         date="";\r
215                         index=-1;\r
216                         boards.clear();\r
217 \r
218                         TiXmlHandle hnd2(node);\r
219                         txt=hnd2.FirstChild("Date").FirstChild().ToText();\r
220                         if(txt)\r
221                         {\r
222                                 date=txt->ValueStr();\r
223                         }\r
224                         txt=hnd2.FirstChild("Index").FirstChild().ToText();\r
225                         if(txt)\r
226                         {\r
227                                 tempstr=txt->ValueStr();\r
228                                 StringFunctions::Convert(tempstr,index);\r
229                         }\r
230                         node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode();\r
231                         while(node2)\r
232                         {\r
233                                 if(node2->FirstChild())\r
234                                 {\r
235                                         boards.push_back(node2->FirstChild()->ValueStr());\r
236                                 }\r
237                                 node2=node2->NextSibling("Board");\r
238                         }\r
239 \r
240                         m_messages.push_back(message(date,index,boards));\r
241 \r
242                         node=node->NextSibling("Message");\r
243                 }\r
244 \r
245                 return true;\r
246         }\r
247         else\r
248         {\r
249                 return false;\r
250         }\r
251 }\r