maybe now...
[engrid.git] / src / xmlhandler.cpp
blob1041cd452eb33b1c729a016f8c50c0429879e674
1 //
2 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 // + +
4 // + This file is part of enGrid. +
5 // + +
6 // + Copyright 2008-2010 enGits GmbH +
7 // + +
8 // + enGrid is free software: you can redistribute it and/or modify +
9 // + it under the terms of the GNU General Public License as published by +
10 // + the Free Software Foundation, either version 3 of the License, or +
11 // + (at your option) any later version. +
12 // + +
13 // + enGrid is distributed in the hope that it will be useful, +
14 // + but WITHOUT ANY WARRANTY; without even the implied warranty of +
15 // + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +
16 // + GNU General Public License for more details. +
17 // + +
18 // + You should have received a copy of the GNU General Public License +
19 // + along with enGrid. If not, see <http://www.gnu.org/licenses/>. +
20 // + +
21 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23 #include "xmlhandler.h"
25 #include <QFile>
26 #include <QtDebug>
27 #include <QDir>
28 #include <QString>
29 #include <QMessageBox>
31 #include "engrid.h"
33 #include <iostream>
34 using namespace std;
36 XmlHandler::XmlHandler(QString tagName, QObject *parent)
37 : QObject(parent) {
38 m_parent = parent;
40 // initialise XML document
41 m_TagName = tagName;
42 QDomElement root = m_XmlDoc.createElement(m_TagName);
43 m_XmlDoc.appendChild(root);
46 bool XmlHandler::openXml(QString file_name) {
47 QFile xml_file(file_name);
48 if (!xml_file.open(QIODevice::ReadOnly)) {
49 QString error_message = "Failed to open xml_file " + xml_file.fileName();
50 error_message += QString("\n") + "QDir::current()=" + QDir::current().absolutePath();
51 error_message += QString("\n") + "QDir::currentPath()=" + QDir::currentPath();
53 qWarning() << error_message;
54 return(false);
56 if (!m_XmlDoc.setContent(&xml_file)) {
57 qWarning() << tr("Error reading XML file:\n").arg(file_name) << "\n setContent failed.";
58 return(false);
60 xml_file.close();
62 // initialize m_DomNode
63 resetToTopNode();
65 return(true);
68 bool XmlHandler::saveXml(QString file_name) {
69 QString buffer = m_XmlDoc.toString(2);
70 // QString buffer = m_XmlDoc.toString(0);
71 QFile xml_file(file_name);
72 xml_file.open(QIODevice::WriteOnly | QIODevice::Text);
73 QTextStream f(&xml_file);
74 f << buffer << endl;
75 xml_file.close();
76 return(true);
79 QString XmlHandler::getXmlSection(QString name) {
80 QStringList tags = name.toLower().split(tr("/"), QString::SkipEmptyParts);
81 QDomElement element = m_XmlDoc.documentElement();
82 bool found = true;
83 QString section_text = tr("");
84 try {
85 foreach(QString tag, tags) {
86 QDomNodeList nodes = element.elementsByTagName(tag);
87 if (nodes.size() > 1) {
88 EG_ERR_RETURN(tr("error retrieving XML section '") + name + tr("'"));
90 if (nodes.size() == 0) {
91 found = false;
92 break;
94 if (!nodes.at(0).isElement()) {
95 EG_ERR_RETURN(tr("error retrieving XML section '") + name + tr("'"));
97 element = nodes.at(0).toElement();
99 } catch (Error err) {
100 err.display();
102 if (found) {
103 section_text = element.text();
105 return section_text;
108 void XmlHandler::setXmlSection(QString name, QString contents) {
109 QStringList tags = name.toLower().split(tr("/"), QString::SkipEmptyParts);
110 QDomElement element = m_XmlDoc.documentElement();
111 try {
112 foreach(QString tag, tags) {
113 QDomNodeList nodes = element.elementsByTagName(tag);
114 if (nodes.size() > 1) {
115 EG_ERR_RETURN(tr("error retrieving XML section '") + name + tr("'"));
117 if (nodes.size() == 0) {
118 QDomElement new_element = m_XmlDoc.createElement(tag);
119 element.appendChild(new_element);
120 element = new_element;
121 } else if (!nodes.at(0).isElement()) {
122 EG_ERR_RETURN(tr("error retrieving XML section '") + name + tr("'"));
123 } else {
124 element = nodes.at(0).toElement();
127 while (element.hasChildNodes()) {
128 element.removeChild(element.firstChild());
130 QDomText text_node = m_XmlDoc.createTextNode(contents);
131 element.appendChild(text_node);
132 } catch (Error err) {
133 err.display();
137 QStringList XmlHandler::allKeys() {
138 QStringList ret;
139 QDomNode dom_node;
140 dom_node = m_XmlDoc.firstChild();
141 parseNode(dom_node, ret, dom_node.nodeName());
142 return(ret);
145 QStringList XmlHandler::childGroups() {
146 QStringList ret;
148 for (QDomNode sub_node = m_DomNode.firstChild(); !sub_node.isNull(); sub_node = sub_node.nextSibling()) {
149 if (sub_node.nodeType() == QDomNode::ElementNode) {
150 ret << sub_node.nodeName();
154 return(ret);
157 QStringList XmlHandler::childKeys() {
158 QStringList ret;
159 qDebug() << "m_DomNode.nodeName()=" << m_DomNode.nodeName();
160 QString output = parseNode(m_DomNode, ret, m_DomNode.nodeName());
161 qDebug() << "output=" << output;
162 qDebug() << "ret=" << ret;
163 return(ret);
166 QString XmlHandler::group(bool absolute) {
167 if (!absolute) {
168 return m_DomNode.nodeName();
169 } else {
170 QString section;
171 QString stop_node = m_XmlDoc.firstChild().nodeName();
172 QDomNode parent_node = m_DomNode;
173 while (!parent_node.isNull() && parent_node.nodeName() != stop_node) {
174 section = parent_node.nodeName() + tr("/") + section;
175 parent_node = parent_node.parentNode();
177 return section;
181 void XmlHandler::setGroup(const QString & prefix) {
182 resetToTopNode();
183 beginGroup(prefix);
186 void XmlHandler::beginGroup(const QString & prefix) {
187 QStringList tag_list = prefix.split(tr("/"));
188 foreach(QString tag, tag_list) {
189 if (!tag.isEmpty()) {
190 QDomElement dom_element = m_DomNode.toElement();
191 QDomNodeList dom_node_list = dom_element.elementsByTagName(tag);
192 m_DomNode = dom_node_list.at(0);
197 void XmlHandler::endGroup() {
198 if (!m_DomNode.parentNode().isNull()) m_DomNode = m_DomNode.parentNode();
201 QString XmlHandler::parseNode(const QDomNode& dom_node, QStringList& string_list, QString stop_node) {
202 QString section;
204 if (dom_node.nodeType() == QDomNode::TextNode) {
205 QDomNode parent_node = dom_node.parentNode();
206 while (!parent_node.isNull() && parent_node.nodeName() != stop_node) {
207 section = parent_node.nodeName() + tr("/") + section;
208 parent_node = parent_node.parentNode();
210 string_list << section;
213 for (QDomNode sub_node = dom_node.firstChild(); !sub_node.isNull(); sub_node = sub_node.nextSibling()) {
214 parseNode(sub_node, string_list, stop_node);
217 // qDebug() << "section=" << section;
218 return(section);
221 void XmlHandler::resetToTopNode() {
222 m_DomNode = m_XmlDoc.firstChild();
225 void XmlHandler::resetXmlDoc() {
226 m_XmlDoc.clear();
227 QDomElement root = m_XmlDoc.createElement(m_TagName);
228 m_XmlDoc.appendChild(root);