don't allow leaving the software update plugin while ipkg is running
[enigma2.git] / lib / python / Plugins / SystemPlugins / SoftwareUpdate / plugin.py
index af4d8982c73b42008d35b644072caf3d983ce123..dc494e6f1517a1ff08ce7611b7eeb3a4b6e47b25 100644 (file)
@@ -1,4 +1,4 @@
-from enigma import *
+from enigma import eTimer, quitMainloop
 from Screens.Screen import Screen
 from Screens.MessageBox import MessageBox
 from Components.ActionMap import ActionMap, NumberActionMap
@@ -7,8 +7,12 @@ from Components.GUIComponent import *
 from Components.MenuList import MenuList
 from Components.Input import Input
 from Screens.Console import Console
+from Screens.MessageBox import MessageBox
 from Plugins.Plugin import PluginDescriptor
 from Screens.ImageWizard import ImageWizard
+from Components.Ipkg import Ipkg
+from Components.Slider import Slider
+from Components.Label import Label
 
 import os
 
@@ -57,9 +61,19 @@ class UpdatePluginMenu(Screen):
                                self.session.open(Ipkg)
                        elif (self["menu"].l.getCurrentSelection()[1] == "setup"):
                                self.session.open(MessageBox, _("Function not yet implemented"), MessageBox.TYPE_ERROR)
+       
        def runUpgrade(self, result):
                if result:
-                       self.session.open(Console, ["ipkg update", "ipkg upgrade -force-defaults -force-overwrite"])
+                       self.session.open(Console, title = "Upgrade running...", cmdlist = ["ipkg update", "ipkg upgrade -force-defaults -force-overwrite"], finishedCallback = self.runFinished)
+
+       def runFinished(self):
+               self.session.openWithCallback(self.reboot, MessageBox, _("Upgrade finished. Do you want to reboot your Dreambox?"), MessageBox.TYPE_YESNO)
+               
+       def reboot(self, result):
+               if result is None:
+                       return
+               if result:
+                       quitMainloop(3)
 
 class IPKGSource(Screen):
        skin = """
@@ -151,7 +165,7 @@ class PacketList(GUIComponent):
        def invalidate(self):
                self.l.invalidate()
 
-class Ipkg(Screen):
+class Ipkg2(Screen):
        skin = """
                <screen position="100,100" size="550,400" title="IPKG upgrade..." >
                        <widget name="list" position="0,0" size="550,400" scrollbarMode="showOnDemand" />
@@ -218,9 +232,114 @@ class Ipkg(Screen):
                        self.delayTimer.start(0, 1)
                else:
                        self.close()
+                       
+class UpdatePlugin(Screen):
+       skin = """
+               <screen position="100,100" size="550,200" title="Software Update..." >
+                       <widget name="activityslider" position="0,0" size="550,5"  />
+                       <widget name="slider" position="0,100" size="550,30"  />
+                       <widget name="package" position="10,30" size="420,20" font="Regular;18"/>
+                       <widget name="status" position="10,60" size="420,45" font="Regular;18"/>
+               </screen>"""
+               
+       def __init__(self, session, args = None):
+               self.skin = UpdatePlugin.skin
+               Screen.__init__(self, session)
+               
+               self.sliderPackages = { "dreambox-dvb-modules": 1, "enigma2": 2, "tuxbox-image-info": 3 }
+               
+               self.slider = Slider(0, 4)
+               self["slider"] = self.slider
+               self.activityslider = Slider(0, 100)
+               self["activityslider"] = self.activityslider
+               self.status = Label(_("Upgrading Dreambox... Please wait"))
+               self["status"] = self.status
+               self.package = Label()
+               self["package"] = self.package
+               
+               self.packages = 0
+               self.error = 0
+               
+               self.activity = 0
+               self.activityTimer = eTimer()
+               self.activityTimer.timeout.get().append(self.doActivityTimer)
+               self.activityTimer.start(100, False)
+                               
+               self.ipkg = Ipkg()
+               self.ipkg.addCallback(self.ipkgCallback)
+               
+               self.updating = True
+               self.package.setText(_("Package list update"))
+               self.ipkg.cmdUpdate()
+                       
+               self["actions"] = ActionMap(["WizardActions"], 
+               {
+                       "ok": self.exit,
+                       "back": self.exit
+               }, -1)
+               
+       def doActivityTimer(self):
+               self.activity += 1
+               if self.activity == 100:
+                       self.activity = 0
+               self.activityslider.setValue(self.activity)
+               
+       def ipkgCallback(self, event, param):
+               if event == Ipkg.EVENT_DOWNLOAD:
+                       self.status.setText(_("Downloading"))
+               elif event == Ipkg.EVENT_UPGRADE:
+                       if self.sliderPackages.has_key(param):
+                               self.slider.setValue(self.sliderPackages[param])
+                       self.package.setText(param)
+                       self.status.setText(_("Upgrading"))
+                       self.packages += 1
+               elif event == Ipkg.EVENT_INSTALL:
+                       self.package.setText(param)
+                       self.status.setText(_("Installing"))
+                       self.packages += 1
+               elif event == Ipkg.EVENT_CONFIGURING:
+                       self.package.setText(param)
+                       self.status.setText(_("Configuring"))
+               elif event == Ipkg.EVENT_ERROR:
+                       self.error += 1
+               elif event == Ipkg.EVENT_DONE:
+                       if self.updating:
+                               self.updating = False
+                               self.ipkg.cmdUpgrade(test_only = False)
+                       elif self.error == 0:
+                               self.slider.setValue(4)
+                               
+                               self.activityTimer.stop()
+                               self.activityslider.setValue(0)
+                               
+                               self.package.setText("")
+                               self.status.setText(_("Done - Installed or upgraded %d packages") % self.packages)
+                       else:
+                               self.activityTimer.stop()
+                               self.activityslider.setValue(0)
+                               error = _("your dreambox might be unusable now. Please consult the manual for further assistance before rebooting your dreambox.")
+                               if self.packages == 0:
+                                       error = _("No packages were upgraded yet. So you can check your network and try again.")
+                               if self.updating:
+                                       error = _("Your dreambox isn't connected to the internet properly. Please check it and try again.")
+                               self.status.setText(_("Error") +  " - " + error)
+               #print event, "-", param
+               pass
+       
+       def exit(self):
+               if not self.ipkg.isRunning():
+                       if self.packages != 0 and self.error == 0:
+                               self.session.openWithCallback(self.exitAnswer, MessageBox, _("Upgrade finished. Do you want to reboot your Dreambox?"))
+                       else:
+                               self.close()
+                       
+       def exitAnswer(self, result):
+               if result is not None and result:
+                       quitMainloop(2)
+               self.close()
 
 def UpgradeMain(session, **kwargs):
-       session.open(UpdatePluginMenu)
+       session.open(UpdatePlugin)
 
 def Plugins(**kwargs):
-       return PluginDescriptor(name="Softwareupdate", description="Updates your receiver's software", icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain)
+       return PluginDescriptor(name="Softwareupdate", description=_("Updates your receiver's software"), icon="update.png", where = PluginDescriptor.WHERE_PLUGINMENU, fnc=UpgradeMain)