version 0.2.18
[fms.git] / src / freenet / messagelistxml.cpp
index c05bb66..473a495 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
@@ -75,6 +157,29 @@ std::string MessageListXML::GetXML()
                }\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
+               if((*i).m_type=="Keyed")\r
+               {\r
+                       tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity));\r
+                       tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index));\r
+               }\r
+               else\r
+               {\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
+               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
+               }\r
+       }\r
+\r
        td.Accept(&tp);\r
        return std::string(tp.CStr());\r
 }\r
@@ -82,6 +187,7 @@ std::string MessageListXML::GetXML()
 void MessageListXML::Initialize()\r
 {\r
        m_messages.clear();\r
+       m_externalmessages.clear();\r
 }\r
 \r
 const bool MessageListXML::ParseXML(const std::string &xml)\r
@@ -113,12 +219,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 +232,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,6 +244,57 @@ 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