Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #ifndef __XML_PUGI_H__ 6 : #define __XML_PUGI_H__ 7 : 8 : #include <pugixml/pugixml.hpp> 9 : 10 : class XmlPugi : public XmlBase { 11 : public: 12 : 13 : virtual int LoadDoc(const std::string &doc); 14 : virtual int WriteDoc(uint8_t *buf); 15 : virtual int WriteRawDoc(uint8_t *buf); 16 : virtual void PrintDoc(std::ostream& os) const; 17 : virtual void PrintDocFormatted(std::ostream& os) const; 18 : virtual int AddNode(const std::string &key, const std::string &value); 19 : virtual int DeleteNode(const std::string &key); 20 : virtual int ModifyNode(const std::string &key, const std::string &value); 21 : virtual int AddChildNode(const std::string &key, const std::string &value); 22 : virtual int AddChildNodeAfter(const std::string &node_name, 23 : const std::string &key, const std::string &value); 24 : virtual int AddAttribute(const std::string &key, const std::string &value); 25 : virtual int DeleteAttribute(const std::string &key); 26 : virtual int ModifyAttribute(const std::string &key, const std::string &value); 27 : 28 : // Read methods 29 : virtual const char *ReadNode(const std::string &name); 30 : virtual const char *ReadNodeName(const std::string &name); 31 : virtual const char *ReadNodeValue(); 32 : virtual const char *ReadChildNode(); 33 : virtual const char *ReadChildNodeName(); 34 : virtual const char *ReadNextNode(); 35 : virtual const char *ReadNextNodeName(); 36 : virtual void RewindNode(); 37 : 38 : virtual const char *ReadAttrib(const std::string &str); 39 : virtual const char *ReadFirstAttrib(); 40 : virtual const char *ReadNextAttrib(); 41 : virtual void RewindAttrib(); 42 : 43 : virtual const char *ReadParentName(); 44 : 45 : // resets node and attributes 46 : virtual void RewindDoc(); 47 : virtual void AppendDoc(const std::string &str, XmlBase *a_doc); 48 : 49 : pugi::xml_node RootNode(); 50 : pugi::xml_node FindNode(const std::string &name); 51 : 52 : XmlPugi(); 53 : virtual ~XmlPugi(); 54 : 55 : struct xmpp_buf_write : pugi::xml_writer { 56 4177344 : xmpp_buf_write(XmlPugi *arg) : ref(arg) {} 57 : virtual void write(const void *data, size_t sz); 58 : XmlPugi *ref; 59 : }; 60 : 61 : void SetBuf(const void *buf, size_t sz); 62 : 63 3511821 : bool IsNull(pugi::xml_node &node) { return node.type() == pugi::node_null; } 64 81421 : bool IsNull(pugi::xml_attribute &attr) { 65 81421 : return attr == NULL; 66 : } 67 0 : void LoadXmlDoc(const pugi::xml_document &doc) {doc_.reset(doc);} 68 0 : const pugi::xml_document &doc() {return doc_;} 69 : 70 : private: 71 : uint8_t *buf_tmp_; 72 : size_t ts_; //temp size 73 : struct xmpp_buf_write writer_; 74 : 75 : pugi::xml_document doc_; 76 : 77 : // Foll maintains traversal context 78 : pugi::xml_node node_; 79 : pugi::xml_attribute attrib_; 80 : 81 : struct PugiPredicate { 82 : bool operator()(pugi::xml_attribute attr) const { 83 : return (strcmp(attr.name(), tmp_.c_str()) == 0); 84 : } 85 89955669 : bool operator()(pugi::xml_node node) const { 86 89955669 : return (strcmp(node.name(), tmp_.c_str()) == 0); 87 : } 88 5127658 : PugiPredicate(const std::string &name) : tmp_(name) { } 89 : std::string tmp_; 90 : }; 91 : 92 : static pugi::xml_attribute GAttr; 93 : static pugi::xml_node GNode; 94 : void SetContext(pugi::xml_node node = GNode, 95 : pugi::xml_attribute atrib = GAttr); 96 : 97 : }; 98 : 99 : #endif // __XML_PUGI_H__