diff -r d508aa856878 -r d30183af6ca6 phonebookengines/cntlistmodel/src/cntcache_p.cpp --- a/phonebookengines/cntlistmodel/src/cntcache_p.cpp Wed Aug 11 09:06:35 2010 +0300 +++ b/phonebookengines/cntlistmodel/src/cntcache_p.cpp Mon Aug 23 16:06:28 2010 +0300 @@ -15,6 +15,9 @@ * */ +#include +#include + #include #include #include @@ -23,7 +26,8 @@ #include #include "cntcache.h" #include "cntcache_p.h" -#include "cntinfoprovider.h" +#include +#include #include "cntdefaultinfoprovider.h" #include "cntpresenceinfoprovider.h" #include @@ -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(pluginLoader.instance()); + + if (factory) + { + CntInfoProvider *provider = factory->infoProvider(); + mDataProviders.insert(provider, provider->supportedFields()); + } + } + } + // connect the providers QMapIterator i(mDataProviders); while (i.hasNext()) { i.next(); - connect(qobject_cast(i.key()), + connect(static_cast(i.key()), SIGNAL(infoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)), this, SLOT(onInfoFieldReady(CntInfoProvider*, int, ContactInfoField, const QString&)));