From c8c839608b98cc3b37e90d049b66e646f8e46cd9 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Thu, 23 Feb 2006 02:59:37 +0000 Subject: [PATCH] properly unload old plugins and load new plugins --- lib/python/Components/PluginComponent.py | 68 ++++++++++++++---------- lib/python/Plugins/Plugin.py | 3 ++ lib/python/Screens/PluginBrowser.py | 2 +- 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/lib/python/Components/PluginComponent.py b/lib/python/Components/PluginComponent.py index e55bbd4d..e5ceb90d 100644 --- a/lib/python/Components/PluginComponent.py +++ b/lib/python/Components/PluginComponent.py @@ -34,38 +34,48 @@ class PluginComponent: if x == PluginDescriptor.WHERE_AUTOSTART: plugin(reason=1) - def reReadPluginList(self, directory, depth = 1): - print "re-reading plugin list" - self.clearPluginList() - self.readPluginList(directory=directory, depth=depth) - - def readPluginList(self, directory, modules = [], depth = 1): + def readPluginList(self, directory): """enumerates plugins""" - directories = os.listdir(directory) + categories = os.listdir(directory) + + new_plugins = [ ] + + for c in categories: + directory_category = directory + c + if not os.path.isdir(directory_category): + continue + open(directory_category + "/__init__.py", "a").close() + for x in os.listdir(directory_category): + path = directory_category + "/" + x + "/" + if os.path.isdir(path): + if fileExists(path + "plugin.py"): + plugin = my_import('.'.join(["Plugins", c, x, "plugin"])) + + if not plugin.__dict__.has_key("Plugins"): + print "Plugin %s doesn't have 'Plugin'-call." % (x) + continue + + plugins = plugin.Plugins() + + # allow single entry not to be a list + if type(plugins) is not list: + plugins = [ plugins ] + + for p in plugins: + p.updateIcon(path) + new_plugins.append(p) + + # build a diff between the old list of plugins and the new one + # internally, the "fnc" argument will be compared with __eq__ + plugins_added = [p for p in new_plugins if p not in self.pluginList] + plugins_removed = [p for p in self.pluginList if p not in new_plugins] + + for p in plugins_removed: + self.removePlugin(p) - for x in directories: - path = directory + x + "/" - if os.path.isdir(path): - if fileExists(path + "plugin.py"): - plugin = my_import('.'.join(["Plugins"] + modules + [x, "plugin"])) - - if not plugin.__dict__.has_key("Plugins"): - print "Plugin %s doesn't have 'Plugin'-call." % (x) - continue - - plugins = plugin.Plugins() - - # allow single entry not to be a list - if type(plugins) is not list: - plugins = [ plugins ] - - for p in plugins: - p.updateIcon(path) - self.addPlugin(p); - else: - open(path + "__init__.py", "a").close() - self.readPluginList(path, modules + [x], depth - 1) + for p in plugins_added: + self.addPlugin(p) def getPlugins(self, where): """Get list of plugins in a specific category""" diff --git a/lib/python/Plugins/Plugin.py b/lib/python/Plugins/Plugin.py index 0378ce4c..4b5b7e2a 100644 --- a/lib/python/Plugins/Plugin.py +++ b/lib/python/Plugins/Plugin.py @@ -44,3 +44,6 @@ class PluginDescriptor: self.icon = loadPNG(path + self.iconstr) else: self.icon = None + + def __eq__(self, other): + return self.__call__ == other.__call__ diff --git a/lib/python/Screens/PluginBrowser.py b/lib/python/Screens/PluginBrowser.py index a21dde80..99c0ac24 100644 --- a/lib/python/Screens/PluginBrowser.py +++ b/lib/python/Screens/PluginBrowser.py @@ -112,7 +112,7 @@ class PluginDownloadBrowser(Screen): self.container.execute("ipkg update") def installFinished(self): - plugins.reReadPluginList(resolveFilename(SCOPE_PLUGINS)) + plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) self.close() def runFinished(self, retval): -- 2.30.2