Changeset 9821

Show
Ignore:
Timestamp:
06/18/08 22:45:22 (3 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.

Location:
branches/plugin-system
Files:
8 modified

Legend:

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

    r9792 r9821  
    2020 
    2121:author: Mateusz Biliński <mateusz@bilinski.it> 
    22 :since: 06/10/2008 
     22:since: 9th June 2008 
    2323:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> 
    2424:license: GPL 
     
    4040        homepage = u'http://blog.bilinski.it' 
    4141 
    42         @log_calls('AcronymsExpanderPlugin') 
    43         def __init__(self): 
    44                 super(AcronymsExpanderPlugin, self).__init__() 
    45  
     42        #@log_calls('AcronymsExpanderPlugin') 
     43        #def __init__(self): 
     44                #super(AcronymsExpanderPlugin, self).__init__() 
     45                 
     46        def init(self): 
    4647                self.gui_extension_points = { 
    4748                        'chat_control_base' : (self.connect_with_chat_control_base, 
     
    5758                                                 'GW-' : 'http://trac.gajim.org/', 
    5859                                                 'GTS-' : 'http://trac.gajim.org/report' 
    59                                                 } 
     60                                                }                
    6061 
    6162        @log_calls('AcronymsExpanderPlugin') 
     
    100101                tv.get_buffer().disconnect(d['h_id']) 
    101102                 
     103                 
  • branches/plugin-system/plugins/length_notifier.py

    r9792 r9821  
    2020 
    2121:author: Mateusz Biliński <mateusz@bilinski.it> 
    22 :since: 06/01/2008 
     22:since: 1st June 2008 
    2323:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> 
    2424:license: GPL 
     
    4040        homepage = u'http://blog.bilinski.it' 
    4141 
     42        #@log_calls('LengthNotifierPlugin') 
     43        #def __init__(self): 
     44                #super(LengthNotifierPlugin, self).__init__() 
     45         
    4246        @log_calls('LengthNotifierPlugin') 
    43         def __init__(self): 
    44                 super(LengthNotifierPlugin, self).__init__() 
    45                  
     47        def init(self): 
    4648                self.gui_extension_points = { 
    4749                        'chat_control' : (self.connect_with_chat_control, 
  • branches/plugin-system/plugins/roster_buttons/plugin.py

    r9803 r9821  
    2020 
    2121:author: Mateusz Biliński <mateusz@bilinski.it> 
    22 :since: 06/10/2008 
     22:since: 14th June 2008 
    2323:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> 
    2424:license: GPL 
     
    4545        #def __init__(self): 
    4646                #super(RosterButtonsPlugin, self).__init__() 
     47 
     48        @log_calls('RosterButtonsPlugin')        
     49        def init(self): 
     50                #log.debug('self.__path__==%s'%(self.__path__)) 
     51                self.GLADE_FILE_PATH = self.local_file_path('roster_buttons.glade') 
    4752                 
     53                self.roster_vbox = gajim.interface.roster.xml.get_widget('roster_vbox2') 
     54                self.show_offline_contacts_menuitem = gajim.interface.roster.xml.get_widget('show_offline_contacts_menuitem') 
     55         
    4856        @log_calls('RosterButtonsPlugin') 
    4957        def activate(self): 
    50                 #log.debug('self.__path__==%s'%(self.__path__)) 
    51                 self.GLADE_FILE_PATH = self.local_file_path('roster_buttons.glade') 
    5258                self.xml = gtk.glade.XML(self.GLADE_FILE_PATH, root='roster_buttons_buttonbox', domain=i18n.APP) 
    5359                self.buttonbox = self.xml.get_widget('roster_buttons_buttonbox') 
    5460                 
    55                 self.roster_vbox = gajim.interface.roster.xml.get_widget('roster_vbox2') 
    5661                self.roster_vbox.pack_start(self.buttonbox, expand=False) 
    5762                self.roster_vbox.reorder_child(self.buttonbox, 0) 
    58                  
    59                 self.show_offline_contacts_menuitem = gajim.interface.roster.xml.get_widget('show_offline_contacts_menuitem') 
    60                  
    6163                self.xml.signal_autoconnect(self) 
    62                  
    6364                 
    6465        @log_calls('RosterButtonsPlugin') 
     
    7374                #gajim.interface.roster.on_show_offline_contacts_menuitem_activate(None) 
    7475                self.show_offline_contacts_menuitem.set_active(not self.show_offline_contacts_menuitem.get_active()) 
    75                  
    7676         
    7777        @log_calls('RosterButtonsPlugin') 
  • branches/plugin-system/src/common/config.py

    r9644 r9821  
    391391                        'urgency_hint': [opt_bool, False], 
    392392                }, {}), 
     393                'plugins': ({ 
     394                        'active': [opt_bool, False, _('State whether plugins should be activated on exit (this is saved on Gajim exit). This option SHOULD NOT be used to (de)activate plug-ins. Use GUI instead.')], 
     395                },{}), 
    393396        } 
    394397 
  • branches/plugin-system/src/gajim-remote.py

    r9701 r9821  
    378378                        raise exceptions.SessionBusNotPresent 
    379379 
     380                from pprint import pprint 
     381                pprint(list(self.sbus.list_names())) 
    380382                if not self.check_gajim_running(): 
    381383                        send_error(_('It seems Gajim is not running. So you can\'t use gajim-remote.')) 
  • branches/plugin-system/src/plugins/gui.py

    r9762 r9821  
    140140                self.installed_plugins_model.set_sort_column_id(0, gtk.SORT_ASCENDING) 
    141141                 
    142                 for plugin_class in pm.plugins: 
    143                         self.installed_plugins_model.append([plugin_class,  
    144                                                                                                  plugin_class.name,  
    145                                                                                                  plugin_class._active]) 
     142                for plugin in pm.plugins: 
     143                        self.installed_plugins_model.append([plugin,  
     144                                                                                                 plugin.name,  
     145                                                                                                 plugin.active]) 
    146146                 
    147147        @log_calls('PluginsWindow') 
    148148        def installed_plugins_toggled_cb(self, cell, path): 
    149149                is_active = self.installed_plugins_model[path][2] 
    150                 plugin_class = self.installed_plugins_model[path][0] 
     150                plugin = self.installed_plugins_model[path][0] 
    151151 
    152152                if is_active: 
    153                         gajim.plugin_manager.deactivate_plugin(plugin_class._instance) 
     153                        gajim.plugin_manager.deactivate_plugin(plugin) 
    154154                else: 
    155                         gajim.plugin_manager.activate_plugin(plugin_class) 
     155                        gajim.plugin_manager.activate_plugin(plugin) 
    156156                 
    157157                self.installed_plugins_model[path][2] = not is_active 
  • 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 
  • branches/plugin-system/src/plugins/plugin.py

    r9803 r9821  
    2020 
    2121:author: Mateusz Biliński <mateusz@bilinski.it> 
    22 :since: 06/01/2008 
     22:since: 1st June 2008 
    2323:copyright: Copyright (2008) Mateusz Biliński <mateusz@bilinski.it> 
    2424:license: GPL 
     
    105105                :type: `plugins.plugin.Config` 
    106106                ''' 
    107                  
    108                 self._load_config() 
     107                self.load_config() 
     108                self.init() 
    109109         
    110110        @log_calls('GajimPlugin') 
    111         def _save_config(self): 
     111        def save_config(self): 
    112112                pass 
    113113         
    114114        @log_calls('GajimPlugin')        
    115         def _load_config(self): 
     115        def load_config(self): 
    116116                pass 
    117117         
     
    123123        def local_file_path(self, file_name): 
    124124                return os.path.join(self.__path__, file_name) 
     125 
     126        @log_calls('GajimPlugin') 
     127        def init(self): 
     128                pass 
    125129         
    126130        @log_calls('GajimPlugin')