diff options
author | Walter Purcaro <vuolter@gmail.com> | 2014-12-11 02:07:42 +0100 |
---|---|---|
committer | Walter Purcaro <vuolter@gmail.com> | 2014-12-11 02:07:42 +0100 |
commit | 25f6be5c9259d17ee0a3de5eb056b07f505a5f7d (patch) | |
tree | 8f7d1982620452aa65c26b381a5682a509044422 /pyload/manager/AddonManager.py | |
parent | Rename some Addon methods (diff) | |
download | pyload-25f6be5c9259d17ee0a3de5eb056b07f505a5f7d.tar.xz |
Rename some events + engage renamed addon methods
Diffstat (limited to 'pyload/manager/AddonManager.py')
-rw-r--r-- | pyload/manager/AddonManager.py | 130 |
1 files changed, 78 insertions, 52 deletions
diff --git a/pyload/manager/AddonManager.py b/pyload/manager/AddonManager.py index 6ae9f4fbc..0fc3efb7b 100644 --- a/pyload/manager/AddonManager.py +++ b/pyload/manager/AddonManager.py @@ -11,7 +11,7 @@ from types import MethodType from pyload.manager.thread.AddonThread import AddonThread from pyload.manager.PluginManager import literal_eval -from utils import lock +from pyload.utils import lock class AddonManager(object): @@ -26,44 +26,45 @@ class AddonManager(object): **Known Events:** Most addon methods exists as events. These are the additional known events. - ===================== ============== ================================== + ======================= ============== ================================== Name Arguments Description - ===================== ============== ================================== - downloadPreparing fid A download was just queued and will be prepared now. - downloadStarts fid A plugin will immediately starts the download afterwards. - linksAdded links, pid Someone just added links, you are able to modify the links. - allDownloadsProcessed Every link was handled, pyload would idle afterwards. - allDownloadsFinished Every download in queue is finished. - unrarFinished folder, fname An Unrar job finished - configChanged The config was changed via the api. - pluginConfigChanged The plugin config changed, due to api or internal process. - ===================== ============== ================================== + ======================= ============== ================================== + download-preparing fid A download was just queued and will be prepared now. + download-start fid A plugin will immediately starts the download afterwards. + links-added links, pid Someone just added links, you are able to modify the links. + all_downloads-processed Every link was handled, pyload would idle afterwards. + all_downloads-finished Every download in queue is finished. + config-changed The config was changed via the api. + pluginConfigChanged The plugin config changed, due to api or internal process. + ======================= ============== ================================== | Notes: - | allDownloadsProcessed is *always* called before allDownloadsFinished. - | configChanged is *always* called before pluginConfigChanged. + | all_downloads-processed is *always* called before all_downloads-finished. + | config-changed is *always* called before pluginConfigChanged. """ def __init__(self, core): - __builtin__.addonManager = self #needed to let addons register themself + __builtin__.addonManager = self #: needed to let addons register themself self.plugins = [] self.pluginMap = {} - self.methods = {} #dict of names and list of methods usable by rpc + self.methods = {} #: dict of names and list of methods usable by rpc - self.events = {} # contains events + self.events = {} #: contains events # registering callback for config event - self.core.config.pluginCB = MethodType(self.dispatchEvent, "pluginConfigChanged", basestring) + self.core.config.pluginCB = MethodType(self.dispatchEvent, "pluginConfigChanged", basestring) #@TODO: Rename event pluginConfigChanged self.addEvent("pluginConfigChanged", self.manageAddon) self.lock = RLock() self.createIndex() + def try_catch(func): + def new(*args): try: return func(*args) @@ -71,8 +72,10 @@ class AddonManager(object): args[0].log.error(_("Error executing addon: %s") % e) if args[0].core.debug: traceback.print_exc() + return new + def addRPC(self, plugin, func, doc): plugin = plugin.rpartition(".")[2] doc = doc.strip() if doc else "" @@ -82,17 +85,20 @@ class AddonManager(object): else: self.methods[plugin] = {func: doc} + def callRPC(self, plugin, func, args, parse): - if not args: args = tuple() + if not args: + args = tuple() if parse: args = tuple([literal_eval(x) for x in args]) plugin = self.pluginMap[plugin] f = getattr(plugin, func) return f(*args) + def createIndex(self): - plugins = [] - active = [] + plugins = [] + active = [] deactive = [] for pluginname in self.core.pluginManager.addonPlugins: @@ -100,7 +106,8 @@ class AddonManager(object): # hookClass = getattr(plugin, plugin.__name) if self.core.config.getPlugin(pluginname, "activated"): pluginClass = self.core.pluginManager.loadClass("addon", pluginname) - if not pluginClass: continue + if not pluginClass: + continue plugin = pluginClass(self.core, self) plugins.append(plugin) @@ -120,50 +127,50 @@ class AddonManager(object): self.plugins = plugins + def manageAddon(self, plugin, name, value): if name == "activated" and value: self.activateAddon(plugin) + elif name == "activated" and not value: self.deactivateAddon(plugin) - def activateAddon(self, plugin): + + def activateAddon(self, pluginname): # check if already loaded for inst in self.plugins: - if inst.__name == plugin: + if inst.__name == pluginname: return - pluginClass = self.core.pluginManager.loadClass("addon", plugin) + pluginClass = self.core.pluginManager.loadClass("addon", pluginname) if not pluginClass: return - self.core.log.debug("Plugin loaded: %s" % plugin) + self.core.log.debug("Activate addon: %s" % pluginname) - plugin = pluginClass(self.core, self) - self.plugins.append(plugin) - self.pluginMap[pluginClass.__name] = plugin + addon = pluginClass(self.core, self) + self.plugins.append(addon) + self.pluginMap[pluginClass.__name] = addon - # call core Ready - t = Thread(target=plugin.coreReady) - t.setDaemon(True) - t.start() + addon.activate() - def deactivateAddon(self, plugin): - addon = None - for inst in self.plugins: - if inst.__name == plugin: - addon = inst - - if not addon: + def deactivateAddon(self, pluginname): + for plugin in self.plugins: + if plugin.__name == pluginname: + addon = plugin + break + else: return - self.core.log.debug("Plugin unloaded: %s" % plugin) + self.core.log.debug("Deactivate addon: %s" % pluginname) - addon.unload() + addon.deactivate() #remove periodic call - self.core.log.debug("Removed callback %s" % self.core.scheduler.removeJob(addon.cb)) + self.core.log.debug("Removed callback: %s" % self.core.scheduler.removeJob(addon.cb)) + self.plugins.remove(addon) del self.pluginMap[addon.__name] @@ -172,22 +179,28 @@ class AddonManager(object): def coreReady(self): for plugin in self.plugins: if plugin.isActivated(): - plugin.coreReady() - self.dispatchEvent("coreReady") + plugin.activate() + + self.dispatchEvent("addon-start") + @try_catch def coreExiting(self): for plugin in self.plugins: if plugin.isActivated(): - plugin.coreExiting() - self.dispatchEvent("coreExiting") + plugin.exit() + + self.dispatchEvent("addon-exit") + @lock def downloadPreparing(self, pyfile): for plugin in self.plugins: if plugin.isActivated(): plugin.downloadPreparing(pyfile) - self.dispatchEvent("downloadPreparing", pyfile) + + self.dispatchEvent("download-preparing", pyfile) + @lock def downloadFinished(self, pyfile): @@ -195,7 +208,8 @@ class AddonManager(object): if plugin.isActivated(): plugin.downloadFinished(pyfile) - self.dispatchEvent("downloadFinished", pyfile) + self.dispatchEvent("download-finished", pyfile) + @lock @try_catch @@ -204,7 +218,8 @@ class AddonManager(object): if plugin.isActivated(): plugin.downloadFailed(pyfile) - self.dispatchEvent("downloadFailed", pyfile) + self.dispatchEvent("download-failed", pyfile) + @lock def packageFinished(self, package): @@ -212,30 +227,37 @@ class AddonManager(object): if plugin.isActivated(): plugin.packageFinished(package) - self.dispatchEvent("packageFinished", package) + self.dispatchEvent("package-finished", package) + @lock def beforeReconnecting(self, ip): for plugin in self.plugins: plugin.beforeReconnecting(ip) + self.dispatchEvent("beforeReconnecting", ip) + @lock def afterReconnecting(self, ip): for plugin in self.plugins: if plugin.isActivated(): plugin.afterReconnecting(ip) + self.dispatchEvent("afterReconnecting", ip) + def startThread(self, function, *args, **kwargs): return AddonThread(self.core.threadManager, function, args, kwargs) + def activePlugins(self): """ returns all active plugins """ return [x for x in self.plugins if x.isActivated()] + def getAllInfo(self): - """returns info stored by hook plugins""" + """returns info stored by addon plugins""" info = {} for name, plugin in self.pluginMap.iteritems(): if plugin.info: @@ -244,6 +266,7 @@ class AddonManager(object): [(x, str(y) if not isinstance(y, basestring) else y) for x, y in plugin.info.iteritems()]) return info + def getInfo(self, plugin): info = {} if plugin in self.pluginMap and self.pluginMap[plugin].info: @@ -251,6 +274,7 @@ class AddonManager(object): for x, y in self.pluginMap[plugin].info.iteritems()) return info + def addEvent(self, event, func): """Adds an event listener for event name""" if event in self.events: @@ -258,11 +282,13 @@ class AddonManager(object): else: self.events[event] = [func] + def removeEvent(self, event, func): """removes previously added event listener""" if event in self.events: self.events[event].remove(func) + def dispatchEvent(self, event, *args): """dispatches event with args""" if event in self.events: |