# -*- coding: utf-8 -*- """ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . @author: mkaay @interface-version: 0.1 """ import traceback from threading import RLock from module.PluginThread import HookThread from time import time class HookManager(): def __init__(self, core): self.core = core self.config = self.core.config self.log = self.core.log self.plugins = [] self.lock = RLock() self.createIndex() def lock(func): def new(*args): args[0].lock.acquire() res = func(*args) args[0].lock.release() return res return new def try_catch(func): def new(*args): try: return func(*args) except Exception, e: args[0].log.error(_("Error executing hooks: %s") % str(e)) traceback.print_exc() return new def createIndex(self): plugins = [] for pluginClass in self.core.pluginManager.getHookPlugins(): try: #hookClass = getattr(plugin, plugin.__name__) if self.core.config.getPlugin(pluginClass.__name__, "load"): plugin = pluginClass(self.core) plugins.append(plugin) self.log.info(_("%(name)s loaded, activated %(value)s") % {"name": pluginClass.__name__, "value": plugin.isActivated() }) except: self.log.warning(_("Failed activating %(name)s") % {"name":pluginClass.__name__}) if self.core.debug: traceback.print_exc() self.plugins = plugins @try_catch def periodical(self): for plugin in self.plugins: if plugin.isActivated() and plugin.lastCall + plugin.interval < time(): plugin.lastCall = time() plugin.periodical() @try_catch def coreReady(self): for plugin in self.plugins: if plugin.isActivated(): plugin.coreReady() @lock def downloadStarts(self, pyfile): for plugin in self.plugins: if plugin.isActivated(): plugin.downloadStarts(pyfile) @lock def downloadFinished(self, pyfile): for plugin in self.plugins: if plugin.isActivated(): if "downloadFinished" in plugin.__threaded__: self.startThread(plugin.downloadFinished, pyfile) else: plugin.downloadFinished(pyfile) @lock def packageFinished(self, package): for plugin in self.plugins: if plugin.isActivated(): if "packageFinished" in plugin.__threaded__: self.startThread(plugin.packageFinished, package) else: plugin.packageFinished(package) @lock def beforeReconnecting(self, ip): for plugin in self.plugins: plugin.beforeReconnecting(ip) @lock def afterReconnecting(self, ip): for plugin in self.plugins: if plugin.isActivated(): plugin.afterReconnecting(ip) @lock def unrarFinished(self, folder, fname): for plugin in self.plugins: plugin.unrarFinished(folder, fname) def startThread(self, function, pyfile): t = HookThread(self.core.threadManager, function, pyfile)