view data/fileio/QueryConfigReader.cpp @ 227:59d84a8bb76c

compatibility with changes done for the web site: - easaier servlet name changed - new queryfield.xml ("range" attributes form)
author lbajardsilogic
date Wed, 27 Feb 2008 16:00:02 +0000
parents 11e298cdb9e7
children
line wrap: on
line source
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */

/*	Sound Access	
		EASAIER client application.	
		Silogic 2007. Laure Bajard. 
	
	This program is free software; you can redistribute it and/or    
	modify it under the terms of the GNU General Public License as    
	published by the Free Software Foundation; either version 2 of the    
	License, or (at your option) any later version.  See the file    
	COPYING included with this distribution for more information.
*/

#include "QueryConfigReader.h"

#include <iostream>

#include "model/QueryModel.h"

QueryConfigReader::QueryConfigReader(QueryModel * queryModel) :
	m_queryModel(queryModel)
{}

bool QueryConfigReader::parse(const QString & filename)
{
	QueryConfigHandler handler(m_queryModel);
    QXmlSimpleReader reader;
    reader.setContentHandler(&handler);
    reader.setErrorHandler(&handler);

	QFile file(filename);

    if (!file.open(QFile::ReadOnly | QFile::Text)) {
        return false;
    }

    QXmlInputSource xmlInputSource(&file);
    if (reader.parse(xmlInputSource))
	{
		return true;
	}
	
	return false;
}

QueryConfigHandler::QueryConfigHandler(QueryModel * queryModel) : QXmlDefaultHandler(),
	m_inTheme(false),
	m_inFieldGroup(false),
	m_inBinding(false),
	m_propertyName(""),
	m_queryModel(queryModel)
{}

bool QueryConfigHandler::startElement(const QString &namespaceURI, const QString &localName,
						  const QString &qName, const QXmlAttributes &attributes)
{
	
    QString name = qName.toLower();

    bool ok = false;

    // Valid element names:
    //
    // easaierquery
    // theme
    // fieldgroup
    // field
    
    if (name == "easaierquery") {

		// nothing needed
		ok = true;

    } else if (name == "theme") {

		m_inTheme = true;
		m_queryModel->addTheme(attributes.value("name"), attributes.value("label"));
		ok = true;

    } else if (name == "fieldgroup") {

		m_inFieldGroup = true;
		m_queryModel->newGroup(attributes.value("name"), attributes.value("label"));
		ok = true;
    
    } else if (name == "field") {
	
		ok = true;
		m_propertyName	= attributes.value("name");
		QString label	= attributes.value("label");
		QString type	= attributes.value("xsi:type");
		QString range	= attributes.value("range");
		QString unit	= attributes.value("unit");
		QString comment	= attributes.value("comment");
		m_queryModel->addProperty(m_propertyName, label, type, range, unit, comment);

    } else if (name == "range") {

		m_inBinding = true;
		ok = true;
	}

    if (!ok) {
		std::cerr << "WARNING: QueryConfigReader-XML: Failed to completely process element \""
		  << name.toLocal8Bit().data() << "\"" << std::endl;
    }

    return true;
}

bool QueryConfigHandler::endElement(const QString &namespaceURI, const QString &localName,
						const QString &qName)
{
	QString name = qName.toLower();

    if (name == "theme") 
	{
		m_inTheme = false;
    } 
	else if (name == "fieldgroup") 
	{
        m_inFieldGroup = false;
    } 
	else if (name == "range") 
	{
        m_inBinding = false;
    } 

	return true;
}

bool QueryConfigHandler::characters(const QString &str)
{
	bool ok = false;

	if (m_inBinding)
	{
		m_queryModel->addRange(m_propertyName, str);
	}

    return true;
}

bool QueryConfigHandler::error(const QXmlParseException &exception)
{
	QString errorString;
	errorString += QString("ERROR: QueryConfigReader-XML: %1 at line %2, column %3")
	.arg(exception.message())
	.arg(exception.lineNumber())
	.arg(exception.columnNumber());
    std::cerr << errorString.toLocal8Bit().data() << std::endl;
    return QXmlDefaultHandler::error(exception);
}

bool QueryConfigHandler::fatalError(const QXmlParseException &exception)
{
	QString errorString;
	errorString += QString("FATAL ERROR: QueryConfigReader-XML: %1 at line %2, column %3")
	.arg(exception.message())
	.arg(exception.lineNumber())
	.arg(exception.columnNumber());
    std::cerr << errorString.toLocal8Bit().data() << std::endl;
    return QXmlDefaultHandler::fatalError(exception);
}