version 0.3.0
[fms.git] / src / freenet / messagelistxml.cpp
index c05bb66..c35e10f 100644 (file)
@@ -9,11 +9,21 @@ MessageListXML::MessageListXML()
        Initialize();\r
 }\r
 \r
-void MessageListXML::AddMessage(const std::string &date, const long index, const std::vector<std::string> boards)\r
+void MessageListXML::AddMessage(const std::string &date, const long index, const std::vector<std::string> &boards)\r
 {\r
        m_messages.push_back(message(date,index,boards));\r
 }\r
 \r
+void MessageListXML::AddExternalMessage(const std::string &identity, const std::string &date, const long index, const std::vector<std::string> &boards)\r
+{\r
+       m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
+}\r
+\r
+void MessageListXML::AddExternalMessage(const std::string &messagekey, const std::string &date, const std::vector<std::string> &boards)\r
+{\r
+       m_externalmessages.push_back(externalmessage("Anonymous",messagekey,date,boards));\r
+}\r
+\r
 std::vector<std::string> MessageListXML::GetBoards(const long index)\r
 {\r
        if(index>=0 && index<m_messages.size())\r
@@ -38,6 +48,78 @@ std::string MessageListXML::GetDate(const long index)
        }\r
 }\r
 \r
+std::vector<std::string> MessageListXML::GetExternalBoards(const long index)\r
+{\r
+       if(index>=0 && index<m_externalmessages.size())\r
+       {\r
+               return m_externalmessages[index].m_boards;\r
+       }\r
+       else\r
+       {\r
+               return std::vector<std::string>();\r
+       }\r
+}\r
+\r
+std::string MessageListXML::GetExternalDate(const long index)\r
+{\r
+       if(index>=0 && index<m_externalmessages.size())\r
+       {\r
+               return m_externalmessages[index].m_date;\r
+       }\r
+       else\r
+       {\r
+               return "";\r
+       }\r
+}\r
+\r
+std::string MessageListXML::GetExternalIdentity(const long index)\r
+{\r
+       if(index>=0 && index<m_externalmessages.size())\r
+       {\r
+               return m_externalmessages[index].m_identity;\r
+       }\r
+       else\r
+       {\r
+               return "";\r
+       }\r
+}\r
+\r
+const long MessageListXML::GetExternalIndex(const long index)\r
+{\r
+       if(index>=0 && index<m_externalmessages.size())\r
+       {\r
+               return m_externalmessages[index].m_index;\r
+       }\r
+       else\r
+       {\r
+               return-1;\r
+       }\r
+}\r
+\r
+std::string MessageListXML::GetExternalMessageKey(const long index)\r
+{\r
+       if(index>=0 && index<m_externalmessages.size())\r
+       {\r
+               return m_externalmessages[index].m_messagekey;\r
+       }\r
+       else\r
+       {\r
+               return "";\r
+       }\r
+}\r
+\r
+std::string MessageListXML::GetExternalType(const long index)\r
+{\r
+       if(index>=0 && index<m_externalmessages.size())\r
+       {\r
+               return m_externalmessages[index].m_type;\r
+       }\r
+       else\r
+       {\r
+               return "";\r
+       }\r
+}\r
+\r
 const long MessageListXML::GetIndex(const long index)\r
 {\r
        if(index>=0 && index<m_messages.size())\r
@@ -52,40 +134,205 @@ 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
+       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
-       td.LinkEndChild(tdec);\r
-       tid=new TiXmlElement("MessageList");\r
-       td.LinkEndChild(tid);\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
+                       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
+               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->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->appendChild(XMLCreateCDATAElement(doc,"MessageKey",(*i).m_messagekey));\r
+                       //tr->LinkEndChild(XMLCreateCDATAElement("MessageKey",(*i).m_messagekey));\r
+               }\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
 {\r
        m_messages.clear();\r
+       m_externalmessages.clear();\r
 }\r
 \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
@@ -113,12 +360,12 @@ const bool MessageListXML::ParseXML(const std::string &xml)
                        txt=hnd2.FirstChild("Date").FirstChild().ToText();\r
                        if(txt)\r
                        {\r
-                               date=txt->ValueStr();\r
+                               date=SanitizeSingleString(txt->ValueStr());\r
                        }\r
                        txt=hnd2.FirstChild("Index").FirstChild().ToText();\r
                        if(txt)\r
                        {\r
-                               tempstr=txt->ValueStr();\r
+                               tempstr=SanitizeSingleString(txt->ValueStr());\r
                                StringFunctions::Convert(tempstr,index);\r
                        }\r
                        node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode();\r
@@ -126,7 +373,9 @@ const bool MessageListXML::ParseXML(const std::string &xml)
                        {\r
                                if(node2->FirstChild())\r
                                {\r
-                                       boards.push_back(node2->FirstChild()->ValueStr());\r
+                                       std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());\r
+                                       StringFunctions::LowerCase(boardname,boardname);\r
+                                       boards.push_back(boardname);\r
                                }\r
                                node2=node2->NextSibling("Board");\r
                        }\r
@@ -136,10 +385,62 @@ const bool MessageListXML::ParseXML(const std::string &xml)
                        node=node->NextSibling("Message");\r
                }\r
 \r
+               node=hnd.FirstChild("MessageList").FirstChild("ExternalMessage").ToNode();\r
+               while(node)\r
+               {\r
+                       std::string type="";\r
+                       std::string identity="";\r
+                       date="";\r
+                       index=-1;\r
+                       boards.clear();\r
+\r
+                       TiXmlHandle hnd2(node);\r
+                       txt=hnd2.FirstChild("Type").FirstChild().ToText();\r
+                       if(txt)\r
+                       {\r
+                               type=SanitizeSingleString(txt->ValueStr());\r
+                       }\r
+\r
+                       if(type=="Keyed")\r
+                       {\r
+                               txt=hnd2.FirstChild("Identity").FirstChild().ToText();\r
+                               if(txt)\r
+                               {\r
+                                       identity=SanitizeSingleString(txt->ValueStr());\r
+                               }\r
+                               txt=hnd2.FirstChild("Date").FirstChild().ToText();\r
+                               if(txt)\r
+                               {\r
+                                       date=SanitizeSingleString(txt->ValueStr());\r
+                               }\r
+                               txt=hnd2.FirstChild("Index").FirstChild().ToText();\r
+                               if(txt)\r
+                               {\r
+                                       tempstr=SanitizeSingleString(txt->ValueStr());\r
+                                       StringFunctions::Convert(tempstr,index);\r
+                               }\r
+                               node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode();\r
+                               while(node2)\r
+                               {\r
+                                       if(node2->FirstChild())\r
+                                       {\r
+                                               std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr());\r
+                                               StringFunctions::LowerCase(boardname,boardname);\r
+                                               boards.push_back(boardname);\r
+                                       }\r
+                                       node2=node2->NextSibling("Board");\r
+                               }\r
+                               m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards));\r
+                       }\r
+\r
+                       node=node->NextSibling("ExternalMessage");\r
+               }\r
+\r
                return true;\r
        }\r
        else\r
        {\r
                return false;\r
        }\r
+       */\r
 }\r