DeviceManager : prevent MessageBox crash.
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / DeviceManager / plugin.py
index 4ee8037..9076321 100755 (executable)
@@ -522,6 +522,11 @@ class DeviceInit(Screen):
                self.exitMessageTimer.callback.append(self.exitMessage)
                self.msg = ""
                self.fstype = None
+               self.mkfs_cmd = ""
+               self.doMkfsTimer = eTimer()
+               self.doMkfsTimer.callback.append(self.doMkfs)
+               self.doInitializeTimer = eTimer()
+               self.doInitializeTimer.callback.append(self.doInitialize)
 
        def timerStart(self):
                self.initStartTimer.start(100,True)
@@ -634,19 +639,22 @@ class DeviceInit(Screen):
                        for index in range(len(self.inputbox_partitionSizeList)):
                                msg += _("\npartition %d : %s MB")%(index+1, str(self.inputbox_partitionSizeList[index]))
                        self.msgWaiting = self.session.openWithCallback(self.msgWaitingCB, MessageBox_2, msg, type = MessageBox.TYPE_INFO, enable_input = False)
-                       set = ""
-                       partitions = len(self.inputbox_partitionSizeList)
-                       if partitions == 1:
-                               cmd = 'printf "8,\n;0,0\n;0,0\n;0,0\ny\n" | sfdisk -f -uS /dev/' + self.device
-                       else:
-                               for p in range(4):
-                                       if partitions > p+1:
-                                               set += ",%s\n"%(self.inputbox_partitionSizeList[p])
-                                       else:
-                                               set +=";\n"
-                               set+="y\n"
-                               cmd = 'printf "%s" | sfdisk -f -uM /dev/%s'%(set,self.device)
-                       self.deviceInitConsole.ePopen(cmd, self.initInitializeFinished)
+                       self.doInitializeTimer.start(500,True)
+
+       def doInitialize(self):
+               set = ""
+               partitions = len(self.inputbox_partitionSizeList)
+               if partitions == 1:
+                       cmd = 'printf "8,\n;0,0\n;0,0\n;0,0\ny\n" | sfdisk -f -uS /dev/' + self.device
+               else:
+                       for p in range(4):
+                               if partitions > p+1:
+                                       set += ",%s\n"%(self.inputbox_partitionSizeList[p])
+                               else:
+                                       set +=";\n"
+                       set+="y\n"
+                       cmd = 'printf "%s" | sfdisk -f -uM /dev/%s'%(set,self.device)
+               self.deviceInitConsole.ePopen(cmd, self.initInitializeFinished)
 
        def initInitializeFinished(self, result, retval, extra_args = None):
                if retval == 0:
@@ -716,7 +724,12 @@ class DeviceInit(Screen):
                msg += _("\nFilesystem : %s") % (self.fstype)
                msg += _("\nSize : %d MB\n")%int(self.inputbox_partitionSizeList[self.devicenumber-1])
                self.msgWaitingMkfs = self.session.openWithCallback(self.msgWaitingMkfsCB, MessageBox_2, msg, type = MessageBox.TYPE_INFO, enable_input = False)
-               self.deviceInitConsole.ePopen(cmd, self.createFilesystemFinished, (self.device, fulldevicename))
+               self.mkfs_cmd = cmd
+               self.doMkfsTimer.start(500,True)
+
+       def doMkfs(self):
+               fulldevicename = "/dev/" + self.device + str(self.devicenumber)
+               self.deviceInitConsole.ePopen(self.mkfs_cmd, self.createFilesystemFinished, (self.device, fulldevicename))
 
        def createFilesystemFinished(self, result, retval, extra_args = None):
                device = extra_args[0]
@@ -777,6 +790,8 @@ class DeviceCheck(Screen):
                self.onLayoutFinish.append(self.timerStart)
                self.checkStartTimer = eTimer()
                self.checkStartTimer.callback.append(self.confirmMessage)
+               self.umountTimer = eTimer()
+               self.umountTimer.callback.append(self.doUnmount)
 
        def timerStart(self):
                self.checkStartTimer.start(100,True)
@@ -800,7 +815,6 @@ class DeviceCheck(Screen):
                print "deviceCheckStart "
                print "partition : ", self.partition
                device = self.partition["partition"]
-               mountpoint = self.partition["mountpoint"]
                fstype = self.partition["fstype"]
                fssize = self.partition["size"]
                if device is not None and fstype.startswith("ext"):
@@ -808,13 +822,19 @@ class DeviceCheck(Screen):
                        msg += _("\nDevice : /dev/%s")%(device)
                        msg += _("\nFilesystem : %s")%(fstype)
                        self.msgWaiting = self.session.openWithCallback(self.msgWaitingCB, MessageBox_2, msg, type = MessageBox.TYPE_INFO, enable_input = False)
