summaryrefslogtreecommitdiffstats
path: root/pyload/manager/AddonManager.py
diff options
context:
space:
mode:
authorGravatar Walter Purcaro <vuolter@gmail.com> 2014-12-11 02:07:42 +0100
committerGravatar Walter Purcaro <vuolter@gmail.com> 2014-12-11 02:07:42 +0100
commit25f6be5c9259d17ee0a3de5eb056b07f505a5f7d (patch)
tree8f7d1982620452aa65c26b381a5682a509044422 /pyload/manager/AddonManager.py
parentRename some Addon methods (diff)
downloadpyload-25f6be5c9259d17ee0a3de5eb056b07f505a5f7d.tar.xz
Rename some events + engage renamed addon methods
Diffstat (limited to 'pyload/manager/AddonManager.py')
-rw-r--r--pyload/manager/AddonManager.py130
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: