\r
std::string MessageXML::GetXML()\r
{\r
- TiXmlDocument td;\r
- TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
- TiXmlElement *tid;\r
- TiXmlPrinter tp;\r
-\r
- td.LinkEndChild(tdec);\r
- tid=new TiXmlElement("Message");\r
- td.LinkEndChild(tid);\r
-\r
- tid->LinkEndChild(XMLCreateTextElement("Date",m_date));\r
- tid->LinkEndChild(XMLCreateTextElement("Time",m_time));\r
- tid->LinkEndChild(XMLCreateCDATAElement("Subject",m_subject));\r
- tid->LinkEndChild(XMLCreateCDATAElement("MessageID",m_messageid));\r
- tid->LinkEndChild(XMLCreateCDATAElement("ReplyBoard",m_replyboard));\r
- // a little hack because TinyXML doesn't handle ]]> inside a CDATA section - manually separate into multiple CDATA sections\r
- // TinyXML still won't be able to parse past the 1st CDATA section, but other implementations might\r
- tid->LinkEndChild(XMLCreateCDATAElement("Body",StringFunctions::Replace(m_body,"]]>","]]]]><![CDATA[>")));\r
-\r
- TiXmlElement *brds=new TiXmlElement("Boards");\r
- tid->LinkEndChild(brds);\r
+ Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
+ Poco::AutoPtr<Poco::XML::Element> root=doc->createElement("Message");\r
+\r
+ doc->appendChild(root);\r
+\r
+ root->appendChild(XMLCreateTextElement(doc,"Date",m_date));\r
+ root->appendChild(XMLCreateTextElement(doc,"Time",m_time));\r
+ root->appendChild(XMLCreateCDATAElement(doc,"Subject",m_subject));\r
+ root->appendChild(XMLCreateCDATAElement(doc,"MessageID",m_messageid));\r
+ root->appendChild(XMLCreateCDATAElement(doc,"ReplyBoard",m_replyboard));\r
+ \r
+ root->appendChild(XMLCreateCDATAElement(doc,"Body",m_body));\r
+\r
+ Poco::AutoPtr<Poco::XML::Element> brds=doc->createElement("Boards");\r
+\r
+ root->appendChild(brds);\r
+\r
+ // attach boards\r
for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
{\r
- brds->LinkEndChild(XMLCreateCDATAElement("Board",(*i)));\r
+ std::string boardname=(*i);\r
+ StringFunctions::Convert(boardname,boardname);\r
+ brds->appendChild(XMLCreateCDATAElement(doc,"Board",boardname));\r
}\r
\r
+ // attach inreplyto ids\r
if(m_inreplyto.size()>0)\r
{\r
- TiXmlElement *rply=new TiXmlElement("InReplyTo");\r
- tid->LinkEndChild(rply);\r
+ Poco::AutoPtr<Poco::XML::Element> rply=doc->createElement("InReplyTo");\r
+ root->appendChild(rply);\r
for(std::map<long,std::string>::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++)\r
{\r
- TiXmlElement *mess=new TiXmlElement("Message");\r
- rply->LinkEndChild(mess);\r
- mess->LinkEndChild(XMLCreateTextElement("Order",(*j).first));\r
- mess->LinkEndChild(XMLCreateCDATAElement("MessageID",(*j).second));\r
+ Poco::AutoPtr<Poco::XML::Element> mess=doc->createElement("Message");\r
+ rply->appendChild(mess);\r
+ mess->appendChild(XMLCreateTextElement(doc,"Order",(*j).first));\r
+ mess->appendChild(XMLCreateCDATAElement(doc,"MessageID",(*j).second));\r
+ }\r
+ }\r
+\r
+ // add attachemnt node if we have attachments\r
+ if(m_fileattachments.size()>0)\r
+ {\r
+ Poco::AutoPtr<Poco::XML::Element> attachments=doc->createElement("Attachments");\r
+ root->appendChild(attachments);\r
+ for(std::vector<fileattachment>::iterator j=m_fileattachments.begin(); j!=m_fileattachments.end(); j++)\r
+ {\r
+ Poco::AutoPtr<Poco::XML::Element> f=doc->createElement("File");\r
+ attachments->appendChild(f);\r
+ f->appendChild(XMLCreateCDATAElement(doc,"Key",(*j).m_key));\r
+ f->appendChild(XMLCreateTextElement(doc,"Size",(*j).m_size));\r
}\r
}\r
\r
- td.Accept(&tp);\r
- return std::string(tp.CStr());\r
+ return GenerateXML(doc,false);\r
}\r
\r
void MessageXML::Initialize()\r
m_replyboard="";\r
m_inreplyto.clear();\r
m_body="";\r
+ m_fileattachments.clear();\r
}\r
\r
const bool MessageXML::ParseXML(const std::string &xml)\r
{\r
- TiXmlDocument td;\r
- td.Parse(xml.c_str());\r
+ bool parsed=false;\r
+ Poco::XML::DOMParser dp;\r
\r
- if(!td.Error())\r
- {\r
- TiXmlHandle hnd(&td);\r
- TiXmlNode *node2;\r
- TiXmlText *txt;\r
+ Initialize();\r
\r
- Initialize();\r
+ try\r
+ {\r
+ Poco::AutoPtr<Poco::XML::Document> doc=dp.parseString(FixCDATA(xml));\r
+ Poco::XML::Element *root=XMLGetFirstChild(doc,"Message");\r
+ Poco::XML::Element *txt=NULL;\r
\r
- txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText();\r
+ txt=XMLGetFirstChild(root,"Date");\r
if(txt)\r
{\r
- m_date=txt->ValueStr();\r
+ if(txt->firstChild())\r
+ {\r
+ m_date=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+ }\r
}\r
- txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText();\r
+ txt=XMLGetFirstChild(root,"Time");\r
if(txt)\r
{\r
- m_time=txt->ValueStr();\r
+ if(txt->firstChild())\r
+ {\r
+ m_time=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+ }\r
}\r
- txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText();\r
+ txt=XMLGetFirstChild(root,"Subject");\r
if(txt)\r
{\r
- m_subject=txt->ValueStr();\r
+ if(txt->firstChild())\r
+ {\r
+ m_subject=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+ }\r
}\r
- txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText();\r
+ txt=XMLGetFirstChild(root,"MessageID");\r
if(txt)\r
{\r
- m_messageid=txt->ValueStr();\r
+ if(txt->firstChild())\r
+ {\r
+ m_messageid=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+ }\r
}\r
- txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText();\r
+ txt=XMLGetFirstChild(root,"ReplyBoard");\r
if(txt)\r
{\r
- m_replyboard=txt->ValueStr();\r
+ if(txt->firstChild())\r
+ {\r
+ m_replyboard=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+ StringFunctions::LowerCase(m_replyboard,m_replyboard);\r
+ // strip off everything after , in board name\r
+ if(m_replyboard.find(",")!=std::string::npos)\r
+ {\r
+ m_replyboard.erase(m_replyboard.find(","));\r
+ }\r
+ if(m_replyboard.size()>40)\r
+ {\r
+ m_replyboard.erase(40);\r
+ }\r
+ }\r
}\r
- txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText();\r
+ txt=XMLGetFirstChild(root,"Body");\r
if(txt)\r
{\r
- m_body=txt->ValueStr();\r
- }\r
-\r
- node2=hnd.FirstChild("Message").FirstChild("Boards").FirstChild("Board").ToNode();\r
- while(node2)\r
- {\r
- if(node2->FirstChild())\r
+ if(txt->firstChild())\r
{\r
- std::string boardname=node2->FirstChild()->ValueStr();\r
- StringFunctions::LowerCase(boardname,boardname);\r
- m_boards.push_back(boardname);\r
+ m_body=txt->firstChild()->getNodeValue();\r
}\r
- node2=node2->NextSibling("Board");\r
}\r
-\r
- node2=hnd.FirstChild("Message").FirstChild("InReplyTo").FirstChild("Message").ToNode();\r
- while(node2)\r
+ Poco::XML::Element *boards=XMLGetFirstChild(root,"Boards");\r
+ if(boards)\r
{\r
- std::string orderstr;\r
- long order=-1;\r
- std::string messageid="";\r
- TiXmlHandle hnd2(node2);\r
- txt=hnd2.FirstChild("Order").FirstChild().ToText();\r
- if(txt)\r
+ Poco::XML::Element *board=XMLGetFirstChild(boards,"Board");\r
+ while(board)\r
{\r
- orderstr=txt->ValueStr();\r
- StringFunctions::Convert(orderstr,order);\r
+ if(board->firstChild())\r
+ {\r
+ std::string boardname=SanitizeSingleString(board->firstChild()->getNodeValue());\r
+ StringFunctions::LowerCase(boardname,boardname);\r
+ // strip off everything after , in board name\r
+ if(boardname.find(",")!=std::string::npos)\r
+ {\r
+ boardname.erase(boardname.find(","));\r
+ }\r
+ if(boardname.size()>40)\r
+ {\r
+ boardname.erase(40);\r
+ }\r
+ m_boards.push_back(boardname);\r
+ }\r
+ board=XMLGetNextSibling(board,"Board");\r
}\r
- txt=hnd2.FirstChild("MessageID").FirstChild().ToText();\r
- if(txt)\r
+ }\r
+ Poco::XML::Element *inreplyto=XMLGetFirstChild(root,"InReplyTo");\r
+ if(inreplyto)\r
+ {\r
+ Poco::XML::Element *message=XMLGetFirstChild(inreplyto,"Message");\r
+ while(message)\r
{\r
- messageid=txt->ValueStr();\r
+ Poco::XML::Element *orderel=XMLGetFirstChild(message,"Order");\r
+ Poco::XML::Element *messageidel=XMLGetFirstChild(message,"MessageID");\r
+ if(orderel && orderel->firstChild() && messageidel && messageidel->firstChild())\r
+ {\r
+ int order=-1;\r
+ std::string messageid="";\r
+\r
+ StringFunctions::Convert(orderel->firstChild()->getNodeValue(),order);\r
+ messageid=messageidel->firstChild()->getNodeValue();\r
+\r
+ if(order!=-1 && messageid!="")\r
+ {\r
+ m_inreplyto[order]=messageid;\r
+ }\r
+ }\r
+ message=XMLGetNextSibling(message,"Message");\r
}\r
-\r
- if(order!=-1 && messageid!="")\r
+ }\r
+ Poco::XML::Element *attachments=XMLGetFirstChild(root,"Attachments");\r
+ if(attachments)\r
+ {\r
+ Poco::XML::Element *file=XMLGetFirstChild(attachments,"File");\r
+ while(file)\r
{\r
- m_inreplyto[order]=messageid;\r
+ Poco::XML::Element *keyel=XMLGetFirstChild(file,"Key");\r
+ Poco::XML::Element *sizeel=XMLGetFirstChild(file,"Size");\r
+\r
+ if(keyel && keyel->firstChild() && sizeel && sizeel->firstChild())\r
+ {\r
+ int size=-1;\r
+ std::string key="";\r
+ \r
+ StringFunctions::Convert(sizeel->firstChild()->getNodeValue(),size);\r
+ key=keyel->firstChild()->getNodeValue();\r
+\r
+ if(size!=-1 && key!="")\r
+ {\r
+ m_fileattachments.push_back(fileattachment(key,size));\r
+ }\r
+ }\r
+\r
+ file=XMLGetNextSibling(file,"File");\r
}\r
-\r
- node2=node2->NextSibling("Message");\r
}\r
\r
- return true;\r
+ parsed=true;\r
+\r
}\r
- else\r
+ catch(...)\r
{\r
- return false;\r
}\r
+\r
+ return parsed;\r
}\r