emailservices/nmclientapi/src/nmapidatapluginfactory.cpp
changeset 23 2dc6caa42ec3
parent 18 578830873419
child 30 759dc5235cdb
equal deleted inserted replaced
20:ecc8def7944a 23:2dc6caa42ec3
    13  *
    13  *
    14  * Description:
    14  * Description:
    15  *
    15  *
    16  */
    16  */
    17 
    17 
    18 #include "nmapidataplugininterface.h"
    18 #include "nmdataplugininterface.h"
    19 #include "nmapidatapluginfactory.h"
    19 #include "nmapidatapluginfactory.h"
       
    20 
    20 // Qt
    21 // Qt
    21 #include <QList>
       
    22 #include <QPluginLoader>
    22 #include <QPluginLoader>
    23 #include <QDir>
    23 #include <QDir>
    24 #include <QApplication>
    24 #include <QApplication>
    25 #include <QLocale>
    25 #include <QLocale>
       
    26 #include <QObject>
    26 
    27 
    27 // nmailbase
    28 // nmailbase
    28 #include "nmcommon.h"
    29 #include "nmcommon.h"
    29 #include "nmmailbox.h"
    30 #include "nmmailbox.h"
    30 #include "../../../inc/nmmessageenvelope.h"
    31 #include "nmmessageenvelope.h"
    31 #include "nmmessage.h"
    32 #include "nmmessage.h"
    32 #include "nmmessagepart.h"
    33 #include "nmmessagepart.h"
    33 #include "nmfolder.h"
    34 #include "nmfolder.h"
    34 
    35 
    35 /*!
    36 /*!
    36  \class NmDataPluginFactory
    37  \class NmApiDataPluginFactory
    37  \brief The NmDataPluginFactory class creates NmDataPlugin instance.
    38  \brief The NmApiDataPluginFactory class creates NmDataPlugin instance.
    38 
    39 
    39  */
    40  */
    40 NmDataPluginFactory *NmDataPluginFactory::mInstance = NULL;
    41 NmApiDataPluginFactory *NmApiDataPluginFactory::mInstance = NULL;
    41 int NmDataPluginFactory::mReferenceCount = 0;
    42 int NmApiDataPluginFactory::mReferenceCount = 0;
    42 QList<QObject*> *NmDataPluginFactory::mPluginArray = NULL;
    43 QObject *NmApiDataPluginFactory::mPlugin = NULL;
    43 QList<QPluginLoader*> NmDataPluginFactory::mPluginLoaderArray = QList<QPluginLoader*> ();
    44 QPluginLoader *NmApiDataPluginFactory::mPluginLoader = NULL;
    44 const int INTERFACEPLUGININDEX = 0;
       
    45 
    45 
    46 /*!
    46 /*!
    47 
    47 
    48  */
    48  */
    49 NmDataPluginFactory::NmDataPluginFactory()
    49 NmApiDataPluginFactory::NmApiDataPluginFactory()
    50 {
    50 {
    51 
    51 
    52 }
    52 }
    53 
    53 
    54 /*!
    54 /*!
    55 
    55 
    56  */
    56  */
    57 NmDataPluginFactory::~NmDataPluginFactory()
    57 NmApiDataPluginFactory::~NmApiDataPluginFactory()
    58 {
    58 {
    59     if (mPluginArray) {
    59     if (mPlugin) {
    60         qDeleteAll(mPluginArray->begin(), mPluginArray->end());
    60         delete mPlugin;
    61         mPluginArray->clear();
    61         mPlugin = NULL;
    62         delete mPluginArray;
       
    63         mPluginArray = NULL;
       
    64     }
    62     }
    65 
    63     
    66     qDeleteAll(mPluginLoaderArray.constBegin(), mPluginLoaderArray.constEnd());
    64     if(mPluginLoader){
    67     mPluginLoaderArray.clear();
    65         delete mPluginLoader;
       
    66         mPluginLoader = NULL;
       
    67     }
    68 }
    68 }
    69 
    69 
    70 /*!
    70 /*!
    71 
    71 
    72  */
    72  */
    73 NmDataPluginFactory *NmDataPluginFactory::instance()
    73 NmApiDataPluginFactory *NmApiDataPluginFactory::instance()
    74 {
    74 {
    75     if (!mInstance) {
    75     if (!mInstance) {
    76         mInstance = new NmDataPluginFactory();
    76         mInstance = new NmApiDataPluginFactory();
    77     }
    77     }
    78     mReferenceCount++;
    78     mReferenceCount++;
    79     return mInstance;
    79     return mInstance;
    80 }
    80 }
    81 
    81 
    82 /*!
    82 /*!
    83 
    83 
    84  */
    84  */
    85 void NmDataPluginFactory::releaseInstance(NmDataPluginFactory *&instance)
    85 void NmApiDataPluginFactory::releaseInstance(NmApiDataPluginFactory *&instance)
    86 {
    86 {
    87     //can't have passed out instances if we don't have any
    87     //can't have passed out instances if we don't have any
    88     if (mInstance) {
    88     if (mInstance) {
    89         if (instance == mInstance) {
    89         if (instance == mInstance) {
    90             instance = NULL;
    90             instance = NULL;
    95             mInstance = NULL;
    95             mInstance = NULL;
    96         }
    96         }
    97     }
    97     }
    98 }
    98 }
    99 
    99 
       
   100 
   100 /*!
   101 /*!
   101 
   102 
   102  */
   103  */
   103 NmDataPluginInterface *NmDataPluginFactory::interfaceInstance(QObject *plugin)
   104 NmDataPluginInterface *NmApiDataPluginFactory::interfaceInstance()
   104 {
   105 {
   105     NmDataPluginInterface *pluginInterface = NULL;
   106     if (!mPlugin) {
   106     if (plugin) {
   107         mPlugin = loadPlugin();
   107         pluginInterface = qobject_cast<NmDataPluginInterface*> (plugin);
       
   108     }
   108     }
   109     return pluginInterface;
   109     return qobject_cast<NmDataPluginInterface*> (mPlugin);
   110 }
   110 }
   111 
   111 
   112 /*!
   112 /*!
   113 
   113 
   114  */
   114  */
   115 NmDataPluginInterface *NmDataPluginFactory::interfaceInstance(NmId mailboxId)
   115 QObject *NmApiDataPluginFactory::loadPlugin()
   116 {
   116 {
   117     return interfaceInstance(pluginInstance(mailboxId));
   117     if (!mPluginLoader) {
   118 }
       
   119 
       
   120 /*!
       
   121 
       
   122  */
       
   123 QObject *NmDataPluginFactory::pluginInstance(NmId mailboxId)
       
   124 {
       
   125     Q_UNUSED(mailboxId);
       
   126     return pluginInstances()->at(INTERFACEPLUGININDEX);
       
   127 }
       
   128 
       
   129 /*!
       
   130 
       
   131  */
       
   132 QList<QObject*> *NmDataPluginFactory::pluginInstances()
       
   133 {
       
   134     //if plugins have not been already created, do it now.
       
   135     if (!mPluginArray) {
       
   136         mPluginArray = new QList<QObject*> ();
       
   137     }
       
   138     if (mPluginArray->count() == 0) {
       
   139 #ifdef Q_OS_SYMBIAN
       
   140 
       
   141         const QString KPluginDirectory = "c:\\resource\\plugins";
   118         const QString KPluginDirectory = "c:\\resource\\plugins";
   142         QDir pluginDir = QDir(KPluginDirectory);
   119         QDir pluginDir = QDir(KPluginDirectory);
   143         const QString KFrameworkPluginName = "nmframeworkadapter.qtplugin";
   120         const QString KFrameworkPluginName = "nmframeworkadapter.qtplugin";
   144         QObject *frameworkPlugin = loadPlugin(pluginDir, KFrameworkPluginName);
   121         /*!
   145         mPluginArray->append(frameworkPlugin);
   122          This creates plugin entity.
       
   123          */
       
   124         mPluginLoader = new QPluginLoader(pluginDir.absoluteFilePath(KFrameworkPluginName));
   146 
   125 
   147 #endif
   126         mPlugin = mPluginLoader->instance();
       
   127         if(!mPlugin){
       
   128             // We don't have proper plugin instance, so we don't need it's loader.
       
   129             delete mPluginLoader;
       
   130             mPluginLoader = NULL;
       
   131         }
   148     }
   132     }
   149 
   133     return mPlugin;
   150     return mPluginArray;
       
   151 }
   134 }
   152 
   135 
   153 /*!
   136 QObject *NmApiDataPluginFactory::plugin()
   154 
       
   155  */
       
   156 QObject *NmDataPluginFactory::loadPlugin(const QDir& pluginDir, const QString& pluginName)
       
   157 {
   137 {
   158     /*!
   138     if (!mPlugin) {
   159      This creates plugin entity.
   139         mPlugin = loadPlugin();
   160      */
       
   161     QPluginLoader *loader = new QPluginLoader(pluginDir.absoluteFilePath(pluginName));
       
   162 
       
   163     QObject *pluginInstance = loader->instance();
       
   164 
       
   165     if (pluginInstance) {
       
   166         // Store QPluginLoader instances to keep plugins alive.
       
   167         // If QPluginLoader instance for a plugin is deleted, then there
       
   168         // is a risk that some component outside will load and unload
       
   169         // plugin, which will lead into situation where plugin is deleted.
       
   170         // This means that instance in mPluginArray will be invalid.
       
   171         mPluginLoaderArray.append(loader);
       
   172     }
   140     }
   173     else {
   141     return mPlugin;
   174         // We don't have proper plugin instance, so we don't need it's loader.
       
   175         delete loader;
       
   176         loader = NULL;
       
   177     }
       
   178     return pluginInstance;
       
   179 }
   142 }