emailservices/nmclientapi/src/nmapidatapluginfactory.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 14:51:52 +0300
changeset 18 578830873419
child 23 2dc6caa42ec3
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
 * 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 "nmapidataplugininterface.h"
#include "nmapidatapluginfactory.h"
// Qt
#include <QList>
#include <QPluginLoader>
#include <QDir>
#include <QApplication>
#include <QLocale>

// nmailbase
#include "nmcommon.h"
#include "nmmailbox.h"
#include "../../../inc/nmmessageenvelope.h"
#include "nmmessage.h"
#include "nmmessagepart.h"
#include "nmfolder.h"

/*!
 \class NmDataPluginFactory
 \brief The NmDataPluginFactory class creates NmDataPlugin instance.

 */
NmDataPluginFactory *NmDataPluginFactory::mInstance = NULL;
int NmDataPluginFactory::mReferenceCount = 0;
QList<QObject*> *NmDataPluginFactory::mPluginArray = NULL;
QList<QPluginLoader*> NmDataPluginFactory::mPluginLoaderArray = QList<QPluginLoader*> ();
const int INTERFACEPLUGININDEX = 0;

/*!

 */
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<NmDataPluginInterface*> (plugin);
    }
    return pluginInterface;
}

/*!

 */
NmDataPluginInterface *NmDataPluginFactory::interfaceInstance(NmId mailboxId)
{
    return interfaceInstance(pluginInstance(mailboxId));
}

/*!

 */
QObject *NmDataPluginFactory::pluginInstance(NmId mailboxId)
{
    Q_UNUSED(mailboxId);
    return pluginInstances()->at(INTERFACEPLUGININDEX);
}

/*!

 */
QList<QObject*> *NmDataPluginFactory::pluginInstances()
{
    //if plugins have not been already created, do it now.
    if (!mPluginArray) {
        mPluginArray = new QList<QObject*> ();
    }
    if (mPluginArray->count() == 0) {
#ifdef Q_OS_SYMBIAN

        const QString KPluginDirectory = "c:\\resource\\plugins";
        QDir pluginDir = QDir(KPluginDirectory);
        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;
}