diff -r 885c2596c964 -r 5d007b20cfd0 qtecomplugins/xqplugins/src/xqpluginloader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtecomplugins/xqplugins/src/xqpluginloader.cpp Tue Aug 31 16:02:37 2010 +0300 @@ -0,0 +1,172 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License as published by +* the Free Software Foundation, version 2.1 of the License. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, +* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/". +* +* Description: This class implements an extended wrapper for the ECOM framework. +* +*/ + +#include "xqpluginloader.h" +#include "xqpluginloaderprivate.h" + +#include +#include "qdebug.h" + +/*! + Constructs plugin loader with the given parent. + @param parent - address of class instance parent +*/ +XQPluginLoader::XQPluginLoader(QObject* parent) +: +QObject(parent), +d(0), +did_load( false ) +{ +} + +/*! + Constructs plugin loader with the given parent and plugin implementation UID. + @param uid - UID of plugin that should be loaded + @param parent - address of class instance parent + */ +XQPluginLoader::XQPluginLoader(int requestedUid, QObject* parent) +: +QObject(parent), +d(XQPluginLoaderPrivate::findOrCreate(requestedUid)), +did_load( false ) +{ +} + +/*! + Destroys plugin loader. Unless unload() was called explicitly, plugins still stays in memory. +*/ +XQPluginLoader::~XQPluginLoader() +{ + if(d) { + d->release(); + } +} + +/*! + List available plugins which implement requested interface. Plugins are resolved using interface name. + + @param interfaceName - requested interface name + @param impls - destination list where resolved plugins info will be stored + @return true on success, false on any error +*/ +bool XQPluginLoader::listImplementations( + const QString &interfaceName, + QList< XQPluginInfo > &impls) +{ + RImplInfoPtrArray infoArr; + TRAPD( errCode, XQPluginLoaderPrivate::listImplementationsL( infoArr, interfaceName, impls ) ); + infoArr.ResetAndDestroy(); + return ( KErrNone == errCode ); +} + +/*! + Returns UID of requested plugin. + */ +int XQPluginLoader::uid()const +{ + return ( d ? d->uid : KNullUid.iUid ); +} + +/*! + Return pointer to plugin root-component instance + @return instance address on success, 0 otherwise + */ +QObject* XQPluginLoader::instance() +{ + if (!load()) + return 0; +#ifndef Q_OS_SYMBIAN + if (d->instance) + return d->instance(); + else + return 0; +#else + return d->instance(); +#endif + +} + +/*! + Return information if plugin have been loaded + @return true if plugin have been loaded, false otherwise + */ +bool XQPluginLoader::isLoaded() const +{ + return d && d->pHnd +#ifndef Q_OS_SYMBIAN + && d->instance; +#else + ; +#endif +} + +/*! + Load requested plugin. + @return true on success, false otherwise + */ +bool XQPluginLoader::load() +{ + if (!d) + return false; + if (did_load) + return d->pHnd; + did_load = true; + return d->loadPlugin(); +} + +/*! + Unloads the plugin and returns true if plugin could be unloaded. All plugins are unloaded at aplication exit + so calling this method is not mandatory. + Actual unloading will succed only when all instances of given plugin loaders calls unload. + @return true on success, false otherwise + */ +bool XQPluginLoader::unload() +{ + if (did_load) { + did_load = false; + return d->unload(); + } + if (d) // Ouch + d->errorString = tr("The plugin was not loaded."); + return false; +} + +/*! + Setter for UID of plugin. It is the same UID that may be specified in constructor. +*/ +void XQPluginLoader::setUid ( int uid ) +{ + if (d) { + d->release(); + d = 0; + did_load = false; + } + d = XQPluginLoaderPrivate::findOrCreate( uid ); +} + +/*! + Return string.with description of last error that occured. + @return error description +*/ +QString XQPluginLoader::errorString () const +{ + return (!d || d->errorString.isEmpty()) ? tr("Unknown error") : d->errorString; +}