diff options
author | MattV <qt-info@nokia.com> | 2009-10-21 09:17:31 +1000 |
---|---|---|
committer | MattV <qt-info@nokia.com> | 2009-10-21 09:17:31 +1000 |
commit | e39cd019705c1ff54a70f974e610f1210dbcbec3 (patch) | |
tree | dcf72b8e049ac076cfe449688b4ded634a0ad189 | |
parent | 80514a5404394d4f50fb1e36cbfff2c2d5890ca6 (diff) |
Ensure instances of plugin classes are released at shutdown.2009W44
-rw-r--r-- | src/libraries/messageserver/qmailmessageservice.cpp | 42 | ||||
-rw-r--r-- | src/libraries/qtopiamail/support/qmailpluginmanager.cpp | 9 |
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), |