summaryrefslogtreecommitdiff
path: root/shared/xmlBase.h
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:00:17 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:00:17 +0200
commitfd0853d2623dd278b08288331ed42e3be59252fb (patch)
treea7645daeaef8bdbed064faf4eb88e72cee58726c /shared/xmlBase.h
parent2.1 (diff)
downloadFreeFileSync-fd0853d2623dd278b08288331ed42e3be59252fb.tar.gz
FreeFileSync-fd0853d2623dd278b08288331ed42e3be59252fb.tar.bz2
FreeFileSync-fd0853d2623dd278b08288331ed42e3be59252fb.zip
2.2
Diffstat (limited to 'shared/xmlBase.h')
-rw-r--r--shared/xmlBase.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/shared/xmlBase.h b/shared/xmlBase.h
new file mode 100644
index 00000000..5fc13b65
--- /dev/null
+++ b/shared/xmlBase.h
@@ -0,0 +1,136 @@
+#ifndef XMLBASE_H_INCLUDED
+#define XMLBASE_H_INCLUDED
+
+#include "tinyxml/tinyxml.h"
+#include <string>
+#include <vector>
+#include <wx/string.h>
+
+
+namespace xmlAccess
+{
+
+ enum XmlType
+ {
+ XML_GUI_CONFIG,
+ XML_BATCH_CONFIG,
+ XML_GLOBAL_SETTINGS,
+ XML_REAL_CONFIG,
+ XML_OTHER
+ };
+
+ XmlType getXmlType(const wxString& filename);
+
+ bool loadXmlDocument(const wxString& fileName, const XmlType type, TiXmlDocument& document);
+ void getDefaultXmlDocument(const XmlType type, TiXmlDocument& document);
+ bool saveXmlDocument(const wxString& fileName, const TiXmlDocument& document);
+
+
+//------------------------------------------------------------------------------------------
+
+ //small helper functions
+ bool readXmlElement(const std::string& name, const TiXmlElement* parent, std::string& output);
+ bool readXmlElement(const std::string& name, const TiXmlElement* parent, wxString& output);
+ bool readXmlElement(const std::string& name, const TiXmlElement* parent, int& output);
+ bool readXmlElement(const std::string& name, const TiXmlElement* parent, unsigned int& output);
+ bool readXmlElement(const std::string& name, const TiXmlElement* parent, long& output);
+ bool readXmlElement(const std::string& name, const TiXmlElement* parent, bool& output);
+ bool readXmlElement(const std::string& name, const TiXmlElement* parent, std::vector<wxString>& output);
+
+ bool readXmlAttribute(const std::string& name, const TiXmlElement* node, std::string& output);
+ bool readXmlAttribute(const std::string& name, const TiXmlElement* node, int& output);
+ bool readXmlAttribute(const std::string& name, const TiXmlElement* node, unsigned int& output);
+ bool readXmlAttribute(const std::string& name, const TiXmlElement* node, bool& output);
+
+ void addXmlElement(const std::string& name, const std::string& value, TiXmlElement* parent);
+ void addXmlElement(const std::string& name, const wxString& value, TiXmlElement* parent);
+ void addXmlElement(const std::string& name, const int value, TiXmlElement* parent);
+ void addXmlElement(const std::string& name, const unsigned int value, TiXmlElement* parent);
+ void addXmlElement(const std::string& name, const long value, TiXmlElement* parent);
+ void addXmlElement(const std::string& name, const bool value, TiXmlElement* parent);
+ void addXmlElement(const std::string& name, const std::vector<wxString>& value, TiXmlElement* parent);
+
+ void addXmlAttribute(const std::string& name, const std::string& value, TiXmlElement* node);
+ void addXmlAttribute(const std::string& name, const int value, TiXmlElement* node);
+ void addXmlAttribute(const std::string& name, const unsigned int value, TiXmlElement* node);
+ void addXmlAttribute(const std::string& name, const bool value, TiXmlElement* node);
+
+
+
+ class XmlParser
+ {
+ public:
+ XmlParser(const TiXmlElement* rootElement) : root(rootElement) {}
+
+ void logError(const std::string& nodeName);
+ bool errorsOccured() const;
+ const wxString getErrorMessageFormatted() const;
+
+ protected:
+ //another level of indirection: if errors occur during xml parsing they are logged
+ template <class T>
+ void readXmlElementLogging(const std::string& name, const TiXmlElement* parent, T& output)
+ {
+ if (!readXmlElement(name, parent, output))
+ logError(name);
+ }
+
+ template <class T>
+ void readXmlAttributeLogging(const std::string& name, const TiXmlElement* node, T& output)
+ {
+ if (!readXmlAttribute(name, node, output))
+ logError(name);
+ }
+
+ const TiXmlElement* const root;
+ std::vector<wxString> failedNodes;
+ };
+
+
+ class XmlError //Exception class
+ {
+ public:
+ enum Severity
+ {
+ WARNING = 77,
+ FATAL
+ };
+
+ XmlError(const wxString& message, Severity sev = FATAL) : errorMessage(message), m_severity(sev) {}
+
+ const wxString& show() const
+ {
+ return errorMessage;
+ }
+ Severity getSeverity() const
+ {
+ return m_severity;
+ }
+ private:
+ const wxString errorMessage;
+ const Severity m_severity;
+ };
+}
+
+
+class TiXmlHandleConst //like TiXmlHandle but respecting "const TiXmlElement*"
+{
+public:
+ TiXmlHandleConst(const TiXmlElement* element) : m_element(element) {}
+
+ TiXmlHandleConst FirstChild(const char* name) const
+ {
+ return TiXmlHandleConst(m_element != NULL ? m_element->FirstChildElement(name) : NULL);
+ }
+
+ const TiXmlElement* ToElement() const
+ {
+ return m_element;
+ }
+
+private:
+ const TiXmlElement* const m_element;
+};
+
+
+#endif // XMLBASE_H_INCLUDED
bgstack15