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/CMakeLists.txt | 1 + src/Makefile.am | 5 ++- src/configuration.cpp | 2 +- src/configuration.h | 1 + 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 ++++++++++++++++ 11 files changed, 182 insertions(+), 18 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') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0305db4a7..e5398adb9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -821,6 +821,7 @@ SET(SRCS utils/xml.inc utils/xmlutils.cpp utils/xmlutils.h + utils/xmlwriter.h utils/xml/libxml.cpp utils/xml/libxml.h utils/xml/libxml.inc diff --git a/src/Makefile.am b/src/Makefile.am index ce8e9ec86..4e723484d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -476,6 +476,7 @@ SRC += events/actionevent.h \ utils/xml.inc \ utils/xmlutils.cpp \ utils/xmlutils.h \ + utils/xmlwriter.h \ test/testlauncher.cpp \ test/testlauncher.h \ test/testmain.cpp \ @@ -694,7 +695,9 @@ SRC += events/actionevent.h \ if ENABLE_PUGIXML SRC += utils/xml/pugixml.cpp \ utils/xml/pugixml.h \ - utils/xml/pugixml.inc + utils/xml/pugixml.inc \ + utils/xml/pugixmlwriter.cpp \ + utils/xml/pugixmlwriter.h endif if ENABLE_LIBXML SRC += utils/xml/libxml.cpp \ diff --git a/src/configuration.cpp b/src/configuration.cpp index 583ea2d83..da80e9f8f 100644 --- a/src/configuration.cpp +++ b/src/configuration.cpp @@ -31,7 +31,7 @@ #include "utils/paths.h" #ifdef DEBUG_CONFIG #include "utils/stringmap.h" -#endif +#endif // DEBUG_CONFIG #include "debug.h" diff --git a/src/configuration.h b/src/configuration.h index c0214d8cc..b4320cec9 100644 --- a/src/configuration.h +++ b/src/configuration.h @@ -25,6 +25,7 @@ #include "utils/stringutils.h" #include "utils/xml.h" +#include "utils/xmlwriter.h" #include "defaults.h" #include "localconsts.h" 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