don't allow leaving the software update plugin while ipkg is running
[enigma2.git] / lib / python / Plugins / SystemPlugins / SoftwareUpdate / plugin.py
index c0649b13a15b989de5bdef865b647ec550cba076..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
 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 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 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
 
 
 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)
                                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:
        def runUpgrade(self, result):
                if result:
-                       self.session.open(Console, title = "Upgrade running...", cmdlist = ["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 = """
 
 class IPKGSource(Screen):
        skin = """
@@ -151,7 +165,7 @@ class PacketList(GUIComponent):
        def invalidate(self):
                self.l.invalidate()
 
        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" />
        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()
                        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):
 
 def UpgradeMain(session, **kwargs):
-       session.open(UpdatePluginMenu)
+       session.open(UpdatePlugin)
 
 def Plugins(**kwargs):
 
 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)