Device manager : show error msg when device/partition not found.
[vuplus_dvbapp] / lib / python / Plugins / SystemPlugins / DeviceManager / plugin.py
index 4ee8037..e3b2460 100755 (executable)
@@ -102,41 +102,41 @@ class DeviceManagerConfiguration(Screen, ConfigListScreen):
 
 class DeviceManager(Screen):
        skin = """
-               <screen position="center,center" size="670,400" title="DeviceManager">
+               <screen position="center,center" size="590,350" title="DeviceManager">
                        <ePixmap pixmap="skin_default/buttons/red.png" position="20,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/green.png" position="180,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="340,0" size="140,40" alphatest="on" />
-                       <ePixmap pixmap="skin_default/buttons/blue.png" position="500,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/green.png" position="160,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/yellow.png" position="300,0" size="140,40" alphatest="on" />
+                       <ePixmap pixmap="skin_default/buttons/blue.png" position="440,0" size="140,40" alphatest="on" />
                        <widget name="key_red" position="20,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#9f1313" transparent="1" />
-                       <widget name="key_green" position="180,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#1f771f" transparent="1" />
-                       <widget name="key_yellow" position="340,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#a08500" transparent="1" />
-                       <widget name="key_blue" position="500,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#18188b" transparent="1" />
-                       <ePixmap pixmap="skin_default/div-h.png" position="0,48" size="670,2" alphatest="on" />
-                       <widget source="menu" render="Listbox" position="0,48" size="670,350" scrollbarMode="showOnDemand">
+                       <widget name="key_green" position="160,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#1f771f" transparent="1" />
+                       <widget name="key_yellow" position="300,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#a08500" transparent="1" />
+                       <widget name="key_blue" position="440,0" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" foregroundColor="#ffffff" backgroundColor="#18188b" transparent="1" />
+                       <ePixmap pixmap="skin_default/div-h.png" position="0,48" size="590,2" alphatest="on" />
+                       <widget source="menu" render="Listbox" position="0,48" size="590,350" scrollbarMode="showOnDemand">
                                <convert type="TemplatedMultiContent">
                                {"templates":
                                        {"default": (54,[
-                                                       MultiContentEntryText(pos = (100, 0), size = (560, 30), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), # index 0 is vendor  - model
-                                                       MultiContentEntryText(pos = (100, 32), size = (130, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 1), # index 1 is Device
-                                                       MultiContentEntryText(pos = (230, 32), size = (130, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 2), # index 2 is Size
-                                                       MultiContentEntryText(pos = (360, 32), size = (130, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 3), # index 3 is Partitions
-                                                       MultiContentEntryText(pos = (490, 32), size = (140, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 4), # index 4 is Removable
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (670, 2), png = 5), # png 5 is the div pixmap
+                                                       MultiContentEntryText(pos = (50, 0), size = (510, 30), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), # index 0 is vendor  - model
+                                                       MultiContentEntryText(pos = (50, 32), size = (120, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 1), # index 1 is Device
+                                                       MultiContentEntryText(pos = (170, 32), size = (120, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 2), # index 2 is Size
+                                                       MultiContentEntryText(pos = (290, 32), size = (120, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 3), # index 3 is Partitions
+                                                       MultiContentEntryText(pos = (410, 32), size = (130, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 4), # index 4 is Removable
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (590, 2), png = 5), # png 5 is the div pixmap
                                                ]),
                                        "partitions": (98, [
-                                                       MultiContentEntryText(pos = (100, 0), size = (560, 30), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), # index 1 is Partition
-                                                       MultiContentEntryText(pos = (100, 32), size = (560, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 1), # index 2 is Mounted on
-                                                       MultiContentEntryText(pos = (100, 54), size = (560, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 2), # index 3 UUID
-                                                       MultiContentEntryText(pos = (100, 76), size = (140, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 3), # index 4 Type
-                                                       MultiContentEntryText(pos = (230, 76), size = (140, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 4), # index 5 Size_total
-                                                       MultiContentEntryText(pos = (380, 76), size = (200, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 5), # index 6 Size_free
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 96), size = (670, 2), png = 6), # png 6 is the div pixmap
+                                                       MultiContentEntryText(pos = (50, 0), size = (500, 30), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 0), # index 1 is Partition
+                                                       MultiContentEntryText(pos = (50, 32), size = (500, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 1), # index 2 is Mounted on
+                                                       MultiContentEntryText(pos = (50, 54), size = (500, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 2), # index 3 UUID
+                                                       MultiContentEntryText(pos = (50, 76), size = (130, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 3), # index 4 Type
+                                                       MultiContentEntryText(pos = (180, 76), size = (130, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 4), # index 5 Size_total
+                                                       MultiContentEntryText(pos = (310, 76), size = (190, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 5), # index 6 Size_free
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 96), size = (590, 2), png = 6), # png 6 is the div pixmap
                                                ]),
                                        "mountpoint": (54,[
                                                        MultiContentEntryPixmapAlphaTest(pos = (10, 7), size = (30, 30), png = 0), # index 0: picture
                                                        MultiContentEntryText(pos = (40, 0), size = (500, 30), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 1), # index 1 name
                                                        MultiContentEntryText(pos = (40, 32), size = (500, 20), font=1, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = 2), # index 2 path
-                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (670, 2), png = 5), # index 5 is the div pixmap
+                                                       MultiContentEntryPixmapAlphaTest(pos = (0, 52), size = (590, 2), png = 5), # index 5 is the div pixmap
                                                ])
                                        },
                                        "fonts": [gFont("Regular", 22),gFont("Regular", 16),gFont("Regular", 28)],
@@ -295,31 +295,40 @@ class DeviceManager(Screen):
                self["menu"].setList(self.mountPointList)
 
        def getCurrentDevice(self):
-               if self.currList == "default":
+               try:
                        return self["menu"].getCurrent()[6]
-               return None
+               except:
+                       return None
 
        def getCurrentPartition(self):
-               if self.currList == "partitions":
+               try:
                        return self["menu"].getCurrent()[7]
-               return None
+               except:
+                       return None
 
        def keyOk(self):
 #              print "keyOk"
                if self.currList == "default":
                        self.currDevice = self.getCurrentDevice()
-                       if len(self.currDevice["partitions"]) == 0:
-                               self.session.open(MessageBox, _("No partition list found on device.\nPlease click BLUE key and do Initialize to use this device."), MessageBox.TYPE_ERROR, timeout = 10)
+                       if self.currDevice is not None:
+                               if len(self.currDevice["partitions"]) == 0:
+                                       self.session.open(MessageBox, _("No partition list found on device.\nPlease click BLUE key and do Initialize to use this device."), MessageBox.TYPE_ERROR, timeout = 10)
+                               else:
+                                       self.showPartitionList()
                        else:
-                               self.showPartitionList()
+                               self.session.open(MessageBox, _("Device not found."), MessageBox.TYPE_ERROR, timeout = 10)
                elif self.currList == "partitions":
-                       currMountPoint = self.getCurrentPartition()["mountpoint"]
-                       currUuid = self.getCurrentPartition()["uuid"]
-                       if currMountPoint == "":
-                               self.currPartition = self.getCurrentPartition()
-                               self.showMountPointSetup()
+                       currentPartition = self.getCurrentPartition()
+                       if currentPartition is not None:
+                               currMountPoint = currentPartition["mountpoint"]
+                               currUuid = currentPartition["uuid"]
+                               if currMountPoint == "":
+                                       self.currPartition = currentPartition
+                                       self.showMountPointSetup()
+                               else:
+                                       self.doUmount(currMountPoint, self.showPartitionList)
                        else:
-                               self.doUmount(currMountPoint, self.showPartitionList)
+                               self.session.open(MessageBox, _("Partition info is not found."), MessageBox.TYPE_ERROR, timeout = 10)
                elif self.currList == "mountpoint":
 # self["menu"].getCurrent() : (green_button, "menu description", "mount point description, "default", mountpoint, self.divpng)
                        currEntry = self["menu"].getCurrent()[3]
@@ -352,16 +361,21 @@ class DeviceManager(Screen):
 
        def keyYellow(self):
                if self.currList == "partitions":
-                       partition = self.getCurrentPartition()
                        self.choiceBoxFstype()
 
        def keyBlue(self):
                if self.currList == "default":
                        device = self.getCurrentDevice()
-                       self.session.openWithCallback(self.deviceInitCB, DeviceInit, device["blockdev"], device["size"])
+                       if device is not None:
+                               self.session.openWithCallback(self.deviceInitCB, DeviceInit, device["blockdev"], device["size"])
+                       else:
+                               self.session.open(MessageBox, _("Device not found."), MessageBox.TYPE_ERROR, timeout = 10)
                elif self.currList == "partitions":
                        partition = self.getCurrentPartition()
-                       self.session.openWithCallback(self.deviceCheckCB, DeviceCheck, partition)
+                       if partition is not None:
+                               self.session.openWithCallback(self.deviceCheckCB, DeviceCheck, partition)
+                       else:
+                               self.session.open(MessageBox, _("Partition info is not found."), MessageBox.TYPE_ERROR, timeout = 10)
 
        def keyMenu(self):
                self.session.open(DeviceManagerConfiguration)
@@ -388,7 +402,10 @@ class DeviceManager(Screen):
                        return
                else:
                        partition = self.getCurrentPartition()
-                       self.session.openWithCallback(self.deviceFormatCB, DeviceFormat, partition, choice[1])
+                       if partition is not None:
+                               self.session.openWithCallback(self.deviceFormatCB, DeviceFormat, partition, choice[1])
+                       else:
+                               self.session.open(MessageBox, _("Partition info is not found."), MessageBox.TYPE_ERROR, timeout = 10)
 
 # about mount funcs..
        def doUmount(self, mountpoint, callback):
@@ -522,6 +539,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 +656,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 +741,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 +807,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 +832,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 +839,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 +916,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 +1054,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 +1461,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 +1508,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 +1724,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):