TTKMusicPlayer  4.3.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) noexcept
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 noexcept
63 {
64  return m_current;
65 }
66 
67 QString TTKXmlHelper::nodeName(const QString &name) const noexcept
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  close();
91 }
92 
93 bool TTKAbstractXml::load(const QString &name)
94 {
95  close();
96 
97  m_file = new QFile(name);
98  m_document = new QDomDocument;
99  return m_file->open(QIODevice::WriteOnly | QIODevice::Text);
100 }
101 
103 {
104  if(!m_file || !m_document)
105  {
106  return;
107  }
108 
109  QTextStream out(m_file);
110  m_document->save(out, 4);
111 }
112 
114 {
115  delete m_file;
116  delete m_document;
117  m_file = nullptr;
118  m_document = nullptr;
119 }
120 
122 {
123  if(!m_file || !m_document)
124  {
125  return false;
126  }
127 
128  return load(m_file->fileName());
129 }
130 
131 bool TTKAbstractXml::fromFile(const QString &name)
132 {
133  close();
134 
135  m_file = new QFile(name);
136  m_document = new QDomDocument;
137 
138  if(!m_file->open(QIODevice::ReadOnly | QIODevice::Text))
139  {
140  return false;
141  }
142 
143  if(!m_document->setContent(m_file))
144  {
145  m_file->close();
146  delete m_file;
147  m_file = nullptr;
148  return false;
149  }
150  return true;
151 }
152 
153 bool TTKAbstractXml::fromString(const QString &data)
154 {
155  close();
156 
157  m_document = new QDomDocument;
158 #if TTK_QT_VERSION_CHECK(6,5,0)
159  return TTKStaticCast(bool, m_document->setContent(data));
160 #else
161  return m_document->setContent(data);
162 #endif
163 }
164 
165 bool TTKAbstractXml::fromByteArray(const QByteArray &data)
166 {
167  close();
168 
169  m_document = new QDomDocument;
170 #if TTK_QT_VERSION_CHECK(6,5,0)
171  return TTKStaticCast(bool, m_document->setContent(data));
172 #else
173  return m_document->setContent(data);
174 #endif
175 }
176 
178 {
179  return m_document ? m_document->toString() : QString();
180 }
181 
182 QByteArray TTKAbstractXml::toByteArray() const
183 {
184  return m_document ? m_document->toByteArray() : QByteArray();
185 }
186 
187 QString TTKAbstractXml::readAttributeByTagName(const QString &node, const QString &attrName) const
188 {
189  const QDomNodeList &nodes = findDomNodes(node);
190  return nodes.isEmpty() ? QString() : nodes.item(0).toElement().attribute(attrName);
191 }
192 
193 QString TTKAbstractXml::readTextByTagName(const QString &node) const
194 {
195  const QDomNodeList &nodes = findDomNodes(node);
196  return nodes.isEmpty() ? QString() : nodes.item(0).toElement().text();
197 }
198 
200 {
201  const QDomNodeList &nodes = findDomNodes(node);
202  if(nodes.isEmpty())
203  {
204  return {};
205  }
206 
207  TTKXmlNode v;
208  const QDomElement &element = nodes.item(0).toElement();
209  const QDomNamedNodeMap &nodeMap = element.attributes();
210 
211  for(int i = 0; i < nodeMap.count(); ++i)
212  {
213  const QDomAttr &attr = nodeMap.item(i).toAttr();
214  v.m_attrs << TTKXmlAttr(attr.name(), attr.value());
215  }
216 
217  v.m_text = element.text();
218  return v;
219 }
220 
221 QStringList TTKAbstractXml::readMultiAttributeByTagName(const QString &node, const QString &attrName) const
222 {
223  const QDomNodeList &nodes = findDomNodes(node);
224  if(nodes.isEmpty())
225  {
226  return {};
227  }
228 
229  QStringList v;
230  for(int i = 0; i < nodes.count(); ++i)
231  {
232  v << nodes.item(i).toElement().attribute(attrName);
233  }
234  return v;
235 }
236 
237 QStringList TTKAbstractXml::readMultiTextByTagName(const QString &node) const
238 {
239  const QDomNodeList &nodes = findDomNodes(node);
240  if(nodes.isEmpty())
241  {
242  return {};
243  }
244 
245  QStringList v;
246  for(int i = 0; i < nodes.count(); ++i)
247  {
248  v << nodes.item(i).toElement().text();
249  }
250  return v;
251 }
252 
253 TTKXmlNodeList TTKAbstractXml::readMultiNodeByTagName(const QString &node) const
254 {
255  const QDomNodeList &nodes = findDomNodes(node);
256  if(nodes.isEmpty())
257  {
258  return {};
259  }
260 
261  TTKXmlNodeList v;
262  for(int i = 0; i < nodes.count(); ++i)
263  {
264  const QDomElement &element = nodes.item(i).toElement();
265  const QDomNamedNodeMap &nodeMap = element.attributes();
266 
267  TTKXmlNode n;
268  for(int j = 0; j < nodeMap.count(); ++j)
269  {
270  const QDomAttr &attr = nodeMap.item(j).toAttr();
271  n.m_attrs << TTKXmlAttr(attr.name(), attr.value());
272  }
273 
274  n.m_text = element.text();
275  v << n;
276  }
277  return v;
278 }
279 
280 QDomElement TTKAbstractXml::createRoot(const QString &node) const
281 {
282  const QDomElement &domElement = m_document->createElement(node);
283  m_document->appendChild(domElement);
284  return domElement;
285 }
286 
287 QDomElement TTKAbstractXml::createRoot(const QString &node, const TTKXmlAttr &attr) const
288 {
289  QDomElement domElement = m_document->createElement(node);
290  writeAttribute(domElement, attr);
291  m_document->appendChild(domElement);
292  return domElement;
293 }
294 
295 QDomElement TTKAbstractXml::createRoot(const QString &node, const TTKXmlAttrList &attrs) const
296 {
297  QDomElement domElement = m_document->createElement(node);
298  writeAttribute(domElement, attrs);
299  m_document->appendChild(domElement);
300  return domElement;
301 }
302 
303 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node) const
304 {
305  const QDomElement &domElement = m_document->createElement(node);
306  element.appendChild(domElement);
307  return domElement;
308 }
309 
310 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const QString &text) const
311 {
312  QDomElement domElement = writeDomElement(element, node);
313  const QDomText &domText = m_document->createTextNode(text);
314  domElement.appendChild(domText);
315  return domElement;
316 }
317 
318 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const TTKXmlNode &attr) const
319 {
320  return writeDomMultiElement(element, node, attr);
321 }
322 
323 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const TTKXmlAttr &attr) const
324 {
325  QDomElement domElement = writeDomElement(element, node);
326  writeAttribute(domElement, attr);
327  return domElement;
328 }
329 
330 QDomElement TTKAbstractXml::writeDomElement(QDomElement &element, const QString &node, const TTKXmlAttr &attr, const QString &text) const
331 {
332  QDomElement domElement = writeDomElement(element, node, attr);
333  const QDomText &domText = m_document->createTextNode(text);
334  domElement.appendChild(domText);
335  return domElement;
336 }
337 
338 QDomElement TTKAbstractXml::writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlNode &attrs) const
339 {
340  return writeDomMultiElement(element, node, attrs.m_attrs, attrs.m_text);
341 }
342 
343 QDomElement TTKAbstractXml::writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlAttrList &attrs) const
344 {
345  if(attrs.isEmpty())
346  {
347  return {};
348  }
349 
350  QDomElement domElement = writeDomElement(element, node);
351  writeAttribute(domElement, attrs);
352  return domElement;
353 }
354 
355 QDomElement TTKAbstractXml::writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlAttrList &attrs, const QString &text) const
356 {
357  if(attrs.isEmpty())
358  {
359  return {};
360  }
361 
362  QDomElement domElement = writeDomMultiElement(element, node, attrs);
363  const QDomText &domText = m_document->createTextNode(text);
364  domElement.appendChild(domText);
365  return domElement;
366 }
367 
368 QDomNodeList TTKAbstractXml::findDomNodes(const QString &node) const
369 {
370  return m_document->elementsByTagName(node);
371 }
372 
374 {
375  const QDomNode &node = m_document->createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");
376  m_document->appendChild(node);
377 }
378 
379 void TTKAbstractXml::writeAttribute(QDomElement &element, const TTKXmlAttr &attr) const
380 {
381  switch(QtVariantType(attr.m_value))
382  {
383  case QMetaType::Int: element.setAttribute(attr.m_key, attr.m_value.toInt()); break;
384  case QMetaType::LongLong: element.setAttribute(attr.m_key, attr.m_value.toLongLong()); break;
385  case QMetaType::ULongLong: element.setAttribute(attr.m_key, attr.m_value.toULongLong()); break;
386  case QMetaType::Double: element.setAttribute(attr.m_key, attr.m_value.toDouble()); break;
387  case QMetaType::UInt: element.setAttribute(attr.m_key, attr.m_value.toUInt()); break;
388  case QMetaType::QString: element.setAttribute(attr.m_key, attr.m_value.toString()); break;
389  default: break;
390  }
391 }
392 
393 void TTKAbstractXml::writeAttribute(QDomElement &element, const TTKXmlAttrList &attrs) const
394 {
395  for(const TTKXmlAttr &attr : qAsConst(attrs))
396  {
397  writeAttribute(element, attr);
398  }
399 }
QString m_key
#define TTKStaticCast(x, y)
Definition: ttkglobal.h:231
QDomNode m_root
QDomDocument * m_document
QString readAttributeByTagName(const QString &node, const QString &attrName="value") const
QString toString() const
bool fromFile(const QString &name)
QDomElement writeDomElement(QDomElement &element, const QString &node) const
QString nodeName(const QString &name) const noexcept
QStringList readMultiTextByTagName(const QString &node) const
QDomElement writeDomMultiElement(QDomElement &element, const QString &node, const TTKXmlNode &attrs) const
QSet< QString > m_nodeNames
bool fromString(const QString &data)
void createProcessingInstruction() const
TTKXmlNode readNodeByTagName(const QString &node) const
QDomElement createRoot(const QString &node) const
#define qAsConst
Definition: ttkqtglobal.h:57
const char * name
Definition: http_parser.c:458
QDomNodeList findDomNodes(const QString &node) const
TTKXmlHelper(const QDomNode &root) noexcept
bool fromByteArray(const QByteArray &data)
QByteArray toByteArray() const
The class of the ttk xml attribute.
TTKXmlAttrList m_attrs
The class of the ttk xml node.
TTKXmlNodeList readMultiNodeByTagName(const QString &node) const
bool load(const QString &name)
QStringList readMultiAttributeByTagName(const QString &node, const QString &attrName="value") const
void save() const
QDomNode next() const noexcept
void writeAttribute(QDomElement &element, const TTKXmlAttr &attr) const
virtual ~TTKAbstractXml()
QString readTextByTagName(const QString &node) const
QDomNode m_current
#define const
Definition: zconf.h:233
QVariant m_value
QString m_text
#define QtVariantType(p)
Variant type.
Definition: ttkqtcompat.h:185