-                       if mountpoint != "":
-                               self.doUmountFsck(device, mountpoint, fstype)
-                       else:
-                               self.umountFsckFinished("NORESULT", 0, (device, mountpoint, fstype))
+                       self.umountTimer.start(500,True)
                else:
                        self.exit()
 
+       def doUnmount(self):
+               device = self.partition["partition"]
+               mountpoint = self.partition["mountpoint"]
+               fstype = self.partition["fstype"]
+               if mountpoint != "":
+                       self.doUmountFsck(device, mountpoint, fstype)
+               else:
+                       self.umountFsckFinished("NORESULT", 0, (device, mountpoint, fstype))
+
        def doUmountFsck(self, device, mountpoint, fstype):
                cmd = "umount /dev/%s" % device
                self.deviceCheckConsole.ePopen(cmd, self.umountFsckFinished, (device, mountpoint, fstype))
@@ -879,24 +899,31 @@ class DeviceFormat(Screen):
                self.onLayoutFinish.append(self.timerStart)
                self.formatStartTimer = eTimer()
                self.formatStartTimer.callback.append(self.DeviceFormatStart)
+               self.setHotplugDisabled = False
+               self.umountTimer = eTimer()
+               self.umountTimer.callback.append(self.doUnmount)
 
        def timerStart(self):
                self.formatStartTimer.start(100,True)
 
        def DeviceFormatStart(self):
+               devicemanagerhotplug.setHotplugActive(False)
+               self.setHotplugDisabled = True
                print "DeviceFormatStart : ", self.partition,
                print "Filesystem : ",self.newfstype
                device = self.partition["partition"]
                devicepath = "/dev/"+device
-               mountpoint = self.partition["mountpoint"]
                fssize = self.partition["size"]
                newfstype = self.newfstype
-
                msg = _("Format filesystem, please wait ...")
                msg += _("\nDevice : %s")%(devicepath)
                msg += _("\nFilesystem : %s")%(newfstype)
                msg += _("\nSize : %s")%(byteConversion(fssize))
-               self.msgWaiting = self.session.openWithCallback(self.msgWaitingCB, MessageBox_2, msg, type = MessageBox_2.TYPE_INFO, enable_input = False)
+               self.msgWaiting = self.session.openWithCallback(self.msgWaitingCB, MessageBox_2, msg, type = MessageBox_2.TYPE_INFO, enable_input = False, msgBoxID = None)
+               self.umountTimer.start(500,True)
+
+       def doUnmount(self):
+               mountpoint = self.partition["mountpoint"]
                if mountpoint != "":
                        self.doumountPartition()
                else:
@@ -1010,6 +1037,9 @@ class DeviceFormat(Screen):
                        self.session.openWithCallback(self.exit, MessageBox, msg, MessageBox.TYPE_ERROR, timeout = 10)
 
        def exit(self, ret):
+               if self.setHotplugDisabled == True:
+                       devicemanagerhotplug.setHotplugActive(True)
+                       self.setHotplugDisabled = False
                self.close()
 
 #device format end
@@ -1414,6 +1444,12 @@ class deviceManagerHotplug:
        def __init__(self):
                self.hotplugActive = True
 
+       def setHotplugActive(self,value=True):
+               if value:
+                       self.hotplugActive = True
+               else:
+                       self.hotplugActive = False
+
        def printDebug(self):
                for p in harddiskmanager.partitions:
                        print " # partition : %s %s %s %s %s(mp, des, f_mounted, is_hot, dev)"%(p.mountpoint, p.description, p.force_mounted, p.is_hotplug,p.device)
@@ -1455,11 +1491,13 @@ class deviceManagerHotplug:
 
        def doUmount(self, device, mountpoint):
                devpath = "/dev/"+device
-               if len(deviceinfo.checkMountDev(devpath)) == 0:
+               mountpoints = deviceinfo.checkMountDev(devpath)
+               if len(mountpoints) == 0:
                        return
-               cmd = "umount %s"%devpath
-               print "[DeviceManager] cmd : %s"%cmd
-               os.system(cmd)
+               for mp in mountpoints:
+                       cmd = "umount %s"%devpath
+                       print "[DeviceManager] cmd : %s"%cmd
+                       os.system(cmd)
 
        def addHotPlugDevice(self, partition):
                device = partition.device
@@ -1669,8 +1707,8 @@ def autostart(reason, **kwargs):
                devicemanagerhotplug.umountOnShutdown()
 
 def menu(menuid, **kwargs):
-       if menuid == "harddisk":
-               return [(_("DeviceManager"), main, "device_manager", 1)]
+       if menuid == "system":
+               return [(_("DeviceManager"), main, "device_manager", 50)]
        return []
 
 def main(session, **kwargs):