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 "SparqlResultsReader.h" lbajardsilogic@15: lbajardsilogic@15: #include lbajardsilogic@15: benoitrigolleau@280: SparqlResultsReader::SparqlResultsReader(QueryResultsWidget* resultsWidget) : benoitrigolleau@280: m_resultsWidget(resultsWidget) benoitrigolleau@280: {} lbajardsilogic@15: lbajardsilogic@15: bool SparqlResultsReader::parse(const QString & filename) lbajardsilogic@15: { benoitrigolleau@280: SparqlResultsHandler handler(m_resultsWidget); lbajardsilogic@15: QXmlSimpleReader reader; benoitrigolleau@280: reader.setContentHandler(&handler); benoitrigolleau@280: 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: { benoitrigolleau@280: m_resultsWidget->displayResult(); lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: return false; lbajardsilogic@15: } lbajardsilogic@15: benoitrigolleau@280: SparqlResultsHandler::SparqlResultsHandler(QueryResultsWidget* resultsWidget) : QXmlDefaultHandler(), benoitrigolleau@280: m_resultsWidget(resultsWidget), benoitrigolleau@280: m_inBinding(false), benoitrigolleau@280: m_curBindingName("") benoitrigolleau@280: {} benoitrigolleau@280: benoitrigolleau@280: bool SparqlResultsHandler::startElement(const QString &namespaceURI, const QString &localName, benoitrigolleau@280: const QString &qName, const QXmlAttributes &attributes) benoitrigolleau@280: { benoitrigolleau@280: benoitrigolleau@280: QString name = qName.toLower(); benoitrigolleau@280: benoitrigolleau@280: bool ok = false; benoitrigolleau@280: benoitrigolleau@280: // Valid element names: benoitrigolleau@280: // benoitrigolleau@280: // sparql benoitrigolleau@280: // head benoitrigolleau@280: // variable benoitrigolleau@280: // results benoitrigolleau@280: // result benoitrigolleau@280: // binding benoitrigolleau@280: benoitrigolleau@280: if (name == "sparql") { benoitrigolleau@280: benoitrigolleau@280: // nothing needed benoitrigolleau@280: ok = true; benoitrigolleau@280: benoitrigolleau@280: } else if (name == "head") { benoitrigolleau@280: benoitrigolleau@280: // nothing needed benoitrigolleau@280: ok = true; benoitrigolleau@280: benoitrigolleau@280: } else if (name == "variable") { benoitrigolleau@280: benoitrigolleau@280: // nothing needed benoitrigolleau@280: ok = true; benoitrigolleau@280: benoitrigolleau@280: } else if (name == "results") { benoitrigolleau@280: benoitrigolleau@280: // nothing needed benoitrigolleau@280: ok = true; benoitrigolleau@280: benoitrigolleau@280: } else if (name == "result") { benoitrigolleau@280: benoitrigolleau@280: m_resultsWidget->newResult(); benoitrigolleau@280: ok = true; benoitrigolleau@280: benoitrigolleau@280: } else if (name == "binding") { benoitrigolleau@280: benoitrigolleau@280: m_curBindingName = attributes.value("name"); benoitrigolleau@280: ok = true; benoitrigolleau@280: benoitrigolleau@280: } else if ( (name == "uri") || (name == "literal") ) { benoitrigolleau@280: m_inBinding = true; benoitrigolleau@280: ok = true; benoitrigolleau@280: } benoitrigolleau@280: benoitrigolleau@280: if (!ok) { benoitrigolleau@280: std::cerr << "WARNING: SparqlResultsHandler-XML: Failed to completely process element \"" benoitrigolleau@280: << name.toLocal8Bit().data() << "\"" << std::endl; benoitrigolleau@280: } benoitrigolleau@280: benoitrigolleau@280: return true; lbajardsilogic@15: } lbajardsilogic@15: benoitrigolleau@280: bool SparqlResultsHandler::endElement(const QString &namespaceURI, const QString &localName, benoitrigolleau@280: const QString &qName) benoitrigolleau@280: { benoitrigolleau@280: QString name = qName.toLower(); benoitrigolleau@280: benoitrigolleau@280: if ( (name == "uri") || (name == "literal") ) benoitrigolleau@280: { benoitrigolleau@280: m_inBinding = false; benoitrigolleau@280: m_curBindingName = ""; benoitrigolleau@280: benoitrigolleau@280: } else if (name == "result") benoitrigolleau@280: { benoitrigolleau@280: /*m_resultsWidget->addInfo("composer", m_composer); benoitrigolleau@280: m_resultsWidget->addInfo("arranger", m_arranger); benoitrigolleau@280: m_composer.clear(); benoitrigolleau@280: m_arranger.clear(); benoitrigolleau@280: m_composer.append(" -"); benoitrigolleau@280: m_arranger.append(" -");*/ benoitrigolleau@280: benoitrigolleau@280: m_resultsWidget->saveCurResult(); benoitrigolleau@280: } benoitrigolleau@280: benoitrigolleau@280: return true; benoitrigolleau@280: } benoitrigolleau@280: benoitrigolleau@280: bool SparqlResultsHandler::characters(const QString &str) benoitrigolleau@280: { benoitrigolleau@280: if (m_inBinding) benoitrigolleau@280: { benoitrigolleau@280: /*if (m_curBindingName.contains("composer")) benoitrigolleau@280: { benoitrigolleau@280: m_composer.append(" " + str); benoitrigolleau@280: } benoitrigolleau@280: else if (m_curBindingName.contains("arranger")) benoitrigolleau@280: { benoitrigolleau@280: m_arranger.append(" " + str); benoitrigolleau@280: } benoitrigolleau@280: else benoitrigolleau@280: {*/ benoitrigolleau@280: m_resultsWidget->addInfo(m_curBindingName, str); benoitrigolleau@280: //} benoitrigolleau@280: } benoitrigolleau@280: benoitrigolleau@280: return true; benoitrigolleau@280: } benoitrigolleau@280: benoitrigolleau@280: bool SparqlResultsHandler::error(const QXmlParseException &exception) benoitrigolleau@280: { benoitrigolleau@280: QString errorString; benoitrigolleau@280: errorString += QString("ERROR: SparqlResultsHandler-XML: %1 at line %2, column %3") benoitrigolleau@280: .arg(exception.message()) benoitrigolleau@280: .arg(exception.lineNumber()) benoitrigolleau@280: .arg(exception.columnNumber()); benoitrigolleau@280: std::cerr << errorString.toLocal8Bit().data() << std::endl; benoitrigolleau@280: return QXmlDefaultHandler::error(exception); benoitrigolleau@280: } benoitrigolleau@280: benoitrigolleau@280: bool SparqlResultsHandler::fatalError(const QXmlParseException &exception) benoitrigolleau@280: { benoitrigolleau@280: QString errorString; benoitrigolleau@280: errorString += QString("FATAL ERROR: SparqlResultsHandler-XML: %1 at line %2, column %3") benoitrigolleau@280: .arg(exception.message()) benoitrigolleau@280: .arg(exception.lineNumber()) benoitrigolleau@280: .arg(exception.columnNumber()); benoitrigolleau@280: std::cerr << errorString.toLocal8Bit().data() << std::endl; benoitrigolleau@280: return QXmlDefaultHandler::fatalError(exception); benoitrigolleau@280: }