--- a/smf/smfservermodule/smfserver/pluginmgr/smfpluginmanager.cpp Fri May 21 15:40:57 2010 +0530
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1051 +0,0 @@
-/**
- * Copyright (c) 2010 Sasken Communication Technologies Ltd.
- * All rights reserved.
- * This component and the accompanying materials are made available
- * under the terms of the "Eclipse Public License v1.0"
- * which accompanies this distribution, and is available
- * at the URL "http://www.eclipse.org/legal/epl-v10.html"
- *
- * Initial Contributors:
- * Chandradeep Gandhi, Sasken Communication Technologies Ltd - Initial contribution
- *
- * Contributors:
- * Manasij Roy, Nalina Hariharan
- *
- * Description:
- * The Plugin Manager class manages the loading and unloading of plug-ins
- *
- */
-
-#include <QDir>
-#include <QLibraryInfo>
-#include <QFileSystemWatcher>
-#include <QPluginLoader>
-#include <QList>
-#include <smfpluginbase.h>
-#include <smfpluginutil.h>
-#include <smfprovider.h>
-
-#include "smfpluginmanager.h"
-#include "smfpluginmanagerutil.h"
-#include "smftransportmanagerutil.h"
-
-// Static data initialisation
-SmfPluginManager* SmfPluginManager::m_myInstance = NULL;
-
-
-/**
- * Method to get the instance of SmfPluginManager class
- * @param aServer The Smf server instance
- * @return The instance of SmfPluginManager class
- */
-SmfPluginManager* SmfPluginManager::getInstance ( SmfServer *aServer)
- {
- if(NULL == m_myInstance)
- m_myInstance = new SmfPluginManager(aServer);
- return m_myInstance;
- }
-
-
-/**
- * Constructor with default argument
- * @param aServer The Smf server instance
- */
-SmfPluginManager::SmfPluginManager ( SmfServer *aServer )
- {
- // Save the server instance
- m_server = aServer;
-
- m_server->writeLog("Inside SmfPluginManager::SmfPluginManager()");
-
- // initialize the file watcher to monitor plugin addition/upgradation/removal
- initializeFileWatcher ( );
-
- // create a database to store the folder structure of the path "c://resource//qt//plugins"
- initializeSmfPluginDataBase ( );
-
- // create teh Plugin Manager utility class instance
- m_util = new SmfPluginManagerUtil(this);
-
- // Get handle to the Transport MAnager utility instance
- m_transMngrUtil = SmfTransportManagerUtil::getInstance();
- }
-
-
-/**
- * Destructor
- */
-SmfPluginManager::~SmfPluginManager ( )
- {
- m_server->writeLog("Inside SmfPluginManager::~SmfPluginManager()");
- if(m_fileWatcher)
- delete m_fileWatcher;
-
- if(m_tempStruct)
- delete m_tempStruct;
-
- if(m_waitingPluginHash.count() > 0)
- {
- foreach(SmfWaitingPluginInfoStruc *str, m_waitingPluginHash.values())
- delete str;
- }
-
- if(m_util)
- delete m_util;
-
- if(m_pluginDataBase.isOpen())
- {
- m_pluginDataBase.close();
- m_pluginDataBase.removeDatabase("SmfPluginsInfoDatabase");
- }
-
- // unload all loaded plugins
- unload(m_pluginLoaderHash.keys());
-
- if(m_myInstance)
- delete m_myInstance;
- }
-
-
-/**
- * Method called by Smf server to create a web query.
- * Plugin Manager calls the appropriate web query creation method
- * using the aOperation and aInputData parameters. Once the web request
- * is ready, it calls the appropriate methods exposed by the Transport
- * Manager to send the network request.
- * @param aSessionID The session ID provided by Smf Server
- * @param aPluginID The plugin ID that need to perform this operation
- * @param aOperation The type of operation to be performed
- * @param aInputData The data required to create the web query
- * @return SmfPluginManagerResult The result of the operation
- * @see smfglobal.h
- */
-SmfPluginManagerResult SmfPluginManager::createRequest ( const quint32& aSessionID,
- const QString& aPluginID,
- const SmfRequestTypeID& aOperation,
- QByteArray& aInputData )
- {
- m_server->writeLog("Inside SmfPluginManager::createRequest()");
-
- SmfPluginManagerResult result = SmfPluginUnknownError;
-
- // Load the plugin
- QObject *plugin = load(aPluginID, result);
-
- // Check if plugin is loaded
- if(plugin && (SmfPluginLoaded == result))
- {
- m_server->writeLog("Plugin loaded");
- SmfPluginBase* instance = qobject_cast<SmfPluginBase *>(plugin);
-
- if(instance)
- {
- // Get the registration token of the plugin
- QString regToken = instance->getProviderInfo()->smfRegistrationId();
- QList<QUrl> urlList;
- SmfPluginRequestData reqData;
-
- // check if the plugin is authorised (with CSM)
- if( authorisePlugin(regToken, urlList ))
- {
- m_server->writeLog("Plugin authorised");
-
- // call the utility method to create plugin specific request
- m_util->createRequest(plugin, aOperation, aInputData, reqData, result);
-
- // If the request is created successfully, call the TM method to send the request
- if( SmfPluginRequestCreated == result )
- {
- m_server->writeLog("Plugin request creation successful");
- m_tempStruct = new SmfWaitingPluginInfoStruc();
- m_tempStruct->iSessionID = aSessionID;
- m_tempStruct->iPluginId = aPluginID;
- m_tempStruct->iInstance = instance;
- m_tempStruct->iOperation = aOperation;
- m_tempStruct->iInputData = aInputData;
- m_tempStruct->iUrlList = urlList;
-
- // send the request
- sendRequest ( reqData, result, urlList );
- }
- }
-
- else
- {
- // plugin not authorised, so unload
- m_server->writeLog("Plugin not authorised!!!");
- unload(instance);
- result = SmfPluginNotAuthorised;
- }
- }
- else
- {
- // plugin instance cannot be casted, so unload
- m_server->writeLog("Plugin instance cannot be casted to SmfPluginBase*!!!");
- unload(instance);
- result = SmfPluginLoadError;
- }
- }
-
- else
- {
- // plugin not loaded
- m_server->writeLog("Plugin not loaded!!!");
- result = SmfPluginLoadError;
- }
-
- return result;
- }
-
-
-/**
- * Method called by Transport Manager when network response is available
- * @param aTransportResult The result of Transport Operation
- * @param aReply The QNetworkReply instance that requested
- * this transaction
- * @param aResponse The network response data, may be NULL for error
- */
-void SmfPluginManager::responseAvailable (
- const SmfTransportResult &aTransportResult,
- QNetworkReply *aReply,
- QByteArray *aResponse )
- {
- m_server->writeLog("Inside SmfPluginManager::responseAvailable()");
-
- // For request success or For request cancellation
- if((SmfTransportOpNoError == aTransportResult) ||
- (SmfTransportOpOperationCanceledError == aTransportResult))
- {
- m_server->writeLog("no transport error/ cancellation");
-
- // get the details of the plugin which made this request
- SmfWaitingPluginInfoStruc* info = m_waitingPluginHash.value(aReply);
- quint32 sessionId = m_waitingPluginHash.value(aReply)->iSessionID;
- QString pluginId = m_waitingPluginHash.value(aReply)->iPluginId;
- SmfRequestTypeID operation = m_waitingPluginHash.value(aReply)->iOperation;
- QByteArray inputData = m_waitingPluginHash.value(aReply)->iInputData;
-
- QVariant result;
- SmfPluginRetType retType = SmfRequestError;
- SmfResultPage pageResult;
-
- m_server->writeLog("Before m_util->responseAvailable");
-
- // call the utility method to send response to appropriate plugins
- SmfPluginManagerResult retValue = m_util->responseAvailable( info->iInstance, operation,
- aTransportResult, aResponse, &result, retType, pageResult );
-
- // remove the plugin from the waiting list
- delete m_waitingPluginHash.value(aReply);
- m_waitingPluginHash.remove(aReply);
-
- QByteArray arr;
- QDataStream stream(&arr, QIODevice::ReadWrite);
- if( SmfPluginResponseParsed == retValue )
- {
- m_server->writeLog("Parsing successful");
-
- // serialize the response to suitable class and pass the data to server
- serializeResult(operation, &result, stream);
-
- ////TODO:- send error in enums-by manasij
- // Send the response data to the server
- m_server->resultsAvailable(sessionId, &arr, SmfNoError);
- }
-
- // Send the request again
- else if( SmfPluginSendRequestAgain == retValue )
- {
- m_server->writeLog("Send request again");
-
- // create the request again (with same paramaters)
- retValue = createRequest( sessionId, pluginId, operation, inputData );
- }
-
- // Error
- else
- {
- m_server->writeLog("Parsing failed!!");
-
- // Error in parsing, sent to server
- m_server->resultsAvailable(sessionId, &arr, SmfpluginResponseParseFailure);
- }
-
- // delete aReply later, when event loop is re-entered
- aReply->deleteLater();
- }
-
- // Any other error
- else
- {
- m_server->writeLog("Error in SmfPluginManager::responseAvailable, Transport failure code : ");
- QString err = QString::number(aTransportResult);
- m_server->writeLog(err);
-
- //Added by manasij, send all kind of errors to the server
- //TODO:- to be refined by PM owner
- quint32 sessionId = m_waitingPluginHash.value(aReply)->iSessionID;
- QByteArray arr;
- m_server->resultsAvailable(sessionId, &arr, SmftransportInitNetworkNotAvailable);
- }
- }
-
-
-/**
- * Method to cancel the service request
- * @param aPluginId The plugin whose current operation
- * is to be cancelled
- */
-bool SmfPluginManager::cancelRequest ( const QString& aPluginId )
- {
- bool retValue = false;
- m_server->writeLog("Inside SmfPluginManager::cancelRequest()");
-
- // Get the plugin for which cancel is requested
- foreach(SmfWaitingPluginInfoStruc* iPluginInfo, m_waitingPluginHash.values())
- {
- if( 0 == iPluginInfo->iPluginId.compare(aPluginId))
- {
- m_server->writeLog("Plugin to be cancelled found in the waiting list");
-
- // Notify Transport Manager
- m_transMngrUtil->cancelRequest(m_waitingPluginHash.key(iPluginInfo));
-
- // Notify the plugin that the request has been cancelled
- SmfPluginRetType retType;
- SmfResultPage pageResult;
- SmfPluginError ret = iPluginInfo->iInstance->responseAvailable( SmfTransportOpCancelled,
- NULL, NULL, retType, pageResult );
-
- // Remove that plugin from the waiting list
- delete (m_waitingPluginHash.value(m_waitingPluginHash.key(iPluginInfo)));
- m_waitingPluginHash.remove(m_waitingPluginHash.key(iPluginInfo));
-
- if(SmfPluginErrNone == ret)
- retValue = true;
- }
- //else , cancel requested for a plugin which is not loaded, do nothing
- else
- {
- m_server->writeLog("Plugin to be cancelled not found in the waiting list!!! - do nothing");
- retValue = false;
- }
- }
- return retValue;
- }
-
-
-/**
- * Method called to initialize the file watcher watching the file
- * system for adition/upgradation/removal of plugins
- */
-void SmfPluginManager::initializeFileWatcher ( )
- {
- m_server->writeLog("Inside SmfPluginManager::initializeFileWatcher()");
-
- // Create the file watcher for the plugins in /Smf folder of the Qt plugin directory
- m_fileWatcher = new QFileSystemWatcher(this);
-
- // Get the directory having the Qt plugin stubs
- QDir dir(QLibraryInfo::location(QLibraryInfo::PluginsPath));
-
- // If Smf folder exists
- if(dir.cd("smf/plugin"))
- {
- // Add each service provider folders to the file watcher
- foreach(QString folder, dir.entryList(QDir::AllDirs))
- {
- dir.cd(folder);
- m_fileWatcher->addPath(dir.absolutePath());
- dir.cdUp();
- }
- }
- else
- m_fileWatcher->addPath(dir.absolutePath());
- }
-
-
-
-/**
- * Method called to initialize the database holding the plugin
- * directory sructure information. This is called only once when
- * the Plugin Manager is instantiated.
- * This method creates and updates m_pluginIdPathHash member
- * of this class
- */
-bool SmfPluginManager::initializeSmfPluginDataBase ( )
- {
- m_server->writeLog("Inside SmfPluginManager::initializeSmfPluginDataBase()");
-
- // Find QSQLite driver and create a connection to database
- m_pluginDataBase.removeDatabase("SmfPluginsInfoDatabase");
- m_pluginDataBase = QSqlDatabase::addDatabase("QSQLITE");
- m_pluginDataBase.setDatabaseName("SmfPluginsInfoDatabase");
-
- // Open the database
- bool opened = m_pluginDataBase.open();
- if(!opened)
- return false;
-
- m_server->writeLog("Database opened");
-
- // Create a query to create the DB table for Plugin Manager (if it doesn't exists)
- QSqlQuery query;
- bool tableCreated = false;
-
- tableCreated = query.exec("CREATE TABLE IF NOT EXISTS pluginDetails ("
- "pluginId TEXT PRIMARY KEY, interfaceName TEXT, serviceProvider TEXT, "
- "description TEXT, serviceUrl TEXT, authAppId TEXT)");
-
- // Error - table not created, Plugin Manager might not work properly
- if(!tableCreated)
- {
- m_server->writeLog("Table not created, error = "+query.lastError().text());
- return false;
- }
-
- m_server->writeLog("Table created");
-
- // Get the directory having the Qt plugin stubs
- QDir dir(QLibraryInfo::location(QLibraryInfo::PluginsPath));
-
- // If Smf folder exists
- if(dir.cd("smf/plugin"))
- {
- m_server->writeLog("Smf/plugin folder exists");
- // Get each interface folders names
- foreach(QString intfName, dir.entryList(QDir::AllDirs))
- {
- dir.cd(intfName);
- m_server->writeLog("Interface name : "+dir.dirName());
-
- // Get each plugin in this folder
- foreach(QString pluginName, dir.entryList(QDir::Files))
- {
- m_server->writeLog("plugins for this Interface : "+pluginName);
-
- // load this plugin
- QPluginLoader pluginLoader(dir.absoluteFilePath(pluginName));
- QObject *instance = pluginLoader.instance();
- if (instance)
- {
- m_server->writeLog("instance found");
- SmfPluginBase* plugin = qobject_cast<SmfPluginBase *>(instance);
- if (plugin)
- {
- m_server->writeLog("SmfPluginBase found");
- plugin->initialize(SmfPluginUtil::getInstance());
-
- // get the plugin id
- QString id = plugin->getProviderInfo()->pluginId();
-
- // get the interface implemented by the plugin
- QString intfImplemented = dir.dirName();
- intfImplemented.prepend("org.symbian.smf.plugin.");
- m_server->writeLog("intfImplemented=");
- m_server->writeLog(intfImplemented);
-
- // get the service provider
- QString serProv = plugin->getProviderInfo()->serviceName();
-
- //get the description
- QString desc = plugin->getProviderInfo()->description();
-
- // get the service URL
- QString servURL = plugin->getProviderInfo()->serviceUrl().toString();
-
- // get the authentication application id
- QString str;
- QStringList list;
- QString authAppId = plugin->getProviderInfo()->authenticationApp(
- str, list, QIODevice::ReadWrite);
-
- // Update m_pluginIdPathHash
- m_pluginIdPathHash.insert(id, dir.absoluteFilePath(pluginName));
-
- QSqlQuery rowInsertQuery;
-
- // insert into database
- bool rowInserted = rowInsertQuery.exec(QString("INSERT INTO pluginDetails VALUES ('%1', "
- "'%2', '%3', '%4', '%5', '%6')").arg(id).arg(intfImplemented).arg(serProv)
- .arg(desc).arg(servURL).arg(authAppId));
-
- if(rowInserted)
- m_server->writeLog("This Plugin's information is added to database : "+id+""
- ", "+intfImplemented+", "+serProv);
- else
- m_server->writeLog("plugins data not written to database, error = "+query.lastError().text());
- }
- else
- {
- m_server->writeLog("Plugin could not be converted to SmfpluginBase* - returning");
-
- // Close the database
- m_pluginDataBase.close();
-
- return false;
- }
-
- pluginLoader.unload();
- }
- else
- {
- m_server->writeLog("Plugin could not be loaded - returning");
-
- // Close the database
- m_pluginDataBase.close();
-
- return false;
- }
- }
- dir.cdUp();
- }
- }
- else
- m_server->writeLog("No Smf plugins installed!!!");
-
- // Close the database
- m_pluginDataBase.close();
-
- return true;
- }
-
-
-
-/**
- * Method to load a plugin using its Plugin Id.
- * @param aPluginId The unique ID of the plugin
- * @param aLoadResult [out] Output paramater indicating the result
- * of the loading
- * @return The instance of the loaded plugin if loaded, else NULL
- */
-QObject* SmfPluginManager::load ( const QString &aPluginId,
- SmfPluginManagerResult &aLoadResult)
- {
- m_server->writeLog("Inside SmfPluginManager::load()");
-
- QPluginLoader *pluginLoader;
-
- // Find the plugin Path
- QString pluginPath = m_pluginIdPathHash.value(aPluginId);
-
- if(!pluginPath.isEmpty())
- {
- // create the plugin loader and load the plugin
- pluginLoader = new QPluginLoader(pluginPath);
- SmfPluginBase *plugin = qobject_cast<SmfPluginBase *>(pluginLoader->instance());
-
- // If the plugin is loaded
- if( pluginLoader->isLoaded() && plugin )
- {
- // Initialize the plugin
- plugin->initialize(SmfPluginUtil::getInstance());
-
- // update the plugin loader and the loaded plugin lists
- m_pluginLoaderHash.insertMulti(plugin, pluginLoader);
- aLoadResult = SmfPluginLoaded;
- m_server->writeLog("Plugin loaded");
- }
- else
- {
- m_server->writeLog("Plugin not loaded");
-
- // Plugin could not be loaded, error
- aLoadResult = SmfPluginNotLoaded;
- }
- }
- else
- {
- m_server->writeLog("Plugin not found");
-
- // plugin not found in hash
- aLoadResult = SmfPluginNotFound;
- }
-
- return pluginLoader->instance();
- }
-
-
-/**
- * Method to unload a loaded plugin. Returns true if success, else
- * returns false.
- * @param aPlugin The plugin instance to be unloaded
- * @return Returns true if success, else returns false
- */
-bool SmfPluginManager::unload ( SmfPluginBase *aPlugin )
- {
- m_server->writeLog("Inside SmfPluginManager::unload()");
-
- // Get all the loaders for this plugin
- QList<QPluginLoader*> loaderList = m_pluginLoaderHash.values(aPlugin);
- bool unloaded = false;
-
- foreach(QPluginLoader *loader, loaderList)
- {
- // for each loader unload the plugin
- unloaded = loader->unload();
-
- // delete the instance of the loader
- delete loader;
- loader = NULL;
- }
-
- // Remove the plugin and its associated loaders from the Hash
- m_pluginLoaderHash.remove(aPlugin);
- return unloaded;
- }
-
-
-/**
- * Method to unload the list of loaded plugins. Returns true if all are
- * success, else returns false if any one fails.
- * @param aPluginList The list of instances for all plugins that are
- * to be unloaded
- * @return Returns true if all are success, else returns false if any
- * one fails.
- */
-bool SmfPluginManager::unload ( const QList<SmfPluginBase *> &aPluginList)
- {
- m_server->writeLog("Inside SmfPluginManager::unload() - overloaded fn");
- //unload all the required plugins
- bool unloaded = true;
-
- foreach(SmfPluginBase *plugin, aPluginList)
- {
- // unload individual plugins in the list
- bool ret = unload(plugin);
-
- // indicate error if any one of the plugin failed to unload
- if(!ret)
- unloaded = ret;
- }
- return unloaded;
- }
-
-
-/**
- * Method that calls the Transport Manager Utility class method to
- * send the request created by the plugins over the network
- * @param aReqData The request data created by the plugin
- * @param aResult [out] The output parameter indicating the result
- * of this method
- * @param aUrlList The list of accessible Urls for this plugin
- * @see smfglobal.h
- */
-void SmfPluginManager::sendRequest ( SmfPluginRequestData &aReqData,
- SmfPluginManagerResult &aResult,
- const QList<QUrl> &aUrlList )
- {
- m_server->writeLog("Inside SmfPluginManager::sendRequest()");
-
- QNetworkReply* reply;
- bool sopCompliant = false;
-
- // Check the type of Http operation to be performed
- switch(aReqData.iHttpOperationType)
- {
- // Http HEAD
- case QNetworkAccessManager::HeadOperation:
- reply = m_transMngrUtil->head(aReqData.iNetworkRequest, aUrlList, sopCompliant);
- break;
-
- // Http GET
- case QNetworkAccessManager::GetOperation:
- reply = m_transMngrUtil->get(aReqData.iNetworkRequest, aUrlList, sopCompliant);
- break;
-
- // Http PUT
- case QNetworkAccessManager::PutOperation:
- reply = m_transMngrUtil->put(aReqData.iNetworkRequest, aReqData.iPostData->buffer(), aUrlList, sopCompliant);
- break;
-
- // Http POST
- case QNetworkAccessManager::PostOperation:
- reply = m_transMngrUtil->post(aReqData.iNetworkRequest, aReqData.iPostData->buffer(), aUrlList, sopCompliant);
- break;
-
- // Http DELETE
- case QNetworkAccessManager::DeleteOperation:
- reply = m_transMngrUtil->deleteResource(aReqData.iNetworkRequest, aUrlList, sopCompliant);
- break;
-
- default:
- aResult = SmfPluginUnknownService;
- return;
- }
-
- if( sopCompliant )
- {
- if( reply )
- {
- // SOP compliant, sending successful
- m_waitingPluginHash.insert(reply, m_tempStruct);
- m_tempStruct = NULL;
- aResult = SmfPluginNoError;
-
- m_server->writeLog("No error, request sent");
-
- }
- // reply is NULL, sending failed
- else
- {
- m_server->writeLog("QNEtrworkReply returned error - not sent");
- aResult = SmfPluginRequestSendingFailed;
- }
- }
-
- // SOP violation
- else
- {
- m_server->writeLog("SOP checking failed");
- aResult = SmfPluginSOPCheckFailed;
- }
- }
-
-
-/**
- * Method that checks if a plugin is authorised to make a request.
- * This method communicates with Credential and Settings Manager
- * through Smf server, giving the registration token and getting
- * the valid url list if available for this plugin.
- * @param aRegToken The registration token given by the plugin
- * @param aUrlList [out] The list of Urls that the plugin can send
- * request to (to be filled by CSM)
- * @return Returns true if plugin is authorised, else returns false.
- */
-bool SmfPluginManager::authorisePlugin( const QString &aRegToken,
- QList<QUrl> &aUrlList )
- {
- Q_UNUSED(aRegToken)
- m_server->writeLog("Inside SmfPluginManager::authorisePlugin()");
-
-#ifdef CSM_INTEGRATED
-// Get the valid URL list from CSM, giving the reg token
- if(m_server->authorisePlugin(aRegToken, aUrlList))
- return true;
- else
- return false;
-
-#else
-// CSM STUBBING - start
- QUrl url1 ("http://www.example.com");
- QUrl url2 ("http://api.facebook.com");
- QUrl url3 ("http://api.flickr.com");
-
- aUrlList.append(url1);
- aUrlList.append(url2);
- aUrlList.append(url3);
-
- return true;
-// CSM STUBBING - end
-#endif
-
- }
-
-
-/**
- * Method to serialize the result of parsing (which is done by the
- * plugins) to QByteArray to be sent to Smf server.
- * @param aOperation The type of operation to be performed
- * @param aResult The data to be serialized
- * @param aDataStream Stream to be written
- */
-void SmfPluginManager::serializeResult (
- const SmfRequestTypeID &aOperation,
- QVariant* aResult,
- QDataStream &aDataStream )
- {
- m_server->writeLog("Inside SmfPluginManager::serializeResult()");
-
- // Call the utlity class method to serialize the result
- m_util->serializeResult(aOperation, aResult, aDataStream);
- }
-
-
-/**
- * Method for the directoryChanged signal of QFileSystemWatcher.
- * This will update the iPluginHash member and also the Plugin
- * Information List.
- * @param aPath The path of the directory that has changed
- */
-void SmfPluginManager::directoryChanged ( const QString &aPath )
- {
- m_server->writeLog("Inside SmfPluginManager::directoryChanged()");
-
- // Create a QDir instance with the given path
- QDir dir(aPath);
- QString pluginId;
- QString oldpluginId;
- QString interfaceName;
- QString serviceProv;
- QString authAppId;
-
- // Get all the files in the directory at a specified path(sorted)
- QStringList newPlugins = dir.entryList(QDir::Files, QDir::Name);
- QStringList::const_iterator newListIterator = newPlugins.constBegin();
-
- // Get all plugins who were in this path, before this directory was changed
- QStringList availablePlugins = m_pluginIdPathHash.keys(aPath);
- availablePlugins.sort();
- QStringList::const_iterator oldListIterator = availablePlugins.constBegin();
-
- // Open the database
- bool opened = m_pluginDataBase.open();
- if(!opened)
- ;//return;
-
- // If plugin is changed
- if( newPlugins.count() == availablePlugins.count() )
- {
- // Check for equality
- while( newListIterator != newPlugins.constEnd() )
- {
- if( *newListIterator == *oldListIterator )
- {
- newListIterator++;
- oldListIterator++;
- }
- else
- break;
- }
- // replace *oldListIterator with *newListIterator
- QHash<QString, QString>::iterator i = m_pluginIdPathHash.find(*oldListIterator);
- m_pluginIdPathHash.insert(*newListIterator, i.value());
- m_pluginIdPathHash.remove(*oldListIterator);
-
- // Also update database with *newListIterator
- QSqlQuery updateQuery;
-
- bool updated = updateQuery.exec(QString("UPDATE pluginDetails SET pluginId = '%1' "
- "WHERE pluginId = '%2'").arg(*newListIterator).arg(*oldListIterator));
- if (!updated)
- m_server->writeLog("Database table not updated, error = "+updateQuery.lastError().text());
-
-
- // Get the new and old plugin Ids
- pluginId = *newListIterator;
- oldpluginId = *oldListIterator;
-
- // Load the plugin and get its service provider name
- SmfPluginManagerResult result;
- SmfPluginBase* instance = qobject_cast<SmfPluginBase *>(load(pluginId, result));
-
- if(instance && (SmfPluginLoaded == result))
- {
- instance->initialize(SmfPluginUtil::getInstance());
- serviceProv = instance->getProviderInfo()->serviceName();
- interfaceName = dir.dirName();
- }
-
- unload(instance);
- // Inform server that plugin has been changed
-#ifdef CSM_INTEGRATED
- //Remove after Server Integration
- m_server->pluginChanged(oldPluginId, newPluginId, interfaceName, serviceProv);
-#endif
- }
-
- // If plugin is added
- else if(newPlugins.count() > availablePlugins.count())
- {
- // Check for equality
- while( oldListIterator != availablePlugins.constEnd() )
- {
- if( *newListIterator == *oldListIterator )
- {
- newListIterator++;
- oldListIterator++;
- }
- else
- break;
- }
- // replace *oldListIterator with *newListIterator
- m_pluginIdPathHash.insert(*newListIterator, aPath);
-
- // Get the plugin Id
- pluginId = *newListIterator;
-
- // Load the plugin and get its service provider name
- SmfPluginManagerResult result;
- SmfPluginBase* instance = qobject_cast<SmfPluginBase *>(load(pluginId, result));
-
- if(instance && (SmfPluginLoaded == result))
- {
- instance->initialize(SmfPluginUtil::getInstance());
- serviceProv = instance->getProviderInfo()->serviceName();
- interfaceName = dir.dirName();
- interfaceName.prepend("org.symbian.smf.plugin.");
- QString prgm;
- QStringList list;
- authAppId = instance->getProviderInfo()->authenticationApp(prgm, list, QIODevice::ReadWrite);
- }
-
- unload(instance);
-
- // Also add to the database the value newListIterator and aPath
- QSqlQuery insertRowQuery;
- bool rowInserted = insertRowQuery.exec(QString("INSERT INTO pluginDetails VALUES "
- "('%1', '%2', '%3', '%4')").arg(pluginId).arg(interfaceName).arg(serviceProv).arg(authAppId));
-
- // Error
- if (!rowInserted)
- m_server->writeLog("Database table not inserted, error = "+insertRowQuery.lastError().text());
-
- // Inform server that plugin has been added
-#ifdef CSM_INTEGRATED
- //Remove after Server Integration
- m_server->pluginAdded(pluginId, interfaceName, serviceProv);
-#endif
- }
-
- // If plugin is removed
- else //for newPlugins.count() < availablePlugins.count()
- {
- // Check for equality
- while( newListIterator != newPlugins.constEnd() )
- {
- if( *newListIterator == *oldListIterator )
- {
- newListIterator++;
- oldListIterator++;
- }
- else
- break;
- }
- // remove *oldListIterator
- m_pluginIdPathHash.remove(*oldListIterator);
-
- // Also remove oldListIterator from the database
- QSqlQuery deleteRowQuery;
- bool rowDeleted = deleteRowQuery.exec(QString("DELETE FROM pluginDetails WHERE pluginId = '%1'")
- .arg(*oldListIterator));
-
- // Error
- if (!rowDeleted)
- m_server->writeLog("Database table row not deleted, error = "+deleteRowQuery.lastError().text());
-
- // Get the plugin Id
- pluginId = *oldListIterator;
-
- // Load the plugin and get its service provider name
- SmfPluginManagerResult result;
- SmfPluginBase* instance = qobject_cast<SmfPluginBase *>(load(pluginId, result));
-
- if(instance && (SmfPluginLoaded == result))
- {
- instance->initialize(SmfPluginUtil::getInstance());
- serviceProv = instance->getProviderInfo()->serviceName();
- interfaceName = dir.dirName();
- }
-
- unload(instance);
- // Inform server that plugin has removed
-#ifdef CSM_INTEGRATED
- //Remove after Server Integration
- m_server->pluginRemoved(pluginId, interfaceName, serviceProv);
-#endif
- }
- // Close the database
- m_pluginDataBase.close();
- }
-
-
-/**
- * Method to get the list of the SmfProvider for all the plugins that implement
- * the mentioned Interface
- * @param aInterface The interface for which list of plugins is required
- * @param aMap The map of pluginID and its corresponding SmfProvider
- */
-void SmfPluginManager::getPlugins(const QString& aInterface, QMap<QString,SmfProvider>& aMap)
- {
- m_server->writeLog("Inside SmfPluginManager::getPlugins()");
-
- // Open the database
- bool opened = m_pluginDataBase.open();
- if(!opened)
- {
- m_server->writeLog("Data base not opened, exiting getplugins()");
- return;
- }
-
- m_server->writeLog("Data base opened");
-
- // Query the database for all pluginIDs that implement the given interface
- QSqlQuery query(QString("SELECT pluginId, interfaceName, serviceProvider, description, "
- "serviceUrl FROM pluginDetails where interfaceName = '%1'").arg(aInterface));
-
- if (query.next())
- {
- m_server->writeLog("Query is success");
-
- SmfProvider prov;
-
- // get the pluginId
- QString pluginId = query.value(0).toString();
-
- // get the service type / interface name
- QStringList servicetypes;
- servicetypes.insert(0, query.value(1).toString());
- prov.serviceTypes(servicetypes);
-
- // Get the serv provider
- QString servName = query.value(2).toString();
- prov.serviceName(servName);
-
- // Get the description
- QString desc = query.value(3).toString();
- prov.description(desc);
-
- // Get the service URL
- QUrl url(query.value(4).toString());
- prov.serviceUrl(url);
-
- aMap.insert(pluginId, prov);
- }
- else
- m_server->writeLog("Data base query->next() returned false, error = "+query.lastError().text());
-
- // Close the database
- m_pluginDataBase.close();
- }
-
-
-/**
- * Method to get the pluginID for the mentioned interface and service provider
- * @param aInterface The interface implemented by the plugin
- * @param aProv The plugin's service provider
- * @param aPluginId The required pluginID
- */
-void SmfPluginManager::getPluginId(const QString& aInterface, const SmfProvider& aProv, QString& aPluginId)
- {
- m_server->writeLog("SmfPluginManager::getPluginId");
-
- // Open the database
- bool opened = m_pluginDataBase.open();
- if(!opened)
- {
- m_server->writeLog("Data base not opened, exiting");
- return;
- }
-
- m_server->writeLog("Data base opened");
-
- // Query the database for a pluginID with given interface name and service provider
- QSqlQuery query(QString("SELECT pluginId FROM pluginDetails where interfaceName = '%1' AND "
- "serviceProvider = '%2'").arg(aInterface).arg(aProv.serviceName()));
-
- if (query.next())
- {
- m_server->writeLog("Query is success");
-
- // get the pluginId
- aPluginId = query.value(0).toString();
- }
- else
- m_server->writeLog("Data base query->next() returned false, error = "+query.lastError().text());
-
- m_server->writeLog("returned pluginID = "+aPluginId);
-
- // Close the database
- m_pluginDataBase.close();
- }