lbajardsilogic@21: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@21: lbajardsilogic@21: /* Sound Access lbajardsilogic@21: EASAIER client application. lbajardsilogic@21: Silogic 2007. Laure Bajard. lbajardsilogic@21: lbajardsilogic@21: This program is free software; you can redistribute it and/or lbajardsilogic@21: modify it under the terms of the GNU General Public License as lbajardsilogic@21: published by the Free Software Foundation; either version 2 of the lbajardsilogic@21: License, or (at your option) any later version. See the file lbajardsilogic@21: COPYING included with this distribution for more information. lbajardsilogic@21: */ lbajardsilogic@21: lbajardsilogic@21: #include "EasaierSessionManager.h" lbajardsilogic@21: lbajardsilogic@21: #include lbajardsilogic@21: #include lbajardsilogic@21: #include lbajardsilogic@21: #include lbajardsilogic@29: #include lbajardsilogic@29: lbajardsilogic@21: lbajardsilogic@21: #include "layer/Layer.h" lbajardsilogic@21: #include "base/TempDirectory.h" lbajardsilogic@21: #include "data/fileio/AudioSourceInfoReader.h" lbajardsilogic@21: #include "data/fileio/ModelReader.h" lbajardsilogic@21: #include "data/fileio/QueryConfigReader.h" lbajardsilogic@21: #include "data/fileio/SparqlResultsReader.h" lbajardsilogic@21: #include "data/model/WaveFileModel.h" lbajardsilogic@21: #include "main/MainWindow.h" lbajardsilogic@21: #include "widgets/QueryResultsWidget.h" lbajardsilogic@21: lbajardsilogic@21: EasaierSessionManager::EasaierSessionManager(HttpClient* httpClient) : QObject(), lbajardsilogic@21: m_fileName(""), lbajardsilogic@21: m_httpClient(httpClient), lbajardsilogic@21: m_document(0), lbajardsilogic@21: m_audioSourceInfoModel(0), lbajardsilogic@21: m_queryModel(0) lbajardsilogic@64: { lbajardsilogic@64: connect(m_httpClient, SIGNAL(requestFinished(int, bool)), this, SLOT(fileLoaded(int, bool))); lbajardsilogic@64: } lbajardsilogic@21: lbajardsilogic@21: EasaierSessionManager::~EasaierSessionManager() lbajardsilogic@21: { lbajardsilogic@21: closeSession(); lbajardsilogic@21: m_httpClient = 0; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: bool EasaierSessionManager::newSession() lbajardsilogic@21: { lbajardsilogic@21: closeSession(); lbajardsilogic@21: lbajardsilogic@21: m_queryModel = new QueryModel(); lbajardsilogic@21: loadFile("http://easaier.silogic.fr/data/query/queryfield.xml", LoadedFile::QUERY_CONFIG); lbajardsilogic@21: lbajardsilogic@21: return true; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: bool EasaierSessionManager::openSession(Document *document) lbajardsilogic@21: { lbajardsilogic@21: newSession(); lbajardsilogic@21: lbajardsilogic@21: m_fileName = document->getAudioSourceInfoFileName(); lbajardsilogic@21: m_document = document; lbajardsilogic@21: lbajardsilogic@21: loadFile(m_fileName, LoadedFile::AUDIO_SOURCE_INFO ); lbajardsilogic@21: lbajardsilogic@21: return true; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: bool EasaierSessionManager::openAudioInfoFile(Document *document) lbajardsilogic@21: { lbajardsilogic@21: closeFile(); lbajardsilogic@21: lbajardsilogic@21: m_fileName = document->getAudioSourceInfoFileName(); lbajardsilogic@21: m_document = document; lbajardsilogic@21: lbajardsilogic@21: loadFile(m_fileName, LoadedFile::AUDIO_SOURCE_INFO); lbajardsilogic@21: lbajardsilogic@21: return true; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void EasaierSessionManager::closeFile() lbajardsilogic@21: { lbajardsilogic@21: m_audioSourceInfoModel = 0; lbajardsilogic@21: lbajardsilogic@21: while (!m_loadFile.empty()) lbajardsilogic@21: { lbajardsilogic@64: m_loadFile.begin()->second->close(); lbajardsilogic@21: delete m_loadFile.begin()->second; lbajardsilogic@21: m_loadFile.erase(m_loadFile.begin()); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: m_modelLoaded.clear(); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void EasaierSessionManager::closeSession() lbajardsilogic@21: { lbajardsilogic@21: closeFile(); lbajardsilogic@21: lbajardsilogic@21: m_fileName = ""; lbajardsilogic@21: m_document = 0; lbajardsilogic@21: lbajardsilogic@21: if (m_queryModel) lbajardsilogic@21: { lbajardsilogic@21: delete m_queryModel; lbajardsilogic@21: m_queryModel = 0; lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void EasaierSessionManager::loadFile(const QString& uri, LoadedFile::FileType type) lbajardsilogic@21: { lbajardsilogic@21: if (uri == 0) lbajardsilogic@21: return; lbajardsilogic@21: lbajardsilogic@21: if (m_httpClient->getHost() == "") lbajardsilogic@21: { lbajardsilogic@21: return; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: QUrl url(uri); lbajardsilogic@21: QString path = url.path(); lbajardsilogic@21: QString directory = path.left(path.lastIndexOf("/")); lbajardsilogic@21: QString filename = path.right(path.length() - path.lastIndexOf("/")); lbajardsilogic@21: lbajardsilogic@21: if (directory.left(1) == "/") lbajardsilogic@21: { lbajardsilogic@21: directory.remove(0, 1); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: //create the subdirectory in local lbajardsilogic@21: QString localPath = TempDirectory::getInstance()->getSubDirectoryPath(directory); lbajardsilogic@21: localPath.append(filename); lbajardsilogic@21: lbajardsilogic@21: LoadedFile* newFile = new LoadedFile(localPath); lbajardsilogic@21: newFile->setFileType(type); lbajardsilogic@21: newFile->setUri(uri); lbajardsilogic@21: lbajardsilogic@21: int index = m_httpClient->get(path, newFile); lbajardsilogic@21: lbajardsilogic@64: std::cerr << "Ask for file : GET " << path.toStdString() << " - index : " << index << std::endl; lbajardsilogic@64: lbajardsilogic@21: m_loadFile[index] = newFile; lbajardsilogic@21: lbajardsilogic@29: if (type == LoadedFile::QUERY_RESULTS) lbajardsilogic@21: MainWindow::instance()->statusBar()->showMessage(tr("Querying database...")); lbajardsilogic@21: else if (type == LoadedFile::QUERY_CONFIG) lbajardsilogic@21: MainWindow::instance()->statusBar()->showMessage(tr("Asking for query config...")); lbajardsilogic@21: else lbajardsilogic@29: MainWindow::instance()->statusBar()->showMessage(tr("Loading File : %1").arg(filename)); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void EasaierSessionManager::fileLoaded(int index, bool error) lbajardsilogic@21: { lbajardsilogic@21: QString errorString = m_httpClient->errorString(); lbajardsilogic@21: std::map::iterator iter = m_loadFile.find(index); lbajardsilogic@21: if (iter == m_loadFile.end()) lbajardsilogic@21: { lbajardsilogic@64: std::cerr << "fileLoaded() : file " << index << " not found. " << std::endl; lbajardsilogic@21: return; lbajardsilogic@21: } lbajardsilogic@21: if (error) lbajardsilogic@21: { lbajardsilogic@21: QMessageBox::critical(MainWindow::instance(), tr("Download Failed"), m_httpClient->errorString()); lbajardsilogic@21: return; lbajardsilogic@21: } lbajardsilogic@21: bool read = false; lbajardsilogic@21: lbajardsilogic@21: //retreive loaded file lbajardsilogic@21: LoadedFile* loadedFile = iter->second; lbajardsilogic@21: loadedFile->close(); lbajardsilogic@21: lbajardsilogic@21: //save type and filename for reading lbajardsilogic@21: LoadedFile::FileType type = loadedFile->getFileType(); lbajardsilogic@21: QString filename = loadedFile->fileName(); lbajardsilogic@21: QString uri = loadedFile->getUri(); lbajardsilogic@21: lbajardsilogic@21: //delete de file and erase from the loaded file queue lbajardsilogic@21: delete loadedFile; lbajardsilogic@21: m_loadFile.erase(iter); lbajardsilogic@21: lbajardsilogic@64: std::cerr << "fileLoaded() : file loaded, start to read file " << index << std::endl; lbajardsilogic@64: lbajardsilogic@29: if ((type == LoadedFile::QUERY_RESULTS) || (type == LoadedFile::QUERY_CONFIG)) lbajardsilogic@21: { lbajardsilogic@21: MainWindow::instance()->statusBar()->clearMessage(); lbajardsilogic@21: } lbajardsilogic@21: else lbajardsilogic@21: { lbajardsilogic@21: QString name = filename.right(filename.length() - filename.lastIndexOf("/")); lbajardsilogic@21: MainWindow::instance()->statusBar()->showMessage(tr("File Loaded : %1").arg(name), 3000); lbajardsilogic@29: } lbajardsilogic@21: lbajardsilogic@21: //read and load (in m_document) the file according to its type lbajardsilogic@21: switch (type) { lbajardsilogic@21: lbajardsilogic@21: case LoadedFile::AUDIO_SOURCE_INFO : lbajardsilogic@21: { lbajardsilogic@21: m_audioSourceInfoModel = new AudioSourceInfoModel(); lbajardsilogic@21: AudioSourceInfoReader audioSourceInfoReader(m_audioSourceInfoModel); lbajardsilogic@21: read = audioSourceInfoReader.parse(filename); lbajardsilogic@21: if (read) lbajardsilogic@21: { lbajardsilogic@21: m_document->setAudioSourceInfoModel(m_audioSourceInfoModel); lbajardsilogic@21: loadRelatedModel(); lbajardsilogic@21: } lbajardsilogic@21: break; lbajardsilogic@21: } lbajardsilogic@21: case LoadedFile::MODEL : lbajardsilogic@21: { lbajardsilogic@21: QString modelName = m_audioSourceInfoModel->getKey(uri); lbajardsilogic@21: lbajardsilogic@21: read = addModelToLayers(modelName, filename); lbajardsilogic@21: lbajardsilogic@21: break; lbajardsilogic@21: } lbajardsilogic@21: case LoadedFile::METADATA : lbajardsilogic@21: { lbajardsilogic@21: ModelReader modelReader(m_document,0, m_currentPane); lbajardsilogic@21: read = modelReader.parse(filename); lbajardsilogic@21: lbajardsilogic@21: break; lbajardsilogic@21: } lbajardsilogic@21: case LoadedFile::QUERY_CONFIG : lbajardsilogic@21: { lbajardsilogic@21: QueryConfigReader reader(m_queryModel); lbajardsilogic@21: bool ok = reader.parse(filename); lbajardsilogic@21: lbajardsilogic@21: if (ok) lbajardsilogic@21: emit queryModelLoaded(m_queryModel); lbajardsilogic@21: lbajardsilogic@21: read = ok; lbajardsilogic@21: break; lbajardsilogic@21: } lbajardsilogic@21: case LoadedFile::QUERY_RESULTS : lbajardsilogic@21: { lbajardsilogic@21: QueryResultsWidget* resultsWidget = MainWindow::instance()->getQueryResultsWidget(); lbajardsilogic@21: resultsWidget->reset(); lbajardsilogic@21: lbajardsilogic@21: if (resultsWidget) lbajardsilogic@21: { lbajardsilogic@21: SparqlResultsReader reader(resultsWidget); lbajardsilogic@21: read = reader.parse(filename); lbajardsilogic@21: } lbajardsilogic@21: break; lbajardsilogic@21: } lbajardsilogic@21: default: break; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: //if the file could not be read by any reader lbajardsilogic@21: if (!read) lbajardsilogic@21: { lbajardsilogic@21: QFile file(filename); lbajardsilogic@21: if (file.open(QFile::ReadOnly)) { lbajardsilogic@21: QMessageBox::critical(MainWindow::instance(), tr("Download Error"), file.readAll()); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@64: else { lbajardsilogic@64: std::cerr << "fileLoaded() : " << index << " all successful. " << std::endl; lbajardsilogic@64: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void EasaierSessionManager::loadRelatedModel() lbajardsilogic@21: { lbajardsilogic@21: std::set layers = m_document->getLayers(); lbajardsilogic@21: std::set::iterator iter; lbajardsilogic@21: lbajardsilogic@21: std::set loadedModel; lbajardsilogic@21: lbajardsilogic@21: for (iter=layers.begin(); iter != layers.end(); iter++) lbajardsilogic@21: { lbajardsilogic@21: Layer * layer = *iter; lbajardsilogic@21: lbajardsilogic@21: QString modelName = layer->getModelName(); lbajardsilogic@21: if (modelName != "") lbajardsilogic@21: { lbajardsilogic@21: QString modelId = QString::number(layer->getModelId()); lbajardsilogic@21: modelName.append(modelId); lbajardsilogic@21: lbajardsilogic@21: } else if (layer->getLayerPresentationName() == "Waveform") lbajardsilogic@21: { lbajardsilogic@21: modelName = "audiofile"; lbajardsilogic@21: int modelId = 1; lbajardsilogic@21: layer->setModelName(modelName); lbajardsilogic@21: layer->setModelId(modelId); lbajardsilogic@21: modelName.append(QString::number(modelId)); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: if (modelName != "") lbajardsilogic@21: { lbajardsilogic@21: QString uri = m_audioSourceInfoModel->getInfo(modelName); lbajardsilogic@21: lbajardsilogic@21: std::set::iterator iterModel = m_modelLoaded.find(uri); lbajardsilogic@21: lbajardsilogic@21: if (iterModel == m_modelLoaded.end()) lbajardsilogic@21: { lbajardsilogic@21: m_modelLoaded.insert(uri); lbajardsilogic@21: loadFile(uri, LoadedFile::MODEL); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: bool EasaierSessionManager::addModelToLayers(const QString& name, const QString& filename) lbajardsilogic@21: { lbajardsilogic@21: std::set layers = m_document->getLayers(); lbajardsilogic@21: std::set::iterator iter; lbajardsilogic@21: lbajardsilogic@21: std::map addedModel; lbajardsilogic@21: lbajardsilogic@21: bool ok = false; lbajardsilogic@21: lbajardsilogic@21: for (iter=layers.begin(); iter != layers.end(); iter++) lbajardsilogic@21: { lbajardsilogic@21: Layer * layer = *iter; lbajardsilogic@21: lbajardsilogic@21: QString modelName = layer->getModelName(); lbajardsilogic@21: QString modelId = QString::number(layer->getModelId()); lbajardsilogic@21: lbajardsilogic@21: modelName.append(modelId); lbajardsilogic@21: modelName = modelName.toLower(); lbajardsilogic@21: lbajardsilogic@21: if (modelName == name) lbajardsilogic@21: { lbajardsilogic@21: std::map::iterator iterModel; lbajardsilogic@21: iterModel = addedModel.find(modelName); lbajardsilogic@21: lbajardsilogic@21: if (iterModel == addedModel.end()) lbajardsilogic@21: { lbajardsilogic@21: if (filename.right(4) == ".ogg") lbajardsilogic@21: { lbajardsilogic@21: WaveFileModel *model = new WaveFileModel(filename); lbajardsilogic@21: m_document->setMainModel(model); lbajardsilogic@21: addedModel[modelName] = (Model* ) model; lbajardsilogic@21: ok = true; lbajardsilogic@21: } else lbajardsilogic@21: { lbajardsilogic@21: ModelReader modelReader(m_document, layer); lbajardsilogic@21: ok = modelReader.parse(filename); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: else lbajardsilogic@21: { lbajardsilogic@21: Model* model = iterModel->second; lbajardsilogic@21: m_document->addImportedModel(model); lbajardsilogic@21: m_document->setModel(layer, model); lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: return ok; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void EasaierSessionManager::importMetadata(const QString& filename, Pane* pane) lbajardsilogic@21: { lbajardsilogic@21: loadFile(filename, LoadedFile::METADATA); lbajardsilogic@21: m_currentPane = pane; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: void EasaierSessionManager::queryDatabase(const QString& themeName) lbajardsilogic@21: { lbajardsilogic@21: QString text = tr("Sorry query database information on the %1 theme is not yet available. All results are returned").arg(themeName); lbajardsilogic@21: QMessageBox::information( MainWindow::instance(), tr("Query database information"), text); lbajardsilogic@21: lbajardsilogic@21: QString filename = "http://easaier.silogic.fr/data/query/results.xml"; lbajardsilogic@21: lbajardsilogic@21: loadFile(filename, LoadedFile::QUERY_RESULTS); lbajardsilogic@21: }