version 0.1.0
[fms.git] / src / freenet / messagexml.cpp
diff --git a/src/freenet/messagexml.cpp b/src/freenet/messagexml.cpp
new file mode 100644 (file)
index 0000000..90bcca7
--- /dev/null
@@ -0,0 +1,153 @@
+#include "../../include/freenet/messagexml.h"\r
+\r
+#ifdef XMEM\r
+       #include <xmem.h>\r
+#endif\r
+\r
+MessageXML::MessageXML()\r
+{\r
+       Initialize();\r
+}\r
+\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
+       tid->LinkEndChild(XMLCreateCDATAElement("Body",m_body));\r
+\r
+       TiXmlElement *brds=new TiXmlElement("Boards");\r
+       tid->LinkEndChild(brds);\r
+       for(std::vector<std::string>::iterator i=m_boards.begin(); i!=m_boards.end(); i++)\r
+       {\r
+               brds->LinkEndChild(XMLCreateCDATAElement("Board",(*i)));\r
+       }\r
+\r
+       if(m_inreplyto.size()>0)\r
+       {\r
+               TiXmlElement *rply=new TiXmlElement("InReplyTo");\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
+               }\r
+       }\r
+\r
+       td.Accept(&tp);\r
+       return std::string(tp.CStr());\r
+}\r
+\r
+void MessageXML::Initialize()\r
+{\r
+       m_date="";\r
+       m_time="";\r
+       m_subject="";\r
+       m_boards.clear();\r
+       m_replyboard="";\r
+       m_inreplyto.clear();\r
+       m_body="";\r
+}\r
+\r
+const bool MessageXML::ParseXML(const std::string &xml)\r
+{\r
+       TiXmlDocument td;\r
+       td.Parse(xml.c_str());\r
+\r
+       if(!td.Error())\r
+       {\r
+               TiXmlHandle hnd(&td);\r
+               TiXmlNode *node1;\r
+               TiXmlNode *node2;\r
+               TiXmlText *txt;\r
+\r
+               Initialize();\r
+\r
+               txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText();\r
+               if(txt)\r
+               {\r
+                       m_date=txt->ValueStr();\r
+               }\r
+               txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText();\r
+               if(txt)\r
+               {\r
+                       m_time=txt->ValueStr();\r
+               }\r
+               txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText();\r
+               if(txt)\r
+               {\r
+                       m_subject=txt->ValueStr();\r
+               }\r
+               txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText();\r
+               if(txt)\r
+               {\r
+                       m_messageid=txt->ValueStr();\r
+               }\r
+               txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText();\r
+               if(txt)\r
+               {\r
+                       m_replyboard=txt->ValueStr();\r
+               }\r
+               txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText();\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
+                       {\r
+                               m_boards.push_back(node2->FirstChild()->ValueStr());\r
+                       }\r
+                       node2=node2->NextSibling("Board");\r
+               }\r
+\r
+               node2=hnd.FirstChild("Message").FirstChild("InReplyTo").FirstChild("Message").ToNode();\r
+               while(node2)\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
+                       {\r
+                               orderstr=txt->ValueStr();\r
+                               StringFunctions::Convert(orderstr,order);\r
+                       }\r
+                       txt=hnd2.FirstChild("MessageID").FirstChild().ToText();\r
+                       if(txt)\r
+                       {\r
+                               messageid=txt->ValueStr();\r
+                       }\r
+\r
+                       if(order!=-1 && messageid!="")\r
+                       {\r
+                               m_inreplyto[order]=messageid;\r
+                       }\r
+\r
+                       node2=node2->NextSibling("Message");\r
+               }\r
+\r
+               return true;\r
+       }\r
+       else\r
+       {\r
+               return false;\r
+       }\r
+}\r