X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffreenet%2Fmessagelistxml.cpp;h=eb57240d3fdbf33f3863d75b0e610ce47dac4e6b;hb=76805933f794915a72b7f0a21b12af6654759f4f;hp=473a495e983dd17cea1c9b1a58c61cf25a539c13;hpb=1230cc420c955e75051d011d964bc68f061ba08c;p=fms.git diff --git a/src/freenet/messagelistxml.cpp b/src/freenet/messagelistxml.cpp index 473a495..eb57240 100644 --- a/src/freenet/messagelistxml.cpp +++ b/src/freenet/messagelistxml.cpp @@ -134,54 +134,51 @@ const long MessageListXML::GetIndex(const long index) std::string MessageListXML::GetXML() { - TiXmlDocument td; - TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8",""); - TiXmlElement *tid; - TiXmlPrinter tp; + Poco::AutoPtr doc=new Poco::XML::Document; + Poco::AutoPtr root=doc->createElement("MessageList"); - td.LinkEndChild(tdec); - tid=new TiXmlElement("MessageList"); - td.LinkEndChild(tid); + doc->appendChild(root); for(std::vector::iterator i=m_messages.begin(); i!=m_messages.end(); i++) { - TiXmlElement *tr=new TiXmlElement("Message"); - tid->LinkEndChild(tr); - tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date)); - tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index)); - TiXmlElement *brds=new TiXmlElement("Boards"); - tr->LinkEndChild(brds); + Poco::AutoPtr tr=doc->createElement("Message"); + root->appendChild(tr); + tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date)); + tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index)); + + Poco::AutoPtr boards=doc->createElement("Boards"); + tr->appendChild(boards); for(std::vector::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++) { - brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j))); + boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j))); } } for(std::vector::iterator i=m_externalmessages.begin(); i!=m_externalmessages.end(); i++) { - TiXmlElement *tr=new TiXmlElement("ExternalMessage"); - tid->LinkEndChild(tr); - tr->LinkEndChild(XMLCreateTextElement("Type",(*i).m_type)); + Poco::AutoPtr tr=doc->createElement("ExternalMessage"); + root->appendChild(tr); + tr->appendChild(XMLCreateTextElement(doc,"Type",(*i).m_type)); if((*i).m_type=="Keyed") { - tr->LinkEndChild(XMLCreateCDATAElement("Identity",(*i).m_identity)); - tr->LinkEndChild(XMLCreateTextElement("Index",(*i).m_index)); + tr->appendChild(XMLCreateCDATAElement(doc,"Identity",(*i).m_identity)); + tr->appendChild(XMLCreateTextElement(doc,"Index",(*i).m_index)); } else { - tr->LinkEndChild(XMLCreateCDATAElement("MessageKey",(*i).m_messagekey)); + tr->appendChild(XMLCreateCDATAElement(doc,"MessageKey",(*i).m_messagekey)); } - tr->LinkEndChild(XMLCreateTextElement("Date",(*i).m_date)); - TiXmlElement *brds=new TiXmlElement("Boards"); - tr->LinkEndChild(brds); + tr->appendChild(XMLCreateTextElement(doc,"Date",(*i).m_date)); + + Poco::AutoPtr boards=doc->createElement("Boards"); + tr->appendChild(boards); for(std::vector::iterator j=(*i).m_boards.begin(); j!=(*i).m_boards.end(); j++) { - brds->LinkEndChild(XMLCreateCDATAElement("Board",(*j))); + boards->appendChild(XMLCreateCDATAElement(doc,"Board",(*j))); } } - td.Accept(&tp); - return std::string(tp.CStr()); + return GenerateXML(doc); } void MessageListXML::Initialize() @@ -192,113 +189,122 @@ void MessageListXML::Initialize() const bool MessageListXML::ParseXML(const std::string &xml) { - TiXmlDocument td; - td.Parse(xml.c_str()); - if(!td.Error()) + bool parsed=false; + Poco::XML::DOMParser dp; + + Initialize(); + + try { - std::string tempstr; - std::string date; - long index; - std::vector boards; - TiXmlText *txt; - TiXmlHandle hnd(&td); - TiXmlNode *node; - TiXmlNode *node2; - - Initialize(); - - node=hnd.FirstChild("MessageList").FirstChild("Message").ToNode(); + Poco::AutoPtr doc=dp.parseString(FixCDATA(xml)); + Poco::XML::Element *root=XMLGetFirstChild(doc,"MessageList"); + + Poco::XML::Element *node=XMLGetFirstChild(root,"Message"); while(node) { - date=""; - index=-1; - boards.clear(); + std::string date=""; + int index=-1; + std::vector boards; - TiXmlHandle hnd2(node); - txt=hnd2.FirstChild("Date").FirstChild().ToText(); - if(txt) + Poco::XML::Element *node2=XMLGetFirstChild(node,"Date"); + if(node2 && node2->firstChild()) { - date=SanitizeSingleString(txt->ValueStr()); + date=SanitizeSingleString(node2->firstChild()->getNodeValue()); } - txt=hnd2.FirstChild("Index").FirstChild().ToText(); - if(txt) + node2=XMLGetFirstChild(node,"Index"); + if(node2 && node2->firstChild()) { - tempstr=SanitizeSingleString(txt->ValueStr()); - StringFunctions::Convert(tempstr,index); + std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue()); + StringFunctions::Convert(indexstr,index); } - node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode(); - while(node2) + node2=XMLGetFirstChild(node,"Boards"); + if(node2) { - if(node2->FirstChild()) + Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board"); + while(node3) { - std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr()); - StringFunctions::LowerCase(boardname,boardname); - boards.push_back(boardname); + if(node3 && node3->firstChild()) + { + std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue()); + StringFunctions::LowerCase(boardname,boardname); + if(boardname.size()>40) + { + boardname.erase(40); + } + boards.push_back(boardname); + } + node3=XMLGetNextSibling(node3,"Board"); } - node2=node2->NextSibling("Board"); } m_messages.push_back(message(date,index,boards)); - node=node->NextSibling("Message"); + node=XMLGetNextSibling(node,"Message"); } - node=hnd.FirstChild("MessageList").FirstChild("ExternalMessage").ToNode(); + node=XMLGetFirstChild(root,"ExternalMessage"); while(node) { std::string type=""; std::string identity=""; - date=""; - index=-1; - boards.clear(); + std::string date=""; + int index=-1; + std::vector boards; - TiXmlHandle hnd2(node); - txt=hnd2.FirstChild("Type").FirstChild().ToText(); - if(txt) + Poco::XML::Element *node2=XMLGetFirstChild(node,"Type"); + if(node2 && node2->firstChild()) { - type=SanitizeSingleString(txt->ValueStr()); + type=SanitizeSingleString(node2->firstChild()->getNodeValue()); } if(type=="Keyed") { - txt=hnd2.FirstChild("Identity").FirstChild().ToText(); - if(txt) + node2=XMLGetFirstChild(node,"Identity"); + if(node2 && node2->firstChild()) { - identity=SanitizeSingleString(txt->ValueStr()); + identity=SanitizeSingleString(node2->firstChild()->getNodeValue()); } - txt=hnd2.FirstChild("Date").FirstChild().ToText(); - if(txt) + node2=XMLGetFirstChild(node,"Date"); + if(node2 && node2->firstChild()) { - date=SanitizeSingleString(txt->ValueStr()); + date=SanitizeSingleString(node2->firstChild()->getNodeValue()); } - txt=hnd2.FirstChild("Index").FirstChild().ToText(); - if(txt) + node2=XMLGetFirstChild(node,"Index"); + if(node2 && node2->firstChild()) { - tempstr=SanitizeSingleString(txt->ValueStr()); - StringFunctions::Convert(tempstr,index); + std::string indexstr=SanitizeSingleString(node2->firstChild()->getNodeValue()); + StringFunctions::Convert(indexstr,index); } - node2=hnd2.FirstChild("Boards").FirstChild("Board").ToNode(); - while(node2) + node2=XMLGetFirstChild(node,"Boards"); + if(node2) { - if(node2->FirstChild()) + Poco::XML::Element *node3=XMLGetFirstChild(node2,"Board"); + while(node3) { - std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr()); - StringFunctions::LowerCase(boardname,boardname); - boards.push_back(boardname); + if(node3 && node3->firstChild()) + { + std::string boardname=SanitizeSingleString(node3->firstChild()->getNodeValue()); + StringFunctions::LowerCase(boardname,boardname); + if(boardname.size()>40) + { + boardname.erase(40); + } + boards.push_back(boardname); + } + node3=XMLGetNextSibling(node3,"Board"); } - node2=node2->NextSibling("Board"); } m_externalmessages.push_back(externalmessage("Keyed",identity,date,index,boards)); } - node=node->NextSibling("ExternalMessage"); + node=XMLGetNextSibling(node,"ExternalMessage"); } - - return true; + parsed=true; } - else + catch(...) { - return false; } + + return parsed; }