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 "ModelReader.h" lbajardsilogic@15: lbajardsilogic@15: #include "document/Document.h" lbajardsilogic@15: #include "layer/Layer.h" lbajardsilogic@15: lbajardsilogic@15: #include "data/model/EditableDenseThreeDimensionalModel.h" lbajardsilogic@15: #include "data/model/SparseOneDimensionalModel.h" lbajardsilogic@15: #include "data/model/SparseTimeValueModel.h" lbajardsilogic@15: #include "data/model/NoteModel.h" lbajardsilogic@15: #include "data/model/TextModel.h" lbajardsilogic@15: #include "data/model/IntervalModel.h" lbajardsilogic@15: #include "view/Pane.h" lbajardsilogic@268: #include "main/MainWindow.h" lbajardsilogic@15: lbajardsilogic@15: #include lbajardsilogic@15: lbajardsilogic@15: ModelReader::ModelReader(Document *document, Layer * layer, Pane * pane) : lbajardsilogic@15: m_document(document), lbajardsilogic@15: m_layer(layer), lbajardsilogic@15: m_pane(pane) lbajardsilogic@261: { lbajardsilogic@261: } lbajardsilogic@15: lbajardsilogic@15: bool ModelReader::parse(const QString & filename) lbajardsilogic@15: { lbajardsilogic@15: ModelHandler handler(m_document, m_layer, m_pane); 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: ModelHandler::ModelHandler(Document *document, Layer * layer, Pane* pane) : QXmlDefaultHandler(), lbajardsilogic@15: m_document(document), lbajardsilogic@15: m_layer(layer), lbajardsilogic@15: m_pane(pane), lbajardsilogic@15: m_model(0), lbajardsilogic@251: m_inBinding(false), lbajardsilogic@252: m_curBindingName(""), lbajardsilogic@251: m_sampleRate(44100) lbajardsilogic@268: { lbajardsilogic@268: m_sampleRate = MainWindow::instance()->getMainModelSampleRate(); lbajardsilogic@268: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::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@251: if (name == "sparql") { lbajardsilogic@251: lbajardsilogic@251: // nothing needed lbajardsilogic@251: ok = true; lbajardsilogic@251: lbajardsilogic@251: } else if (name == "head") { lbajardsilogic@251: lbajardsilogic@251: // nothing needed lbajardsilogic@251: ok = true; lbajardsilogic@251: lbajardsilogic@251: } else if (name == "variable") { lbajardsilogic@251: lbajardsilogic@251: // nothing needed lbajardsilogic@251: ok = true; lbajardsilogic@251: lbajardsilogic@251: } else if (name == "results") { lbajardsilogic@251: lbajardsilogic@251: // nothing needed lbajardsilogic@251: ok = true; lbajardsilogic@251: lbajardsilogic@251: } else if (name == "result") { lbajardsilogic@251: lbajardsilogic@251: //m_resultsWidget->newResult(); lbajardsilogic@251: ok = true; lbajardsilogic@251: lbajardsilogic@251: } else if (name == "binding") { lbajardsilogic@251: lbajardsilogic@251: m_curBindingName = attributes.value("name"); lbajardsilogic@251: ok = true; lbajardsilogic@251: lbajardsilogic@251: } else if ( (name == "uri") || (name == "literal") ) { lbajardsilogic@251: m_inBinding = true; lbajardsilogic@251: ok = true; lbajardsilogic@251: } lbajardsilogic@15: lbajardsilogic@15: if (!ok) { lbajardsilogic@15: std::cerr << "WARNING: ModelReader-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 ModelHandler::endElement(const QString &namespaceURI, const QString &localName, lbajardsilogic@15: const QString &qName) lbajardsilogic@15: { lbajardsilogic@251: QString name = qName.toLower(); lbajardsilogic@251: lbajardsilogic@251: if ( (name == "uri") || (name == "literal") ) lbajardsilogic@251: { lbajardsilogic@251: m_inBinding = false; lbajardsilogic@251: m_curBindingName = ""; lbajardsilogic@251: lbajardsilogic@251: } else if (name == "result") lbajardsilogic@251: { lbajardsilogic@251: addNewData(); lbajardsilogic@251: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::characters(const QString &str) lbajardsilogic@15: { lbajardsilogic@251: if (m_inBinding) lbajardsilogic@251: { lbajardsilogic@251: m_info[m_curBindingName] = str; lbajardsilogic@251: } lbajardsilogic@15: lbajardsilogic@15: return true; lbajardsilogic@15: } lbajardsilogic@15: lbajardsilogic@15: bool ModelHandler::error(const QXmlParseException &exception) lbajardsilogic@15: { lbajardsilogic@15: QString errorString; lbajardsilogic@15: errorString += QString("ERROR: ModelReader-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 ModelHandler::fatalError(const QXmlParseException &exception) lbajardsilogic@15: { lbajardsilogic@15: QString errorString; lbajardsilogic@15: errorString += QString("FATAL ERROR: ModelReader-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: } lbajardsilogic@15: lbajardsilogic@251: void ModelHandler::addNewData() lbajardsilogic@251: { lbajardsilogic@251: m_layer = 0; lbajardsilogic@251: m_model = 0; lbajardsilogic@251: lbajardsilogic@251: if (m_info.find("beginsAt") != m_info.end()) lbajardsilogic@251: { lbajardsilogic@251: addDataInterval(); lbajardsilogic@251: } else if (m_info.find("at") != m_info.end()) lbajardsilogic@251: { lbajardsilogic@251: addDataTimeInstants(); lbajardsilogic@251: } lbajardsilogic@251: lbajardsilogic@251: m_info.clear(); lbajardsilogic@251: } lbajardsilogic@251: lbajardsilogic@251: void ModelHandler::addDataInterval() lbajardsilogic@251: { lbajardsilogic@251: std::map::iterator iter; lbajardsilogic@251: lbajardsilogic@251: std::map::iterator iterEventLabel = m_info.find("event_label"); lbajardsilogic@251: if (iterEventLabel == m_info.end()) lbajardsilogic@251: return; lbajardsilogic@251: lbajardsilogic@251: QString eventLabel = iterEventLabel->second; lbajardsilogic@251: lbajardsilogic@251: std::set layers = m_document->getLayers(); lbajardsilogic@251: std::set::iterator iterLayer; lbajardsilogic@251: bool findLayer = false; lbajardsilogic@261: lbajardsilogic@251: for (iterLayer=layers.begin(); iterLayer != layers.end(); iterLayer++) lbajardsilogic@251: { lbajardsilogic@251: if ((*iterLayer)->objectName() == eventLabel) lbajardsilogic@251: { lbajardsilogic@251: m_layer = (*iterLayer); lbajardsilogic@251: findLayer = true; lbajardsilogic@251: m_model = m_layer->getModel(); lbajardsilogic@251: } lbajardsilogic@251: } lbajardsilogic@251: lbajardsilogic@251: if (!findLayer) lbajardsilogic@251: { lbajardsilogic@251: //create layer lbajardsilogic@251: m_layer = m_document->createLayer(LayerFactory::getInstance()->getLayerTypeForName("interval")); lbajardsilogic@251: lbajardsilogic@251: if (!m_layer) { lbajardsilogic@251: std::cerr << "WARNING: modelreader-XML: Failed to add layer of type interval" << std::endl; lbajardsilogic@251: return ; lbajardsilogic@251: } lbajardsilogic@251: m_layer->setObjectName(eventLabel); lbajardsilogic@251: lbajardsilogic@251: m_layer->setModelName(eventLabel); lbajardsilogic@251: lbajardsilogic@261: if (m_pane && m_layer) lbajardsilogic@261: { lbajardsilogic@261: m_document->addLayerToViewWithoutCommand(m_pane, m_layer); lbajardsilogic@261: } lbajardsilogic@261: } lbajardsilogic@261: lbajardsilogic@261: if (!m_model) lbajardsilogic@261: { lbajardsilogic@251: //create model lbajardsilogic@251: IntervalModel * model = new IntervalModel(m_sampleRate, 1, true); lbajardsilogic@251: m_model = model; lbajardsilogic@251: m_model->setObjectName(eventLabel); lbajardsilogic@251: lbajardsilogic@253: //set color and value for interval lbajardsilogic@253: IntervalModel *im = dynamic_cast (m_model); lbajardsilogic@253: if ((m_pane) && (im)) lbajardsilogic@253: { lbajardsilogic@253: int modulo = m_pane->getIntervalModulo(); lbajardsilogic@253: im->setMeanValue(modulo*0.2+0.2); lbajardsilogic@253: m_layer->setProperty("Colour", modulo + 1); lbajardsilogic@253: } lbajardsilogic@253: lbajardsilogic@251: //link model, layer document and view lbajardsilogic@251: if (m_model && m_layer) lbajardsilogic@251: { lbajardsilogic@251: m_document->addImportedModel(m_model); lbajardsilogic@251: m_document->setModel(m_layer, m_model); lbajardsilogic@251: } lbajardsilogic@261: } lbajardsilogic@251: lbajardsilogic@251: //add interval lbajardsilogic@251: IntervalModel *im = dynamic_cast (m_model); lbajardsilogic@251: if (im) lbajardsilogic@251: { lbajardsilogic@251: //start lbajardsilogic@251: iter = m_info.find("beginsAt"); lbajardsilogic@251: if (iter == m_info.end()) lbajardsilogic@251: return; lbajardsilogic@251: QString beginAt = iter->second; lbajardsilogic@251: long start = beginAt.mid(2, beginAt.length()-3).toDouble()*m_sampleRate; lbajardsilogic@251: //end lbajardsilogic@251: iter = m_info.find("duration"); lbajardsilogic@251: if (iter == m_info.end()) lbajardsilogic@251: return; lbajardsilogic@251: QString duration = iter->second; lbajardsilogic@268: long temp = duration.mid(2, duration.length()-3).toDouble(); lbajardsilogic@268: long end = start + duration.mid(2, duration.length()-3).toDouble()*m_sampleRate; lbajardsilogic@251: //label lbajardsilogic@251: QString label = ""; lbajardsilogic@251: for (iter = m_info.begin(); iter != m_info.end(); iter++) lbajardsilogic@251: { lbajardsilogic@251: QString propertylabel = iter->first; lbajardsilogic@251: if ((propertylabel != "beginsAt") && (propertylabel != "duration") && lbajardsilogic@251: (propertylabel != "event_label") && (propertylabel != "signal") ) lbajardsilogic@251: label += iter->second + " - "; lbajardsilogic@251: } lbajardsilogic@251: //value lbajardsilogic@268: std::cerr << "modelreader-XML: beginAt = " << beginAt.toStdString() << " duration : " << duration.toStdString() << std::endl; lbajardsilogic@268: std::cerr << "modelreader-XML: temp = " << temp << std::endl; lbajardsilogic@268: std::cerr << "modelreader-XML: start = " << start << " end : " << end << std::endl; lbajardsilogic@268: lbajardsilogic@253: float value = im->getMeanValue(); lbajardsilogic@251: im->addInterval(start, end, label, value); lbajardsilogic@251: } lbajardsilogic@251: } lbajardsilogic@251: lbajardsilogic@251: void ModelHandler::addDataTimeInstants() lbajardsilogic@251: { lbajardsilogic@251: std::map::iterator iter; lbajardsilogic@251: lbajardsilogic@251: std::map::iterator iterEventLabel = m_info.find("event_label"); lbajardsilogic@251: if (iterEventLabel == m_info.end()) lbajardsilogic@251: return; lbajardsilogic@251: lbajardsilogic@251: QString eventLabel = iterEventLabel->second; lbajardsilogic@251: lbajardsilogic@251: std::set layers = m_document->getLayers(); lbajardsilogic@251: std::set::iterator iterLayer; lbajardsilogic@251: bool findLayer = false; lbajardsilogic@251: lbajardsilogic@251: for (iterLayer=layers.begin(); iterLayer != layers.end(); iterLayer++) lbajardsilogic@251: { lbajardsilogic@251: if ((*iterLayer)->objectName() == eventLabel) lbajardsilogic@251: { lbajardsilogic@251: m_layer = (*iterLayer); lbajardsilogic@251: findLayer = true; lbajardsilogic@251: m_model = m_layer->getModel(); lbajardsilogic@251: } lbajardsilogic@251: } lbajardsilogic@251: lbajardsilogic@251: if (!findLayer) lbajardsilogic@251: { lbajardsilogic@251: //create layer lbajardsilogic@251: m_layer = m_document->createLayer(LayerFactory::getInstance()->getLayerTypeForName("timeinstants")); lbajardsilogic@251: lbajardsilogic@251: if (!m_layer) { lbajardsilogic@251: std::cerr << "WARNING: modelreader-XML: Failed to add layer of type timeinstants" << std::endl; lbajardsilogic@251: return ; lbajardsilogic@251: } lbajardsilogic@251: m_layer->setObjectName(eventLabel); lbajardsilogic@251: lbajardsilogic@251: m_layer->setModelName(eventLabel); lbajardsilogic@251: lbajardsilogic@261: if (m_pane && m_layer) lbajardsilogic@261: { lbajardsilogic@261: m_document->addLayerToView(m_pane, m_layer); lbajardsilogic@261: } lbajardsilogic@261: } lbajardsilogic@261: lbajardsilogic@261: if (!m_model) lbajardsilogic@261: { lbajardsilogic@251: //create model lbajardsilogic@251: SparseOneDimensionalModel *model = new SparseOneDimensionalModel(m_sampleRate, 512); lbajardsilogic@251: m_model = model; lbajardsilogic@251: m_model->setObjectName(eventLabel); lbajardsilogic@251: lbajardsilogic@251: //link model, layer document and view lbajardsilogic@251: if (m_model && m_layer) lbajardsilogic@251: { lbajardsilogic@251: m_document->addImportedModel(m_model); lbajardsilogic@251: m_document->setModel(m_layer, m_model); lbajardsilogic@261: } lbajardsilogic@261: } lbajardsilogic@251: lbajardsilogic@251: //add point lbajardsilogic@251: SparseOneDimensionalModel *sodm = dynamic_cast (m_model); lbajardsilogic@251: if (sodm) lbajardsilogic@251: { lbajardsilogic@251: //frame lbajardsilogic@251: iter = m_info.find("at"); lbajardsilogic@251: if (iter == m_info.end()) lbajardsilogic@251: return; lbajardsilogic@251: QString at = iter->second; lbajardsilogic@251: long frame = at.toDouble()*m_sampleRate; lbajardsilogic@251: lbajardsilogic@251: sodm->addPoint(SparseOneDimensionalModel::Point(frame, "")); lbajardsilogic@251: } lbajardsilogic@251: lbajardsilogic@15: }