X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FComponents%2FDreamInfoHandler.py;h=25397feb48260db796e6f50fb427d9c3325c7986;hp=570143da2e5377ce2124741c575fd9b0234fb906;hb=f1a86786decb08fe741c39aeef1706d8b48e87a7;hpb=7f219531682843b95e48bc51365718f4b5fb86da diff --git a/lib/python/Components/DreamInfoHandler.py b/lib/python/Components/DreamInfoHandler.py old mode 100644 new mode 100755 index 570143d..25397fe --- a/lib/python/Components/DreamInfoHandler.py +++ b/lib/python/Components/DreamInfoHandler.py @@ -1,8 +1,10 @@ +# -*- coding: iso-8859-1 -*- import xml.sax -from Tools.Directories import crawlDirectory, resolveFilename, SCOPE_CONFIG, SCOPE_SKIN +from Tools.Directories import crawlDirectory, resolveFilename, SCOPE_CONFIG, SCOPE_SKIN, SCOPE_METADIR, copyfile, copytree from Components.NimManager import nimmanager from Components.Ipkg import IpkgComponent from Components.config import config, configfile +from Tools.HardwareInfo import HardwareInfo from enigma import eConsoleAppContainer, eDVBDB import os @@ -13,7 +15,7 @@ class InfoHandlerParseError(Exception): return repr(self.value) class InfoHandler(xml.sax.ContentHandler): - def __init__(self, prerequisiteMet, directory): + def __init__(self, prerequisiteMet, directory, language = None): self.attributes = {} self.directory = directory self.list = [] @@ -22,19 +24,21 @@ class InfoHandler(xml.sax.ContentHandler): self.elements = [] self.validFileTypes = ["skin", "config", "services", "favourites", "package"] self.prerequisitesMet = prerequisiteMet - - + self.data = "" + self.languagedata = "" + self.language = language + def printError(self, error): print "Error in defaults xml files:", error raise InfoHandlerParseError, error - + def startElement(self, name, attrs): #print name, ":", attrs.items() self.elements.append(name) - if name in ["hardware", "bcastsystem", "satellite", "tag"]: + if name in ("hardware", "bcastsystem", "satellite", "tag", "flag"): if not attrs.has_key("type"): self.printError(str(name) + " tag with no type attribute") - if self.elements[-3] == "default": + if self.elements[-3] in ("default", "package"): prerequisites = self.globalprerequisites else: prerequisites = self.prerequisites @@ -45,6 +49,8 @@ class InfoHandler(xml.sax.ContentHandler): if attrs.has_key("type"): if attrs["type"] == "directories": self.attributes["filestype"] = "directories" + elif attrs["type"] == "package": + self.attributes["filestype"] = "package" # TODO add a compressed archive type if name == "file": self.prerequisites = {} @@ -62,6 +68,21 @@ class InfoHandler(xml.sax.ContentHandler): else: self.filetype = type self.fileattrs = attrs + + if name == "package": + if attrs.has_key("details"): + self.attributes["details"] = str(attrs["details"]) + if attrs.has_key("name"): + self.attributes["name"] = str(attrs["name"].encode("utf-8")) + if attrs.has_key("packagename"): + self.attributes["packagename"] = str(attrs["packagename"].encode("utf-8")) + if attrs.has_key("shortdescription"): + self.attributes["shortdescription"] = str(attrs["shortdescription"].encode("utf-8")) + + if name == "screenshot": + if attrs.has_key("src"): + self.attributes["screenshot"] = str(attrs["src"]) + def endElement(self, name): #print "end", name #print "self.elements:", self.elements @@ -78,17 +99,32 @@ class InfoHandler(xml.sax.ContentHandler): else: directory = self.directory self.attributes[self.filetype].append({ "name": str(self.fileattrs["name"]), "directory": directory }) - - if name == "default": + + if name in ( "default", "package" ): self.list.append({"attributes": self.attributes, 'prerequisites': self.globalprerequisites}) self.attributes = {} self.globalprerequisites = {} - + def characters(self, data): if self.elements[-1] == "author": self.attributes["author"] = str(data) if self.elements[-1] == "name": self.attributes["name"] = str(data) + if self.elements[-1] == "packagename": + self.attributes["packagename"] = str(data.encode("utf-8")) + if self.elements[-1] == "shortdescription": + self.attributes["shortdescription"] = str(data.encode("utf-8")) + if self.elements[-1] == "description": + self.data += data.strip() + self.attributes["description"] = str(self.data.encode("utf-8")) + if self.language is not None: + if self.elements[-1] == ("name_" + str(self.language)): + self.attributes["name"] = str(data.encode("utf-8")) + if self.elements[-1] == ("shortdescription_" + str(self.language)): + self.attributes["shortdescription"] = str(data.encode("utf-8")) + if self.elements[-1] == ("description_" + str(self.language)): + self.languagedata += data.strip() + self.attributes["description"] = str(self.languagedata.encode("utf-8")) #print "characters", data class DreamInfoHandler: @@ -97,10 +133,13 @@ class DreamInfoHandler: STATUS_ERROR = 2 STATUS_INIT = 4 - def __init__(self, statusCallback, blocking = False, neededTag = None): + def __init__(self, statusCallback, blocking = False, neededTag = None, neededFlag = None, language = None): + self.hardware_info = HardwareInfo() self.directory = "/" self.neededTag = neededTag + self.neededFlag = neededFlag + self.language = language # caution: blocking should only be used, if further execution in enigma2 depends on the outcome of # the installer! @@ -109,13 +148,16 @@ class DreamInfoHandler: self.currentlyInstallingMetaIndex = None self.console = eConsoleAppContainer() - self.console.appClosed.get().append(self.installNext) + self.console.appClosed.append(self.installNext) + self.reloadFavourites = False self.statusCallback = statusCallback self.setStatus(self.STATUS_INIT) self.packageslist = [] - + self.packagesIndexlist = [] + self.packageDetails = [] + def readInfo(self, directory, file): print "Reading .info file", file handler = InfoHandler(self.prerequisiteMet, directory) @@ -126,7 +168,29 @@ class DreamInfoHandler: except InfoHandlerParseError: print "file", file, "ignored due to errors in the file" print handler.list - + + def readIndex(self, directory, file): + print "Reading .xml meta index file", file + handler = InfoHandler(self.prerequisiteMet, directory, self.language) + try: + xml.sax.parse(file, handler) + for entry in handler.list: + self.packagesIndexlist.append((entry,file)) + except InfoHandlerParseError: + print "file", file, "ignored due to errors in the file" + #print handler.list + + def readDetails(self, directory, file): + print "Reading .xml meta details file", file + handler = InfoHandler(self.prerequisiteMet, directory, self.language) + try: + xml.sax.parse(file, handler) + for entry in handler.list: + self.packageDetails.append((entry,file)) + except InfoHandlerParseError: + print "file", file, "ignored due to errors in the file" + #print handler.list + # prerequisites = True: give only packages matching the prerequisites def fillPackagesList(self, prerequisites = True): self.packageslist = [] @@ -145,6 +209,32 @@ class DreamInfoHandler: if not self.prerequisiteMet(package[0]["prerequisites"]): self.packageslist.remove(package) return self.packageslist + + # prerequisites = True: give only packages matching the prerequisites + def fillPackagesIndexList(self, prerequisites = True): + self.packagesIndexlist = [] + if self.language is not None: + indexfile = 'index_' + self.language + '.xml' + else: + indexfile = 'index.xml' + if not isinstance(self.directory, list): + self.directory = [self.directory] + self.readIndex(self.directory[0] + "/", self.directory[0] + "/" + indexfile) + + if prerequisites: + for package in self.packagesIndexlist[:]: + if not self.prerequisiteMet(package[0]["prerequisites"]): + self.packagesIndexlist.remove(package) + return self.packagesIndexlist + + # prerequisites = True: give only packages matching the prerequisites + def fillPackageDetails(self, details = None): + self.packageDetails = [] + detailsfile = details + if not isinstance(self.directory, list): + self.directory = [self.directory] + self.readDetails(self.directory[0] + "/", self.directory[0] + "/" + detailsfile) + return self.packageDetails def prerequisiteMet(self, prerequisites): # TODO: we need to implement a hardware detection here... @@ -153,24 +243,43 @@ class DreamInfoHandler: if self.neededTag is None: if prerequisites.has_key("tag"): return False + elif self.neededTag == 'ALL_TAGS': + return True else: if prerequisites.has_key("tag"): if not self.neededTag in prerequisites["tag"]: return False + else: + return False + + if self.neededFlag is None: + if prerequisites.has_key("flag"): + return False + else: + if prerequisites.has_key("flag"): + if not self.neededFlag in prerequisites["flag"]: + return False + else: + return True # No flag found, assuming all flags valid if prerequisites.has_key("satellite"): for sat in prerequisites["satellite"]: if int(sat) not in nimmanager.getConfiguredSats(): return False if prerequisites.has_key("bcastsystem"): + has_system = False for bcastsystem in prerequisites["bcastsystem"]: if nimmanager.hasNimType(bcastsystem): - return True - return False + has_system = True + if not has_system: + return False if prerequisites.has_key("hardware"): + hardware_found = False for hardware in prerequisites["hardware"]: - # TODO: hardware detection - met = True + if hardware == self.hardware_info.device_name: + hardware_found = True + if not hardware_found: + return False return True def installPackages(self, indexes): @@ -184,6 +293,10 @@ class DreamInfoHandler: self.installPackage(self.installIndexes[self.currentlyInstallingMetaIndex]) def installPackage(self, index): + print "self.packageslist:", self.packageslist + if len(self.packageslist) <= index: + print "no package with index", index, "found... installing nothing" + return print "installing package with index", index, "and name", self.packageslist[index][0]["attributes"]["name"] attributes = self.packageslist[index][0]["attributes"] @@ -198,6 +311,10 @@ class DreamInfoHandler: self.statusCallback(self.status, None) def installNext(self, *args, **kwargs): + if self.reloadFavourites: + self.reloadFavourites = False + db = eDVBDB.getInstance().reloadBouquets() + self.currentIndex += 1 attributes = self.installingAttributes #print "attributes:", attributes @@ -211,10 +328,13 @@ class DreamInfoHandler: else: print "increment meta index to install next package" self.currentlyInstallingMetaIndex += 1 + self.currentAttributeIndex = 0 self.installPackage(self.installIndexes[self.currentlyInstallingMetaIndex]) + return self.setStatus(self.STATUS_WORKING) + print "currentAttributeIndex:", self.currentAttributeIndex currentAttribute = self.attributeNames[self.currentAttributeIndex] print "installing", currentAttribute, "with index", self.currentIndex @@ -285,7 +405,7 @@ class DreamInfoHandler: print "installing skin:", directory, " - ", name print "cp -a %s %s" % (directory, resolveFilename(SCOPE_SKIN)) if self.blocking: - os.system("cp -a %s %s" % (directory, resolveFilename(SCOPE_SKIN))) + copytree(directory, resolveFilename(SCOPE_SKIN)) self.installNext() else: if self.console.execute("cp -a %s %s" % (directory, resolveFilename(SCOPE_SKIN))): @@ -303,9 +423,10 @@ class DreamInfoHandler: def installFavourites(self, directory, name): print "installing favourites:", directory, " - ", name + self.reloadFavourites = True if self.blocking: - os.system("cp %s %s" % ((directory + name), resolveFilename(SCOPE_CONFIG))) + copyfile(directory + name, resolveFilename(SCOPE_CONFIG)) self.installNext() else: if self.console.execute("cp %s %s" % ((directory + name), resolveFilename(SCOPE_CONFIG))):