SystemPlugins/SoftwareManager: - add SoftwareTools.py to factor out some code.
authoracid-burn <acid-burn@opendreambox.org>
Mon, 28 Dec 2009 20:01:06 +0000 (21:01 +0100)
committeracid-burn <acid-burn@opendreambox.org>
Mon, 28 Dec 2009 20:01:06 +0000 (21:01 +0100)
This is for bug #112

lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py [new file with mode: 0755]

diff --git a/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py b/lib/python/Plugins/SystemPlugins/SoftwareManager/SoftwareTools.py
new file mode 100755 (executable)
index 0000000..4e7591e
--- /dev/null
@@ -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