+ statuspng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ self.statuslist.append(( _("Error"), '', _("There was an error downloading the packetlist. Please try again." ),'', '', statuspng, divpng, None, '' ))
+ self["list"].style = "default"
+ self['list'].setList(self.statuslist)
+
+
+ def getUpdateInfos(self):
+ self.setState('update')
+ iSoftwareTools.startSoftwareTools(self.getUpdateInfosCB)
+
+ def getUpdateInfosCB(self, retval = None):
+ if retval is not None:
+ if retval is True:
+ if iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.available_updates) + _(" updates available."))
+ else:
+ self["status"].setText(_("There are no updates available."))
+ self.rebuildList()
+ elif retval is False:
+ self.setState('error')
+ if iSoftwareTools.NetworkConnectionAvailable:
+ self["status"].setText(_("Updatefeed not available."))
+ else:
+ self["status"].setText(_("No network connection available."))
+
+ def rebuildList(self, retval = None):
+ if self.currentSelectedTag is None:
+ self.buildCategoryList()
+ else:
+ self.buildPacketList(self.currentSelectedTag)
+
+ 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(_("Uninstall"))
+ elif current[4] == 'installable':
+ self["key_green"].setText(_("Install"))
+ elif current[4] == 'remove':
+ self["key_green"].setText(_("Undo uninstall"))
+ elif current[4] == 'install':
+ self["key_green"].setText(_("Undo install"))
+ self["key_yellow"].setText(_("View details"))
+ self["key_blue"].setText("")
+ if len(self.selectedFiles) == 0 and iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.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 are currently no outstanding actions."))
+ 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 iSoftwareTools.available_updates is not 0:
+ self["status"].setText(_("There are at least ") + str(iSoftwareTools.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 are currently no outstanding actions."))
+
+ def getSelectionState(self, detailsFile):
+ for entry in self.selectedFiles:
+ if entry[0] == detailsFile:
+ return True
+ return False
+
+ 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]))
+ self.currentSelectedPackage = ((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 = iSoftwareTools.directory[0] + "/" + current[1]
+ if (os_path.exists(detailsfile) == True):
+ self.saved_currentSelectedPackage = self.currentSelectedPackage
+ 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 = None):
+ if result is not None:
+ if result is not False:
+ self.setState('sync')
+ iSoftwareTools.lastDownloadDate = time()
+ for entry in self.selectedFiles:
+ if entry == self.saved_currentSelectedPackage:
+ self.selectedFiles.remove(entry)
+ iSoftwareTools.startIpkgListInstalled(self.rebuildList)
+
+ def buildEntryComponent(self, name, details, description, packagename, state, selected = False):
+ divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png"))
+ installedpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installed.png"))
+ installablepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/installable.png"))
+ removepng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/remove.png"))
+ installpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/SoftwareManager/install.png"))
+ if state == 'installed':
+ return((name, details, description, packagename, state, installedpng, divpng, selected))
+ elif state == 'installable':
+ return((name, details, description, packagename, state, installablepng, divpng, selected))
+ elif state == 'remove':
+ return((name, details, description, packagename, state, removepng, divpng, selected))
+ elif state == 'install':
+ 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 iSoftwareTools.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 = ""
+ name = x[0].strip()
+ details = x[1].strip()
+ description = x[2].strip()
+ packagename = x[3].strip()
+ selectState = self.getSelectionState(details)
+ if iSoftwareTools.installed_packetlist.has_key(packagename):
+ if selectState == True:
+ status = "remove"
+ else:
+ status = "installed"
+ self.list.append(self.buildEntryComponent(name, details, description, packagename, status, selected = selectState))
+ else:
+ if selectState == True:
+ status = "install"
+ else:
+ status = "installable"
+ self.list.append(self.buildEntryComponent(name, details, description, packagename, 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 iSoftwareTools.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(( _("Satellite equipment"), _("View list of available Satellite equipment 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 iSoftwareTools.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 = iSoftwareTools.directory[0] + "/" + plugin[0]
+ if (os_path.exists(detailsfile) == True):
+ iSoftwareTools.fillPackageDetails(plugin[0])
+ self.package = iSoftwareTools.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 = None):
+ if result is not None:
+ if result[0] is True:
+ self.session.openWithCallback(self.runExecuteFinished, Ipkg, cmdList = self.cmdList)
+ elif result[0] is False:
+ self.cmdList = result[1]
+ 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.selectedFiles = []
+ self.detailsClosed(True)
+ if result:
+ quitMainloop(3)
+
+ def reloadPluginlist(self):
+ plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+
+
+class PluginManagerInfo(Screen):
+ skin = """
+ <screen name="PluginManagerInfo" position="center,center" size="560,450" title="Plugin manager activity information" >
+ <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" alphatest="on" />
+ <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" alphatest="on" />
+ <widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
+ <widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
+ <widget source="list" render="Listbox" position="5,50" size="550,350" scrollbarMode="showOnDemand" selectionDisabled="1">
+ <convert type="TemplatedMultiContent">
+ {"template": [
+ MultiContentEntryText(pos = (50, 0), size = (150, 26), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
+ MultiContentEntryText(pos = (50, 27), size = (540, 23), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the state
+ MultiContentEntryPixmapAlphaTest(pos = (0, 1), size = (48, 48), png = 2), # index 2 is the status pixmap
+ MultiContentEntryPixmapAlphaTest(pos = (0, 48), size = (550, 2), png = 3), # index 3 is the div pixmap
+ ],
+ "fonts": [gFont("Regular", 24),gFont("Regular", 22)],
+ "itemHeight": 50
+ }
+ </convert>
+ </widget>
+ <ePixmap pixmap="skin_default/div-h.png" position="0,404" zPosition="10" size="560,2" transparent="1" alphatest="on" />
+ <widget source="status" render="Label" position="5,408" zPosition="10" size="550,44" halign="center" valign="center" font="Regular;22" transparent="1" shadowColor="black" shadowOffset="-1,-1" />
+ </screen>"""
+
+ def __init__(self, session, plugin_path, cmdlist = None):
+ Screen.__init__(self, session)
+ self.session = session
+ self.skin_path = plugin_path
+ self.cmdlist = cmdlist
+
+ self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions"],
+ {
+ "ok": self.process_all,
+ "back": self.exit,
+ "red": self.exit,
+ "green": self.process_extensions,
+ }, -1)
+
+ self.list = []
+ self["list"] = List(self.list)
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("Only extensions."))
+ self["status"] = StaticText(_("Following tasks will be done after you press OK!"))
+
+ self.onShown.append(self.setWindowTitle)
+ self.onLayoutFinish.append(self.rebuildList)
+
+ def setWindowTitle(self):
+ self.setTitle(_("Plugin manager activity information"))