summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattV <qt-info@nokia.com>2009-10-21 09:17:31 +1000
committerMattV <qt-info@nokia.com>2009-10-21 09:17:31 +1000
commite39cd019705c1ff54a70f974e610f1210dbcbec3 (patch)
treedcf72b8e049ac076cfe449688b4ded634a0ad189
parent80514a5404394d4f50fb1e36cbfff2c2d5890ca6 (diff)
Ensure instances of plugin classes are released at shutdown.2009W44
-rw-r--r--src/libraries/messageserver/qmailmessageservice.cpp42
-rw-r--r--src/libraries/qtopiamail/support/qmailpluginmanager.cpp9
2 files changed, 29 insertions, 22 deletions
diff --git a/src/libraries/messageserver/qmailmessageservice.cpp b/src/libraries/messageserver/qmailmessageservice.cpp
index eede35f9..233a509d 100644
--- a/src/libraries/messageserver/qmailmessageservice.cpp
+++ b/src/libraries/messageserver/qmailmessageservice.cpp
@@ -56,32 +56,30 @@
namespace {
-typedef QMap<QString, QMailMessageServicePlugin*> PluginMap;
-
-PluginMap initMap(QMailPluginManager &manager)
+class PluginMap : public QMap<QString, QMailMessageServicePlugin*>
{
- PluginMap map;
-
- foreach (const QString &item, manager.list()) {
- QObject *instance(manager.instance(item));
- if (QMailMessageServicePlugin *iface = qobject_cast<QMailMessageServicePlugin*>(instance))
- map.insert(iface->key(), iface);
+public:
+ PluginMap()
+ : QMap<QString, QMailMessageServicePlugin*>(),
+ _manager(PLUGIN_KEY)
+ {
+ foreach (const QString &item, _manager.list()) {
+ QObject *instance(_manager.instance(item));
+ if (QMailMessageServicePlugin *iface = qobject_cast<QMailMessageServicePlugin*>(instance))
+ insert(iface->key(), iface);
+ }
}
+
+private:
+ QMailPluginManager _manager;
+};
- return map;
-}
-
-PluginMap &pluginMap()
-{
- static QMailPluginManager manager(PLUGIN_KEY);
- static PluginMap map(initMap(manager));
- return map;
-}
+Q_GLOBAL_STATIC(PluginMap, pluginMap);
QMailMessageServicePlugin *mapping(const QString &key)
{
- PluginMap::const_iterator it = pluginMap().find(key);
- if (it != pluginMap().end())
+ PluginMap::const_iterator it = pluginMap()->find(key);
+ if (it != pluginMap()->end())
return it.value();
qMailLog(Messaging) << "Unable to map service for key:" << key;
@@ -125,10 +123,10 @@ QMailMessageServicePlugin *mapping(const QString &key)
QStringList QMailMessageServiceFactory::keys(QMailMessageServiceFactory::ServiceType type)
{
if (type == QMailMessageServiceFactory::Any)
- return pluginMap().keys();
+ return pluginMap()->keys();
QStringList result;
- foreach (QMailMessageServicePlugin *plugin, pluginMap().values())
+ foreach (QMailMessageServicePlugin *plugin, pluginMap()->values())
if (plugin->supports(type))
result.append(plugin->key());
diff --git a/src/libraries/qtopiamail/support/qmailpluginmanager.cpp b/src/libraries/qtopiamail/support/qmailpluginmanager.cpp
index f44f078a..ff26e3b5 100644
--- a/src/libraries/qtopiamail/support/qmailpluginmanager.cpp
+++ b/src/libraries/qtopiamail/support/qmailpluginmanager.cpp
@@ -121,6 +121,7 @@ class QMailPluginManagerPrivate
{
public:
QMailPluginManagerPrivate(const QString& ident);
+ ~QMailPluginManagerPrivate();
public:
QMap<QString,QPluginLoader*> pluginMap;
@@ -145,6 +146,14 @@ QMailPluginManagerPrivate::QMailPluginManagerPrivate(const QString& path)
pluginMap[libname] = 0;
}
+QMailPluginManagerPrivate::~QMailPluginManagerPrivate()
+{
+ foreach (QPluginLoader *lib, pluginMap.values()) {
+ lib->unload();
+ delete lib;
+ }
+}
+
QMailPluginManager::QMailPluginManager(const QString& dir, QObject* parent)
:
QObject(parent),