annotate sv/main/EasaierSessionManager.cpp @ 92:dd06af61a4ff

correct bug with port 80 and 9876
author lbajardsilogic
date Fri, 29 Jun 2007 10:04:07 +0000
parents 87495ac7710a
children ca3a5912fd78
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>
benoitrigolleau@81 21 #include <vector>
lbajardsilogic@90 22
benoitrigolleau@88 23 #include <QApplication>
benoitrigolleau@88 24 #include <Qt>
lbajardsilogic@29 25
lbajardsilogic@21 26 #include "layer/Layer.h"
lbajardsilogic@21 27 #include "base/TempDirectory.h"
lbajardsilogic@21 28 #include "data/fileio/AudioSourceInfoReader.h"
lbajardsilogic@21 29 #include "data/fileio/ModelReader.h"
lbajardsilogic@21 30 #include "data/fileio/QueryConfigReader.h"
lbajardsilogic@21 31 #include "data/fileio/SparqlResultsReader.h"
lbajardsilogic@21 32 #include "data/model/WaveFileModel.h"
lbajardsilogic@21 33 #include "main/MainWindow.h"
lbajardsilogic@21 34 #include "widgets/QueryResultsWidget.h"
benoitrigolleau@81 35 #include "base/PropertyContainer.h"
lbajardsilogic@85 36 #include "data/fileio/AudioFileReaderFactory.h"
lbajardsilogic@21 37
lbajardsilogic@21 38 EasaierSessionManager::EasaierSessionManager(HttpClient* httpClient) : QObject(),
lbajardsilogic@21 39 m_fileName(""),
lbajardsilogic@21 40 m_httpClient(httpClient),
lbajardsilogic@21 41 m_document(0),
lbajardsilogic@21 42 m_audioSourceInfoModel(0),
lbajardsilogic@21 43 m_queryModel(0)
lbajardsilogic@64 44 {
lbajardsilogic@64 45 connect(m_httpClient, SIGNAL(requestFinished(int, bool)), this, SLOT(fileLoaded(int, bool)));
lbajardsilogic@64 46 }
lbajardsilogic@21 47
lbajardsilogic@21 48 EasaierSessionManager::~EasaierSessionManager()
lbajardsilogic@21 49 {
lbajardsilogic@21 50 closeSession();
lbajardsilogic@21 51 m_httpClient = 0;
lbajardsilogic@21 52 }
lbajardsilogic@21 53
lbajardsilogic@21 54 bool EasaierSessionManager::newSession()
lbajardsilogic@21 55 {
lbajardsilogic@21 56 closeSession();
lbajardsilogic@21 57
lbajardsilogic@21 58 m_queryModel = new QueryModel();
lbajardsilogic@86 59 QString filename = "http://" + m_httpClient->getHost() + "/data/query/queryfield.xml";
lbajardsilogic@92 60 QString query = "/data/query/queryfield.xml";
lbajardsilogic@92 61
lbajardsilogic@92 62 m_httpClient->setHost(m_httpClient->getHost());
lbajardsilogic@90 63
lbajardsilogic@90 64 loadFile(query, filename, LoadedFile::QUERY_CONFIG);
lbajardsilogic@21 65
lbajardsilogic@21 66 return true;
lbajardsilogic@21 67 }
lbajardsilogic@21 68
lbajardsilogic@21 69 bool EasaierSessionManager::openSession(Document *document)
lbajardsilogic@21 70 {
lbajardsilogic@21 71 newSession();
lbajardsilogic@21 72
lbajardsilogic@21 73 m_fileName = document->getAudioSourceInfoFileName();
lbajardsilogic@21 74 m_document = document;
lbajardsilogic@21 75
lbajardsilogic@90 76 QString params = "&identification=" + m_fileName;
lbajardsilogic@90 77
lbajardsilogic@92 78 QString query = "/easaier/servlet/MOQueryServlet?theme=infoFile"+params;
lbajardsilogic@90 79
lbajardsilogic@92 80 QString filename = "http://"+ m_httpClient->getHost() + ":" + "9876" +
lbajardsilogic@90 81 "/easaier/servlet/infoFile";
lbajardsilogic@21 82
lbajardsilogic@92 83 m_httpClient->setHost(m_httpClient->getHost(), 9876);
lbajardsilogic@92 84
lbajardsilogic@90 85 loadFile(query, filename, LoadedFile::AUDIO_SOURCE_INFO);
lbajardsilogic@90 86
lbajardsilogic@21 87 return true;
lbajardsilogic@21 88 }
lbajardsilogic@21 89
lbajardsilogic@21 90 bool EasaierSessionManager::openAudioInfoFile(Document *document)
lbajardsilogic@21 91 {
lbajardsilogic@21 92 closeFile();
lbajardsilogic@21 93
lbajardsilogic@21 94 m_fileName = document->getAudioSourceInfoFileName();
lbajardsilogic@21 95 m_document = document;
lbajardsilogic@21 96
lbajardsilogic@90 97 QString params = "&identification=" + m_fileName;
lbajardsilogic@90 98
lbajardsilogic@92 99 QString query = "/easaier/servlet/MOQueryServlet?theme=infoFile"+params;
lbajardsilogic@90 100
lbajardsilogic@92 101 QString filename = "http://"+ m_httpClient->getHost() + ":" + "9876" +
lbajardsilogic@90 102 "/easaier/servlet/infoFile";
lbajardsilogic@90 103
lbajardsilogic@92 104 m_httpClient->setHost(m_httpClient->getHost(), 9876);
lbajardsilogic@92 105
lbajardsilogic@90 106 loadFile(query, filename, LoadedFile::AUDIO_SOURCE_INFO);
lbajardsilogic@21 107
lbajardsilogic@21 108 return true;
lbajardsilogic@21 109 }
lbajardsilogic@21 110
lbajardsilogic@21 111 void EasaierSessionManager::closeFile()
lbajardsilogic@21 112 {
lbajardsilogic@21 113 m_audioSourceInfoModel = 0;
lbajardsilogic@21 114
lbajardsilogic@21 115 while (!m_loadFile.empty())
lbajardsilogic@21 116 {
lbajardsilogic@64 117 m_loadFile.begin()->second->close();
lbajardsilogic@21 118 delete m_loadFile.begin()->second;
lbajardsilogic@21 119 m_loadFile.erase(m_loadFile.begin());
lbajardsilogic@21 120 }
lbajardsilogic@21 121
lbajardsilogic@21 122 m_modelLoaded.clear();
lbajardsilogic@21 123 }
lbajardsilogic@21 124
lbajardsilogic@21 125 void EasaierSessionManager::closeSession()
lbajardsilogic@21 126 {
lbajardsilogic@21 127 closeFile();
lbajardsilogic@21 128
lbajardsilogic@21 129 m_fileName = "";
lbajardsilogic@21 130 m_document = 0;
lbajardsilogic@21 131
lbajardsilogic@21 132 if (m_queryModel)
lbajardsilogic@21 133 {
lbajardsilogic@21 134 delete m_queryModel;
lbajardsilogic@21 135 m_queryModel = 0;
lbajardsilogic@21 136 }
lbajardsilogic@21 137 }
lbajardsilogic@21 138
lbajardsilogic@90 139 void EasaierSessionManager::loadFile(const QString& query, const QString& filename, LoadedFile::FileType type)
lbajardsilogic@21 140 {
lbajardsilogic@90 141 if ((query == 0) || (filename == 0))
lbajardsilogic@21 142 return;
lbajardsilogic@21 143
lbajardsilogic@21 144 if (m_httpClient->getHost() == "")
lbajardsilogic@21 145 return;
lbajardsilogic@21 146
lbajardsilogic@90 147 QUrl url(filename);
lbajardsilogic@21 148 QString path = url.path();
lbajardsilogic@21 149 QString directory = path.left(path.lastIndexOf("/"));
lbajardsilogic@90 150 QString file = path.right(path.length() - path.lastIndexOf("/"));
lbajardsilogic@21 151
lbajardsilogic@21 152 if (directory.left(1) == "/")
lbajardsilogic@21 153 {
lbajardsilogic@21 154 directory.remove(0, 1);
lbajardsilogic@21 155 }
lbajardsilogic@21 156
lbajardsilogic@21 157 //create the subdirectory in local
lbajardsilogic@21 158 QString localPath = TempDirectory::getInstance()->getSubDirectoryPath(directory);
lbajardsilogic@90 159 localPath.append(file);
lbajardsilogic@21 160
lbajardsilogic@21 161 LoadedFile* newFile = new LoadedFile(localPath);
lbajardsilogic@90 162 newFile->setFileType(type);
lbajardsilogic@90 163 newFile->setUri(query);
benoitrigolleau@88 164
lbajardsilogic@90 165 int index = m_httpClient->get(query, newFile);
lbajardsilogic@21 166
lbajardsilogic@64 167 std::cerr << "Ask for file : GET " << path.toStdString() << " - index : " << index << std::endl;
lbajardsilogic@64 168
lbajardsilogic@21 169 m_loadFile[index] = newFile;
lbajardsilogic@21 170
lbajardsilogic@29 171 if (type == LoadedFile::QUERY_RESULTS)
lbajardsilogic@21 172 MainWindow::instance()->statusBar()->showMessage(tr("Querying database..."));
lbajardsilogic@21 173 else if (type == LoadedFile::QUERY_CONFIG)
lbajardsilogic@21 174 MainWindow::instance()->statusBar()->showMessage(tr("Asking for query config..."));
lbajardsilogic@21 175 else
lbajardsilogic@29 176 MainWindow::instance()->statusBar()->showMessage(tr("Loading File : %1").arg(filename));
lbajardsilogic@21 177 }
lbajardsilogic@21 178
lbajardsilogic@21 179 void EasaierSessionManager::fileLoaded(int index, bool error)
lbajardsilogic@21 180 {
lbajardsilogic@21 181 QString errorString = m_httpClient->errorString();
lbajardsilogic@21 182 std::map<int , LoadedFile*>::iterator iter = m_loadFile.find(index);
lbajardsilogic@21 183 if (iter == m_loadFile.end())
lbajardsilogic@21 184 {
lbajardsilogic@64 185 std::cerr << "fileLoaded() : file " << index << " not found. " << std::endl;
lbajardsilogic@21 186 return;
lbajardsilogic@21 187 }
lbajardsilogic@21 188 if (error)
lbajardsilogic@21 189 {
benoitrigolleau@88 190 QApplication::restoreOverrideCursor();
lbajardsilogic@21 191 QMessageBox::critical(MainWindow::instance(), tr("Download Failed"), m_httpClient->errorString());
lbajardsilogic@21 192 return;
lbajardsilogic@21 193 }
lbajardsilogic@21 194 bool read = false;
lbajardsilogic@21 195
lbajardsilogic@21 196 //retreive loaded file
lbajardsilogic@21 197 LoadedFile* loadedFile = iter->second;
lbajardsilogic@21 198 loadedFile->close();
lbajardsilogic@21 199
lbajardsilogic@21 200 //save type and filename for reading
lbajardsilogic@21 201 LoadedFile::FileType type = loadedFile->getFileType();
lbajardsilogic@21 202 QString filename = loadedFile->fileName();
lbajardsilogic@21 203 QString uri = loadedFile->getUri();
lbajardsilogic@21 204
lbajardsilogic@21 205 //delete de file and erase from the loaded file queue
lbajardsilogic@21 206 delete loadedFile;
lbajardsilogic@21 207 m_loadFile.erase(iter);
lbajardsilogic@21 208
lbajardsilogic@64 209 std::cerr << "fileLoaded() : file loaded, start to read file " << index << std::endl;
lbajardsilogic@64 210
lbajardsilogic@29 211 if ((type == LoadedFile::QUERY_RESULTS) || (type == LoadedFile::QUERY_CONFIG))
lbajardsilogic@21 212 {
lbajardsilogic@21 213 MainWindow::instance()->statusBar()->clearMessage();
lbajardsilogic@21 214 }
lbajardsilogic@21 215 else
lbajardsilogic@21 216 {
lbajardsilogic@21 217 QString name = filename.right(filename.length() - filename.lastIndexOf("/"));
lbajardsilogic@21 218 MainWindow::instance()->statusBar()->showMessage(tr("File Loaded : %1").arg(name), 3000);
lbajardsilogic@29 219 }
lbajardsilogic@21 220
lbajardsilogic@21 221 //read and load (in m_document) the file according to its type
lbajardsilogic@21 222 switch (type) {
lbajardsilogic@21 223
lbajardsilogic@21 224 case LoadedFile::AUDIO_SOURCE_INFO :
lbajardsilogic@21 225 {
lbajardsilogic@21 226 m_audioSourceInfoModel = new AudioSourceInfoModel();
lbajardsilogic@21 227 AudioSourceInfoReader audioSourceInfoReader(m_audioSourceInfoModel);
lbajardsilogic@21 228 read = audioSourceInfoReader.parse(filename);
lbajardsilogic@21 229 if (read)
lbajardsilogic@21 230 {
lbajardsilogic@21 231 m_document->setAudioSourceInfoModel(m_audioSourceInfoModel);
lbajardsilogic@21 232 loadRelatedModel();
lbajardsilogic@21 233 }
lbajardsilogic@21 234 break;
lbajardsilogic@21 235 }
lbajardsilogic@21 236 case LoadedFile::MODEL :
lbajardsilogic@21 237 {
lbajardsilogic@21 238 QString modelName = m_audioSourceInfoModel->getKey(uri);
lbajardsilogic@21 239
lbajardsilogic@21 240 read = addModelToLayers(modelName, filename);
lbajardsilogic@21 241
lbajardsilogic@21 242 break;
lbajardsilogic@21 243 }
lbajardsilogic@21 244 case LoadedFile::METADATA :
lbajardsilogic@21 245 {
lbajardsilogic@21 246 ModelReader modelReader(m_document,0, m_currentPane);
lbajardsilogic@21 247 read = modelReader.parse(filename);
lbajardsilogic@21 248
lbajardsilogic@21 249 break;
lbajardsilogic@21 250 }
lbajardsilogic@21 251 case LoadedFile::QUERY_CONFIG :
lbajardsilogic@21 252 {
lbajardsilogic@21 253 QueryConfigReader reader(m_queryModel);
lbajardsilogic@21 254 bool ok = reader.parse(filename);
lbajardsilogic@21 255
lbajardsilogic@21 256 if (ok)
lbajardsilogic@21 257 emit queryModelLoaded(m_queryModel);
lbajardsilogic@21 258
lbajardsilogic@21 259 read = ok;
lbajardsilogic@21 260 break;
lbajardsilogic@21 261 }
lbajardsilogic@21 262 case LoadedFile::QUERY_RESULTS :
lbajardsilogic@21 263 {
lbajardsilogic@21 264 QueryResultsWidget* resultsWidget = MainWindow::instance()->getQueryResultsWidget();
lbajardsilogic@21 265 resultsWidget->reset();
lbajardsilogic@21 266
lbajardsilogic@21 267 if (resultsWidget)
lbajardsilogic@21 268 {
lbajardsilogic@21 269 SparqlResultsReader reader(resultsWidget);
lbajardsilogic@21 270 read = reader.parse(filename);
lbajardsilogic@21 271 }
lbajardsilogic@21 272 break;
lbajardsilogic@21 273 }
lbajardsilogic@21 274 default: break;
lbajardsilogic@21 275 }
lbajardsilogic@21 276
lbajardsilogic@21 277 //if the file could not be read by any reader
lbajardsilogic@21 278 if (!read)
lbajardsilogic@21 279 {
lbajardsilogic@21 280 QFile file(filename);
lbajardsilogic@21 281 if (file.open(QFile::ReadOnly)) {
benoitrigolleau@88 282 QApplication::restoreOverrideCursor();
lbajardsilogic@21 283 QMessageBox::critical(MainWindow::instance(), tr("Download Error"), file.readAll());
lbajardsilogic@21 284 }
lbajardsilogic@21 285 }
lbajardsilogic@64 286 else {
lbajardsilogic@64 287 std::cerr << "fileLoaded() : " << index << " all successful. " << std::endl;
lbajardsilogic@64 288 }
benoitrigolleau@88 289 QApplication::restoreOverrideCursor();
lbajardsilogic@21 290 }
lbajardsilogic@21 291
lbajardsilogic@21 292 void EasaierSessionManager::loadRelatedModel()
lbajardsilogic@21 293 {
lbajardsilogic@21 294 std::set<Layer *> layers = m_document->getLayers();
lbajardsilogic@21 295 std::set<Layer *>::iterator iter;
lbajardsilogic@21 296
lbajardsilogic@21 297 std::set<QString> loadedModel;
lbajardsilogic@21 298
lbajardsilogic@21 299 for (iter=layers.begin(); iter != layers.end(); iter++)
lbajardsilogic@21 300 {
lbajardsilogic@21 301 Layer * layer = *iter;
lbajardsilogic@21 302
lbajardsilogic@21 303 QString modelName = layer->getModelName();
lbajardsilogic@21 304 if (modelName != "")
lbajardsilogic@21 305 {
lbajardsilogic@21 306 QString modelId = QString::number(layer->getModelId());
lbajardsilogic@90 307 //modelName.append(modelId);
lbajardsilogic@21 308
lbajardsilogic@21 309 } else if (layer->getLayerPresentationName() == "Waveform")
lbajardsilogic@21 310 {
lbajardsilogic@90 311 modelName = "http://purl.org/dc/elements/1.1/source";
lbajardsilogic@21 312 int modelId = 1;
lbajardsilogic@21 313 layer->setModelName(modelName);
lbajardsilogic@21 314 layer->setModelId(modelId);
lbajardsilogic@90 315 //modelName.append(QString::number(modelId));
lbajardsilogic@21 316 }
lbajardsilogic@21 317
lbajardsilogic@21 318 if (modelName != "")
lbajardsilogic@21 319 {
lbajardsilogic@21 320 QString uri = m_audioSourceInfoModel->getInfo(modelName);
lbajardsilogic@90 321
lbajardsilogic@92 322 QString filename = "http://" + m_httpClient->getHost() + uri;
lbajardsilogic@90 323
lbajardsilogic@21 324 std::set<QString>::iterator iterModel = m_modelLoaded.find(uri);
lbajardsilogic@21 325
lbajardsilogic@92 326 m_httpClient->setHost(m_httpClient->getHost());
lbajardsilogic@92 327
lbajardsilogic@21 328 if (iterModel == m_modelLoaded.end())
lbajardsilogic@21 329 {
lbajardsilogic@21 330 m_modelLoaded.insert(uri);
lbajardsilogic@92 331 loadFile(uri, filename, LoadedFile::MODEL);
lbajardsilogic@21 332 }
lbajardsilogic@21 333 }
lbajardsilogic@21 334 }
lbajardsilogic@21 335 }
lbajardsilogic@21 336
lbajardsilogic@21 337 bool EasaierSessionManager::addModelToLayers(const QString& name, const QString& filename)
lbajardsilogic@21 338 {
lbajardsilogic@21 339 std::set<Layer *> layers = m_document->getLayers();
lbajardsilogic@21 340 std::set<Layer *>::iterator iter;
lbajardsilogic@21 341
lbajardsilogic@21 342 std::map<QString, Model *> addedModel;
lbajardsilogic@21 343
lbajardsilogic@21 344 bool ok = false;
lbajardsilogic@21 345
lbajardsilogic@21 346 for (iter=layers.begin(); iter != layers.end(); iter++)
lbajardsilogic@21 347 {
lbajardsilogic@21 348 Layer * layer = *iter;
lbajardsilogic@21 349
lbajardsilogic@21 350 QString modelName = layer->getModelName();
lbajardsilogic@21 351 QString modelId = QString::number(layer->getModelId());
lbajardsilogic@21 352
lbajardsilogic@90 353 //modelName.append(modelId);
lbajardsilogic@21 354 modelName = modelName.toLower();
lbajardsilogic@21 355
lbajardsilogic@21 356 if (modelName == name)
lbajardsilogic@21 357 {
lbajardsilogic@21 358 std::map<QString, Model *>::iterator iterModel;
lbajardsilogic@21 359 iterModel = addedModel.find(modelName);
lbajardsilogic@21 360
lbajardsilogic@21 361 if (iterModel == addedModel.end())
lbajardsilogic@21 362 {
lbajardsilogic@85 363 QString extension = filename.right(filename.length()-filename.lastIndexOf(".")-1);
lbajardsilogic@85 364 if (AudioFileReaderFactory::isKnownExtensions(extension))
lbajardsilogic@21 365 {
lbajardsilogic@21 366 WaveFileModel *model = new WaveFileModel(filename);
lbajardsilogic@21 367 m_document->setMainModel(model);
lbajardsilogic@21 368 addedModel[modelName] = (Model* ) model;
lbajardsilogic@21 369 ok = true;
lbajardsilogic@21 370 } else
lbajardsilogic@21 371 {
lbajardsilogic@21 372 ModelReader modelReader(m_document, layer);
lbajardsilogic@21 373 ok = modelReader.parse(filename);
lbajardsilogic@21 374 }
lbajardsilogic@21 375 }
lbajardsilogic@21 376 else
lbajardsilogic@21 377 {
lbajardsilogic@21 378 Model* model = iterModel->second;
lbajardsilogic@21 379 m_document->addImportedModel(model);
lbajardsilogic@21 380 m_document->setModel(layer, model);
lbajardsilogic@21 381 }
lbajardsilogic@21 382 }
lbajardsilogic@21 383 }
lbajardsilogic@21 384
lbajardsilogic@21 385 return ok;
lbajardsilogic@21 386 }
lbajardsilogic@21 387
lbajardsilogic@21 388 void EasaierSessionManager::importMetadata(const QString& filename, Pane* pane)
lbajardsilogic@21 389 {
lbajardsilogic@90 390 QString file = "http://" + m_httpClient->getHost() + filename;
lbajardsilogic@90 391
lbajardsilogic@92 392 m_httpClient->setHost(m_httpClient->getHost());
lbajardsilogic@92 393
lbajardsilogic@92 394 loadFile(filename, file, LoadedFile::METADATA);
lbajardsilogic@90 395
lbajardsilogic@21 396 m_currentPane = pane;
lbajardsilogic@21 397 }
lbajardsilogic@21 398
lbajardsilogic@21 399 void EasaierSessionManager::queryDatabase(const QString& themeName)
lbajardsilogic@21 400 {
lbajardsilogic@21 401
benoitrigolleau@81 402 QueryThemeModel *themeModel = (m_queryModel->getThemes()).find(themeName)->second;
benoitrigolleau@81 403 QString params = "";
benoitrigolleau@81 404 if(themeModel!=0){
benoitrigolleau@81 405 PropertyContainer::PropertyList propertyList = themeModel->getProperties();
benoitrigolleau@81 406 for(int i=0; i<propertyList.size();i++){
benoitrigolleau@81 407 params+= "&"+propertyList[i] + "="+themeModel->getPropertyValue(propertyList[i]);
benoitrigolleau@81 408 }
benoitrigolleau@81 409 }
lbajardsilogic@86 410
lbajardsilogic@92 411 QString query = "/easaier/servlet/MOQueryServlet?theme="+themeName+""+params;
lbajardsilogic@92 412 QString filename = "http://"+ m_httpClient->getHost() + ":" + "9876" + "/easaier/servlet/"+themeName;
lbajardsilogic@92 413
lbajardsilogic@92 414 m_httpClient->setHost(m_httpClient->getHost(), 9876);
benoitrigolleau@88 415
benoitrigolleau@88 416 QApplication::setOverrideCursor( Qt::WaitCursor );
lbajardsilogic@90 417 loadFile(query, filename, LoadedFile::QUERY_RESULTS);
lbajardsilogic@90 418
lbajardsilogic@21 419 }