Show
Ignore:
Timestamp:
06/18/08 22:45:22 (6 months ago)
Author:
vardo
Message:

Added new 'init' method to Plugin class that plugins can implement to make actions that need to be done only once - when plugin is added (not activated) to Gajim. In this method plugins should declare handlers for GUI extension points. This was created so that init method doesn't have to be reimplemented in specific way (create config, load config) - it is all done by init in Plugin class. If init is reimplemented, it must call Plugin init (eg. using super() ) to plugin work properly.

Example plug-ins were modified to use init() instead of init().

Added new category in configuration - 'plugins'. It only holds one option for each plugin - 'active', which determines whether plugin should be activated on startup.

Now, Gajim remembers which plugins are active on exit, and activates them on next startup.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/plugin-system/src/plugins/pluginmanager.py

    r9803 r9821  
    2020 
    2121:author: Mateusz Biliński <mateusz@bilinski.it> 
    22 :since: 05/30/2008 
     22:since: 30th May 2008 
    2323:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> 
    2424:license: GPL 
     
    9595 
    9696                for path in gajim.PLUGINS_DIRS: 
    97                         self._add_plugins(PluginManager.scan_dir_for_plugins(path)) 
     97                        self.add_plugins(PluginManager.scan_dir_for_plugins(path)) 
    9898 
    9999                log.debug('plugins: %s'%(self.plugins)) 
    100100 
    101                 self.activate_all_plugins() 
     101                self._activate_all_plugins_from_global_config() 
    102102 
    103103                log.debug('active: %s'%(self.active_plugins)) 
    104104 
    105                  
    106         @log_calls('PluginManager') 
    107         def _add_plugin(self, plugin_class): 
     105        @log_calls('PluginManager') 
     106        def _plugin_has_entry_in_global_config(self, plugin): 
     107                if gajim.config.get_per('plugins', plugin.short_name) is None: 
     108                        return False 
     109                else: 
     110                        return True 
     111         
     112        @log_calls('PluginManager') 
     113        def _create_plugin_entry_in_global_config(self, plugin): 
     114                gajim.config.add_per('plugins', plugin.short_name) 
     115                 
     116        @log_calls('PluginManager') 
     117        def add_plugin(self, plugin_class): 
    108118                ''' 
    109119                :todo: what about adding plug-ins that are already added? Module reload 
    110120                and adding class from reloaded module or ignoring adding plug-in? 
    111121                ''' 
    112                 plugin_class._active = False 
    113                 plugin_class._instance = None 
    114                 self.plugins.append(plugin_class) 
    115          
    116         @log_calls('PluginManager') 
    117         def _add_plugins(self, plugin_classes): 
     122                plugin = plugin_class() 
     123                if not self._plugin_has_entry_in_global_config(plugin): 
     124                        self._create_plugin_entry_in_global_config(plugin) 
     125                         
     126                self.plugins.append(plugin) 
     127                plugin.active = False 
     128         
     129        @log_calls('PluginManager') 
     130        def add_plugins(self, plugin_classes): 
    118131                for plugin_class in plugin_classes: 
    119                         self._add_plugin(plugin_class) 
     132                        self.add_plugin(plugin_class) 
    120133                 
    121134        @log_calls('PluginManager') 
     
    157170 
    158171        @log_calls('PluginManager') 
    159         def activate_plugin(self, plugin_class): 
     172        def activate_plugin(self, plugin): 
    160173                ''' 
    161174                :param plugin: plugin to be activated 
    162175                :type plugin: class object of `GajimPlugin` subclass 
    163                 ''' 
    164                  
    165                 plugin_object = plugin_class() 
    166  
    167                 success = True 
    168  
    169                 self._add_gui_extension_points_handlers_from_plugin(plugin_object) 
    170                 self._handle_all_gui_extension_points_with_plugin(plugin_object) 
    171  
    172                 if success: 
    173                         self.active_plugins.append(plugin_object) 
    174                         plugin_object.activate() 
    175                         plugin_class._instance = plugin_object 
    176                         plugin_class._active = True 
     176                 
     177                :todo: success checks should be implemented using exceptions. Such 
     178                        control should also be implemented in deactivation. 
     179                ''' 
     180                success = False 
     181                if not plugin.active: 
     182         
     183                        self._add_gui_extension_points_handlers_from_plugin(plugin) 
     184                        self._handle_all_gui_extension_points_with_plugin(plugin) 
     185                         
     186                        success = True 
     187                         
     188                        if success: 
     189                                self.active_plugins.append(plugin) 
     190                                plugin.activate() 
     191                                self._set_plugin_active_in_global_config(plugin) 
     192                                plugin.active = True 
    177193 
    178194                return success 
    179195         
    180         def deactivate_plugin(self, plugin_object): 
     196        def deactivate_plugin(self, plugin): 
    181197                # detaching plug-in from handler GUI extension points (calling 
    182198                # cleaning up method that must be provided by plug-in developer 
    183199                # for each handled GUI extension point) 
    184200                for gui_extpoint_name, gui_extpoint_handlers in \ 
    185                                 plugin_object.gui_extension_points.iteritems(): 
     201                                plugin.gui_extension_points.iteritems(): 
    186202                        if gui_extpoint_name in self.gui_extension_points: 
    187203                                for gui_extension_point_args in self.gui_extension_points[gui_extpoint_name]: 
     
    191207                # handlers list 
    192208                for gui_extpoint_name, gui_extpoint_handlers in \ 
    193                                 plugin_object.gui_extension_points.iteritems(): 
     209                                plugin.gui_extension_points.iteritems(): 
    194210                        self.gui_extension_points_handlers[gui_extpoint_name].remove(gui_extpoint_handlers) 
    195211                         
    196212                # removing plug-in from active plug-ins list 
    197                 plugin_object.deactivate() 
    198                 self.active_plugins.remove(plugin_object) 
    199                 plugin_object.__class__._active = False 
    200                 plugin_object.__class__._instance = None 
    201                 del plugin_object 
    202                  
    203         def deactivate_all_plugins(self): 
     213                plugin.deactivate() 
     214                self.active_plugins.remove(plugin) 
     215                self._set_plugin_active_in_global_config(plugin, False) 
     216                plugin.active = False 
     217                 
     218        def _deactivate_all_plugins(self): 
    204219                for plugin_object in self.active_plugins: 
    205220                        self.deactivate_plugin(plugin_object) 
    206221         
    207222        @log_calls('PluginManager') 
    208         def _add_gui_extension_points_handlers_from_plugin(self, plugin_object): 
     223        def _add_gui_extension_points_handlers_from_plugin(self, plugin): 
    209224                for gui_extpoint_name, gui_extpoint_handlers in \ 
    210                                 plugin_object.gui_extension_points.iteritems(): 
     225                                plugin.gui_extension_points.iteritems(): 
    211226                        self.gui_extension_points_handlers.setdefault(gui_extpoint_name, []).append( 
    212227                                        gui_extpoint_handlers) 
    213228         
    214229        @log_calls('PluginManager') 
    215         def _handle_all_gui_extension_points_with_plugin(self, plugin_object): 
     230        def _handle_all_gui_extension_points_with_plugin(self, plugin): 
    216231                for gui_extpoint_name, gui_extpoint_handlers in \ 
    217                                 plugin_object.gui_extension_points.iteritems(): 
     232                                plugin.gui_extension_points.iteritems(): 
    218233                        if gui_extpoint_name in self.gui_extension_points: 
    219234                                for gui_extension_point_args in self.gui_extension_points[gui_extpoint_name]: 
     
    221236 
    222237        @log_calls('PluginManager') 
    223         def activate_all_plugins(self): 
     238        def _activate_all_plugins(self): 
    224239                ''' 
    225240                Activates all plugins in `plugins`. 
     
    227242                Activated plugins are appended to `active_plugins` list. 
    228243                ''' 
    229                 self.active_plugins = [] 
     244                #self.active_plugins = [] 
    230245                for plugin in self.plugins: 
    231246                        self.activate_plugin(plugin) 
     247                         
     248        def _activate_all_plugins_from_global_config(self): 
     249                for plugin in self.plugins: 
     250                        if self._plugin_is_active_in_global_config(plugin): 
     251                                self.activate_plugin(plugin) 
     252                 
     253        def _plugin_is_active_in_global_config(self, plugin): 
     254                return gajim.config.get_per('plugins', plugin.short_name, 'active') 
     255         
     256        def _set_plugin_active_in_global_config(self, plugin, active=True): 
     257                gajim.config.set_per('plugins', plugin.short_name, 'active', active) 
    232258 
    233259        @staticmethod