lbajardsilogic@15
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
lbajardsilogic@15
|
2
|
lbajardsilogic@15
|
3 /* Sound Access
|
lbajardsilogic@15
|
4 EASAIER client application.
|
lbajardsilogic@15
|
5 Silogic 2007. Laure Bajard.
|
lbajardsilogic@15
|
6
|
lbajardsilogic@15
|
7 This program is free software; you can redistribute it and/or
|
lbajardsilogic@15
|
8 modify it under the terms of the GNU General Public License as
|
lbajardsilogic@15
|
9 published by the Free Software Foundation; either version 2 of the
|
lbajardsilogic@15
|
10 License, or (at your option) any later version. See the file
|
lbajardsilogic@15
|
11 COPYING included with this distribution for more information.
|
lbajardsilogic@15
|
12 */
|
lbajardsilogic@15
|
13
|
lbajardsilogic@15
|
14 #include "QueryConfigReader.h"
|
lbajardsilogic@15
|
15
|
lbajardsilogic@15
|
16 #include <iostream>
|
lbajardsilogic@15
|
17
|
lbajardsilogic@15
|
18 #include "model/QueryModel.h"
|
lbajardsilogic@15
|
19
|
lbajardsilogic@15
|
20 QueryConfigReader::QueryConfigReader(QueryModel * queryModel) :
|
lbajardsilogic@15
|
21 m_queryModel(queryModel)
|
lbajardsilogic@15
|
22 {}
|
lbajardsilogic@15
|
23
|
lbajardsilogic@15
|
24 bool QueryConfigReader::parse(const QString & filename)
|
lbajardsilogic@15
|
25 {
|
lbajardsilogic@15
|
26 QueryConfigHandler handler(m_queryModel);
|
lbajardsilogic@15
|
27 QXmlSimpleReader reader;
|
lbajardsilogic@15
|
28 reader.setContentHandler(&handler);
|
lbajardsilogic@15
|
29 reader.setErrorHandler(&handler);
|
lbajardsilogic@15
|
30
|
lbajardsilogic@15
|
31 QFile file(filename);
|
lbajardsilogic@15
|
32
|
lbajardsilogic@15
|
33 if (!file.open(QFile::ReadOnly | QFile::Text)) {
|
lbajardsilogic@15
|
34 return false;
|
lbajardsilogic@15
|
35 }
|
lbajardsilogic@15
|
36
|
lbajardsilogic@15
|
37 QXmlInputSource xmlInputSource(&file);
|
lbajardsilogic@15
|
38 if (reader.parse(xmlInputSource))
|
lbajardsilogic@15
|
39 {
|
lbajardsilogic@15
|
40 return true;
|
lbajardsilogic@15
|
41 }
|
lbajardsilogic@15
|
42
|
lbajardsilogic@15
|
43 return false;
|
lbajardsilogic@15
|
44 }
|
lbajardsilogic@15
|
45
|
lbajardsilogic@15
|
46 QueryConfigHandler::QueryConfigHandler(QueryModel * queryModel) : QXmlDefaultHandler(),
|
lbajardsilogic@15
|
47 m_inTheme(false),
|
lbajardsilogic@15
|
48 m_inFieldGroup(false),
|
lbajardsilogic@227
|
49 m_inBinding(false),
|
lbajardsilogic@227
|
50 m_propertyName(""),
|
lbajardsilogic@15
|
51 m_queryModel(queryModel)
|
lbajardsilogic@15
|
52 {}
|
lbajardsilogic@15
|
53
|
lbajardsilogic@15
|
54 bool QueryConfigHandler::startElement(const QString &namespaceURI, const QString &localName,
|
lbajardsilogic@15
|
55 const QString &qName, const QXmlAttributes &attributes)
|
lbajardsilogic@15
|
56 {
|
lbajardsilogic@15
|
57
|
lbajardsilogic@15
|
58 QString name = qName.toLower();
|
lbajardsilogic@15
|
59
|
lbajardsilogic@15
|
60 bool ok = false;
|
lbajardsilogic@15
|
61
|
lbajardsilogic@15
|
62 // Valid element names:
|
lbajardsilogic@15
|
63 //
|
lbajardsilogic@15
|
64 // easaierquery
|
lbajardsilogic@15
|
65 // theme
|
lbajardsilogic@15
|
66 // fieldgroup
|
lbajardsilogic@15
|
67 // field
|
lbajardsilogic@15
|
68
|
lbajardsilogic@15
|
69 if (name == "easaierquery") {
|
lbajardsilogic@15
|
70
|
lbajardsilogic@15
|
71 // nothing needed
|
lbajardsilogic@15
|
72 ok = true;
|
lbajardsilogic@15
|
73
|
lbajardsilogic@15
|
74 } else if (name == "theme") {
|
lbajardsilogic@15
|
75
|
lbajardsilogic@15
|
76 m_inTheme = true;
|
lbajardsilogic@15
|
77 m_queryModel->addTheme(attributes.value("name"), attributes.value("label"));
|
lbajardsilogic@15
|
78 ok = true;
|
lbajardsilogic@15
|
79
|
lbajardsilogic@15
|
80 } else if (name == "fieldgroup") {
|
lbajardsilogic@15
|
81
|
lbajardsilogic@15
|
82 m_inFieldGroup = true;
|
lbajardsilogic@15
|
83 m_queryModel->newGroup(attributes.value("name"), attributes.value("label"));
|
lbajardsilogic@15
|
84 ok = true;
|
lbajardsilogic@15
|
85
|
lbajardsilogic@15
|
86 } else if (name == "field") {
|
lbajardsilogic@15
|
87
|
lbajardsilogic@15
|
88 ok = true;
|
lbajardsilogic@227
|
89 m_propertyName = attributes.value("name");
|
lbajardsilogic@15
|
90 QString label = attributes.value("label");
|
lbajardsilogic@15
|
91 QString type = attributes.value("xsi:type");
|
lbajardsilogic@15
|
92 QString range = attributes.value("range");
|
lbajardsilogic@15
|
93 QString unit = attributes.value("unit");
|
lbajardsilogic@15
|
94 QString comment = attributes.value("comment");
|
lbajardsilogic@227
|
95 m_queryModel->addProperty(m_propertyName, label, type, range, unit, comment);
|
lbajardsilogic@15
|
96
|
lbajardsilogic@227
|
97 } else if (name == "range") {
|
lbajardsilogic@227
|
98
|
lbajardsilogic@227
|
99 m_inBinding = true;
|
lbajardsilogic@227
|
100 ok = true;
|
lbajardsilogic@227
|
101 }
|
lbajardsilogic@15
|
102
|
lbajardsilogic@15
|
103 if (!ok) {
|
lbajardsilogic@15
|
104 std::cerr << "WARNING: QueryConfigReader-XML: Failed to completely process element \""
|
lbajardsilogic@15
|
105 << name.toLocal8Bit().data() << "\"" << std::endl;
|
lbajardsilogic@15
|
106 }
|
lbajardsilogic@15
|
107
|
lbajardsilogic@15
|
108 return true;
|
lbajardsilogic@15
|
109 }
|
lbajardsilogic@15
|
110
|
lbajardsilogic@15
|
111 bool QueryConfigHandler::endElement(const QString &namespaceURI, const QString &localName,
|
lbajardsilogic@15
|
112 const QString &qName)
|
lbajardsilogic@15
|
113 {
|
lbajardsilogic@15
|
114 QString name = qName.toLower();
|
lbajardsilogic@15
|
115
|
lbajardsilogic@15
|
116 if (name == "theme")
|
lbajardsilogic@15
|
117 {
|
lbajardsilogic@15
|
118 m_inTheme = false;
|
lbajardsilogic@15
|
119 }
|
lbajardsilogic@15
|
120 else if (name == "fieldgroup")
|
lbajardsilogic@15
|
121 {
|
lbajardsilogic@15
|
122 m_inFieldGroup = false;
|
lbajardsilogic@15
|
123 }
|
lbajardsilogic@227
|
124 else if (name == "range")
|
lbajardsilogic@227
|
125 {
|
lbajardsilogic@227
|
126 m_inBinding = false;
|
lbajardsilogic@227
|
127 }
|
lbajardsilogic@15
|
128
|
lbajardsilogic@15
|
129 return true;
|
lbajardsilogic@15
|
130 }
|
lbajardsilogic@15
|
131
|
lbajardsilogic@15
|
132 bool QueryConfigHandler::characters(const QString &str)
|
lbajardsilogic@15
|
133 {
|
lbajardsilogic@15
|
134 bool ok = false;
|
lbajardsilogic@15
|
135
|
lbajardsilogic@227
|
136 if (m_inBinding)
|
lbajardsilogic@227
|
137 {
|
lbajardsilogic@227
|
138 m_queryModel->addRange(m_propertyName, str);
|
lbajardsilogic@227
|
139 }
|
lbajardsilogic@227
|
140
|
lbajardsilogic@15
|
141 return true;
|
lbajardsilogic@15
|
142 }
|
lbajardsilogic@15
|
143
|
lbajardsilogic@15
|
144 bool QueryConfigHandler::error(const QXmlParseException &exception)
|
lbajardsilogic@15
|
145 {
|
lbajardsilogic@15
|
146 QString errorString;
|
lbajardsilogic@15
|
147 errorString += QString("ERROR: QueryConfigReader-XML: %1 at line %2, column %3")
|
lbajardsilogic@15
|
148 .arg(exception.message())
|
lbajardsilogic@15
|
149 .arg(exception.lineNumber())
|
lbajardsilogic@15
|
150 .arg(exception.columnNumber());
|
lbajardsilogic@15
|
151 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
lbajardsilogic@15
|
152 return QXmlDefaultHandler::error(exception);
|
lbajardsilogic@15
|
153 }
|
lbajardsilogic@15
|
154
|
lbajardsilogic@15
|
155 bool QueryConfigHandler::fatalError(const QXmlParseException &exception)
|
lbajardsilogic@15
|
156 {
|
lbajardsilogic@15
|
157 QString errorString;
|
lbajardsilogic@15
|
158 errorString += QString("FATAL ERROR: QueryConfigReader-XML: %1 at line %2, column %3")
|
lbajardsilogic@15
|
159 .arg(exception.message())
|
lbajardsilogic@15
|
160 .arg(exception.lineNumber())
|
lbajardsilogic@15
|
161 .arg(exception.columnNumber());
|
lbajardsilogic@15
|
162 std::cerr << errorString.toLocal8Bit().data() << std::endl;
|
lbajardsilogic@15
|
163 return QXmlDefaultHandler::fatalError(exception);
|
lbajardsilogic@15
|
164 }
|