- def selectionChanged(self):
- current = self["list"].getCurrent()
- self["status"].setText("")
- if current:
- if self.currList == "packages":
- self["key_red"].setText(_("Back"))
- if current[4] == 'installed':
- self["key_green"].setText(_("Remove"))
- elif current[4] == 'installable':
- self["key_green"].setText(_("Install"))
- elif current[4] == 'remove':
- self["key_green"].setText(_("Undo\nRemove"))
- elif current[4] == 'install':
- self["key_green"].setText(_("Undo\nInstall"))
- self["key_yellow"].setText(_("View details"))
- self["key_blue"].setText("")
- if len(self.selectedFiles) == 0 and self.available_updates is not 0:
- self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available."))
- elif len(self.selectedFiles) is not 0:
- self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
- else:
- self["status"].setText(_("There is nothing to be done."))
- elif self.currList == "category":
- self["key_red"].setText(_("Close"))
- self["key_green"].setText("")
- self["key_yellow"].setText("")
- self["key_blue"].setText("")
- if len(self.selectedFiles) == 0 and self.available_updates is not 0:
- self["status"].setText(_("There are at least ") + str(self.available_updates) + _(" updates available."))
- self["key_yellow"].setText(_("Update"))
- elif len(self.selectedFiles) is not 0:
- self["status"].setText(str(len(self.selectedFiles)) + _(" packages selected."))
- self["key_yellow"].setText(_("Process"))
- else:
- self["status"].setText(_("There is nothing to be done."))
-
- def getSelectionState(self, detailsFile):
- for entry in self.selectedFiles:
- if entry[0] == detailsFile:
- return True
- return False
-
- def rebuildList(self):
- self.setState('update')
- if not PluginManager.lastDownloadDate or (time() - PluginManager.lastDownloadDate) > 3600:
- # Only update from internet once per hour
- PluginManager.lastDownloadDate = time()
- print "last update time > 1h"
- self.ipkg.startCmd(IpkgComponent.CMD_UPDATE)
- else:
- print "last update time < 1h"
- self.startIpkgList()
-
- def ipkgCallback(self, event, param):
- if event == IpkgComponent.EVENT_ERROR:
- self.list_updating = False
- self.setState('error')
- elif event == IpkgComponent.EVENT_DONE:
- self.startIpkgList()
- pass
-
- def startIpkgList(self):
- if self.list_updating:
- if not self.Console:
- self.Console = Console()
- cmd = "ipkg list"
- self.Console.ePopen(cmd, self.IpkgList_Finished)
-
- def IpkgList_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.available_packetlist = []
- for x in result.splitlines():
- split = x.split(' - ')
- if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
- self.available_packetlist.append([split[0].strip(), split[1].strip(), split[2].strip()])
- self.startInstallMetaPackage()
-
- def startInstallMetaPackage(self):
- if self.list_updating:
- self.list_updating = False
- if not self.Console:
- self.Console = Console()
- cmd = "ipkg install enigma2-meta enigma2-plugins-meta enigma2-skins-meta"
- self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
-
- def InstallMetaPackage_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.fillPackagesIndexList()
- if not self.Console:
- self.Console = Console()
- self.setState('sync')
- cmd = "ipkg list_installed"
- self.Console.ePopen(cmd, self.IpkgListInstalled_Finished)
-
- def IpkgListInstalled_Finished(self, result, retval, extra_args = None):
- if len(result):
- self.installed_packetlist = {}
- for x in result.splitlines():
- split = x.split(' - ')
- if not any(split[0].strip().endswith(x) for x in self.unwanted_extensions):
- self.installed_packetlist[split[0].strip()] = split[1].strip()
- self.countUpdates()
- if self.currentSelectedTag is None:
- self.buildCategoryList()
- else:
- self.buildPacketList(self.currentSelectedTag)
-
- def countUpdates(self):
- self.available_updates = 0
- for package in self.packagesIndexlist[:]:
- attributes = package[0]["attributes"]
- packagename = attributes["packagename"]
- for x in self.available_packetlist:
- if x[0].strip() == packagename:
- if self.installed_packetlist.has_key(packagename):
- if self.installed_packetlist[packagename] != x[1].strip():
- self.available_updates +=1
-
- def handleCurrent(self):
- current = self["list"].getCurrent()
- if current:
- if self.currList == "category":
- self.currentSelectedIndex = self["list"].index
- selectedTag = current[2]
- self.buildPacketList(selectedTag)
- elif self.currList == "packages":
- if current[7] is not '':
- idx = self["list"].getIndex()
- detailsFile = self.list[idx][1]
- if self.list[idx][7] == True:
- for entry in self.selectedFiles:
- if entry[0] == detailsFile:
- self.selectedFiles.remove(entry)
- else:
- alreadyinList = False
- for entry in self.selectedFiles:
- if entry[0] == detailsFile:
- alreadyinList = True
- if not alreadyinList:
- self.selectedFiles.append((detailsFile,current[4],current[3]))
- if current[4] == 'installed':
- self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'remove', True)
- elif current[4] == 'installable':
- self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'install', True)
- elif current[4] == 'remove':
- self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installed', False)
- elif current[4] == 'install':
- self.list[idx] = self.buildEntryComponent(current[0], current[1], current[2], current[3], 'installable',False)
- self["list"].setList(self.list)
- self["list"].setIndex(idx)
- self["list"].updateList(self.list)
- self.selectionChanged()
-
- def handleSelected(self):
- current = self["list"].getCurrent()
- if current:
- if self.currList == "packages":
- if current[7] is not '':
- detailsfile = self.directory[0] + "/" + current[1]
- if (os_path.exists(detailsfile) == True):
- self.session.openWithCallback(self.detailsClosed, PluginDetails, self.skin_path, current)
- else:
- self.session.open(MessageBox, _("Sorry, no Details available!"), MessageBox.TYPE_INFO, timeout = 10)
- elif self.currList == "category":
- self.prepareInstall()
- if len(self.cmdList):
- self.session.openWithCallback(self.runExecute, PluginManagerInfo, self.skin_path, self.cmdList)
-
- def detailsClosed(self, result):
- if result:
- if not self.Console:
- self.Console = Console()
- self.setState('sync')
- PluginManager.lastDownloadDate = time()
- self.selectedFiles = []
- cmd = "ipkg update"
- self.Console.ePopen(cmd, self.InstallMetaPackage_Finished)
-
- def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
- if state == 'installed':
- installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
- return((name, details, description, packagename, state, installedpng, divpng, selected))
- elif state == 'installable':
- installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
- return((name, details, description, packagename, state, installablepng, divpng, selected))
- elif state == 'remove':
- removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
- return((name, details, description, packagename, state, removepng, divpng, selected))
- elif state == 'install':
- installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
- return((name, details, description, packagename, state, installpng, divpng, selected))
-
- def buildPacketList(self, categorytag = None):
- if categorytag is not None:
- self.currList = "packages"
- self.currentSelectedTag = categorytag
- self.packetlist = []
- for package in self.packagesIndexlist[:]:
- prerequisites = package[0]["prerequisites"]
- if prerequisites.has_key("tag"):
- for foundtag in prerequisites["tag"]:
- if categorytag == foundtag:
- attributes = package[0]["attributes"]
- if attributes.has_key("packagetype"):
- if attributes["packagetype"] == "internal":
- continue
- self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
- else:
- self.packetlist.append([attributes["name"], attributes["details"], attributes["shortdescription"], attributes["packagename"]])
- self.list = []
- for x in self.packetlist:
- status = ""
- selectState = self.getSelectionState(x[1].strip())
- if self.installed_packetlist.has_key(x[3].strip()):
- if selectState == True:
- status = "remove"
- else:
- status = "installed"
- self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState))
- else:
- if selectState == True:
- status = "install"
- else:
- status = "installable"
- self.list.append(self.buildEntryComponent(x[0].strip(), x[1].strip(), x[2].strip(), x[3].strip(), status, selected = selectState))
- if len(self.list):
- self.list.sort(key=lambda x: x[0])
- self["list"].style = "default"
- self['list'].setList(self.list)
- self["list"].updateList(self.list)
- self.selectionChanged()
-
- def buildCategoryList(self):
- self.currList = "category"
- self.categories = []
- self.categoryList = []
- for package in self.packagesIndexlist[:]:
- prerequisites = package[0]["prerequisites"]
- if prerequisites.has_key("tag"):
- for foundtag in prerequisites["tag"]:
- attributes = package[0]["attributes"]
- if foundtag not in self.categories:
- self.categories.append(foundtag)
- self.categoryList.append(self.buildCategoryComponent(foundtag))
- self.categoryList.sort(key=lambda x: x[0])
- self["list"].style = "category"
- self['list'].setList(self.categoryList)
- self["list"].updateList(self.categoryList)
- self.selectionChanged()
-
- def buildCategoryComponent(self, tag = None):
- divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
- if tag is not None:
- if tag == 'System':
- return(( _("System"), _("View list of available system extensions" ), tag, divpng ))
- elif tag == 'Skin':
- return(( _("Skins"), _("View list of available skins" ), tag, divpng ))
- elif tag == 'Recording':
- return(( _("Recordings"), _("View list of available recording extensions" ), tag, divpng ))
- elif tag == 'Network':
- return(( _("Network"), _("View list of available networking extensions" ), tag, divpng ))
- elif tag == 'CI':
- return(( _("CommonInterface"), _("View list of available CommonInterface extensions" ), tag, divpng ))
- elif tag == 'Default':
- return(( _("Default Settings"), _("View list of available default settings" ), tag, divpng ))
- elif tag == 'SAT':
- return(( _("Satteliteequipment"), _("View list of available Satteliteequipment extensions." ), tag, divpng ))
- elif tag == 'Software':
- return(( _("Software"), _("View list of available software extensions" ), tag, divpng ))
- elif tag == 'Multimedia':
- return(( _("Multimedia"), _("View list of available multimedia extensions." ), tag, divpng ))
- elif tag == 'Display':
- return(( _("Display and Userinterface"), _("View list of available Display and Userinterface extensions." ), tag, divpng ))
- elif tag == 'EPG':
- return(( _("Electronic Program Guide"), _("View list of available EPG extensions." ), tag, divpng ))
- elif tag == 'Communication':
- return(( _("Communication"), _("View list of available communication extensions." ), tag, divpng ))
- else: # dynamically generate non existent tags
- return(( str(tag), _("View list of available ") + str(tag) + _(" extensions." ), tag, divpng ))
-
- def prepareInstall(self):
- self.cmdList = []
- if self.available_updates > 0:
- self.cmdList.append((IpkgComponent.CMD_UPGRADE, { "test_only": False }))
- if self.selectedFiles and len(self.selectedFiles):
- for plugin in self.selectedFiles:
- detailsfile = self.directory[0] + "/" + plugin[0]
- if (os_path.exists(detailsfile) == True):
- self.fillPackageDetails(plugin[0])
- self.package = self.packageDetails[0]
- if self.package[0].has_key("attributes"):
- self.attributes = self.package[0]["attributes"]
- if self.attributes.has_key("package"):
- self.packagefiles = self.attributes["package"]
- if plugin[1] == 'installed':
- if self.packagefiles:
- for package in self.packagefiles[:]:
- self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": package["name"] }))
- else:
- self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] }))
- else:
- if self.packagefiles:
- for package in self.packagefiles[:]:
- self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": package["name"] }))
- else:
- self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
- else:
- if plugin[1] == 'installed':
- self.cmdList.append((IpkgComponent.CMD_REMOVE, { "package": plugin[2] }))
- else:
- self.cmdList.append((IpkgComponent.CMD_INSTALL, { "package": plugin[2] }))
-
- def runExecute(self, result):
- if result:
- self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
- else:
- self.close()
-
- def runExecuteFinished(self):
- self.session.openWithCallback(self.ExecuteReboot, MessageBox, _("Install or remove finished.") +" "+_("Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
-
- def ExecuteReboot(self, result):
- if result is None:
- return
- if result is False:
- self.reloadPluginlist()
- self.detailsClosed(True)
- if result:
- quitMainloop(3)
-
- def reloadPluginlist(self):
- plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
-
-
-class PluginManagerInfo(Screen):