annotate sv/main/EasaierSessionManager.cpp @ 79:afcf540ae3a2

add the real time filter stack to manage real time filters and their attributes
author lbajardsilogic
date Tue, 19 Jun 2007 15:15:12 +0000
parents b8be8b0e0c4b
children 82c960dc79f7
rev   line source
lbajardsilogic@21 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@21 2
lbajardsilogic@21 3 /* Sound Access
lbajardsilogic@21 4 EASAIER client application.
lbajardsilogic@21 5 Silogic 2007. Laure Bajard.
lbajardsilogic@21 6
lbajardsilogic@21 7 This program is free software; you can redistribute it and/or
lbajardsilogic@21 8 modify it under the terms of the GNU General Public License as
lbajardsilogic@21 9 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@21 10 License, or (at your option) any later version. See the file
lbajardsilogic@21 11 COPYING included with this distribution for more information.
lbajardsilogic@21 12 */
lbajardsilogic@21 13
lbajardsilogic@21 14 #include "EasaierSessionManager.h"
lbajardsilogic@21 15
lbajardsilogic@21 16 #include <QUrl>
lbajardsilogic@21 17 #include <QMessageBox>
lbajardsilogic@21 18 #include <QTextStream>
lbajardsilogic@21 19 #include <iostream>
lbajardsilogic@29 20 #include <QStatusBar>
lbajardsilogic@29 21
lbajardsilogic@21 22
lbajardsilogic@21 23 #include "layer/Layer.h"
lbajardsilogic@21 24 #include "base/TempDirectory.h"
lbajardsilogic@21 25 #include "data/fileio/AudioSourceInfoReader.h"
lbajardsilogic@21 26 #include "data/fileio/ModelReader.h"
lbajardsilogic@21 27 #include "data/fileio/QueryConfigReader.h"
lbajardsilogic@21 28 #include "data/fileio/SparqlResultsReader.h"
lbajardsilogic@21 29 #include "data/model/WaveFileModel.h"
lbajardsilogic@21 30 #include "main/MainWindow.h"
lbajardsilogic@21 31 #include "widgets/QueryResultsWidget.h"
lbajardsilogic@21 32
lbajardsilogic@21 33 EasaierSessionManager::EasaierSessionManager(HttpClient* httpClient) : QObject(),
lbajardsilogic@21 34 m_fileName(""),
lbajardsilogic@21 35 m_httpClient(httpClient),
lbajardsilogic@21 36 m_document(0),
lbajardsilogic@21 37 m_audioSourceInfoModel(0),
lbajardsilogic@21 38 m_queryModel(0)
lbajardsilogic@64 39 {
lbajardsilogic@64 40 connect(m_httpClient, SIGNAL(requestFinished(int, bool)), this, SLOT(fileLoaded(int, bool)));
lbajardsilogic@64 41 }
lbajardsilogic@21 42
lbajardsilogic@21 43 EasaierSessionManager::~EasaierSessionManager()
lbajardsilogic@21 44 {
lbajardsilogic@21 45 closeSession();
lbajardsilogic@21 46 m_httpClient = 0;
lbajardsilogic@21 47 }
lbajardsilogic@21 48
lbajardsilogic@21 49 bool EasaierSessionManager::newSession()
lbajardsilogic@21 50 {
lbajardsilogic@21 51 closeSession();
lbajardsilogic@21 52
lbajardsilogic@21 53 m_queryModel = new QueryModel();
lbajardsilogic@21 54 loadFile("http://easaier.silogic.fr/data/query/queryfield.xml", LoadedFile::QUERY_CONFIG);
lbajardsilogic@21 55
lbajardsilogic@21 56 return true;
lbajardsilogic@21 57 }
lbajardsilogic@21 58
lbajardsilogic@21 59 bool EasaierSessionManager::openSession(Document *document)
lbajardsilogic@21 60 {
lbajardsilogic@21 61 newSession();
lbajardsilogic@21 62
lbajardsilogic@21 63 m_fileName = document->getAudioSourceInfoFileName();
lbajardsilogic@21 64 m_document = document;
lbajardsilogic@21 65
lbajardsilogic@21 66 loadFile(m_fileName, LoadedFile::AUDIO_SOURCE_INFO );
lbajardsilogic@21 67
lbajardsilogic@21 68 return true;
lbajardsilogic@21 69 }
lbajardsilogic@21 70
lbajardsilogic@21 71 bool EasaierSessionManager::openAudioInfoFile(Document *document)
lbajardsilogic@21 72 {
lbajardsilogic@21 73 closeFile();
lbajardsilogic@21 74
lbajardsilogic@21 75 m_fileName = document->getAudioSourceInfoFileName();
lbajardsilogic@21 76 m_document = document;
lbajardsilogic@21 77
lbajardsilogic@21 78 loadFile(m_fileName, LoadedFile::AUDIO_SOURCE_INFO);
lbajardsilogic@21 79
lbajardsilogic@21 80 return true;
lbajardsilogic@21 81 }
lbajardsilogic@21 82
lbajardsilogic@21 83 void EasaierSessionManager::closeFile()
lbajardsilogic@21 84 {
lbajardsilogic@21 85 m_audioSourceInfoModel = 0;
lbajardsilogic@21 86
lbajardsilogic@21 87 while (!m_loadFile.empty())
lbajardsilogic@21 88 {
lbajardsilogic@64 89 m_loadFile.begin()->second->close();
lbajardsilogic@21 90 delete m_loadFile.begin()->second;
lbajardsilogic@21 91 m_loadFile.erase(m_loadFile.begin());
lbajardsilogic@21 92 }
lbajardsilogic@21 93
lbajardsilogic@21 94 m_modelLoaded.clear();
lbajardsilogic@21 95 }
lbajardsilogic@21 96
lbajardsilogic@21 97 void EasaierSessionManager::closeSession()
lbajardsilogic@21 98 {
lbajardsilogic@21 99 closeFile();
lbajardsilogic@21 100
lbajardsilogic@21 101 m_fileName = "";
lbajardsilogic@21 102 m_document = 0;
lbajardsilogic@21 103
lbajardsilogic@21 104 if (m_queryModel)
lbajardsilogic@21 105 {
lbajardsilogic@21 106 delete m_queryModel;
lbajardsilogic@21 107 m_queryModel = 0;
lbajardsilogic@21 108 }
lbajardsilogic@21 109 }
lbajardsilogic@21 110
lbajardsilogic@21 111 void EasaierSessionManager::loadFile(const QString& uri, LoadedFile::FileType type)
lbajardsilogic@21 112 {
lbajardsilogic@21 113 if (uri == 0)
lbajardsilogic@21 114 return;
lbajardsilogic@21 115
lbajardsilogic@21 116 if (m_httpClient->getHost() == "")
lbajardsilogic@21 117 {
lbajardsilogic@21 118 return;
lbajardsilogic@21 119 }
lbajardsilogic@21 120
lbajardsilogic@21 121 QUrl url(uri);
lbajardsilogic@21 122 QString path = url.path();
lbajardsilogic@21 123 QString directory = path.left(path.lastIndexOf("/"));
lbajardsilogic@21 124 QString filename = path.right(path.length() - path.lastIndexOf("/"));
lbajardsilogic@21 125
lbajardsilogic@21 126 if (directory.left(1) == "/")
lbajardsilogic@21 127 {
lbajardsilogic@21 128 directory.remove(0, 1);
lbajardsilogic@21 129 }
lbajardsilogic@21 130
lbajardsilogic@21 131 //create the subdirectory in local
lbajardsilogic@21 132 QString localPath = TempDirectory::getInstance()->getSubDirectoryPath(directory);
lbajardsilogic@21 133 localPath.append(filename);
lbajardsilogic@21 134
lbajardsilogic@21 135 LoadedFile* newFile = new LoadedFile(localPath);
lbajardsilogic@21 136 newFile->setFileType(type);
lbajardsilogic@21 137 newFile->setUri(uri);
lbajardsilogic@21 138
lbajardsilogic@21 139 int index = m_httpClient->get(path, newFile);
lbajardsilogic@21 140
lbajardsilogic@64 141 std::cerr << "Ask for file : GET " << path.toStdString() << " - index : " << index << std::endl;
lbajardsilogic@64 142
lbajardsilogic@21 143 m_loadFile[index] = newFile;
lbajardsilogic@21 144
lbajardsilogic@29 145 if (type == LoadedFile::QUERY_RESULTS)
lbajardsilogic@21 146 MainWindow::instance()->statusBar()->showMessage(tr("Querying database..."));
lbajardsilogic@21 147 else if (type == LoadedFile::QUERY_CONFIG)
lbajardsilogic@21 148 MainWindow::instance()->statusBar()->showMessage(tr("Asking for query config..."));
lbajardsilogic@21 149 else
lbajardsilogic@29 150 MainWindow::instance()->statusBar()->showMessage(tr("Loading File : %1").arg(filename));
lbajardsilogic@21 151 }
lbajardsilogic@21 152
lbajardsilogic@21 153 void EasaierSessionManager::fileLoaded(int index, bool error)
lbajardsilogic@21 154 {
lbajardsilogic@21 155 QString errorString = m_httpClient->errorString();
lbajardsilogic@21 156 std::map<int , LoadedFile*>::iterator iter = m_loadFile.find(index);
lbajardsilogic@21 157 if (iter == m_loadFile.end())
lbajardsilogic@21 158 {
lbajardsilogic@64 159 std::cerr << "fileLoaded() : file " << index << " not found. " << std::endl;
lbajardsilogic@21 160 return;
lbajardsilogic@21 161 }
lbajardsilogic@21 162 if (error)
lbajardsilogic@21 163 {
lbajardsilogic@21 164 QMessageBox::critical(MainWindow::instance(), tr("Download Failed"), m_httpClient->errorString());
lbajardsilogic@21 165 return;
lbajardsilogic@21 166 }
lbajardsilogic@21 167 bool read = false;
lbajardsilogic@21 168
lbajardsilogic@21 169 //retreive loaded file
lbajardsilogic@21 170 LoadedFile* loadedFile = iter->second;
lbajardsilogic@21 171 loadedFile->close();
lbajardsilogic@21 172
lbajardsilogic@21 173 //save type and filename for reading
lbajardsilogic@21 174 LoadedFile::FileType type = loadedFile->getFileType();
lbajardsilogic@21 175 QString filename = loadedFile->fileName();
lbajardsilogic@21 176 QString uri = loadedFile->getUri();
lbajardsilogic@21 177
lbajardsilogic@21 178 //delete de file and erase from the loaded file queue
lbajardsilogic@21 179 delete loadedFile;
lbajardsilogic@21 180 m_loadFile.erase(iter);
lbajardsilogic@21 181
lbajardsilogic@64 182 std::cerr << "fileLoaded() : file loaded, start to read file " << index << std::endl;
lbajardsilogic@64 183
lbajardsilogic@29 184 if ((type == LoadedFile::QUERY_RESULTS) || (type == LoadedFile::QUERY_CONFIG))
lbajardsilogic@21 185 {
lbajardsilogic@21 186 MainWindow::instance()->statusBar()->clearMessage();
lbajardsilogic@21 187 }
lbajardsilogic@21 188 else
lbajardsilogic@21 189 {
lbajardsilogic@21 190 QString name = filename.right(filename.length() - filename.lastIndexOf("/"));
lbajardsilogic@21 191 MainWindow::instance()->statusBar()->showMessage(tr("File Loaded : %1").arg(name), 3000);
lbajardsilogic@29 192 }
lbajardsilogic@21 193
lbajardsilogic@21 194 //read and load (in m_document) the file according to its type
lbajardsilogic@21 195 switch (type) {
lbajardsilogic@21 196
lbajardsilogic@21 197 case LoadedFile::AUDIO_SOURCE_INFO :
lbajardsilogic@21 198 {
lbajardsilogic@21 199 m_audioSourceInfoModel = new AudioSourceInfoModel();
lbajardsilogic@21 200 AudioSourceInfoReader audioSourceInfoReader(m_audioSourceInfoModel);
lbajardsilogic@21 201 read = audioSourceInfoReader.parse(filename);
lbajardsilogic@21 202 if (read)
lbajardsilogic@21 203 {
lbajardsilogic@21 204 m_document->setAudioSourceInfoModel(m_audioSourceInfoModel);
lbajardsilogic@21 205 loadRelatedModel();
lbajardsilogic@21 206 }
lbajardsilogic@21 207 break;
lbajardsilogic@21 208 }
lbajardsilogic@21 209 case LoadedFile::MODEL :
lbajardsilogic@21 210 {
lbajardsilogic@21 211 QString modelName = m_audioSourceInfoModel->getKey(uri);
lbajardsilogic@21 212
lbajardsilogic@21 213 read = addModelToLayers(modelName, filename);
lbajardsilogic@21 214
lbajardsilogic@21 215 break;
lbajardsilogic@21 216 }
lbajardsilogic@21 217 case LoadedFile::METADATA :
lbajardsilogic@21 218 {
lbajardsilogic@21 219 ModelReader modelReader(m_document,0, m_currentPane);
lbajardsilogic@21 220 read = modelReader.parse(filename);
lbajardsilogic@21 221
lbajardsilogic@21 222 break;
lbajardsilogic@21 223 }
lbajardsilogic@21 224 case LoadedFile::QUERY_CONFIG :
lbajardsilogic@21 225 {
lbajardsilogic@21 226 QueryConfigReader reader(m_queryModel);
lbajardsilogic@21 227 bool ok = reader.parse(filename);
lbajardsilogic@21 228
lbajardsilogic@21 229 if (ok)
lbajardsilogic@21 230 emit queryModelLoaded(m_queryModel);
lbajardsilogic@21 231
lbajardsilogic@21 232 read = ok;
lbajardsilogic@21 233 break;
lbajardsilogic@21 234 }
lbajardsilogic@21 235 case LoadedFile::QUERY_RESULTS :
lbajardsilogic@21 236 {
lbajardsilogic@21 237 QueryResultsWidget* resultsWidget = MainWindow::instance()->getQueryResultsWidget();
lbajardsilogic@21 238 resultsWidget->reset();
lbajardsilogic@21 239
lbajardsilogic@21 240 if (resultsWidget)
lbajardsilogic@21 241 {
lbajardsilogic@21 242 SparqlResultsReader reader(resultsWidget);
lbajardsilogic@21 243 read = reader.parse(filename);
lbajardsilogic@21 244 }
lbajardsilogic@21 245 break;
lbajardsilogic@21 246 }
lbajardsilogic@21 247 default: break;
lbajardsilogic@21 248 }
lbajardsilogic@21 249
lbajardsilogic@21 250 //if the file could not be read by any reader
lbajardsilogic@21 251 if (!read)
lbajardsilogic@21 252 {
lbajardsilogic@21 253 QFile file(filename);
lbajardsilogic@21 254 if (file.open(QFile::ReadOnly)) {
lbajardsilogic@21 255 QMessageBox::critical(MainWindow::instance(), tr("Download Error"), file.readAll());
lbajardsilogic@21 256 }
lbajardsilogic@21 257 }
lbajardsilogic@64 258 else {
lbajardsilogic@64 259 std::cerr << "fileLoaded() : " << index << " all successful. " << std::endl;
lbajardsilogic@64 260 }
lbajardsilogic@21 261 }
lbajardsilogic@21 262
lbajardsilogic@21 263 void EasaierSessionManager::loadRelatedModel()
lbajardsilogic@21 264 {
lbajardsilogic@21 265 std::set<Layer *> layers = m_document->getLayers();
lbajardsilogic@21 266 std::set<Layer *>::iterator iter;
lbajardsilogic@21 267
lbajardsilogic@21 268 std::set<QString> loadedModel;
lbajardsilogic@21 269
lbajardsilogic@21 270 for (iter=layers.begin(); iter != layers.end(); iter++)
lbajardsilogic@21 271 {
lbajardsilogic@21 272 Layer * layer = *iter;
lbajardsilogic@21 273
lbajardsilogic@21 274 QString modelName = layer->getModelName();
lbajardsilogic@21 275 if (modelName != "")
lbajardsilogic@21 276 {
lbajardsilogic@21 277 QString modelId = QString::number(layer->getModelId());
lbajardsilogic@21 278 modelName.append(modelId);
lbajardsilogic@21 279
lbajardsilogic@21 280 } else if (layer->getLayerPresentationName() == "Waveform")
lbajardsilogic@21 281 {
lbajardsilogic@21 282 modelName = "audiofile";
lbajardsilogic@21 283 int modelId = 1;
lbajardsilogic@21 284 layer->setModelName(modelName);
lbajardsilogic@21 285 layer->setModelId(modelId);
lbajardsilogic@21 286 modelName.append(QString::number(modelId));
lbajardsilogic@21 287 }
lbajardsilogic@21 288
lbajardsilogic@21 289 if (modelName != "")
lbajardsilogic@21 290 {
lbajardsilogic@21 291 QString uri = m_audioSourceInfoModel->getInfo(modelName);
lbajardsilogic@21 292
lbajardsilogic@21 293 std::set<QString>::iterator iterModel = m_modelLoaded.find(uri);
lbajardsilogic@21 294
lbajardsilogic@21 295 if (iterModel == m_modelLoaded.end())
lbajardsilogic@21 296 {
lbajardsilogic@21 297 m_modelLoaded.insert(uri);
lbajardsilogic@21 298 loadFile(uri, LoadedFile::MODEL);
lbajardsilogic@21 299 }
lbajardsilogic@21 300 }
lbajardsilogic@21 301 }
lbajardsilogic@21 302 }
lbajardsilogic@21 303
lbajardsilogic@21 304 bool EasaierSessionManager::addModelToLayers(const QString& name, const QString& filename)
lbajardsilogic@21 305 {
lbajardsilogic@21 306 std::set<Layer *> layers = m_document->getLayers();
lbajardsilogic@21 307 std::set<Layer *>::iterator iter;
lbajardsilogic@21 308
lbajardsilogic@21 309 std::map<QString, Model *> addedModel;
lbajardsilogic@21 310
lbajardsilogic@21 311 bool ok = false;
lbajardsilogic@21 312
lbajardsilogic@21 313 for (iter=layers.begin(); iter != layers.end(); iter++)
lbajardsilogic@21 314 {
lbajardsilogic@21 315 Layer * layer = *iter;
lbajardsilogic@21 316
lbajardsilogic@21 317 QString modelName = layer->getModelName();
lbajardsilogic@21 318 QString modelId = QString::number(layer->getModelId());
lbajardsilogic@21 319
lbajardsilogic@21 320 modelName.append(modelId);
lbajardsilogic@21 321 modelName = modelName.toLower();
lbajardsilogic@21 322
lbajardsilogic@21 323 if (modelName == name)
lbajardsilogic@21 324 {
lbajardsilogic@21 325 std::map<QString, Model *>::iterator iterModel;
lbajardsilogic@21 326 iterModel = addedModel.find(modelName);
lbajardsilogic@21 327
lbajardsilogic@21 328 if (iterModel == addedModel.end())
lbajardsilogic@21 329 {
lbajardsilogic@21 330 if (filename.right(4) == ".ogg")
lbajardsilogic@21 331 {
lbajardsilogic@21 332 WaveFileModel *model = new WaveFileModel(filename);
lbajardsilogic@21 333 m_document->setMainModel(model);
lbajardsilogic@21 334 addedModel[modelName] = (Model* ) model;
lbajardsilogic@21 335 ok = true;
lbajardsilogic@21 336 } else
lbajardsilogic@21 337 {
lbajardsilogic@21 338 ModelReader modelReader(m_document, layer);
lbajardsilogic@21 339 ok = modelReader.parse(filename);
lbajardsilogic@21 340 }
lbajardsilogic@21 341 }
lbajardsilogic@21 342 else
lbajardsilogic@21 343 {
lbajardsilogic@21 344 Model* model = iterModel->second;
lbajardsilogic@21 345 m_document->addImportedModel(model);
lbajardsilogic@21 346 m_document->setModel(layer, model);
lbajardsilogic@21 347 }
lbajardsilogic@21 348 }
lbajardsilogic@21 349 }
lbajardsilogic@21 350
lbajardsilogic@21 351 return ok;
lbajardsilogic@21 352 }
lbajardsilogic@21 353
lbajardsilogic@21 354 void EasaierSessionManager::importMetadata(const QString& filename, Pane* pane)
lbajardsilogic@21 355 {
lbajardsilogic@21 356 loadFile(filename, LoadedFile::METADATA);
lbajardsilogic@21 357 m_currentPane = pane;
lbajardsilogic@21 358 }
lbajardsilogic@21 359
lbajardsilogic@21 360 void EasaierSessionManager::queryDatabase(const QString& themeName)
lbajardsilogic@21 361 {
lbajardsilogic@21 362 QString text = tr("Sorry query database information on the %1 theme is not yet available. All results are returned").arg(themeName);
lbajardsilogic@21 363 QMessageBox::information( MainWindow::instance(), tr("Query database information"), text);
lbajardsilogic@21 364
lbajardsilogic@21 365 QString filename = "http://easaier.silogic.fr/data/query/results.xml";
lbajardsilogic@21 366
lbajardsilogic@21 367 loadFile(filename, LoadedFile::QUERY_RESULTS);
lbajardsilogic@21 368 }