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@191: #include lbajardsilogic@191: #include lbajardsilogic@191: lbajardsilogic@191: #include lbajardsilogic@191: #include lbajardsilogic@191: #include lbajardsilogic@29: lbajardsilogic@21: #include "layer/Layer.h" lbajardsilogic@191: #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@143: #include "data/fileio/SparqlRelatedMediaReader.h" lbajardsilogic@146: #include "data/fileio/VideoFileReaderFactory.h" lbajardsilogic@21: #include "data/model/WaveFileModel.h" lbajardsilogic@21: #include "main/MainWindow.h" lbajardsilogic@21: #include "widgets/QueryResultsWidget.h" lbajardsilogic@143: #include "widgets/RelatedMediaWidget.h" benoitrigolleau@81: #include "base/PropertyContainer.h" lbajardsilogic@85: #include "data/fileio/AudioFileReaderFactory.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@214: m_queryModel(0), lbajardsilogic@214: m_currentPane(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@95: QString filename = "/data/query/queryfield.xml"; benoitrigolleau@97: QString query = m_httpClient->getServletName() + "?theme=getFile&fileName=data/query/queryfield.xml"; lbajardsilogic@90: loadFile(query, filename, 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@90: QString params = "&identification=" + m_fileName; lbajardsilogic@90: lbajardsilogic@95: QString query = m_httpClient->getServletName() + "?theme=infoFile"+params; lbajardsilogic@177: QString filename = "/easaier/servlet/infoFile"; lbajardsilogic@177: loadFile(query, filename, LoadedFile::AUDIO_SOURCE_INFO); lbajardsilogic@90: lbajardsilogic@177: //get related media lbajardsilogic@177: query = m_httpClient->getServletName() + "?theme=relatedMedia" + params; lbajardsilogic@177: filename = "/easaier/servlet/relatedMedia"; lbajardsilogic@177: loadFile(query, filename, LoadedFile::RELATED_MEDIA_LIST); lbajardsilogic@90: 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@90: QString params = "&identification=" + m_fileName; lbajardsilogic@90: lbajardsilogic@143: //get infofile lbajardsilogic@143: QString query = m_httpClient->getServletName() + "?theme=infoFile" + params; lbajardsilogic@90: lbajardsilogic@95: QString filename = "/easaier/servlet/infoFile"; lbajardsilogic@92: lbajardsilogic@90: loadFile(query, filename, LoadedFile::AUDIO_SOURCE_INFO); lbajardsilogic@21: lbajardsilogic@143: //get related media lbajardsilogic@143: lbajardsilogic@143: query = m_httpClient->getServletName() + "?theme=relatedMedia" + params; lbajardsilogic@143: filename = "/easaier/servlet/relatedMedia"; lbajardsilogic@143: loadFile(query, filename, LoadedFile::RELATED_MEDIA_LIST); lbajardsilogic@143: 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@191: { lbajardsilogic@191: m_loadFile.begin()->second->close(); lbajardsilogic@191: 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: benoitrigolleau@103: void EasaierSessionManager::loadFile(const QString& queryAux, const QString& filename, LoadedFile::FileType type) lbajardsilogic@21: { benoitrigolleau@103: if ((queryAux == 0) || (filename == 0)) lbajardsilogic@21: return; lbajardsilogic@21: lbajardsilogic@21: if (m_httpClient->getHost() == "") lbajardsilogic@21: return; lbajardsilogic@21: benoitrigolleau@103: QUrl url(queryAux); benoitrigolleau@103: QString query = QString(url.toEncoded()); benoitrigolleau@103: lbajardsilogic@191: QString directory = filename.left(filename.lastIndexOf("/")); lbajardsilogic@191: QString file = filename.right(filename.length() - filename.lastIndexOf("/")); lbajardsilogic@191: lbajardsilogic@191: if (directory.left(1) == "/") lbajardsilogic@191: { lbajardsilogic@191: directory.remove(0, 1); lbajardsilogic@191: } lbajardsilogic@191: lbajardsilogic@191: //create the subdirectory in local lbajardsilogic@191: QString localPath = TempDirectory::getInstance()->getSubDirectoryPath(directory); lbajardsilogic@191: localPath.append(file); lbajardsilogic@191: lbajardsilogic@191: LoadedFile* newFile = new LoadedFile(localPath); lbajardsilogic@90: newFile->setFileType(type); lbajardsilogic@100: newFile->setUri(filename); benoitrigolleau@88: lbajardsilogic@90: int index = m_httpClient->get(query, newFile); lbajardsilogic@21: lbajardsilogic@95: std::cerr << "Ask for file : GET " << query.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: { benoitrigolleau@88: QApplication::restoreOverrideCursor(); 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@180: loadedFile = 0; 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@191: switch (type) { lbajardsilogic@191: lbajardsilogic@191: case LoadedFile::AUDIO_SOURCE_INFO : lbajardsilogic@191: { lbajardsilogic@191: m_audioSourceInfoModel = new AudioSourceInfoModel(); lbajardsilogic@191: AudioSourceInfoReader audioSourceInfoReader(m_audioSourceInfoModel); lbajardsilogic@191: read = audioSourceInfoReader.parse(filename); lbajardsilogic@191: if (read) lbajardsilogic@191: { lbajardsilogic@191: m_document->setAudioSourceInfoModel(m_audioSourceInfoModel); lbajardsilogic@191: loadRelatedModel(); lbajardsilogic@191: } lbajardsilogic@191: break; lbajardsilogic@21: } lbajardsilogic@191: case LoadedFile::MODEL : lbajardsilogic@191: { lbajardsilogic@191: QString modelName = m_audioSourceInfoModel->getKey(uri); lbajardsilogic@191: lbajardsilogic@191: read = addModelToLayers(modelName, filename); lbajardsilogic@191: lbajardsilogic@191: break; lbajardsilogic@21: } lbajardsilogic@191: case LoadedFile::METADATA : lbajardsilogic@191: { lbajardsilogic@191: ModelReader modelReader(m_document,0, m_currentPane); lbajardsilogic@191: read = modelReader.parse(filename); lbajardsilogic@191: lbajardsilogic@191: break; lbajardsilogic@21: } lbajardsilogic@191: case LoadedFile::QUERY_CONFIG : lbajardsilogic@191: { lbajardsilogic@191: QueryConfigReader reader(m_queryModel); lbajardsilogic@191: bool ok = reader.parse(filename); lbajardsilogic@191: lbajardsilogic@191: if (ok) lbajardsilogic@191: emit queryModelLoaded(m_queryModel); lbajardsilogic@191: lbajardsilogic@191: read = ok; lbajardsilogic@191: break; lbajardsilogic@191: } lbajardsilogic@191: case LoadedFile::QUERY_RESULTS : lbajardsilogic@191: { 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@191: } lbajardsilogic@191: break; lbajardsilogic@21: } lbajardsilogic@143: case LoadedFile::RELATED_MEDIA_LIST : lbajardsilogic@143: { lbajardsilogic@143: std::list relMediaList; lbajardsilogic@143: SparqlRelatedMediaReader reader(&relMediaList); lbajardsilogic@143: read = reader.parse(filename); lbajardsilogic@143: importRelatedMedia(&relMediaList); lbajardsilogic@143: break; lbajardsilogic@143: } lbajardsilogic@143: case LoadedFile::RELATED_MEDIA : lbajardsilogic@143: { lbajardsilogic@143: read = true; lbajardsilogic@143: RelatedMediaWidget* relMediaWidget = MainWindow::instance()->getRelatedMediaWidget(); lbajardsilogic@143: relMediaWidget->addRelatedMedia(filename); lbajardsilogic@143: break; lbajardsilogic@143: } 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)) { benoitrigolleau@88: QApplication::restoreOverrideCursor(); 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: } benoitrigolleau@88: QApplication::restoreOverrideCursor(); 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@90: //modelName.append(modelId); lbajardsilogic@21: lbajardsilogic@21: } else if (layer->getLayerPresentationName() == "Waveform") lbajardsilogic@21: { lbajardsilogic@244: //modelName = "http://purl.org/dc/elements/1.1/source"; lbajardsilogic@244: modelName = "available_as"; lbajardsilogic@21: int modelId = 1; lbajardsilogic@21: layer->setModelName(modelName); lbajardsilogic@21: layer->setModelId(modelId); lbajardsilogic@90: //modelName.append(QString::number(modelId)); lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@21: if (modelName != "") lbajardsilogic@21: { lbajardsilogic@244: QString uri = m_audioSourceInfoModel->getInfo(modelName)->at(0); lbajardsilogic@90: benoitrigolleau@97: QString query = m_httpClient->getServletName() + "?theme=getFile&fileName="+uri; lbajardsilogic@95: 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@95: loadFile(query, 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@90: //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@191: QString extension = filename.right(filename.length()-filename.lastIndexOf(".")-1); lbajardsilogic@191: if (AudioFileReaderFactory::isKnownExtensions(extension)) lbajardsilogic@191: { lbajardsilogic@191: WaveFileModel *model = new WaveFileModel(filename); lbajardsilogic@191: m_document->setMainModel(model); lbajardsilogic@191: addedModel[modelName] = (Model* ) model; lbajardsilogic@191: ok = true; benoitrigolleau@217: emit audioFileLoaded(); lbajardsilogic@191: } lbajardsilogic@192: #ifdef HAVE_VIDEO lbajardsilogic@191: else if (VideoFileReaderFactory::isKnownExtensions(extension)) lbajardsilogic@146: { lbajardsilogic@185: ok = !(MainWindow::instance()->openVideoFile(filename, MainWindow::ReplaceMainModel)); benoitrigolleau@217: emit audioFileLoaded(); lbajardsilogic@191: } lbajardsilogic@191: #endif lbajardsilogic@191: else lbajardsilogic@21: { lbajardsilogic@191: 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: { benoitrigolleau@97: QString query = m_httpClient->getServletName() + "?theme=getFile&fileName="+filename; lbajardsilogic@92: lbajardsilogic@95: loadFile( query, filename, LoadedFile::METADATA); lbajardsilogic@90: lbajardsilogic@21: m_currentPane = pane; lbajardsilogic@21: } lbajardsilogic@21: lbajardsilogic@143: void EasaierSessionManager::importRelatedMedia(std::list *relMediaList) lbajardsilogic@143: { lbajardsilogic@143: QString filename; lbajardsilogic@143: QString query; lbajardsilogic@143: lbajardsilogic@143: std::list::iterator iter; lbajardsilogic@143: for (iter = relMediaList->begin(); iter != relMediaList->end(); iter++) lbajardsilogic@143: { lbajardsilogic@143: filename = *iter; lbajardsilogic@143: lbajardsilogic@143: query = m_httpClient->getServletName() + "?theme=getFile&fileName=" + filename; lbajardsilogic@143: lbajardsilogic@143: loadFile( query, filename, LoadedFile::RELATED_MEDIA); lbajardsilogic@143: } lbajardsilogic@143: } lbajardsilogic@143: lbajardsilogic@21: void EasaierSessionManager::queryDatabase(const QString& themeName) lbajardsilogic@21: { lbajardsilogic@21: benoitrigolleau@81: QueryThemeModel *themeModel = (m_queryModel->getThemes()).find(themeName)->second; benoitrigolleau@81: QString params = ""; benoitrigolleau@81: if(themeModel!=0){ benoitrigolleau@81: PropertyContainer::PropertyList propertyList = themeModel->getProperties(); lbajardsilogic@185: for(int i=0; i< ((int) propertyList.size());i++){ benoitrigolleau@81: params+= "&"+propertyList[i] + "="+themeModel->getPropertyValue(propertyList[i]); benoitrigolleau@81: } benoitrigolleau@81: } lbajardsilogic@95: QString query = m_httpClient->getServletName() + "?theme="+themeName+""+params; lbajardsilogic@95: QString filename = "/easaier/servlet/"+themeName; benoitrigolleau@104: lbajardsilogic@92: benoitrigolleau@88: QApplication::setOverrideCursor( Qt::WaitCursor ); lbajardsilogic@90: loadFile(query, filename, LoadedFile::QUERY_RESULTS); lbajardsilogic@90: lbajardsilogic@21: }