47 #include <QTextStream>
48 #include <QDomElement>
49 #include <QStringList>
77 retval = this->getDocument(filename);
80 retval = this->readFromFile(filename);
81 this->addDocument(filename, retval);
89 QDomDocument getDocument(
const QString& filename)
91 QMutexLocker lock(&mDocumentMutex);
92 DocumentMap::iterator iter = mDocuments.find(filename);
94 if (iter != mDocuments.end())
96 return iter->second.ownerDocument();
98 return QDomDocument();
101 void addDocument(
const QString& filename, QDomDocument document)
103 QMutexLocker lock(&mDocumentMutex);
104 mDocuments[filename] = document.documentElement();
107 QDomDocument readFromFile(QString filename)
109 QFile file(filename);
110 if (!file.open(QIODevice::ReadOnly))
113 doc.appendChild(doc.createElement(
"root"));
117 QDomDocument loadedDoc;
120 if (!loadedDoc.setContent(&file, &error, &line, &col))
122 QString msg = QString(
"error setting xml content [%1,%2] %3").arg(line).arg(col).arg(error);
129 static SharedDocuments* mInstance;
130 typedef std::map<QString, QDomElement> DocumentMap;
131 QMutex mDocumentMutex;
132 DocumentMap mDocuments;
135 SharedDocuments* SharedDocuments::mInstance = NULL;
142 QString XmlOptionItem::SerializeDataToB64String(
const QVariant& data)
144 QByteArray byteArray;
145 QBuffer writeBuffer(&byteArray);
146 writeBuffer.open(QIODevice::WriteOnly);
147 QDataStream out(&writeBuffer);
153 QString s = QString(byteArray.toBase64());
161 QVariant XmlOptionItem::DeserializeB64String(
const QString& serializedVariant)
163 QByteArray readArr = QByteArray::fromBase64(serializedVariant.toUtf8());
164 QBuffer readBuffer(&readArr);
165 readBuffer.open(QIODevice::ReadOnly);
166 QDataStream in(&readBuffer);
178 mUid(uid), mRoot(root)
188 QVariant val = DeserializeB64String(text);
194 QString text = SerializeDataToB64String(val);
201 QDomElement item = this->findElemFromUid(mUid, mRoot);
202 if (!item.isNull() && item.hasAttribute(
"value"))
204 return item.attribute(
"value");
213 QDomElement item = findElemFromUid(mUid, mRoot);
217 item = mRoot.ownerDocument().createElement(
"option");
218 item.setAttribute(
"id", mUid);
219 mRoot.appendChild(item);
221 item.setAttribute(
"value", val);
224 QDomElement XmlOptionItem::findElemFromUid(
const QString& uid, QDomNode root)
const
226 QDomNodeList
settings = root.childNodes();
227 for (
int i = 0; i < settings.size(); ++i)
229 QDomElement item = settings.item(i).toElement();
230 if (item.attribute(
"id") == uid)
233 return QDomElement();
243 retval.mDocument = QDomDocument();
244 retval.mCurrentElement = QDomElement();
250 mDocument.appendChild(mDocument.createElement(
"root"));
251 mCurrentElement = mDocument.documentElement();
259 mCurrentElement = mDocument.documentElement();
261 if (mCurrentElement.isNull())
263 mDocument.appendChild(mDocument.createElement(
"root"));
264 mCurrentElement = mDocument.documentElement();
279 if(mCurrentElement.isNull() || mDocument.isNull())
287 retval.mCurrentElement = mDocument.documentElement();
294 retval.mCurrentElement = retval.
getElement(element);
306 QDomElement current = retval.
getDocument().createElement(element);
307 current.setAttribute(attributeName, attributeValue);
308 retval.mCurrentElement.appendChild(current);
309 retval.mCurrentElement = current;
317 QDomNodeList presetNodeList = retval.
getElement().elementsByTagName(element);
318 for (
int i = 0; i < presetNodeList.count(); ++i)
320 QDomElement current = presetNodeList.item(i).toElement();
321 QString name = current.attribute(attributeName);
322 if (attributeValue == name)
324 retval.mCurrentElement = current;
335 retval.mCurrentElement = mCurrentElement.parentNode().toElement();
336 if (retval.mCurrentElement.isNull())
345 QDomElement child = parent.namedItem(childName).toElement();
349 child = mDocument.createElement(childName);
350 parent.appendChild(child);
358 QTextStream stream(stdout);
359 stream <<
"\n" << mDocument.toString(4) <<
"\n";
364 QTextStream stream(stdout);
366 mCurrentElement.save(stream, 4);
377 return mCurrentElement;
382 QDomElement elem1 = this->
safeGetElement(mCurrentElement, level1);
388 QDomElement elem1 = this->
safeGetElement(mCurrentElement, level1);
395 while (mCurrentElement.hasChildNodes())
396 mCurrentElement.removeChild(mCurrentElement.firstChild());
401 QDomNode parentNode = mCurrentElement.parentNode();
402 parentNode.removeChild(mCurrentElement);
403 mCurrentElement = QDomElement();
408 if (mFilename.isEmpty())
414 QString path = QFileInfo(mFilename).absolutePath();
416 QFile file(mFilename);
417 if (file.open(QIODevice::WriteOnly | QIODevice::Truncate))
419 QTextStream stream(&file);
420 stream << mDocument.toString(4);
426 reportError(
"XmlOptionFile::save() Could not open " + file.fileName() +
" Error: "
427 + file.errorString());
void reportError(QString msg)
void writeVariant(const QVariant &val)
QDomElement getElement()
return the current element
QDomDocument loadDocument(const QString &filename)
void printDocument()
print the entire document
void reportWarning(QString msg)
static XmlOptionFile createNull()
create an empty document
QDomElement safeGetElement(QDomElement parent, QString childName)
XmlOptionFile ascend() const
step one level up in the xml tree
Settings * settings()
Shortcut for accessing the settings instance.
void printElement()
print just the current element
static SharedDocuments * getInstance()
void writeValue(const QString &val)
QDomDocument getDocument()
returns the document
void deleteNode()
Delete the current node.
void removeChildren()
remove all child nodes of the current element.
void save()
save entire document.
QVariant readVariant(const QVariant &defval=QVariant()) const
bool isNull() const
checks if this is null
XmlOptionFile root() const
set the current element to root
XmlOptionFile tryDescend(QString element, QString attributeName, QString attributeValue) const
Helper class for xml files used to store ssc/cx data.
QString readValue(const QString &defval) const
XmlOptionFile descend(QString element) const
step one level down in the xml tree