X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ffreenet%2Fmessagexml.cpp;h=7105da1c28e085b176524705081b46d3a917b546;hb=76805933f794915a72b7f0a21b12af6654759f4f;hp=0de84c3f84a070e7494b0ce000fb5e0b7875feca;hpb=52c0819bfc1d083c6e0738f75f0d7eeba521295a;p=fms.git diff --git a/src/freenet/messagexml.cpp b/src/freenet/messagexml.cpp index 0de84c3..7105da1 100644 --- a/src/freenet/messagexml.cpp +++ b/src/freenet/messagexml.cpp @@ -11,46 +11,60 @@ MessageXML::MessageXML() std::string MessageXML::GetXML() { - TiXmlDocument td; - TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8",""); - TiXmlElement *tid; - TiXmlPrinter tp; - - td.LinkEndChild(tdec); - tid=new TiXmlElement("Message"); - td.LinkEndChild(tid); - - tid->LinkEndChild(XMLCreateTextElement("Date",m_date)); - tid->LinkEndChild(XMLCreateTextElement("Time",m_time)); - tid->LinkEndChild(XMLCreateCDATAElement("Subject",m_subject)); - tid->LinkEndChild(XMLCreateCDATAElement("MessageID",m_messageid)); - tid->LinkEndChild(XMLCreateCDATAElement("ReplyBoard",m_replyboard)); - // a little hack because TinyXML doesn't handle ]]> inside a CDATA section - manually separate into multiple CDATA sections - // TinyXML still won't be able to parse past the 1st CDATA section, but other implementations might - tid->LinkEndChild(XMLCreateCDATAElement("Body",StringFunctions::Replace(m_body,"]]>","]]]]>"))); - - TiXmlElement *brds=new TiXmlElement("Boards"); - tid->LinkEndChild(brds); + Poco::AutoPtr doc=new Poco::XML::Document; + Poco::AutoPtr root=doc->createElement("Message"); + + doc->appendChild(root); + + root->appendChild(XMLCreateTextElement(doc,"Date",m_date)); + root->appendChild(XMLCreateTextElement(doc,"Time",m_time)); + root->appendChild(XMLCreateCDATAElement(doc,"Subject",m_subject)); + root->appendChild(XMLCreateCDATAElement(doc,"MessageID",m_messageid)); + root->appendChild(XMLCreateCDATAElement(doc,"ReplyBoard",m_replyboard)); + + root->appendChild(XMLCreateCDATAElement(doc,"Body",m_body)); + + Poco::AutoPtr brds=doc->createElement("Boards"); + + root->appendChild(brds); + + // attach boards for(std::vector::iterator i=m_boards.begin(); i!=m_boards.end(); i++) { - brds->LinkEndChild(XMLCreateCDATAElement("Board",(*i))); + std::string boardname=(*i); + StringFunctions::Convert(boardname,boardname); + brds->appendChild(XMLCreateCDATAElement(doc,"Board",boardname)); } + // attach inreplyto ids if(m_inreplyto.size()>0) { - TiXmlElement *rply=new TiXmlElement("InReplyTo"); - tid->LinkEndChild(rply); + Poco::AutoPtr rply=doc->createElement("InReplyTo"); + root->appendChild(rply); for(std::map::iterator j=m_inreplyto.begin(); j!=m_inreplyto.end(); j++) { - TiXmlElement *mess=new TiXmlElement("Message"); - rply->LinkEndChild(mess); - mess->LinkEndChild(XMLCreateTextElement("Order",(*j).first)); - mess->LinkEndChild(XMLCreateCDATAElement("MessageID",(*j).second)); + Poco::AutoPtr mess=doc->createElement("Message"); + rply->appendChild(mess); + mess->appendChild(XMLCreateTextElement(doc,"Order",(*j).first)); + mess->appendChild(XMLCreateCDATAElement(doc,"MessageID",(*j).second)); + } + } + + // add attachemnt node if we have attachments + if(m_fileattachments.size()>0) + { + Poco::AutoPtr attachments=doc->createElement("Attachments"); + root->appendChild(attachments); + for(std::vector::iterator j=m_fileattachments.begin(); j!=m_fileattachments.end(); j++) + { + Poco::AutoPtr f=doc->createElement("File"); + attachments->appendChild(f); + f->appendChild(XMLCreateCDATAElement(doc,"Key",(*j).m_key)); + f->appendChild(XMLCreateTextElement(doc,"Size",(*j).m_size)); } } - td.Accept(&tp); - return std::string(tp.CStr()); + return GenerateXML(doc); } void MessageXML::Initialize() @@ -62,93 +76,151 @@ void MessageXML::Initialize() m_replyboard=""; m_inreplyto.clear(); m_body=""; + m_fileattachments.clear(); } const bool MessageXML::ParseXML(const std::string &xml) { - TiXmlDocument td; - td.Parse(xml.c_str()); + bool parsed=false; + Poco::XML::DOMParser dp; - if(!td.Error()) - { - TiXmlHandle hnd(&td); - TiXmlNode *node2; - TiXmlText *txt; + Initialize(); - Initialize(); + try + { + Poco::AutoPtr doc=dp.parseString(FixCDATA(xml)); + Poco::XML::Element *root=XMLGetFirstChild(doc,"Message"); + Poco::XML::Element *txt=NULL; - txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText(); + txt=XMLGetFirstChild(root,"Date"); if(txt) { - m_date=txt->ValueStr(); + if(txt->firstChild()) + { + m_date=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } } - txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText(); + txt=XMLGetFirstChild(root,"Time"); if(txt) { - m_time=txt->ValueStr(); + if(txt->firstChild()) + { + m_time=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } } - txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText(); + txt=XMLGetFirstChild(root,"Subject"); if(txt) { - m_subject=txt->ValueStr(); + if(txt->firstChild()) + { + m_subject=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } } - txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText(); + txt=XMLGetFirstChild(root,"MessageID"); if(txt) { - m_messageid=txt->ValueStr(); + if(txt->firstChild()) + { + m_messageid=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } } - txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText(); + txt=XMLGetFirstChild(root,"ReplyBoard"); if(txt) { - m_replyboard=txt->ValueStr(); + if(txt->firstChild()) + { + m_replyboard=SanitizeSingleString(txt->firstChild()->getNodeValue()); + StringFunctions::LowerCase(m_replyboard,m_replyboard); + if(m_replyboard.size()>40) + { + m_replyboard.erase(40); + } + } } - txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText(); + txt=XMLGetFirstChild(root,"Body"); if(txt) { - m_body=txt->ValueStr(); - } - - node2=hnd.FirstChild("Message").FirstChild("Boards").FirstChild("Board").ToNode(); - while(node2) - { - if(node2->FirstChild()) + if(txt->firstChild()) { - m_boards.push_back(node2->FirstChild()->ValueStr()); + m_body=txt->firstChild()->getNodeValue(); } - node2=node2->NextSibling("Board"); } - - node2=hnd.FirstChild("Message").FirstChild("InReplyTo").FirstChild("Message").ToNode(); - while(node2) + Poco::XML::Element *boards=XMLGetFirstChild(root,"Boards"); + if(boards) { - std::string orderstr; - long order=-1; - std::string messageid=""; - TiXmlHandle hnd2(node2); - txt=hnd2.FirstChild("Order").FirstChild().ToText(); - if(txt) + Poco::XML::Element *board=XMLGetFirstChild(boards,"Board"); + while(board) { - orderstr=txt->ValueStr(); - StringFunctions::Convert(orderstr,order); + if(board->firstChild()) + { + std::string boardname=SanitizeSingleString(board->firstChild()->getNodeValue()); + StringFunctions::LowerCase(boardname,boardname); + if(boardname.size()>40) + { + boardname.erase(40); + } + m_boards.push_back(boardname); + } + board=XMLGetNextSibling(board,"Board"); } - txt=hnd2.FirstChild("MessageID").FirstChild().ToText(); - if(txt) + } + Poco::XML::Element *inreplyto=XMLGetFirstChild(root,"InReplyTo"); + if(inreplyto) + { + Poco::XML::Element *message=XMLGetFirstChild(inreplyto,"Message"); + while(message) { - messageid=txt->ValueStr(); + Poco::XML::Element *orderel=XMLGetFirstChild(message,"Order"); + Poco::XML::Element *messageidel=XMLGetFirstChild(message,"MessageID"); + if(orderel && orderel->firstChild() && messageidel && messageidel->firstChild()) + { + int order=-1; + std::string messageid=""; + + StringFunctions::Convert(orderel->firstChild()->getNodeValue(),order); + messageid=messageidel->firstChild()->getNodeValue(); + + if(order!=-1 && messageid!="") + { + m_inreplyto[order]=messageid; + } + } + message=XMLGetNextSibling(message,"Message"); } - - if(order!=-1 && messageid!="") + } + Poco::XML::Element *attachments=XMLGetFirstChild(root,"Attachments"); + if(attachments) + { + Poco::XML::Element *file=XMLGetFirstChild(attachments,"File"); + while(file) { - m_inreplyto[order]=messageid; + Poco::XML::Element *keyel=XMLGetFirstChild(file,"Key"); + Poco::XML::Element *sizeel=XMLGetFirstChild(file,"Size"); + + if(keyel && keyel->firstChild() && sizeel && sizeel->firstChild()) + { + int size=-1; + std::string key=""; + + StringFunctions::Convert(sizeel->firstChild()->getNodeValue(),size); + key=keyel->firstChild()->getNodeValue(); + + if(size!=-1 && key!="") + { + m_fileattachments.push_back(fileattachment(key,size)); + } + } + + file=XMLGetNextSibling(file,"File"); } - - node2=node2->NextSibling("Message"); } - return true; + parsed=true; + } - else + catch(...) { - return false; } + + return parsed; }