diff -r e7aa27f58ae1 -r 578830873419 emailuis/nmailuiengine/src/nmdatapluginfactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/nmailuiengine/src/nmdatapluginfactory.cpp Fri Apr 16 14:51:52 2010 +0300 @@ -0,0 +1,197 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include "nmuiengineheaders.h" + + +/*! + \class NmDataPluginFactory + \brief The NmDataPluginFactory class creates NmDataPlugin instance. + +*/ +NmDataPluginFactory *NmDataPluginFactory::mInstance; +int NmDataPluginFactory::mReferenceCount; +QList *NmDataPluginFactory::mPluginArray; +QList NmDataPluginFactory::mPluginLoaderArray; + +static const quint32 TESTPLUGINID = 0x20026764; +static const int TESTPLUGININDEX = 0; +static const int INTERFACEPLUGININDEX = 1; + + +/*! + + */ +NmDataPluginFactory::NmDataPluginFactory() +{ + +} + +/*! + + */ +NmDataPluginFactory::~NmDataPluginFactory() +{ + if (mPluginArray) { + qDeleteAll(mPluginArray->begin(), mPluginArray->end()); + mPluginArray->clear(); + delete mPluginArray; + mPluginArray = NULL; + } + + qDeleteAll(mPluginLoaderArray.constBegin(), mPluginLoaderArray.constEnd()); + mPluginLoaderArray.clear(); +} + +/*! + + */ +NmDataPluginFactory *NmDataPluginFactory::instance() +{ + if (!mInstance) { + mInstance = new NmDataPluginFactory(); + } + mReferenceCount++; + return mInstance; +} + +/*! + + */ +void NmDataPluginFactory::releaseInstance(NmDataPluginFactory *&instance) + { + //can't have passed out instances if we don't have any + if (mInstance) { + if (instance == mInstance) { + instance = NULL; + mReferenceCount--; + } + if (0 >= mReferenceCount) { + delete mInstance; + mInstance = NULL; + } + } + } + +/*! + + */ +NmDataPluginInterface *NmDataPluginFactory::interfaceInstance(QObject *plugin) +{ + NmDataPluginInterface *pluginInterface = NULL; + if (plugin) { + pluginInterface= qobject_cast(plugin); + } + return pluginInterface; +} + +/*! + + */ +NmDataPluginInterface *NmDataPluginFactory::interfaceInstance(NmId mailboxId) +{ + return interfaceInstance(pluginInstance(mailboxId)); +} + +/*! + + */ +QObject *NmDataPluginFactory::pluginInstance(NmId mailboxId) +{ + QObject *value(NULL); + + quint64 tmp = mailboxId.id(); + quint32 pluginId = tmp >> 32; + if (pluginId == TESTPLUGINID || + pluginId == 0 +#ifdef USE_POPIMAP_TESTPLUGIN + || pluginId == POPTESTPLUGINID + || pluginId == IMAPTESTPLUGINID +#endif + ) { + //test plugin is always the first one + value = pluginInstances()->at(TESTPLUGININDEX); + } + else { + return pluginInstances()->at(INTERFACEPLUGININDEX); + } + + return value; +} + +/*! + + */ +QList *NmDataPluginFactory::pluginInstances() +{ + //if plugins have not been already created, do it now. + if (!mPluginArray) { + mPluginArray = new QList(); + } + if (mPluginArray->count() == 0) { + //first, create testPlugin +#ifdef Q_OS_SYMBIAN + const QString KTestPluginName = "nmtestplugin.qtplugin"; + const QString KPluginDirectory = "c:\\resource\\plugins"; + QDir pluginDir = QDir(KPluginDirectory); +#else + const QString KTestPluginName = "nmtestplugin.dll"; + QDir pluginDir = QDir(QApplication::applicationDirPath()); +#endif + QObject *testPlugin = loadPlugin(pluginDir, KTestPluginName); + + mPluginArray->append(testPlugin); + + //then framework data plugin +#ifdef Q_OS_SYMBIAN + const QString KFrameworkPluginName = "nmframeworkadapter.qtplugin"; + QObject *frameworkPlugin = loadPlugin(pluginDir, KFrameworkPluginName); + mPluginArray->append(frameworkPlugin); + +#endif + } + return mPluginArray; +} + +/*! + + */ +QObject *NmDataPluginFactory::loadPlugin( + const QDir &pluginDir, + const QString &pluginName ) +{ + /*! + This creates plugin entity. + */ + QPluginLoader *loader = new QPluginLoader(pluginDir.absoluteFilePath(pluginName)); + + QObject *pluginInstance = loader->instance(); + + if (pluginInstance) { + // Store QPluginLoader instances to keep plugins alive. + // If QPluginLoader instance for a plugin is deleted, then there + // is a risk that some component outside will load and unload + // plugin, which will lead into situation where plugin is deleted. + // This means that instance in mPluginArray will be invalid. + mPluginLoaderArray.append(loader); + } else { + // We don't have proper plugin instance, so we don't need it's loader. + delete loader; + loader = NULL; + } + return pluginInstance; +}