X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/afdb23adeccba916f1b17a5e643a43bb1699a365..533dd652737ca702c0e9528ed06e8a17b9ec72c5:/lib/python/Components/DreamInfoHandler.py diff --git a/lib/python/Components/DreamInfoHandler.py b/lib/python/Components/DreamInfoHandler.py index cc071607..2f2e757c 100644 --- a/lib/python/Components/DreamInfoHandler.py +++ b/lib/python/Components/DreamInfoHandler.py @@ -1,8 +1,9 @@ import xml.sax -from Tools.Directories import crawlDirectory, resolveFilename, SCOPE_CONFIG, SCOPE_SKIN +from Tools.Directories import crawlDirectory, resolveFilename, SCOPE_CONFIG, SCOPE_SKIN, 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 @@ -22,16 +23,15 @@ class InfoHandler(xml.sax.ContentHandler): self.elements = [] self.validFileTypes = ["skin", "config", "services", "favourites", "package"] self.prerequisitesMet = prerequisiteMet - - + def printError(self, error): print "Error in defaults xml files:", error raise InfoHandlerParseError, error def startElement(self, name, attrs): - print name, ":", attrs.items() + #print name, ":", attrs.items() self.elements.append(name) - if name in ["hardware", "bcastsystem", "satellite"]: + if name in ("hardware", "bcastsystem", "satellite", "tag"): if not attrs.has_key("type"): self.printError(str(name) + " tag with no type attribute") if self.elements[-3] == "default": @@ -63,11 +63,11 @@ class InfoHandler(xml.sax.ContentHandler): self.filetype = type self.fileattrs = attrs def endElement(self, name): - print "end", name - print "self.elements:", self.elements + #print "end", name + #print "self.elements:", self.elements self.elements.pop() if name == "file": - print "prerequisites:", self.prerequisites + #print "prerequisites:", self.prerequisites if len(self.prerequisites) == 0 or self.prerequisitesMet(self.prerequisites): if not self.attributes.has_key(self.filetype): self.attributes[self.filetype] = [] @@ -89,7 +89,7 @@ class InfoHandler(xml.sax.ContentHandler): self.attributes["author"] = str(data) if self.elements[-1] == "name": self.attributes["name"] = str(data) - print "characters", data + #print "characters", data class DreamInfoHandler: STATUS_WORKING = 0 @@ -97,17 +97,27 @@ class DreamInfoHandler: STATUS_ERROR = 2 STATUS_INIT = 4 - def __init__(self, statusCallback): + def __init__(self, statusCallback, blocking = False, neededTag = None): + self.hardware_info = HardwareInfo() self.directory = "/" + self.neededTag = neededTag + + # caution: blocking should only be used, if further execution in enigma2 depends on the outcome of + # the installer! + self.blocking = blocking + + 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 = [] - + def readInfo(self, directory, file): print "Reading .info file", file handler = InfoHandler(self.prerequisiteMet, directory) @@ -122,7 +132,13 @@ class DreamInfoHandler: # prerequisites = True: give only packages matching the prerequisites def fillPackagesList(self, prerequisites = True): self.packageslist = [] - packages = crawlDirectory(self.directory, ".*\.info$") + packages = [] + if not isinstance(self.directory, list): + self.directory = [self.directory] + + for directory in self.directory: + packages += crawlDirectory(directory, ".*\.info$") + for package in packages: self.readInfo(package[0] + "/", package[0] + "/" + package[1]) @@ -130,24 +146,57 @@ class DreamInfoHandler: for package in self.packageslist[:]: if not self.prerequisiteMet(package[0]["prerequisites"]): self.packageslist.remove(package) - return packages + return self.packageslist def prerequisiteMet(self, prerequisites): # TODO: we need to implement a hardware detection here... print "prerequisites:", prerequisites met = True + if self.neededTag is None: + if prerequisites.has_key("tag"): + return False + else: + if prerequisites.has_key("tag"): + if not self.neededTag in prerequisites["tag"]: + return False + else: + return False + + 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): + print "installing packages", indexes + if len(indexes) == 0: + self.setStatus(self.STATUS_DONE) + return + self.installIndexes = indexes + print "+++++++++++++++++++++++bla" + self.currentlyInstallingMetaIndex = 0 + 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"] @@ -162,15 +211,30 @@ 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 - if self.currentAttributeIndex >= len(self.attributeNames): # end reached - self.setStatus(self.STATUS_DONE) - return + if self.currentAttributeIndex >= len(self.attributeNames): # end of package reached + print "end of package reached" + if self.currentlyInstallingMetaIndex is None or self.currentlyInstallingMetaIndex >= len(self.installIndexes) - 1: + print "set status to DONE" + self.setStatus(self.STATUS_DONE) + return + 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 @@ -182,6 +246,7 @@ class DreamInfoHandler: self.installNext() return else: # nothing to install here + self.currentIndex = -1 self.currentAttributeIndex += 1 self.installNext() return @@ -221,9 +286,13 @@ class DreamInfoHandler: self.installNext() def installIPK(self, directory, name): - self.ipkg = IpkgComponent() - self.ipkg.addCallback(self.ipkgCallback) - self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': directory + name}) + if self.blocking: + os.system("ipkg install " + directory + name) + self.installNext() + else: + self.ipkg = IpkgComponent() + self.ipkg.addCallback(self.ipkgCallback) + self.ipkg.startCmd(IpkgComponent.CMD_INSTALL, {'package': directory + name}) def ipkgCallback(self, event, param): print "ipkgCallback" @@ -235,22 +304,31 @@ class DreamInfoHandler: def installSkin(self, directory, name): print "installing skin:", directory, " - ", name print "cp -a %s %s" % (directory, resolveFilename(SCOPE_SKIN)) - if self.console.execute("cp -a %s %s" % (directory, resolveFilename(SCOPE_SKIN))): - print "execute failed" + if self.blocking: + copytree(directory, resolveFilename(SCOPE_SKIN)) self.installNext() + else: + if self.console.execute("cp -a %s %s" % (directory, resolveFilename(SCOPE_SKIN))): + print "execute failed" + self.installNext() def mergeServices(self, directory, name, merge = False): print "merging services:", directory, " - ", name - - db = eDVBDB.getInstance() - db.reloadServicelist() - db.loadServicelist(directory + name) - db.saveServicelist() + if os.path.isfile(directory + name): + db = eDVBDB.getInstance() + db.reloadServicelist() + db.loadServicelist(directory + name) + db.saveServicelist() self.installNext() def installFavourites(self, directory, name): print "installing favourites:", directory, " - ", name + self.reloadFavourites = True - if self.console.execute("cp %s %s" % ((directory + name), resolveFilename(SCOPE_CONFIG))): - print "execute failed" + if self.blocking: + copyfile(directory + name, resolveFilename(SCOPE_CONFIG)) self.installNext() + else: + if self.console.execute("cp %s %s" % ((directory + name), resolveFilename(SCOPE_CONFIG))): + print "execute failed" + self.installNext()