version 0.3.0
[fms.git] / src / freenet / messagexml.cpp
index ebba5f5..70b660d 100644 (file)
@@ -11,62 +11,89 @@ MessageXML::MessageXML()
 \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
+       Poco::AutoPtr<Poco::XML::Document> doc=new Poco::XML::Document;\r
+       //TiXmlDocument td;\r
+       //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8","");\r
+       Poco::XML::Element *root=doc->createElement("Message");\r
+       //TiXmlElement *tid;\r
+       //TiXmlPrinter tp;\r
 \r
-       td.LinkEndChild(tdec);\r
-       tid=new TiXmlElement("Message");\r
-       td.LinkEndChild(tid);\r
+       doc->appendChild(root);\r
+       //td.LinkEndChild(tdec);\r
+       //tid=new TiXmlElement("Message");\r
+       //td.LinkEndChild(tid);\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
        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
+       */\r
+       \r
+       root->appendChild(XMLCreateCDATAElement(doc,"Body",m_body));\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
+       //tid->LinkEndChild(XMLCreateCDATAElement("Body",StringFunctions::Replace(m_body,"]]>","]]]]><![CDATA[>")));\r
 \r
-       TiXmlElement *brds=new TiXmlElement("Boards");\r
-       tid->LinkEndChild(brds);\r
+       Poco::XML::Element *brds=doc->createElement("Boards");\r
+       //TiXmlElement *brds=new TiXmlElement("Boards");\r
+       root->appendChild(brds);\r
+       //tid->LinkEndChild(brds);\r
        for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
        {\r
                std::string boardname=(*i);\r
                StringFunctions::Convert(boardname,boardname);\r
-               brds->LinkEndChild(XMLCreateCDATAElement("Board",boardname));\r
+               brds->appendChild(XMLCreateCDATAElement(doc,"Board",boardname));\r
+               //brds->LinkEndChild(XMLCreateCDATAElement("Board",boardname));\r
        }\r
 \r
        if(m_inreplyto.size()>0)\r
        {\r
-               TiXmlElement *rply=new TiXmlElement("InReplyTo");\r
-               tid->LinkEndChild(rply);\r
+               Poco::XML::Element *rply=doc->createElement("InReplyTo");\r
+               //TiXmlElement *rply=new TiXmlElement("InReplyTo");\r
+               root->appendChild(rply);\r
+               //tid->LinkEndChild(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::XML::Element *mess=doc->createElement("Message");\r
+                       //TiXmlElement *mess=new TiXmlElement("Message");\r
+                       rply->appendChild(mess);\r
+                       mess->appendChild(XMLCreateTextElement(doc,"Order",(*j).first));\r
+                       mess->appendChild(XMLCreateCDATAElement(doc,"MessageID",(*j).second));\r
+                       //mess->LinkEndChild(XMLCreateTextElement("Order",(*j).first));\r
+                       //mess->LinkEndChild(XMLCreateCDATAElement("MessageID",(*j).second));\r
                }\r
        }\r
 \r
        // add attachemnt node if we have attachments\r
        if(m_fileattachments.size()>0)\r
        {\r
-               TiXmlElement *attachments=new TiXmlElement("Attachments");\r
-               tid->LinkEndChild(attachments);\r
+               Poco::XML::Element *attachments=doc->createElement("Attachments");\r
+               //TiXmlElement *attachments=new TiXmlElement("Attachments");\r
+               root->appendChild(attachments);\r
+               //tid->LinkEndChild(attachments);\r
                for(std::vector<fileattachment>::iterator j=m_fileattachments.begin(); j!=m_fileattachments.end(); j++)\r
                {\r
-                       TiXmlElement *f=new TiXmlElement("File");\r
-                       attachments->LinkEndChild(f);\r
-                       f->LinkEndChild(XMLCreateCDATAElement("Key",(*j).m_key));\r
-                       f->LinkEndChild(XMLCreateTextElement("Size",(*j).m_size));\r
+                       Poco::XML::Element *f=doc->createElement("File");\r
+                       //TiXmlElement *f=new TiXmlElement("File");\r
+                       attachments->appendChild(f);\r
+                       //attachments->LinkEndChild(f);\r
+                       f->appendChild(XMLCreateCDATAElement(doc,"Key",(*j).m_key));\r
+                       f->appendChild(XMLCreateTextElement(doc,"Size",(*j).m_size));\r
+                       //f->LinkEndChild(XMLCreateCDATAElement("Key",(*j).m_key));\r
+                       //f->LinkEndChild(XMLCreateTextElement("Size",(*j).m_size));\r
                }\r
        }\r
 \r
