1/*
2 This file is part of KDE.
3
4 SPDX-FileCopyrightText: 2009 Eckhart Wörner <ewoerner@kde.org>
5
6 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
7*/
8
9#include "parser.h"
10#include <QDebug>
11
12using namespace Attica;
13
14template<class T>
15Parser<T>::~Parser()
16{
17}
18
19template<class T>
20T Parser<T>::parse(const QString &xmlString)
21{
22 QStringList elements = xmlElement();
23 T item;
24
25 QXmlStreamReader xml(xmlString);
26
27 while (!xml.atEnd()) {
28 xml.readNext();
29
30 if (xml.isStartElement()) {
31 if (xml.name() == QLatin1String("meta")) {
32 parseMetadataXml(xml);
33 } else if (elements.contains(str: xml.name())) {
34 item = parseXml(xml);
35 }
36 }
37 }
38 if (xml.hasError()) {
39 // TODO: error handling in metadata?
40 qWarning() << "parse():: XML Error: " << xml.errorString() << "\nIn XML:\n" << xmlString;
41 }
42
43 return item;
44}
45
46template<class T>
47typename T::List Parser<T>::parseList(const QString &xmlString)
48{
49 /*
50 QString testxml = QString("<?xml version=\"1.0\"?>\
51 <ocs>\
52 <meta>\
53 <status>ok</status>\
54 <statuscode>100</statuscode>\
55 <message></message>\
56 </meta>\
57 <data>\
58 <buildservice>\
59 <id>obs</id>\
60 <name>openSUSE Build Service</name>\
61 <registrationurl>foobar.com</registrationurl>\
62 <supportedtargets>\
63 <target>openSUSE 11.2 32bit Intel</target>\
64 <target>openSUSE 11.3 64bit Intel</target>\
65 <target>openSUSE 11.3 32bit Intel</target>\
66 <target>openSUSE 11.3 64bit Intel</target>\
67 </supportedtargets>\
68 </buildservice>\
69 <buildservice>\
70 <id>mbs</id>\
71 <name>MeeGo Build Service</name>\
72 <registrationurl>foobar42.com</registrationurl>\
73 <supportedtargets>\
74 <target>MeeGo 1.0 Intel</target>\
75 <target>MeeGo 1.0 ARM</target>\
76 <target>MeeGo 1.1 Intel</target>\
77 <target>MeeGo 1.1 ARM</target>\
78 </supportedtargets>\
79 </buildservice>\
80 <buildservice>\
81 <id>sbs</id>\
82 <name>Sebas' Build Service</name>\
83 <registrationurl>foobar42.com</registrationurl>\
84 <supportedtargets>\
85 <target>sebasix 1.3 33bit</target>\
86 <target>sebasis 4.4 14bit</target>\
87 <target>sebasix 1.3 65bit</target>\
88 <target>sebasis 4.4 37bit</target>\
89 </supportedtargets>\
90 </buildservice>\
91 </data>\
92 </ocs>\
93 ");
94
95 qCDebug(ATTICA) << "parsing list:" << xmlString;
96 */
97 QStringList elements = xmlElement();
98 typename T::List items;
99
100 // QXmlStreamReader xml( xmlString );
101 QXmlStreamReader xml(xmlString);
102
103 while (!xml.atEnd()) {
104 xml.readNext();
105 // qCDebug(ATTICA) << "parseList():: Looking for:" << xml.name().toString();
106 if (xml.isStartElement()) {
107 if (xml.name() == QLatin1String("data")) {
108 while (!xml.atEnd()) {
109 xml.readNext();
110
111 if (xml.isEndElement() && xml.name() == QLatin1String("data")) {
112 break;
113 }
114
115 if (xml.isStartElement() && elements.contains(str: xml.name())) {
116 // qCDebug(ATTICA) << "xxxxxxxxx New Item!" << xml.name().toString();
117 items.append(parseXml(xml));
118 }
119 }
120 } else if (xml.name() == QLatin1String("meta")) {
121 parseMetadataXml(xml);
122 }
123 }
124 }
125 if (xml.hasError()) {
126 // TODO: error handling in metadata?
127 qWarning() << "parseList():: XML Error: " << xml.errorString() << "\nIn xml name" << xml.name() << "with text" << xml.text() << "at offset:\n"
128 << xml.characterOffset() << "\nIn XML:\n"
129 << xmlString;
130 }
131
132 return items;
133}
134
135template<class T>
136void Parser<T>::parseMetadataXml(QXmlStreamReader &xml)
137{
138 while (!xml.atEnd()) {
139 xml.readNext();
140 if (xml.isEndElement() && xml.name() == QLatin1String("meta")) {
141 break;
142 } else if (xml.isStartElement()) {
143 if (xml.name() == QLatin1String("status")) {
144 m_metadata.setStatusString(xml.readElementText());
145 } else if (xml.name() == QLatin1String("statuscode")) {
146 m_metadata.setStatusCode(xml.readElementText().toInt());
147 } else if (xml.name() == QLatin1String("message")) {
148 m_metadata.setMessage(xml.readElementText());
149 } else if (xml.name() == QLatin1String("totalitems")) {
150 m_metadata.setTotalItems(xml.readElementText().toInt());
151 } else if (xml.name() == QLatin1String("itemsperpage")) {
152 m_metadata.setItemsPerPage(xml.readElementText().toInt());
153 }
154 }
155 }
156 if (xml.hasError()) {
157 // TODO: error handling in metadata?
158 qWarning() << "XML Error: " << xml.errorString();
159 }
160}
161
162template<class T>
163Metadata Parser<T>::metadata() const
164{
165 return m_metadata;
166}
167

source code of attica/src/parser.cpp