X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Ffreenet%2Fmessagexml.cpp;h=70b660d22a380a9e48a05bd94bebcee41389684c;hb=dec33c63afafabf83c3039e916725cac6faef9b3;hp=4b3252a287f988a838f41fb955d9d274aa84b9c0;hpb=4430e7762844c66428b6f822288beb71b7f82b95;p=fms.git diff --git a/src/freenet/messagexml.cpp b/src/freenet/messagexml.cpp index 4b3252a..70b660d 100644 --- a/src/freenet/messagexml.cpp +++ b/src/freenet/messagexml.cpp @@ -11,46 +11,89 @@ MessageXML::MessageXML() std::string MessageXML::GetXML() { - TiXmlDocument td; - TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8",""); - TiXmlElement *tid; - TiXmlPrinter tp; + Poco::AutoPtr doc=new Poco::XML::Document; + //TiXmlDocument td; + //TiXmlDeclaration *tdec=new TiXmlDeclaration("1.0","UTF-8",""); + Poco::XML::Element *root=doc->createElement("Message"); + //TiXmlElement *tid; + //TiXmlPrinter tp; - td.LinkEndChild(tdec); - tid=new TiXmlElement("Message"); - td.LinkEndChild(tid); + doc->appendChild(root); + //td.LinkEndChild(tdec); + //tid=new TiXmlElement("Message"); + //td.LinkEndChild(tid); + 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)); + /* 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)); + */ + + root->appendChild(XMLCreateCDATAElement(doc,"Body",m_body)); // 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,"]]>","]]]]>"))); + //tid->LinkEndChild(XMLCreateCDATAElement("Body",StringFunctions::Replace(m_body,"]]>","]]]]>"))); - TiXmlElement *brds=new TiXmlElement("Boards"); - tid->LinkEndChild(brds); + Poco::XML::Element *brds=doc->createElement("Boards"); + //TiXmlElement *brds=new TiXmlElement("Boards"); + root->appendChild(brds); + //tid->LinkEndChild(brds); 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)); + //brds->LinkEndChild(XMLCreateCDATAElement("Board",boardname)); } if(m_inreplyto.size()>0) { - TiXmlElement *rply=new TiXmlElement("InReplyTo"); - tid->LinkEndChild(rply); + Poco::XML::Element *rply=doc->createElement("InReplyTo"); + //TiXmlElement *rply=new TiXmlElement("InReplyTo"); + root->appendChild(rply); + //tid->LinkEndChild(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::XML::Element *mess=doc->createElement("Message"); + //TiXmlElement *mess=new TiXmlElement("Message"); + rply->appendChild(mess); + mess->appendChild(XMLCreateTextElement(doc,"Order",(*j).first)); + mess->appendChild(XMLCreateCDATAElement(doc,"MessageID",(*j).second)); + //mess->LinkEndChild(XMLCreateTextElement("Order",(*j).first)); + //mess->LinkEndChild(XMLCreateCDATAElement("MessageID",(*j).second)); + } + } + + // add attachemnt node if we have attachments + if(m_fileattachments.size()>0) + { + Poco::XML::Element *attachments=doc->createElement("Attachments"); + //TiXmlElement *attachments=new TiXmlElement("Attachments"); + root->appendChild(attachments); + //tid->LinkEndChild(attachments); + for(std::vector::iterator j=m_fileattachments.begin(); j!=m_fileattachments.end(); j++) + { + Poco::XML::Element *f=doc->createElement("File"); + //TiXmlElement *f=new TiXmlElement("File"); + attachments->appendChild(f); + //attachments->LinkEndChild(f); + f->appendChild(XMLCreateCDATAElement(doc,"Key",(*j).m_key)); + f->appendChild(XMLCreateTextElement(doc,"Size",(*j).m_size)); + //f->LinkEndChild(XMLCreateCDATAElement("Key",(*j).m_key)); + //f->LinkEndChild(XMLCreateTextElement("Size",(*j).m_size)); } } - td.Accept(&tp); - return std::string(tp.CStr()); + //td.Accept(&tp); + //return std::string(tp.CStr()); + return GenerateXML(doc); } void MessageXML::Initialize() @@ -62,10 +105,155 @@ void MessageXML::Initialize() m_replyboard=""; m_inreplyto.clear(); m_body=""; + m_fileattachments.clear(); } const bool MessageXML::ParseXML(const std::string &xml) { + bool parsed=false; + Poco::XML::DOMParser dp; + + Initialize(); + + try + { + Poco::AutoPtr doc=dp.parseString(FixCDATA(xml)); + Poco::XML::Element *root=XMLGetFirstChild(doc,"Message"); + Poco::XML::Element *txt=NULL; + + txt=XMLGetFirstChild(root,"Date"); + if(txt) + { + if(txt->firstChild()) + { + m_date=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } + } + txt=XMLGetFirstChild(root,"Time"); + if(txt) + { + if(txt->firstChild()) + { + m_time=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } + } + txt=XMLGetFirstChild(root,"Subject"); + if(txt) + { + if(txt->firstChild()) + { + m_subject=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } + } + txt=XMLGetFirstChild(root,"MessageID"); + if(txt) + { + if(txt->firstChild()) + { + m_messageid=SanitizeSingleString(txt->firstChild()->getNodeValue()); + } + } + txt=XMLGetFirstChild(root,"ReplyBoard"); + if(txt) + { + 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=XMLGetFirstChild(root,"Body"); + if(txt) + { + if(txt->firstChild()) + { + m_body=txt->firstChild()->getNodeValue(); + } + } + Poco::XML::Element *boards=XMLGetFirstChild(root,"Boards"); + if(boards) + { + Poco::XML::Element *board=XMLGetFirstChild(boards,"Board"); + while(board) + { + 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"); + } + } + Poco::XML::Element *inreplyto=XMLGetFirstChild(root,"InReplyTo"); + if(inreplyto) + { + Poco::XML::Element *message=XMLGetFirstChild(inreplyto,"Message"); + while(message) + { + 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"); + } + } + Poco::XML::Element *attachments=XMLGetFirstChild(root,"Attachments"); + if(attachments) + { + Poco::XML::Element *file=XMLGetFirstChild(attachments,"File"); + while(file) + { + 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"); + } + } + + parsed=true; + + } + catch(...) + { + } + + return parsed; + +/* TiXmlDocument td; td.Parse(xml.c_str()); @@ -80,27 +268,32 @@ const bool MessageXML::ParseXML(const std::string &xml) txt=hnd.FirstChild("Message").FirstChild("Date").FirstChild().ToText(); if(txt) { - m_date=txt->ValueStr(); + m_date=SanitizeSingleString(txt->ValueStr()); } txt=hnd.FirstChild("Message").FirstChild("Time").FirstChild().ToText(); if(txt) { - m_time=txt->ValueStr(); + m_time=SanitizeSingleString(txt->ValueStr()); } txt=hnd.FirstChild("Message").FirstChild("Subject").FirstChild().ToText(); if(txt) { - m_subject=txt->ValueStr(); + m_subject=SanitizeSingleString(txt->ValueStr()); } txt=hnd.FirstChild("Message").FirstChild("MessageID").FirstChild().ToText(); if(txt) { - m_messageid=txt->ValueStr(); + m_messageid=SanitizeSingleString(txt->ValueStr()); } txt=hnd.FirstChild("Message").FirstChild("ReplyBoard").FirstChild().ToText(); if(txt) { - m_replyboard=txt->ValueStr(); + m_replyboard=SanitizeSingleString(txt->ValueStr()); + StringFunctions::LowerCase(m_replyboard,m_replyboard); + if(m_replyboard.size()>40) + { + m_replyboard.erase(40); + } } txt=hnd.FirstChild("Message").FirstChild("Body").FirstChild().ToText(); if(txt) @@ -113,8 +306,12 @@ const bool MessageXML::ParseXML(const std::string &xml) { if(node2->FirstChild()) { - std::string boardname=node2->FirstChild()->ValueStr(); + std::string boardname=SanitizeSingleString(node2->FirstChild()->ValueStr()); StringFunctions::LowerCase(boardname,boardname); + if(boardname.size()>40) + { + boardname.erase(40); + } m_boards.push_back(boardname); } node2=node2->NextSibling("Board"); @@ -130,13 +327,13 @@ const bool MessageXML::ParseXML(const std::string &xml) txt=hnd2.FirstChild("Order").FirstChild().ToText(); if(txt) { - orderstr=txt->ValueStr(); + orderstr=SanitizeSingleString(txt->ValueStr()); StringFunctions::Convert(orderstr,order); } txt=hnd2.FirstChild("MessageID").FirstChild().ToText(); if(txt) { - messageid=txt->ValueStr(); + messageid=SanitizeSingleString(txt->ValueStr()); } if(order!=-1 && messageid!="") @@ -147,10 +344,41 @@ const bool MessageXML::ParseXML(const std::string &xml) node2=node2->NextSibling("Message"); } + node2=hnd.FirstChild("Message").FirstChild("Attachments").FirstChild("File").ToNode(); + while(node2) + { + std::string key=""; + std::string sizestr="-1"; + int size=-1; + + TiXmlHandle hnd2(node2); + + txt=hnd2.FirstChild("Key").FirstChild().ToText(); + if(txt) + { + key=SanitizeSingleString(txt->ValueStr()); + } + + txt=hnd2.FirstChild("Size").FirstChild().ToText(); + if(txt) + { + sizestr=SanitizeSingleString(txt->ValueStr()); + StringFunctions::Convert(sizestr,size); + } + + if(key!="" && size>0) + { + m_fileattachments.push_back(fileattachment(key,size)); + } + + node2=node2->NextSibling("File"); + } + return true; } else { return false; } + */ }