From 2e2851dc13d73352530dd4495c7e05603b2e520d Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 23:38:38 +0200 Subject: Adding upstream version 2.1.2~dev0+20240219. Signed-off-by: Daniel Baumann --- deluge/core/pluginmanager.py | 105 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 deluge/core/pluginmanager.py (limited to 'deluge/core/pluginmanager.py') diff --git a/deluge/core/pluginmanager.py b/deluge/core/pluginmanager.py new file mode 100644 index 0000000..0482b16 --- /dev/null +++ b/deluge/core/pluginmanager.py @@ -0,0 +1,105 @@ +# +# Copyright (C) 2007 Andrew Resch +# +# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with +# the additional special exception to link portions of this program with the OpenSSL library. +# See LICENSE for more details. +# + + +"""PluginManager for Core""" +import logging + +from twisted.internet import defer + +import deluge.component as component +import deluge.pluginmanagerbase +from deluge.event import PluginDisabledEvent, PluginEnabledEvent + +log = logging.getLogger(__name__) + + +class PluginManager(deluge.pluginmanagerbase.PluginManagerBase, component.Component): + """PluginManager handles the loading of plugins and provides plugins with + functions to access parts of the core.""" + + def __init__(self, core): + component.Component.__init__(self, 'CorePluginManager') + + self.status_fields = {} + + # Call the PluginManagerBase constructor + deluge.pluginmanagerbase.PluginManagerBase.__init__( + self, 'core.conf', 'deluge.plugin.core' + ) + + def start(self): + # Enable plugins that are enabled in the config + self.enable_plugins() + + def stop(self): + # Disable all enabled plugins + self.disable_plugins() + + def shutdown(self): + self.stop() + + def update_plugins(self): + for plugin in self.plugins: + if hasattr(self.plugins[plugin], 'update'): + try: + self.plugins[plugin].update() + except Exception as ex: + log.exception(ex) + + def enable_plugin(self, name): + d = defer.succeed(True) + if name not in self.plugins: + d = deluge.pluginmanagerbase.PluginManagerBase.enable_plugin(self, name) + + def on_enable_plugin(result): + if result is True and name in self.plugins: + component.get('EventManager').emit(PluginEnabledEvent(name)) + return result + + d.addBoth(on_enable_plugin) + return d + + def disable_plugin(self, name): + d = defer.succeed(True) + if name in self.plugins: + d = deluge.pluginmanagerbase.PluginManagerBase.disable_plugin(self, name) + + def on_disable_plugin(result): + if name not in self.plugins: + component.get('EventManager').emit(PluginDisabledEvent(name)) + return result + + d.addBoth(on_disable_plugin) + return d + + def get_status(self, torrent_id, fields): + """Return the value of status fields for the selected torrent_id.""" + status = {} + if len(fields) == 0: + fields = list(self.status_fields) + for field in fields: + try: + status[field] = self.status_fields[field](torrent_id) + except KeyError: + pass + return status + + def register_status_field(self, field, function): + """Register a new status field. This can be used in the same way the + client requests other status information from core.""" + log.debug('Registering status field %s with PluginManager', field) + self.status_fields[field] = function + + def deregister_status_field(self, field): + """Deregisters a status field""" + log.debug('Deregistering status field %s with PluginManager', field) + try: + del self.status_fields[field] + except Exception: + log.warning('Unable to deregister status field %s', field) -- cgit v1.2.3