TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
ttkabstractxml.cpp
Go to the documentation of this file.
1 #include "ttkabstractxml.h"
2 
3 #include <QStringList>
4 
5 TTKXmlHelper::TTKXmlHelper(const QDomNode &root)
6  : m_root(root),
7  m_current(root)
8 {
9 
10 }
11 
13 {
14  do
15  {
16  if(!m_current.isNull() && m_current.isElement())
17  {
18  m_nodeNames.insert(m_current.nodeName());
19  }
20  } while(hasNext());
21 }
22 
24 {
25  bool hasNext = false;
26  if(m_root.isNull() || m_current.isNull())
27  {
28  return hasNext;
29  }
30 
31  if(m_current.hasChildNodes() && !m_current.firstChildElement().isNull())
32  {
33  m_current = m_current.firstChildElement();
34  hasNext = true;
35  }
36  else if(!m_current.nextSiblingElement().isNull())
37  {
38  m_current = m_current.nextSiblingElement();
39  hasNext = true;
40  }
41  else
42  {
43  while(m_current != m_root && m_current.nextSiblingElement().isNull())
44  {
45  m_current = m_current.parentNode();
46  }
47 
48  if(m_current != m_root)
49  {
50  m_current = m_current.nextSiblingElement();
51  hasNext = true;
52  }
53  else
54  {
55  hasNext = false;
56  }
57  }
58 
59  return hasNext;
60 }
61 
62 QDomNode TTKXmlHelper::next() const
63 {
64  return m_current;
65 }
66 
67 QString TTKXmlHelper::nodeName(const QString &name) const
68 {
69  for(const QString &value : qAsConst(m_nodeNames))
70  {
71  if(value.toLower() == name.toLower())
72  {
73  return value;
74  }
75  }
76  return name;
77 }
78 
79 
80 
82  : m_file(nullptr),
83  m_document(nullptr)
84 {
85 
86 }
87 
89 {
90  delete m_file;
91  delete m_document;
92 }
93 
94 bool TTKAbstractXml::load(const QString &name)
95 {
96  delete m_file;
97  delete m_document;
98 
99  m_file = new QFile(name);
100  m_document = new QDomDocument;
101  return m_file->open(QIODevice::WriteOnly | QIODevice::Text);
102 }
103 
105 {
106  if(!m_file || !m_document)
107  {
108  return;
109  }
110 
111  QTextStream out(m_file);
112  m_document->save(out, 4);
113 }
114 
116 {
117  if(!m_file || !m_document)
118  {
119  return false;
120  }
121 
122  return load(m_file->fileName());
123 }
124 
125 bool TTKAbstractXml::fromFile(const QString &name)
126 {
127  delete m_file;
128  delete m_document;
129 
130  m_file = new QFile(name);
131  m_document = new QDomDocument;
132 
133  if(!m_file->open(QIODevice::ReadOnly | QIODevice::Text))
134  {
135  return false;
136  }
137 
138  if(!m_document->setContent(m_file))
139  {
140  m_file->close();
141  delete m_file;
142  m_file = nullptr;
143  return false;
144  }
145  return true;
146 }
147 
148 bool TTKAbstractXml::fromString(const QString &data)
149 {
150  delete m_file;
151  delete m_document;
152 
153  m_file = nullptr;
154  m_document = new QDomDocument;
155 #if TTK_QT_VERSION_CHECK(6,5,0)
156  return TTKStaticCast(bool, m_document->setContent(data));
157 #else
158  return m_document->setContent(data);
159 #endif
160 }
161 
162 bool TTKAbstractXml::fromByteArray(const QByteArray &data)
163 {
164  delete m_file;
165  delete m_document;
166 
167  m_file = nullptr;
168  m_document = new QDomDocument;
169 #if TTK_QT_VERSION_CHECK(6,5,0)
170  return TTKStaticCast(bool, m_document->setContent(data));
171 #else
172  return m_document->setContent(data);
173 #endif
174 }
175 
177 {
178  return m_document ? m_document->toString() : QString();
179 }
180 
181 QByteArray TTKAbstractXml::toByteArray() const
182 {
183  return m_document ? m_document->toByteArray() : QByteArray();
184 }
185 
187 {
188  const QDomNode &node = m_document->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
189  m_document->appendChild(node);
190 }
191 
192 QString TTKAbstractXml::readAttributeByTagName(const QString &tagName, const QString &attrName) const
193 {
194  const QDomNodeList &nodes = m_document->elementsByTagName(tagName);
195  return nodes.isEmpty() ? QString() : nodes.item(0).toElement().attribute(attrName);
196 }
197 
198 QString TTKAbstractXml::readTextByTagName(const QString &tagName) const
199 {
200  const QDomNodeList &nodes = m_document->elementsByTagName(tagName);
201  return nodes.isEmpty() ? QString() : nodes.item(0).toElement().text();
202 }
203 
204 TTKXmlNode TTKAbstractXml::readNodeByTagName(const QString &tagName) const
205 {
206  const QDomNodeList &nodes = m_document->elementsByTagName(tagName);
207  if(nodes.isEmpty())
208  {
209  return {};
210  }
211 
212  TTKXmlNode v;
213  const QDomElement &element = nodes.item(0).toElement();
214  const QDomNamedNodeMap &nodeMap = element.attributes();
215 
216  for(int i = 0; i < nodeMap.count(); ++i)
217  {
218  const QDomAttr &attr = nodeMap.item(i).toAttr();
219  v.m_attrs << TTKXmlAttr(attr.name(), attr.value());
220  }
221 
222  v.m_text = element.text();
223  return v;
224 }
225 
226 QStringList TTKAbstractXml::readMultiAttributeByTagName(const QString &tagName, const QString &attrName) const
227 {
228  const QDomNodeList &nodes = m_document->elementsByTagName(tagName);
229  if(nodes.isEmpty())
230  {
231  return {};
232  }
233 
234  QStringList v;
235  for(int i = 0; i < nodes.count(); ++i)
236  {
237  v << nodes.item(i).toElement().attribute(attrName);
238  }
239  return v;
240 }
241 
242 QStringList TTKAbstractXml::readMultiTextByTagName(const QString &tagName) const
243 {
244  const QDomNodeList &nodes = m_document->elementsByTagName(tagName);
245  if(nodes.isEmpty())
246  {
247  return {};
248  }
249 
250  QStringList v;
251  for(int i = 0; i < nodes.count(); ++i)
252  {
253  v << nodes.item(i).toElement().text();
254  }
255  return v;
256 }
257 
258 TTKXmlNodeList TTKAbstractXml::readMultiNodeByTagName(const QString &tagName) const
259 {
260  const QDomNodeList &nodes = m_document->elementsByTagName(tagName);
261  if(nodes.isEmpty())
262  {
263  return {};
264  }
265 
266  TTKXmlNodeList v;
267  for(int i = 0; i < nodes.count(); ++i)
268  {
269  const QDomElement &element = nodes.item(i).toElement();
270  const QDomNamedNodeMap &nodeMap = element.attributes();
271 
272  TTKXmlNode n;
273  for(int j = 0; j < nodeMap.count(); ++j)
274  {
275  const QDomAttr &attr = nodeMap.item(j).toAttr();
276  n.m_attrs << TTKXmlAttr(attr.name(), attr.value());
277  }
278 
279  n.m_text = element.text();
280  v << n;
281  }
282  return v;
283 }
284 
285 QDomElement TTKAbstractXml::createRoot(const QString &node) const
286 {
287  const QDomElement &domElement = m_document->createElement(node);
288  m_document->appendChild(domElement);
289  return domElement;
290 }
291 
292 QDomElement TTKAbstractXml::createRoot(const QString &node, const TTKXmlAttr &attr) const
293 {
294  QDomElement domElement = m_document->createElement(node);
295  writeAttribute(domElement, attr);
296  m_document->appendChild(domElement);
297  return domElement;
298 }
299 
300 QDomElement TTKAbstractXml::createRoot(const QString &node, const TTKXmlAttrList &attrs) const
301 {
302  QDomElement domElement = m_document->createElement(node);
303  writeAttribute(domElement, attrs);
304  m_document->appendChild(domElement);
305  return domElement;
306 }
307 
308 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node) const
309 {
310  const QDomElement &domElement = m_document->createElement(node);
311  element.appendChild(domElement);
312  return domElement;
313 }
314 
315 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const QString &text) const
316 {
317  QDomElement domElement = writeDomElement(element, node);
318  const QDomText &domText = m_document->createTextNode(text);
319  domElement.appendChild(domText);
320  return domElement;
321 }
322 
323 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const TTKXmlNode &attr) const
324 {
325  return writeDomMultiElement(element, node, attr);
326 }
327 
328 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const TTKXmlAttr &attr) const
329 {
330  QDomElement domElement = writeDomElement(element, node);
331  writeAttribute(domElement, attr);
332  return domElement;
333 }
334 
335 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const TTKXmlAttr &attr, const QString &text) const
336 {
337  QDomElement domElement = writeDomElement(element, node, attr);
338  const QDomText &domText = m_document->createTextNode(text);
339  domElement.appendChild(domText);
340  return domElement;
341 }
342 
343 QDomElement TTKAbstractXml::writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlNode &attrs) const
344 {
345  return writeDomMultiElement(element, node, attrs.m_attrs, attrs.m_text);
346 }
347 
348 QDomElement TTKAbstractXml::writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlAttrList &attrs) const
349 {
350  if(attrs.isEmpty())
351  {
352  return {};
353  }
354 
355  QDomElement domElement = writeDomElement(element, node);
356  writeAttribute(domElement, attrs);
357  return domElement;
358 }
359 
360 QDomElement TTKAbstractXml::writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlAttrList &attrs, const QString &text) const
361 {
362  if(attrs.isEmpty())
363  {
364  return {};
365  }
366 
367  QDomElement domElement = writeDomMultiElement(element, node, attrs);
368  const QDomText &domText = m_document->createTextNode(text);
369  domElement.appendChild(domText);
370  return domElement;
371 }
372 
373 void TTKAbstractXml::writeAttribute(QDomElement &element, const TTKXmlAttr &attr) const
374 {
375  switch(QtVariantType(attr.m_value))
376  {
377  case QVariant::Int: element.setAttribute(attr.m_key, attr.m_value.toInt()); break;
378  case QVariant::String: element.setAttribute(attr.m_key, attr.m_value.toString()); break;
379  case QVariant::LongLong: element.setAttribute(attr.m_key, attr.m_value.toLongLong()); break;
380  case QVariant::ULongLong: element.setAttribute(attr.m_key, attr.m_value.toULongLong()); break;
381  case QVariant::Double: element.setAttribute(attr.m_key, attr.m_value.toDouble()); break;
382  case QVariant::UInt: element.setAttribute(attr.m_key, attr.m_value.toUInt()); break;
383  default: break;
384  }
385 }
386 
387 void TTKAbstractXml::writeAttribute(QDomElement &element, const TTKXmlAttrList &attrs) const
388 {
389  for(const TTKXmlAttr &attr : qAsConst(attrs))
390  {
391  writeAttribute(element, attr);
392  }
393 }
QString m_key
#define TTKStaticCast(x, y)
Definition: ttkglobal.h:159
QDomNode m_root
TTKXmlHelper(const QDomNode &root)
QDomDocument * m_document
QString toString() const
bool fromFile(const QString &name)
QDomElement writeDomElement(QDomElement &element, const QString &node) const
QDomNode next() const
QDomElement writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlNode &attrs) const
QSet< QString > m_nodeNames
bool fromString(const QString &data)
void createProcessingInstruction() const
QDomElement createRoot(const QString &node) const
#define qAsConst
Definition: ttkqtglobal.h:53
const char * name
Definition: http_parser.c:458
TTKXmlNode readNodeByTagName(const QString &tagName) const
bool fromByteArray(const QByteArray &data)
QString nodeName(const QString &name) const
QString readAttributeByTagName(const QString &tagName, const QString &attrName="value") const
QByteArray toByteArray() const
The class of the ttk xml attribute.
TTKXmlAttrList m_attrs
The class of the ttk xml node.
TTKXmlNodeList readMultiNodeByTagName(const QString &tagName) const
bool load(const QString &name)
void save() const
void writeAttribute(QDomElement &element, const TTKXmlAttr &attr) const
virtual ~TTKAbstractXml()
QDomNode m_current
QString readTextByTagName(const QString &tagName) const
QVariant m_value
QStringList readMultiAttributeByTagName(const QString &tagName, const QString &attrName="value") const
QStringList readMultiTextByTagName(const QString &tagName) const
QString m_text
#define QtVariantType(p)
Variant type.
Definition: ttkqtcompat.h:167