lbajardsilogic@15: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@15: lbajardsilogic@15: /* Sound Access lbajardsilogic@15: EASAIER client application. lbajardsilogic@15: Silogic 2007. Laure Bajard. lbajardsilogic@15: lbajardsilogic@15: This program is free software; you can redistribute it and/or lbajardsilogic@15: modify it under the terms of the GNU General Public License as lbajardsilogic@15: published by the Free Software Foundation; either version 2 of the lbajardsilogic@15: License, or (at your option) any later version. See the file lbajardsilogic@15: COPYING included with this distribution for more information. lbajardsilogic@15: */ lbajardsilogic@15: lbajardsilogic@15: #include "QueryConfigReader.h" lbajardsilogic@15: lbajardsilogic@15: #include lbajardsilogic@15: lbajardsilogic@15: #include "model/QueryModel.h" lbajardsilogic@15: lbajardsilogic@15: QueryConfigReader::QueryConfigReader(QueryModel * queryModel) : lbajardsilogic@15: m_queryModel(queryModel) lbajardsilogic@15: {} lbajardsilogic@15: lbajardsilogic@15: bool QueryConfigReader::parse(const QString & filename) lbajardsilogic@15: { lbajardsilogic@15: QueryConfigHandler handler(m_queryModel); lbajardsilogic@15: QXmlSimpleReader reader; lbajardsilogic@15: reader.setContentHandler(&handler); lbajardsilogic@15: reader.setErrorHandler(&handler); lbajardsilogic@15: lbajardsilogic@15: QFile file(filename); lbajardsilogic@15: lbajardsilogic@15: if (!file.open(QFile::ReadOnly | QFile::Text)) { lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: QXmlInputSource xmlInputSource(&file); lbajardsilogic@15: if (reader.parse(xmlInputSource)) lbajardsilogic@15: { lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: QueryConfigHandler::QueryConfigHandler(QueryModel * queryModel) : QXmlDefaultHandler(), lbajardsilogic@15: m_inTheme(false), lbajardsilogic@15: m_inFieldGroup(false), lbajardsilogic@227: m_inBinding(false), lbajardsilogic@227: m_propertyName(""), lbajardsilogic@15: m_queryModel(queryModel) lbajardsilogic@15: {} lbajardsilogic@15: lbajardsilogic@15: bool QueryConfigHandler::startElement(const QString &namespaceURI, const QString &localName, lbajardsilogic@15: const QString &qName, const QXmlAttributes &attributes) lbajardsilogic@15: { lbajardsilogic@15: lbajardsilogic@15: QString name = qName.toLower(); lbajardsilogic@15: lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@15: // Valid element names: lbajardsilogic@15: // lbajardsilogic@15: // easaierquery lbajardsilogic@15: // theme lbajardsilogic@15: // fieldgroup lbajardsilogic@15: // field lbajardsilogic@15: lbajardsilogic@15: if (name == "easaierquery") { lbajardsilogic@15: lbajardsilogic@15: // nothing needed lbajardsilogic@15: ok = true; lbajardsilogic@15: lbajardsilogic@15: } else if (name == "theme") { lbajardsilogic@15: lbajardsilogic@15: m_inTheme = true; lbajardsilogic@15: m_queryModel->addTheme(attributes.value("name"), attributes.value("label")); lbajardsilogic@15: ok = true; lbajardsilogic@15: lbajardsilogic@15: } else if (name == "fieldgroup") { lbajardsilogic@15: lbajardsilogic@15: m_inFieldGroup = true; lbajardsilogic@15: m_queryModel->newGroup(attributes.value("name"), attributes.value("label")); lbajardsilogic@15: ok = true; lbajardsilogic@15: lbajardsilogic@15: } else if (name == "field") { lbajardsilogic@15: lbajardsilogic@15: ok = true; lbajardsilogic@227: m_propertyName = attributes.value("name"); lbajardsilogic@15: QString label = attributes.value("label"); lbajardsilogic@15: QString type = attributes.value("xsi:type"); lbajardsilogic@15: QString range = attributes.value("range"); lbajardsilogic@15: QString unit = attributes.value("unit"); lbajardsilogic@15: QString comment = attributes.value("comment"); lbajardsilogic@227: m_queryModel->addProperty(m_propertyName, label, type, range, unit, comment); lbajardsilogic@15: lbajardsilogic@227: } else if (name == "range") { lbajardsilogic@227: lbajardsilogic@227: m_inBinding = true; lbajardsilogic@227: ok = true; lbajardsilogic@227: } lbajardsilogic@15: lbajardsilogic@15: if (!ok) { lbajardsilogic@15: std::cerr << "WARNING: QueryConfigReader-XML: Failed to completely process element \"" lbajardsilogic@15: << name.toLocal8Bit().data() << "\"" << std::endl; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool QueryConfigHandler::endElement(const QString &namespaceURI, const QString &localName, lbajardsilogic@15: const QString &qName) lbajardsilogic@15: { lbajardsilogic@15: QString name = qName.toLower(); lbajardsilogic@15: lbajardsilogic@15: if (name == "theme") lbajardsilogic@15: { lbajardsilogic@15: m_inTheme = false; lbajardsilogic@15: } lbajardsilogic@15: else if (name == "fieldgroup") lbajardsilogic@15: { lbajardsilogic@15: m_inFieldGroup = false; lbajardsilogic@15: } lbajardsilogic@227: else if (name == "range") lbajardsilogic@227: { lbajardsilogic@227: m_inBinding = false; lbajardsilogic@227: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool QueryConfigHandler::characters(const QString &str) lbajardsilogic@15: { lbajardsilogic@15: bool ok = false; lbajardsilogic@15: lbajardsilogic@227: if (m_inBinding) lbajardsilogic@227: { lbajardsilogic@227: m_queryModel->addRange(m_propertyName, str); lbajardsilogic@227: } lbajardsilogic@227: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool QueryConfigHandler::error(const QXmlParseException &exception) lbajardsilogic@15: { lbajardsilogic@15: QString errorString; lbajardsilogic@15: errorString += QString("ERROR: QueryConfigReader-XML: %1 at line %2, column %3") lbajardsilogic@15: .arg(exception.message()) lbajardsilogic@15: .arg(exception.lineNumber()) lbajardsilogic@15: .arg(exception.columnNumber()); lbajardsilogic@15: std::cerr << errorString.toLocal8Bit().data() << std::endl; lbajardsilogic@15: return QXmlDefaultHandler::error(exception); lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool QueryConfigHandler::fatalError(const QXmlParseException &exception) lbajardsilogic@15: { lbajardsilogic@15: QString errorString; lbajardsilogic@15: errorString += QString("FATAL ERROR: QueryConfigReader-XML: %1 at line %2, column %3") lbajardsilogic@15: .arg(exception.message()) lbajardsilogic@15: .arg(exception.lineNumber()) lbajardsilogic@15: .arg(exception.columnNumber()); lbajardsilogic@15: std::cerr << errorString.toLocal8Bit().data() << std::endl; lbajardsilogic@15: return QXmlDefaultHandler::fatalError(exception); lbajardsilogic@15: }