version 0.3.0
[fms.git] / src / freenet / messagelistxml.cpp
index 473a495..c35e10f 100644 (file)
@@ -134,54 +134,75 @@ const long MessageListXML::GetIndex(const long index)
 \r
 std::string MessageListXML::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("MessageList");\r
-       td.LinkEndChild(tid);\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("MessageList");\r
+       //TiXmlElement *tid;\r
+       //TiXmlPrinter tp;\r
+\r
+       doc->appendChild(root);\r
+       //td.LinkEndChild(tdec);\r
+       //tid=new TiXmlElement("MessageList");\r
+       //td.LinkEndChild(tid);\r
 \r
        for(std::vector<message>::iterator i=m_messages.begin(); i!=m_messages.end(); i++)\r
        {\r
-               TiXmlElement *tr=new TiXmlElement("Message");\r
-               tid->LinkEndChild(tr);\r
-               tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
-               tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
-               TiXmlElement *brds=new TiXmlElement("Boards");\r
-               tr->LinkEndChild(brds);\r
+               Poco::XML::Element *tr=doc->createElement("Message");\r
+               //TiXmlElement *tr=new TiXmlElement("Message");\r
+               root->appendChild(tr);\r
+               //tid->LinkEndChild(tr);\r
+               tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
+               //tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
+               tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
+               //tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
+               Poco::XML::Element *boards=doc->createElement("Boards");\r
+               //TiXmlElement *brds=new TiXmlElement("Boards");\r
+               tr->appendChild(boards);\r
+               //tr->LinkEndChild(brds);\r
                for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
                {\r
-                       brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
+                       boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
+                       //brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
                }\r
        }\r
 \r
        for(std::vector<externalmessage>::iterator i=m_externalmessages.begin(); i!=m_externalmessages.end(); i++)\r
        {\r
-               TiXmlElement *tr=new TiXmlElement("ExternalMessage");\r
-               tid->LinkEndChild(tr);\r
-               tr->LinkEndChild(XMLCreateTextElement("Type",(*i).m_type));\r
+               Poco::XML::Element *tr=doc->createElement("ExternalMessage");\r
+               //TiXmlElement *tr=new TiXmlElement("ExternalMessage");\r
+               root->appendChild(tr);\r
+               //tid->LinkEndChild(tr);\r
+               tr->appendChild(XMLCreateTextElement(doc,"Type",(*i).m_type));\r
+               //tr->LinkEndChild(XMLCreateTextElement("Type",(*i).m_type));\r
                if((*i).m_type=="Keyed")\r
                {\r
-                       tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
-                       tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
+                       tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity));\r
+                       //tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
+                       tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index));\r
+                       //tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
                }\r
                else\r
                {\r
-                       tr->LinkEndChild(XMLCreateCDATAElement("MessageKey",(*i).m_messagekey));\r
+                       tr->appendChild(XMLCreateCDATAElement(doc,"MessageKey",(*i).m_messagekey));\r
+                       //tr->LinkEndChild(XMLCreateCDATAElement("MessageKey",(*i).m_messagekey));\r
                }\r
-               tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
-               TiXmlElement *brds=new TiXmlElement("Boards");\r
-               tr->LinkEndChild(brds);\r
+               tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date));\r
+               //tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date));\r
+               Poco::XML::Element *boards=doc->createElement("Boards");\r
+               //TiXmlElement *brds=new TiXmlElement("Boards");\r
+               tr->appendChild(boards);\r
+               //tr->LinkEndChild(brds);\r
                for(std::vector<std::string>::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++)\r
                {\r
-                       brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\r
+                       boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j)));\r
+                       //brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j)));\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 MessageListXML::Initialize()\r
@@ -192,6 +213,126 @@ void MessageListXML::Initialize()
 \r
 const bool MessageListXML::ParseXML(const std::string &xml)\r
 {\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,"MessageList");\r
+\r
+               Poco::XML::Element *node=XMLGetFirstChild(root,"Message");\r
+               while(node)\r
+               {\r
+                       std::string date="";\r
+                       int index=-1;\r
+                       std::vector<std::string> boards;\r
+\r
+                       Poco::XML::Element *node2=XMLGetFirstChild(node,"Date");\r
+                       if(node2 && node2->firstChild())\r
+                       {\r
+                               date=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
+                       }\r
+                       node2=XMLGetFirstChild(node,"Index");\r
+                       if(node2 && node2->firstChild())\r
+                       {\r
+                               std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
+                               StringFunctions::Convert(indexstr,index);\r
+                       }\r
+                       node2=XMLGetFirstChild(node,"Boards");\r
+                       if(node2)\r
+                       {\r
+                               Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board");\r
+                               while(node3)\r
+                               {\r
+                                       if(node3 && node3->firstChild())\r
+                                       {\r
+                                               std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue());\r
+                                               StringFunctions::LowerCase(boardname,boardname);\r
+                                               if(boardname.size()>40)\r
+                                               {\r
+                                                       boardname.erase(40);\r
+                                               }\r
+                                               boards.push_back(boardname);\r
+                                       }\r
+                                       node3=XMLGetNextSibling(node3,"Board");\r
+                               }\r
+                       }\r
+\r
+                       m_messages.push_back(message(date,index,boards));\r
+\r
+                       node=XMLGetNextSibling(node,"Message");\r
+               }\r
+\r
+               node=XMLGetFirstChild(root,"ExternalMessage");\r
+               while(node)\r
+               {\r
+                       std::string type="";\r
+                       std::string identity="";\r
+                       std::string date="";\r
+                       int index=-1;\r
+                       std::vector<std::string> boards;\r
+\r
+                       Poco::XML::Element *node2=XMLGetFirstChild(node,"Type");\r
+                       if(node2 && node2->firstChild())\r
+                       {\r
+                               type=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
+                       }\r
+\r
+                       if(type=="Keyed")\r
+                       {\r
+                               node2=XMLGetFirstChild(node,"Identity");\r
+                               if(node2 && node2->firstChild())\r
+                               {\r
+                                       identity=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
+                               }\r
+                               node2=XMLGetFirstChild(node,"Date");\r
+                               if(node2 && node2->firstChild())\r
+                               {\r
+                                       date=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
+                               }\r
+                               node2=XMLGetFirstChild(node,"Index");\r
+                               if(node2 && node2->firstChild())\r
+                               {\r
+                                       std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue());\r
+                                       StringFunctions::Convert(indexstr,index);\r
+                               }\r
+                               node2=XMLGetFirstChild(node,"Boards");\r
+                               if(node2)\r
+                               {\r
+                                       Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board");\r
+                                       while(node3)\r
+                                       {\r
+                                               if(node3 && node3->firstChild())\r
+                                               {\r
+                                                       std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue());\r
+                                                       StringFunctions::LowerCase(boardname,boardname);\r
+                                                       if(boardname.size()>40)\r
+                                                       {\r
+                                                               boardname.erase(40);\r
+                                                       }\r
+                                                       boards.push_back(boardname);\r
+                                               }\r
+                                               node3=XMLGetNextSibling(node3,"Board");\r
+                                       }\r
+                               }\r
+                               m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
+                       }\r
+\r
+                       node=XMLGetNextSibling(node,"ExternalMessage");\r
+               }\r
+               parsed=true;\r
+       }\r
+       catch(...)\r
+       {\r
+       }\r
+\r
+       return parsed;\r
+\r
+       /*\r
        TiXmlDocument td;\r
        td.Parse(xml.c_str());\r
 \r
@@ -301,4 +442,5 @@ const bool MessageListXML::ParseXML(const std::string &xml)
        {\r
                return false;\r
        }\r
+       */\r
 }\r