void PluginManager::slotShutdownTimeout() { // When we were already done the timer might still fire. // Do nothing in that case. if ( _kpmp->shutdownMode == PluginManagerPrivate::DoneShutdown ) return; QStringList remaining; for ( PluginManagerPrivate::InfoToPluginMap::ConstIterator it = _kpmp->loadedPlugins.constBegin(); it != _kpmp->loadedPlugins.constEnd(); ++it ) remaining.append( it.value()->pluginId() ); kWarning( 14010 ) << "Some plugins didn't shutdown in time!" << endl << "Remaining plugins: " << remaining.join( QLatin1String( ", " ) ) << endl << "Forcing Kopete shutdown now." << endl; slotShutdownDone(); }
void PluginManager::slotPluginReadyForUnload() { kDebug(); // Using QObject::sender() is on purpose here, because otherwise all // plugins would have to pass 'this' as parameter, which makes the API // less clean for plugin authors // FIXME: I don't buy the above argument. Add a Choqok::Plugin::emitReadyForUnload(void), // and make readyForUnload be passed a plugin. - Richard Plugin *plugin = dynamic_cast<Plugin *>( const_cast<QObject *>( sender() ) ); if ( !plugin ) { kWarning() << "Calling object is not a plugin!"; return; } kDebug() << plugin->pluginId() << "ready for unload"; _kpmp->loadedPlugins.remove(_kpmp->loadedPlugins.key(plugin)); plugin->deleteLater(); plugin = 0L; if(_kpmp->loadedPlugins.count() < 1){ slotShutdownDone(); } }