From d6bae76908e2d75dc9825b85fde19102369ad2f4 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 21 Jan 2016 16:07:23 +0300 Subject: Add support for writing xml files from pugixml. --- src/utils/xml/pugixml.cpp | 4 --- src/utils/xml/pugixml.h | 1 - src/utils/xml/pugixml.inc | 19 +++++------ src/utils/xml/pugixmlwriter.cpp | 73 +++++++++++++++++++++++++++++++++++++++++ src/utils/xml/pugixmlwriter.h | 65 ++++++++++++++++++++++++++++++++++++ src/utils/xml_unittest.cc | 1 + src/utils/xmlwriter.h | 28 ++++++++++++++++ 7 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 src/utils/xml/pugixmlwriter.cpp create mode 100644 src/utils/xml/pugixmlwriter.h create mode 100644 src/utils/xmlwriter.h (limited to 'src/utils') diff --git a/src/utils/xml/pugixml.cpp b/src/utils/xml/pugixml.cpp index 7bff15f6c..9ca717d83 100644 --- a/src/utils/xml/pugixml.cpp +++ b/src/utils/xml/pugixml.cpp @@ -59,7 +59,6 @@ namespace XML const UseResman useResman, const SkipError skipError) : mDoc(), - mRoot(), mData(nullptr), mIsValid(false) { @@ -121,7 +120,6 @@ namespace XML mData = data; } - mRoot = mDoc.first_child(); // if (!mDoc) // logger->log("Error parsing XML file %s", filename.c_str()); } @@ -135,7 +133,6 @@ namespace XML Document::Document(const char *const data, const int size) : mDoc(), - mRoot(), mData(nullptr), mIsValid(true) { @@ -156,7 +153,6 @@ namespace XML } else { - mRoot = mDoc.first_child(); mData = buf; } } diff --git a/src/utils/xml/pugixml.h b/src/utils/xml/pugixml.h index 105f56959..69864959d 100644 --- a/src/utils/xml/pugixml.h +++ b/src/utils/xml/pugixml.h @@ -88,7 +88,6 @@ namespace XML private: pugi::xml_document mDoc; - pugi::xml_node mRoot; char *mData; bool mIsValid; }; diff --git a/src/utils/xml/pugixml.inc b/src/utils/xml/pugixml.inc index 4350a8e71..f6257a967 100644 --- a/src/utils/xml/pugixml.inc +++ b/src/utils/xml/pugixml.inc @@ -36,20 +36,17 @@ #define xmlChar char #define XmlFree(ptr) #define XmlNodeDefault pugi::xml_node() - -// +++ need impliment get context #define XmlNodeGetContent(node) (node).child_value() - -// +++ need impliment writing code -#define XmlTextWriterPtr pugi::xml_writer* -#define XmlTextWriterStartElement(writer, name) -#define XmlTextWriterEndElement(writer) -#define XmlTextWriterWriteAttribute(writer, name, content) -#define XmlNewTextWriterFilename(name, flags) nullptr; +#define XmlTextWriterPtr XML::Writer * +#define XmlTextWriterStartElement(writer, name) (writer)->startNode(name) +#define XmlTextWriterEndElement(writer) (writer)->endNode() +#define XmlTextWriterWriteAttribute(writer, name, content) \ + (writer)->addAttribute(name, content) +#define XmlNewTextWriterFilename(name, flags) new XML::Writer(name); #define XmlTextWriterSetIndent(writer, flags) #define XmlTextWriterStartDocument(writer, p1, p2, p3) -#define XmlTextWriterEndDocument(writer) -#define XmlFreeTextWriter(writer) +#define XmlTextWriterEndDocument(writer) (writer)->endDocument() +#define XmlFreeTextWriter(writer) delete writer #endif // ENABLE_PUGIXML #endif // UTILS_XML_PUGIXML_INC diff --git a/src/utils/xml/pugixmlwriter.cpp b/src/utils/xml/pugixmlwriter.cpp new file mode 100644 index 000000000..94caa9480 --- /dev/null +++ b/src/utils/xml/pugixmlwriter.cpp @@ -0,0 +1,73 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifdef ENABLE_PUGIXML + +#include "utils/xml/pugixmlwriter.h" + +#include "logger.h" + +#include "utils/delete2.h" +#include "utils/fuzzer.h" +#include "utils/physfstools.h" +#include "utils/stringutils.h" + +#include "utils/translation/podict.h" + +#include "debug.h" + +namespace XML +{ + Writer::Writer(const std::string &filename) : + mDoc(), + mNode(), + mName(filename) + { + mNode = mDoc; + } + + Writer::~Writer() + { + } + + void Writer::startNode(const std::string &name) const + { + mNode = mNode.append_child(name.c_str()); + } + + void Writer::endNode() const + { + mNode = mNode.parent(); + } + + void Writer::endDocument() const + { + mDoc.save_file(mName.c_str()); + } + + void Writer::addAttribute(const std::string &name, + const std::string &value) const + { + mNode.append_attribute(name.c_str()) = value.c_str(); + } + +} // namespace XML + +#endif // ENABLE_PUGIXML diff --git a/src/utils/xml/pugixmlwriter.h b/src/utils/xml/pugixmlwriter.h new file mode 100644 index 000000000..5d744f312 --- /dev/null +++ b/src/utils/xml/pugixmlwriter.h @@ -0,0 +1,65 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef UTILS_XML_PUGIXMLWRITER_H +#define UTILS_XML_PUGIXMLWRITER_H + +#ifdef ENABLE_PUGIXML + +#include "enums/simpletypes/skiperror.h" +#include "enums/simpletypes/useresman.h" + +#include "utils/xml/pugixml.inc" + +#include + +#include + +#include "localconsts.h" + +namespace XML +{ + class Writer final + { + public: + explicit Writer(const std::string &filename); + + A_DELETE_COPY(Writer) + + ~Writer(); + + void startNode(const std::string &name) const; + + void endNode() const; + + void endDocument() const; + + void addAttribute(const std::string &name, + const std::string &value) const; + + private: + mutable pugi::xml_document mDoc; + mutable pugi::xml_node mNode; + std::string mName; + }; +} // namespace XML + +#endif // ENABLE_PUGIXML +#endif // UTILS_XML_PUGIXMLWRITER_H diff --git a/src/utils/xml_unittest.cc b/src/utils/xml_unittest.cc index e5c194e21..fdee8de5d 100644 --- a/src/utils/xml_unittest.cc +++ b/src/utils/xml_unittest.cc @@ -24,6 +24,7 @@ #include "utils/physfstools.h" #include "utils/xml.h" +#include "utils/xmlwriter.h" #include "resources/resourcemanager.h" diff --git a/src/utils/xmlwriter.h b/src/utils/xmlwriter.h new file mode 100644 index 000000000..41ff95c68 --- /dev/null +++ b/src/utils/xmlwriter.h @@ -0,0 +1,28 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2016 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef UTILS_XMLWRITER_H +#define UTILS_XMLWRITER_H + +#ifdef ENABLE_PUGIXML +#include "utils/xml/pugixmlwriter.h" +#endif // ENABLE_PUGIXML + +#endif // UTILS_XMLWRITER_H -- cgit v1.2.3-60-g2f50