phonebookengines/cntlistmodel/src/cntcache_p.cpp
changeset 65 ae724a111993
parent 47 7cbcb2896f0e
child 66 554fe4dbbb59
--- a/phonebookengines/cntlistmodel/src/cntcache_p.cpp	Wed Aug 18 09:39:00 2010 +0300
+++ b/phonebookengines/cntlistmodel/src/cntcache_p.cpp	Thu Sep 02 20:16:15 2010 +0300
@@ -15,6 +15,9 @@
 *
 */
 
+#include <QPluginLoader>
+#include <QDir>
+
 #include <qtcontacts.h>
 #include <qcontactmanager.h>
 #include <hbapplication.h>
@@ -23,7 +26,8 @@
 #include <QTimer>
 #include "cntcache.h"
 #include "cntcache_p.h"
-#include "cntinfoprovider.h"
+#include <cntinfoproviderfactory.h>
+#include <cntinfoprovider.h>
 #include "cntdefaultinfoprovider.h"
 #include "cntpresenceinfoprovider.h"
 #include <cntdebug.h>
@@ -41,6 +45,8 @@
 static const int NoIconRequest = -1;
 // the id that states that there is no job with that key
 static const int NoSuchJob = -1;
+
+const char *CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY = "/resource/qt/plugins/contacts/infoproviders/";
     
 // TODO: Provide a way (cenrep keys?) for UI to set which provider to use for
 //       what info field (and what info fields are indeed even in use).
@@ -60,15 +66,30 @@
     // create static provider plugins
     mDataProviders.insert(new CntDefaultInfoProvider(), ContactInfoAllFields);
     mDataProviders.insert(new CntPresenceInfoProvider(), ContactInfoIcon2Field);
-    // TODO: create more static provider plugins
 
-    // TODO: load dynamic provider plugins using QPluginLoader
-
+    // load dynamic provider plugins
+    QDir pluginsDir(CNT_INFO_PROVIDER_EXTENSION_PLUGIN_DIRECTORY);
+    foreach (QString fileName, pluginsDir.entryList(QDir::Files))
+    {
+        // Create plugin loader
+        QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
+        if ( pluginLoader.load() )
+        {
+            CntInfoProviderFactory *factory = qobject_cast<CntInfoProviderFactory*>(pluginLoader.instance());
+            
+            if (factory)
+            {
+                CntInfoProvider *provider = factory->infoProvider();
+                mDataProviders.insert(provider, provider->supportedFields());
+            }
+        }
+    }
+    
     // connect the providers
     QMapIterator<CntInfoProvider*, ContactInfoFields> i(mDataProviders);
     while (i.hasNext()) {
         i.next();
-        connect(qobject_cast<CntInfoProvider*>(i.key()),
+        connect(static_cast<CntInfoProvider*>(i.key()),
                 SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)),
                 this,
                 SLOT(onInfoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));