diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2010-01-02 10:58:02 +0100 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2010-01-02 10:58:02 +0100 |
| commit | 64cfba23aba53b4ab3933284b2a4a9ef5ec68e26 (patch) | |
| tree | 75ffa0a1c53462e7efcc0261f6167563bef9f178 /lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py | |
| parent | 54e5f0d7d4e983b448b9cf387ed62291595cc5a5 (diff) | |
| parent | c32caa3b71b68fc380681670804953abb2fd4ae8 (diff) | |
| download | enigma2-64cfba23aba53b4ab3933284b2a4a9ef5ec68e26.tar.gz enigma2-64cfba23aba53b4ab3933284b2a4a9ef5ec68e26.zip | |
Merge remote branch 'origin/bug_112_enable_extensions_manager'
Diffstat (limited to 'lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py')
| -rwxr-xr-x | lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py new file mode 100755 index 00000000..4e7591ef --- /dev/null +++ b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py @@ -0,0 +1,226 @@ +from enigma import eConsoleAppContainer +from Components.Console import Console +from Components.About import about +from Components.DreamInfoHandler import DreamInfoHandler +from Components.Language import language +from Components.Sources.List import List +from Components.Ipkg import IpkgComponent +from Components.Network import iNetwork +from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_METADIR + +from time import time + +class SoftwareTools(DreamInfoHandler): + lastDownloadDate = None + NetworkConnectionAvailable = None + list_updating = False + available_updates = 0 + available_updatelist = [] + available_packetlist = [] + installed_packetlist = {} + + + def __init__(self): + aboutInfo = about.getImageVersionString() + if aboutInfo.startswith("dev-"): + self.ImageVersion = 'Experimental' + else: + self.ImageVersion = 'Stable' + self.language = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country" + DreamInfoHandler.__init__(self, self.statusCallback, blocking = False, neededTag = 'ALL_TAGS', neededFlag = self.ImageVersion, language = self.language) + self.directory = resolveFilename(SCOPE_METADIR) + self.list = List([]) + self.NotifierCallback = None + self.Console = Console() + self.UpdateConsole = Console() + self.cmdList = [] + self.unwanted_extensions = ('-dbg', '-dev', '-doc') + self.ipkg = IpkgComponent() + self.ipkg.addCallback(self.ipkgCallback) + + def statusCallback(self, status, progress): + pass + + def startSoftwareTools(self, callback = None): + if callback is not None: + self.NotifierCallback = callback + iNetwork.checkNetworkState(self.checkNetworkCB) + + def checkNetworkCB(self,data): + if data is not None: + if data <= 2: + SoftwareTools.NetworkConnectionAvailable = True + self.getUpdates() + else: + SoftwareTools.NetworkConnectionAvailable = False + self.getUpdates() + + def getUpdates(self, callback = None): + if SoftwareTools.NetworkConnectionAvailable == True: + SoftwareTools.lastDownloadDate = time() + if SoftwareTools.list_updating is False and callback is None: + SoftwareTools.list_updating = True + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + elif SoftwareTools.list_updating is False and callback is not None: + SoftwareTools.list_updating = True + self.NotifierCallback = callback + self.ipkg.startCmd(IpkgComponent.CMD_UPDATE) + elif SoftwareTools.list_updating is True and callback is not None: + #update info collecting already in progress + self.NotifierCallback = callback + else: + SoftwareTools.list_updating = False + if callback is not None: + callback(False) + elif self.NotifierCallback is not None: + self.NotifierCallback(False) + + def ipkgCallback(self, event, param): + if event == IpkgComponent.EVENT_ERROR: + SoftwareTools.list_updating = False + elif event == IpkgComponent.EVENT_DONE: + if SoftwareTools.list_updating: + self.startIpkgListAvailable() + pass + + def startIpkgListAvailable(self, callback = None): + if callback is not None: + SoftwareTools.list_updating = True + if SoftwareTools.list_updating: + if not self.UpdateConsole: + self.UpdateConsole = Console() + cmd = "ipkg list" + self.UpdateConsole.ePopen(cmd, self.IpkgListAvailableCB, callback) + + def IpkgListAvailableCB(self, result, retval, extra_args = None): + (callback) = extra_args + if len(result): + if SoftwareTools.list_updating: + SoftwareTools.available_packetlist = [] + for x in result.splitlines(): + split = x.split(' - ') + name = split[0].strip() + if not any(name.endswith(x) for x in self.unwanted_extensions): + SoftwareTools.available_packetlist.append([name, split[1].strip(), split[2].strip()]) + if callback is None: + self.startInstallMetaPackage() + else: + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + callback(True) + else: + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(False) + + def startInstallMetaPackage(self, callback = None): + if callback is not None: + SoftwareTools.list_updating = True + if SoftwareTools.list_updating: + if not self.UpdateConsole: + self.UpdateConsole = Console() + cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta" + self.UpdateConsole.ePopen(cmd, self.InstallMetaPackageCB, callback) + + def InstallMetaPackageCB(self, result, retval, extra_args = None): + (callback) = extra_args + if len(result): + self.fillPackagesIndexList() + if callback is None: + self.startIpkgListInstalled() + else: + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + callback(True) + else: + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(False) + + def startIpkgListInstalled(self, callback = None): + if callback is not None: + SoftwareTools.list_updating = True + if SoftwareTools.list_updating: + if not self.UpdateConsole: + self.UpdateConsole = Console() + cmd = "ipkg list_installed" + self.UpdateConsole.ePopen(cmd, self.IpkgListInstalledCB, callback) + + def IpkgListInstalledCB(self, result, retval, extra_args = None): + (callback) = extra_args + if len(result): + SoftwareTools.installed_packetlist = {} + for x in result.splitlines(): + split = x.split(' - ') + name = split[0].strip() + if not any(name.endswith(x) for x in self.unwanted_extensions): + SoftwareTools.installed_packetlist[name] = split[1].strip() + if callback is None: + self.countUpdates() + else: + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + callback(True) + else: + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(False) + + def countUpdates(self, callback = None): + SoftwareTools.available_updates = 0 + SoftwareTools.available_updatelist = [] + for package in self.packagesIndexlist[:]: + attributes = package[0]["attributes"] + packagename = attributes["packagename"] + for x in SoftwareTools.available_packetlist: + if x[0] == packagename: + if SoftwareTools.installed_packetlist.has_key(packagename): + if SoftwareTools.installed_packetlist[packagename] != x[1]: + SoftwareTools.available_updates +=1 + SoftwareTools.available_updatelist.append([packagename]) + + SoftwareTools.list_updating = False + if self.UpdateConsole: + if len(self.UpdateConsole.appContainers) == 0: + if callback is not None: + callback(True) + callback = None + elif self.NotifierCallback is not None: + self.NotifierCallback(True) + self.NotifierCallback = None + + def startIpkgUpdate(self, callback = None): + if not self.Console: + self.Console = Console() + cmd = "ipkg update" + self.Console.ePopen(cmd, self.IpkgUpdateCB, callback) + + def IpkgUpdateCB(self, result, retval, extra_args = None): + (callback) = extra_args + if len(result): + if self.Console: + if len(self.Console.appContainers) == 0: + if callback is not None: + callback(True) + callback = None + + def cleanupSoftwareTools(self): + if self.NotifierCallback is not None: + self.NotifierCallback = None + self.ipkg.stop() + if self.Console is not None: + if len(self.Console.appContainers): + for name in self.Console.appContainers.keys(): + self.Console.kill(name) + if self.UpdateConsole is not None: + if len(self.UpdateConsole.appContainers): + for name in self.UpdateConsole.appContainers.keys(): + self.UpdateConsole.kill(name) + +iSoftwareTools = SoftwareTools()
\ No newline at end of file |
