1 #include "../../include/freenet/messagexml.h"
\r
7 MessageXML::MessageXML()
\r
12 std::string MessageXML::GetXML()
\r
14 Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;
\r
15 Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("Message");
\r
17 doc->appendChild(root);
\r
19 root->appendChild(XMLCreateTextElement(doc,"Date",m_date));
\r
20 root->appendChild(XMLCreateTextElement(doc,"Time",m_time));
\r
21 root->appendChild(XMLCreateCDATAElement(doc,"Subject",m_subject));
\r
22 root->appendChild(XMLCreateCDATAElement(doc,"MessageID",m_messageid));
\r
23 root->appendChild(XMLCreateCDATAElement(doc,"ReplyBoard",m_replyboard));
\r
25 root->appendChild(XMLCreateCDATAElement(doc,"Body",m_body));
\r
27 Poco::AutoPtr<Poco::XML::Element> brds=doc->createElement("Boards");
\r
29 root->appendChild(brds);
\r
32 for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)
\r
34 std::string boardname=(*i);
\r
35 StringFunctions::Convert(boardname,boardname);
\r
36 brds->appendChild(XMLCreateCDATAElement(doc,"Board",boardname));
\r
39 // attach inreplyto ids
\r
40 if(m_inreplyto.size()>0)
\r
42 Poco::AutoPtr<Poco::XML::Element> rply=doc->createElement("InReplyTo");
\r
43 root->appendChild(rply);
\r
44 for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)
\r
46 Poco::AutoPtr<Poco::XML::Element> mess=doc->createElement("Message");
\r
47 rply->appendChild(mess);
\r
48 mess->appendChild(XMLCreateTextElement(doc,"Order",(*j).first));
\r
49 mess->appendChild(XMLCreateCDATAElement(doc,"MessageID",(*j).second));
\r
53 // add attachemnt node if we have attachments
\r
54 if(m_fileattachments.size()>0)
\r
56 Poco::AutoPtr<Poco::XML::Element> attachments=doc->createElement("Attachments");
\r
57 root->appendChild(attachments);
\r
58 for(std::vector<fileattachment>::iterator j=m_fileattachments.begin(); j!=m_fileattachments.end(); j++)
\r
60 Poco::AutoPtr<Poco::XML::Element> f=doc->createElement("File");
\r
61 attachments->appendChild(f);
\r
62 f->appendChild(XMLCreateCDATAElement(doc,"Key",(*j).m_key));
\r
63 f->appendChild(XMLCreateTextElement(doc,"Size",(*j).m_size));
\r
67 return GenerateXML(doc);
\r
70 void MessageXML::Initialize()
\r
77 m_inreplyto.clear();
\r
79 m_fileattachments.clear();
\r
82 const bool MessageXML::ParseXML(const std::string &xml)
\r
85 Poco::XML::DOMParser dp;
\r
91 Poco::AutoPtr<Poco::XML::Document> doc=dp.parseString(FixCDATA(xml));
\r
92 Poco::XML::Element *root=XMLGetFirstChild(doc,"Message");
\r
93 Poco::XML::Element *txt=NULL;
\r
95 txt=XMLGetFirstChild(root,"Date");
\r
98 if(txt->firstChild())
\r
100 m_date=SanitizeSingleString(txt->firstChild()->getNodeValue());
\r
103 txt=XMLGetFirstChild(root,"Time");
\r
106 if(txt->firstChild())
\r
108 m_time=SanitizeSingleString(txt->firstChild()->getNodeValue());
\r
111 txt=XMLGetFirstChild(root,"Subject");
\r
114 if(txt->firstChild())
\r
116 m_subject=SanitizeSingleString(txt->firstChild()->getNodeValue());
\r
119 txt=XMLGetFirstChild(root,"MessageID");
\r
122 if(txt->firstChild())
\r
124 m_messageid=SanitizeSingleString(txt->firstChild()->getNodeValue());
\r
127 txt=XMLGetFirstChild(root,"ReplyBoard");
\r
130 if(txt->firstChild())
\r
132 m_replyboard=SanitizeSingleString(txt->firstChild()->getNodeValue());
\r
133 StringFunctions::LowerCase(m_replyboard,m_replyboard);
\r
134 // strip off everything after , in board name
\r
135 if(m_replyboard.find(",")!=std::string::npos)
\r
137 m_replyboard.erase(m_replyboard.find(","));
\r
139 if(m_replyboard.size()>40)
\r
141 m_replyboard.erase(40);
\r
145 txt=XMLGetFirstChild(root,"Body");
\r
148 if(txt->firstChild())
\r
150 m_body=txt->firstChild()->getNodeValue();
\r
153 Poco::XML::Element *boards=XMLGetFirstChild(root,"Boards");
\r
156 Poco::XML::Element *board=XMLGetFirstChild(boards,"Board");
\r
159 if(board->firstChild())
\r
161 std::string boardname=SanitizeSingleString(board->firstChild()->getNodeValue());
\r
162 StringFunctions::LowerCase(boardname,boardname);
\r
163 // strip off everything after , in board name
\r
164 if(boardname.find(",")!=std::string::npos)
\r
166 boardname.erase(boardname.find(","));
\r
168 if(boardname.size()>40)
\r
170 boardname.erase(40);
\r
172 m_boards.push_back(boardname);
\r
174 board=XMLGetNextSibling(board,"Board");
\r
177 Poco::XML::Element *inreplyto=XMLGetFirstChild(root,"InReplyTo");
\r
180 Poco::XML::Element *message=XMLGetFirstChild(inreplyto,"Message");
\r
183 Poco::XML::Element *orderel=XMLGetFirstChild(message,"Order");
\r
184 Poco::XML::Element *messageidel=XMLGetFirstChild(message,"MessageID");
\r
185 if(orderel && orderel->firstChild() && messageidel && messageidel->firstChild())
\r
188 std::string messageid="";
\r
190 StringFunctions::Convert(orderel->firstChild()->getNodeValue(),order);
\r
191 messageid=messageidel->firstChild()->getNodeValue();
\r
193 if(order!=-1 && messageid!="")
\r
195 m_inreplyto[order]=messageid;
\r
198 message=XMLGetNextSibling(message,"Message");
\r
201 Poco::XML::Element *attachments=XMLGetFirstChild(root,"Attachments");
\r
204 Poco::XML::Element *file=XMLGetFirstChild(attachments,"File");
\r
207 Poco::XML::Element *keyel=XMLGetFirstChild(file,"Key");
\r
208 Poco::XML::Element *sizeel=XMLGetFirstChild(file,"Size");
\r
210 if(keyel && keyel->firstChild() && sizeel && sizeel->firstChild())
\r
213 std::string key="";
\r
215 StringFunctions::Convert(sizeel->firstChild()->getNodeValue(),size);
\r
216 key=keyel->firstChild()->getNodeValue();
\r
218 if(size!=-1 && key!="")
\r
220 m_fileattachments.push_back(fileattachment(key,size));
\r
224 file=XMLGetNextSibling(file,"File");
\r