diff sv/main/EasaierSessionManager.cpp @ 21:ac5491829e61

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