diff options
-rwxr-xr-x | lib/isodumper.py | 72 | ||||
-rw-r--r-- | share/isodumper/isodumper.glade | 115 |
2 files changed, 172 insertions, 15 deletions
diff --git a/lib/isodumper.py b/lib/isodumper.py index e5f7dac..ae5fe00 100755 --- a/lib/isodumper.py +++ b/lib/isodumper.py @@ -25,7 +25,7 @@ import gtk.glade import gobject from subprocess import Popen,PIPE,call import os - +import io import gettext from gettext import gettext as _ @@ -63,6 +63,15 @@ class IsoDumper: filt.add_pattern("*.iso") filt.add_pattern("*.img") self.chooser.set_filter(filt) + + # optionnal backup of the device + + self.backup_select = self.wTree.get_widget("backup_select") + self.backup_name = self.wTree.get_widget("backup_name") + self.backup = self.wTree.get_widget("backup") + self.choose = self.wTree.get_widget("choose") + self.backup_bname = self.wTree.get_widget("bname") + # set callbacks dict = { "on_main_dialog_destroy" : self.close, @@ -70,9 +79,13 @@ class IsoDumper: "on_emergency_button_clicked" : self.close, "on_success_button_clicked" : self.close, "on_filechooserbutton_file_set" : self.activate_devicelist, + "on_backup_name_file_set" : self.activate_backup, "on_detail_expander_activate" : self.expander_control, "on_device_combobox_changed" : self.device_selected, "on_nodev_close_clicked" : self.close, + "on_backup_toggled" : self.enable_backup, + "on_backup_select_clicked" : self.backup_sel, + "on_select_clicked" : self.backup_choosed, "on_write_button_clicked" : self.do_write} self.wTree.signal_autoconnect(dict) @@ -103,6 +116,28 @@ class IsoDumper: write_button.set_sensitive(True) self.dev = self.combo.get_active_text() + def enable_backup(self,widget) : + self.backup_select.set_sensitive(not self.backup_select.get_sensitive()) + #self.backup_name.set_sensitive(not self.backup_name.get_sensitive()) + + def backup_sel(self,widget): + #dialog = self.wTree.get_widget("backup_choose") + self.choose.show_all() + + def backup_choosed(self, widget): + exit_dialog=self.backup_bname.get_filename() + if exit_dialog == None: + # No backup file name indicated + # Unckeck the choice to backup + self.backup.set_active(0) + else: + # Add .iso if not specified + if not exit_dialog.lower().endswith('.iso'): + exit_dialog=exit_dialog+".iso" + self.backup_select.set_label(exit_dialog) + self.choose.hide() + + def do_write(self, widget): write_button = self.wTree.get_widget("write_button") write_button.set_sensitive(False) @@ -112,11 +147,13 @@ class IsoDumper: source = self.chooser.get_filename() target = self.dev.split('(')[1].split(')')[0] dialog = self.wTree.get_widget("confirm_dialog") + if self.backup.get_active() : + backup_dest=self.backup_select.get_label() + self.logger(_('Backup in:')+' '+backup_dest) self.logger(_('Image: ')+source) self.logger(_('Target Device: ')+self.dev) - self.logger(_('Target Device: ')+target) b = os.path.getsize(source) - if b >= (eval(self.deviceSize)) : + if b > (eval(self.deviceSize)) : self.logger(_('The device is too small to contain the ISO file.')) self.emergency() else: @@ -132,13 +169,21 @@ class IsoDumper: self.close('dummy') self.do_umount(target) dialog.hide() - task = self.raw_write(source, target) + # Backup step + if self.backup.get_active() : + task = self.raw_write(target, backup_dest, eval(self.deviceSize)) + gobject.idle_add(task.next) + while gtk.events_pending(): + gtk.main_iteration(True) + # Writing step + task = self.raw_write(source, target, os.path.getsize(source)) gobject.idle_add(task.next) while gtk.events_pending(): gtk.main_iteration(True) + self.success() else: self.close('dummy') - + def do_umount(self, target): mounts = self.get_mounted(target) if mounts: @@ -170,25 +215,24 @@ class IsoDumper: self.logger(_('Could not read mtab !')) self.emergency() - def raw_write(self, source, target): + def raw_write(self, source, target, b): bs=4096*128 - b = os.path.getsize(source) try: - ifc=open(source, "rb",1) + ifc=io.open(source, "rb",1) except: self.logger(_('Reading error.')) self.emergency() else: try: - ofc= open(target, 'wb',0) + ofc= io.open(target, 'wb',0) except: self.logger(_('You have not the rights for writing on the device')) self.emergency() else: progress = self.wTree.get_widget("progressbar") progress.set_sensitive(True) - progress.set_text(_('Writing ')+source.split('/')[-1]+_(' to ')+self.dev) - self.logger(_('Executing copy from ')+source+' to '+target) + progress.set_text(_('Writing ')+source.split('/')[-1]+_(' to ')+target.split('/')[-1]) + self.logger(_('Executing copy from ')+source+_(' to ')+target) while gtk.events_pending(): gtk.main_iteration(True) steps=range(0, b+1, b/100) @@ -228,7 +272,7 @@ class IsoDumper: except: self.logger(_("Writing error.")) self.emergency() - self.success() + #self.success() ifc.close() yield False @@ -250,6 +294,7 @@ class IsoDumper: resp = dialog.run() if resp: dialog.destroy() + self.close() def final_unsensitive(self): self.chooser.set_sensitive(False) @@ -285,6 +330,9 @@ class IsoDumper: label.set_sensitive(True) self.img_name = self.chooser.get_filename() + def activate_backup(self, widget): + self.backup_img_name = self.backup_dir.get_filename() + def expander_control(self, widget): # this is darn ugly but still better than the UI behavior of # the unexpanded expander which doesnt reset the window size diff --git a/share/isodumper/isodumper.glade b/share/isodumper/isodumper.glade index acc06a4..1404c29 100644 --- a/share/isodumper/isodumper.glade +++ b/share/isodumper/isodumper.glade @@ -2,6 +2,60 @@ <glade-interface> <!-- interface-requires gtk+ 2.16 --> <!-- interface-naming-policy toplevel-contextual --> + <widget class="GtkWindow" id="choose"> + <property name="can_focus">False</property> + <property name="window_position">center</property> + <property name="default_width">600</property> + <property name="default_height">400</property> + <child> + <widget class="GtkVBox" id="vbox1"> + <property name="height_request">400</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">2</property> + <child> + <widget class="GtkFileChooserWidget" id="bname"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="action">save</property> + </widget> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">9</property> + <child> + <widget class="GtkButton" id="select"> + <property name="label" translatable="yes">Select</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <signal name="clicked" handler="on_select_clicked" swapped="no"/> + </widget> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="pack_type">end</property> + <property name="position">1</property> + </packing> + </child> + </widget> + </child> + </widget> <widget class="GtkDialog" id="confirm_dialog"> <property name="can_focus">False</property> <property name="border_width">5</property> @@ -303,17 +357,72 @@ </packing> </child> <child> + <widget class="GtkCheckButton" id="backup"> + <property name="label" translatable="yes">Create a backup of the device as image to restore it later</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_backup_toggled" swapped="no"/> + </widget> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <widget class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Backup in:</property> + </widget> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <widget class="GtkButton" id="backup_select"> + <property name="label" translatable="yes">(None)</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="image_position">right</property> + <signal name="clicked" handler="on_backup_select_clicked" swapped="no"/> + </widget> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> <widget class="GtkProgressBar" id="progressbar"> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">False</property> + <property name="show_text">True</property> <property name="text" translatable="yes"> </property> </widget> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="padding">5</property> - <property name="position">1</property> + <property name="position">3</property> </packing> </child> <child> @@ -325,7 +434,7 @@ <property name="expand">False</property> <property name="fill">True</property> <property name="padding">5</property> - <property name="position">2</property> + <property name="position">4</property> </packing> </child> <child> @@ -368,7 +477,7 @@ <property name="expand">True</property> <property name="fill">True</property> <property name="padding">5</property> - <property name="position">3</property> + <property name="position">5</property> </packing> </child> </widget> |