From 5fa8dab30f9b259ad958f0d9a71a3422fcac3f23 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Mon, 1 Nov 2010 21:22:43 +0100 Subject: [PATCH] show warning dialog when trying to enable a plugin that raise an exception when activate is called. --- src/plugins/gui.py | 7 ++++++- src/plugins/helpers.py | 6 ++++++ src/plugins/pluginmanager.py | 34 +++++++++++++++++----------------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/plugins/gui.py b/src/plugins/gui.py index b54acd0d6..d095b3da3 100644 --- a/src/plugins/gui.py +++ b/src/plugins/gui.py @@ -33,6 +33,7 @@ import gtkgui_helpers from dialogs import WarningDialog, YesNoDialog, ArchiveChooserDialog from common import gajim from plugins.helpers import log_calls, log +from plugins.helpers import GajimPluginActivateException from common.exceptions import PluginsystemError class PluginsWindow(object): @@ -153,7 +154,11 @@ class PluginsWindow(object): if is_active: gajim.plugin_manager.deactivate_plugin(plugin) else: - gajim.plugin_manager.activate_plugin(plugin) + try: + gajim.plugin_manager.activate_plugin(plugin) + except GajimPluginActivateException, e: + WarningDialog(_('Plugin failed'), str(e)) + return self.installed_plugins_model[path][2] = not is_active diff --git a/src/plugins/helpers.py b/src/plugins/helpers.py index 6b62fa3ec..d6d1e412e 100644 --- a/src/plugins/helpers.py +++ b/src/plugins/helpers.py @@ -45,6 +45,12 @@ log.propagate = False import functools +class GajimPluginActivateException(Exception): + ''' + Raised when activation failed + ''' + pass + class log_calls(object): ''' Decorator class for functions to easily log when they are entered and left. diff --git a/src/plugins/pluginmanager.py b/src/plugins/pluginmanager.py index 5caefbe6b..d290d36a2 100644 --- a/src/plugins/pluginmanager.py +++ b/src/plugins/pluginmanager.py @@ -38,7 +38,8 @@ from common import nec from common.exceptions import PluginsystemError from plugins.helpers import log, log_calls, Singleton -from plugins.plugin import GajimPlugin +from plugins.helpers import GajimPluginActivateException +from plugins.plugin import GajimPlugin, GajimPluginException class PluginManager(object): ''' @@ -279,13 +280,7 @@ class PluginManager(object): ''' :param plugin: plugin to be activated :type plugin: class object of `GajimPlugin` subclass - - :todo: success checks should be implemented using exceptions. Such - control should also be implemented in deactivation. Exceptions - should be shown to user inside popup dialog, so the reason - for not activating plugin is known. ''' - success = False if not plugin.active: self._add_gui_extension_points_handlers_from_plugin(plugin) @@ -293,15 +288,14 @@ class PluginManager(object): self._register_events_handlers_in_ged(plugin) self._register_network_events_in_nec(plugin) - success = True - - if success: - self.active_plugins.append(plugin) + self.active_plugins.append(plugin) + try: plugin.activate() - self._set_plugin_active_in_global_config(plugin) - plugin.active = True - - return success + except GajimPluginException, e: + self.deactivate_plugin(plugin) + raise GajimPluginActivateException(str(e)) + self._set_plugin_active_in_global_config(plugin) + plugin.active = True def deactivate_plugin(self, plugin): # remove GUI extension points handlers (provided by plug-in) from @@ -362,12 +356,18 @@ class PluginManager(object): Activated plugins are appended to `active_plugins` list. ''' for plugin in self.plugins: - self.activate_plugin(plugin) + try: + self.activate_plugin(plugin) + except GajimPluginActivateException: + pass def _activate_all_plugins_from_global_config(self): for plugin in self.plugins: if self._plugin_is_active_in_global_config(plugin): - self.activate_plugin(plugin) + try: + self.activate_plugin(plugin) + except GajimPluginActivateException: + pass def _plugin_is_active_in_global_config(self, plugin): return gajim.config.get_per('plugins', plugin.short_name, 'active')