-       td.Accept(&tp);\r
-       return std::string(tp.CStr());\r
+       //td.Accept(&tp);\r
+       //return std::string(tp.CStr());\r
+       return GenerateXML(doc);\r
 }\r
 \r
 void MessageXML::Initialize()\r
@@ -83,6 +110,150 @@ void MessageXML::Initialize()
 \r
 const bool MessageXML::ParseXML(const std::string &xml)\r
 {\r
+       bool parsed=false;\r
+       Poco::XML::DOMParser dp;\r
+\r
+       Initialize();\r
+\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=XMLGetFirstChild(root,"Date");\r
+               if(txt)\r
+               {\r
+                       if(txt->firstChild())\r
+                       {\r
+                               m_date=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+                       }\r
+               }\r
+               txt=XMLGetFirstChild(root,"Time");\r
+               if(txt)\r
+               {\r
+                       if(txt->firstChild())\r
+                       {\r
+                               m_time=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+                       }\r
+               }\r
+               txt=XMLGetFirstChild(root,"Subject");\r
+               if(txt)\r
+               {\r
+                       if(txt->firstChild())\r
+                       {\r
+                               m_subject=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+                       }\r
+               }\r
+               txt=XMLGetFirstChild(root,"MessageID");\r
+               if(txt)\r
+               {\r
+                       if(txt->firstChild())\r
+                       {\r
+                               m_messageid=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+                       }\r
+               }\r
+               txt=XMLGetFirstChild(root,"ReplyBoard");\r
+               if(txt)\r
+               {\r
+                       if(txt->firstChild())\r
+                       {\r
+                               m_replyboard=SanitizeSingleString(txt->firstChild()->getNodeValue());\r
+                               StringFunctions::LowerCase(m_replyboard,m_replyboard);\r
+                               if(m_replyboard.size()>40)\r
+                               {\r
+                                       m_replyboard.erase(40);\r
+                               }\r
+                       }\r
+               }\r
+               txt=XMLGetFirstChild(root,"Body");\r
+               if(txt)\r
+               {\r
+                       if(txt->firstChild())\r
+                       {\r
+                               m_body=txt->firstChild()->getNodeValue();\r
+                       }\r
+               }\r
+               Poco::XML::Element *boards=XMLGetFirstChild(root,"Boards");\r
+               if(boards)\r
+               {\r
+                       Poco::XML::Element *board=XMLGetFirstChild(boards,"Board");\r
+                       while(board)\r
+                       {\r
+                               if(board->firstChild())\r
+                               {\r
+                                       std::string boardname=SanitizeSingleString(board->firstChild()->getNodeValue());\r
+                                       StringFunctions::LowerCase(boardname,boardname);\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
+               }\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
+                               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
+               Poco::XML::Element *attachments=XMLGetFirstChild(root,"Attachments");\r
+               if(attachments)\r
+               {\r
+                       Poco::XML::Element *file=XMLGetFirstChild(attachments,"File");\r
+                       while(file)\r
+                       {\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
+\r
+               parsed=true;\r
+\r
+       }\r
+       catch(...)\r
+       {\r
+       }\r
+\r
+       return parsed;\r
+\r
+/*\r
        TiXmlDocument td;\r
        td.Parse(xml.c_str());\r
 \r
@@ -209,4 +380,5 @@ const bool MessageXML::ParseXML(const std::string &xml)
        {\r
                return false;\r
        }\r
+       */\r
 }\r