aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--COPYING340
-rw-r--r--export.py64
-rwxr-xr-xinstall.sh41
-rwxr-xr-xisodumper16
-rw-r--r--isodumper.pngbin0 -> 9884 bytes
-rw-r--r--lib/.isodumper.log3
-rwxr-xr-xlib/find_devices20
-rwxr-xr-xlib/find_devices.sh33
-rwxr-xr-xlib/isodumper.py279
-rw-r--r--share/applications/isodumper.desktop9
-rw-r--r--share/isodumper/header.pngbin0 -> 46169 bytes
-rw-r--r--share/isodumper/isodumper.glade649
12 files changed, 1454 insertions, 0 deletions
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..623b625
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/export.py b/export.py
new file mode 100644
index 0000000..9b48a10
--- /dev/null
+++ b/export.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Tue Jun 25 19:00:13 2013
+
+@author: yves
+"""
+import os
+# Block size
+ def raw_write(self, source, target):
+ bs=4096
+ b = os.path.getsize("/documents/boot-nonfree.iso")
+ ifc=open(source, "rb",1)
+ ofc= open("/documents/test.iso", 'wb',0)
+ 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)
+ while gtk.events_pending():
+ gtk.main_iteration(True)
+ #output = Popen(['dd if='+source+' of='+target+' bs=1024'], stdout=PIPE, stderr=STDOUT, shell=True)
+ #self.ddpid = output.pid
+ #while output.stdout.readline():
+ # line = output.stdout.readline().strip()
+ steps=range(0, b, b/100)
+ indice=1
+ written=0
+ for i in xrange(0,b,bs):
+ try:
+ buf=ifc.read(bs)
+ except:
+ self.logger(_("Reading error."))
+ return False
+ try:
+ ofc.write(buf)
+ except:
+ self.logger(_("Writing error."))
+ return False
+ written= written+bs
+ if written > steps[indice]:
+ indice +=1
+ while gtk.events_pending():
+ gtk.main_iteration(True)
+ #if line.endswith('MB/s'):
+ # target_size = line.split()[0]
+ self.logger(_('Wrote: ')+written+' bytes')
+ #size = float(target_size)*100/float(src_size)
+ while gtk.events_pending():
+ gtk.main_iteration(True)
+ progress.set_fraction(float(indice/100))
+ #pid, sts = os.waitpid(output.pid, 0)
+ #if sts != 0:
+ # self.logger(_('The dd process ended with an error !'))
+ # self.emergency()
+ # return False
+ progress.set_fraction(1.0)
+ self.logger(_('Image ')+source.split('/')[-1]+_(' successfully written to')+target)
+ self.logger(_("%s octets écrits")%written)
+ self.success()
+
+ # tous les 5%
+
+ ifc.close()
+ ofc.close()
+ print
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..ddca083
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright 2007-2009 Canonical Ltd.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+LIBFILES="isodumper.py find_devices"
+DATAFILES="isodumper.glade header.png"
+
+
+if [ "$1" = "uninstall" ]; then
+ rm -rf /usr/lib/isodumper
+ rm -rf /usr/share/isodumper
+ rm -r /usr/share/applications/isodumper.desktop
+ rm -f /usr/bin/isodumper
+else
+ cp share/applications/isodumper.desktop /usr/share/applications/
+ cp isodumper /usr/bin/
+ mkdir -p /usr/lib/isodumper
+ mkdir -p /usr/share/isodumper
+
+ for item in $LIBFILES; do
+ cp lib/$item /usr/lib/isodumper/
+ done
+
+ for item in $DATAFILES; do
+ cp share/usb-isodumper/$item /usr/share/isodumper/
+ done
+fi
diff --git a/isodumper b/isodumper
new file mode 100755
index 0000000..5e4467a
--- /dev/null
+++ b/isodumper
@@ -0,0 +1,16 @@
+#!/bin/sh
+#
+# Yes that script is horribly ugly and it would be nice if someone
+# would implement the pkill pinging in the pythn script or even write
+# a safe replacement for dd at all with proper progress reporting
+# directly in the python script instead of that hack.
+
+set -e
+
+TERM=xterm
+
+DIR=/usr/lib/isodumper
+
+watch -n1 -- pkill -USR1 ^dd$ >/dev/null 2>&1 &
+MYPID=$!
+$DIR/isodumper.py && kill -9 $MYPID
diff --git a/isodumper.png b/isodumper.png
new file mode 100644
index 0000000..d38ac1a
--- /dev/null
+++ b/isodumper.png
Binary files differ
diff --git a/lib/.isodumper.log b/lib/.isodumper.log
new file mode 100644
index 0000000..b2821c3
--- /dev/null
+++ b/lib/.isodumper.log
@@ -0,0 +1,3 @@
+Image: /documents/boot-nonfree.iso
+Target Device: V88 V88 (/dev/sdb)
+You have not the rights for writing on the device
diff --git a/lib/find_devices b/lib/find_devices
new file mode 100755
index 0000000..6a56c03
--- /dev/null
+++ b/lib/find_devices
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+
+import dbus
+import sys
+
+bus = dbus.SystemBus()
+proxy = bus.get_object("org.freedesktop.UDisks", "/org/freedesktop/UDisks")
+iface = dbus.Interface(proxy, "org.freedesktop.UDisks")
+
+devs = iface.EnumerateDevices()
+
+for dev in devs:
+ dev_obj = bus.get_object("org.freedesktop.UDisks", dev)
+ dev = dbus.Interface(dev_obj, "org.freedesktop.DBus.Properties")
+
+ if str(dev.Get('', 'DriveConnectionInterface')) == 'usb' and not str(dev.Get('', 'PartitionType')) and str(dev.Get('', 'DeviceIsMediaAvailable')) == '1':
+ path = str(dev.Get('', 'DeviceFile'))
+ vend = str(dev.Get('', 'DriveVendor'))
+ model = str(dev.Get('', 'DriveModel'))
+ print vend + ' ' + model + ', ' +path
diff --git a/lib/find_devices.sh b/lib/find_devices.sh
new file mode 100755
index 0000000..b371be0
--- /dev/null
+++ b/lib/find_devices.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+#
+# Copyright 2007-2009 Canonical Ltd.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+for device in $(hal-find-by-capability --capability storage); do
+ VENDOR=$(hal-get-property --udi $device --key storage.vendor)
+ NAME=$(hal-get-property --udi $device --key storage.model)
+ PLUGGABLE=$(hal-get-property --udi $device --key storage.hotpluggable)
+ TYPE=$(hal-get-property --udi $device --key storage.drive_type)
+ DEVPATH=$(hal-get-property --udi $device --key block.device)
+ AVAIL=$(hal-get-property --udi $device --key storage.removable.media_available)
+
+ if [ "${AVAIL}" = true ] && [ "${PLUGGABLE}" = true ] && \
+ ( [ "${TYPE}" = "disk" ] || [ "${TYPE}" = "sd_mmc" ] ); then
+ VENDOR=${VENDOR:-"Unknown"}
+ NAME=${NAME:-"Unknown"}
+ echo "$VENDOR $NAME, $DEVPATH"
+ fi
+done
diff --git a/lib/isodumper.py b/lib/isodumper.py
new file mode 100755
index 0000000..b891cb2
--- /dev/null
+++ b/lib/isodumper.py
@@ -0,0 +1,279 @@
+#!/usr/bin/python
+#
+# Copyright (c) 2007-2009 Canonical Ltd.
+#
+# Author: Oliver Grawert <ogra@ubuntu.com>
+#
+# Modifications 2013 from papoteur <papoteur@mageialinux-online.org>
+# and Geiger David <david.david@mageialinux-online.org>
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+import gtk
+import gtk.glade
+import gobject
+from subprocess import Popen,PIPE,call
+import os
+import signal
+
+import gettext
+from gettext import gettext as _
+
+
+class ImageWriter:
+ def __init__(self):
+ APP="isodumper"
+ DIR="/usr/share/locale"
+
+ gettext.bindtextdomain(APP, DIR)
+ gettext.textdomain(APP)
+ gtk.glade.bindtextdomain(APP, DIR)
+ gtk.glade.textdomain(APP)
+
+ # get glade tree
+ self.gladefile = "/documents/isodumper-0.1.0/share/isodumper/isodumper.glade"
+ self.wTree = gtk.glade.XML(self.gladefile)
+
+ # get globally needed widgets
+ self.window = self.wTree.get_widget("main_dialog")
+ self.devicelist = self.wTree.get_widget("device_combobox")
+ self.logview = self.wTree.get_widget("detail_text")
+ #eventbox = self.wTree.get_widget("eventbox")
+ #bgcol = gtk.gdk.color_parse("white")
+ #eventbox.modify_bg(gtk.STATE_NORMAL, bgcol)
+ self.log = self.logview.get_buffer()
+ self.ddpid = 0
+
+ # set default file filter to *.img
+ # Added for Mageia : *.iso
+ self.chooser = self.wTree.get_widget("filechooserbutton")
+ filt = gtk.FileFilter()
+ filt.add_pattern("*.iso")
+ filt.add_pattern("*.img")
+ self.chooser.set_filter(filt)
+
+ # set callbacks
+ dict = { "on_main_dialog_destroy" : self.close,
+ "on_cancel_button_clicked" : self.close,
+ "on_emergency_button_clicked" : self.close,
+ "on_success_button_clicked" : self.close,
+ "on_filechooserbutton_file_set" : self.activate_devicelist,
+ "on_detail_expander_activate" : self.expander_control,
+ "on_device_combobox_changed" : self.device_selected,
+ "on_button1_clicked" : self.close,
+ "on_write_button_clicked" : self.do_write}
+ self.wTree.signal_autoconnect(dict)
+
+ self.window.show_all()
+ # make sure we have a target device
+ self.get_devices()
+
+ def get_devices(self):
+ dialog = self.wTree.get_widget("nodev_dialog")
+ list = Popen(["/usr/lib/isodumper/find_devices"], stdout=PIPE).communicate()[0]
+ if not len(list):
+ dialog.run()
+ list = Popen(["/usr/lib/isodumper/find_devices"], stdout=PIPE).communicate()[0]
+ if not len(list):
+ dialog.destroy()
+ self.close
+ exit(0)
+ self.combo = self.wTree.get_widget("device_combobox")
+ list = list.strip().split('\n')
+ for item in list:
+ name,path = item.split(',')
+ self.combo.append_text(name+' ('+path.lstrip()+')')
+ dialog.destroy()
+
+ def device_selected(self, widget):
+ write_button = self.wTree.get_widget("write_button")
+ write_button.set_sensitive(True)
+ self.dev = self.combo.get_active_text()
+
+ def do_write(self, widget):
+ write_button = self.wTree.get_widget("write_button")
+ write_button.set_sensitive(False)
+ combo = self.wTree.get_widget("device_combobox")
+ combo.set_sensitive(False)
+ self.chooser.set_sensitive(False)
+ source = self.chooser.get_filename()
+ target = self.dev.split('(')[1].rstrip(')')
+ dialog = self.wTree.get_widget("confirm_dialog")
+ self.logger(_('Image: ')+source)
+ self.logger(_('Target Device: ')+self.dev)
+ resp = dialog.run()
+ if resp:
+ self.do_umount(target)
+ dialog.hide()
+ task = self.raw_write(source, target)
+ gobject.idle_add(task.next)
+ while gtk.events_pending():
+ gtk.main_iteration(True)
+
+ else:
+ self.close('dummy')
+
+ def do_umount(self, target):
+ mounts = self.get_mounted(target)
+ if mounts:
+ self.logger(_('Unmounting all partitions of ')+target+':')
+ for mount in mounts:
+ self.logger(_('Trying to unmount ')+mount[0]+'...')
+ while gtk.events_pending():
+ gtk.main_iteration(True)
+ try:
+ retcode = call('umount '+mount[0], shell=True)
+ if retcode < 0:
+ self.logger(_('Error, umount ')+mount[0]+_(' was terminated by signal ')+str(retcode))
+ self.emergency()
+ else:
+ if retcode == 0:
+ self.logger(mount[0]+_(' successfully unmounted'))
+ else:
+ self.logger(_('Error, umount ')+mount[0]+_(' returned ')+str(retcode))
+ self.emergency()
+ except OSError, e:
+ self.logger(_('Execution failed: ')+str(e))
+ self.emergency()
+
+ def get_mounted(self, target):
+ try:
+ lines = [line.strip("\n").split(" ") for line in open ("/etc/mtab", "r").readlines()]
+ return [mount for mount in lines if mount[0].startswith(target)]
+ except:
+ self.logger(_('Could not read mtab !'))
+ self.emergency()
+
+ def raw_write(self, source, target):
+ bs=4096*128
+ b = os.path.getsize(source)
+ try:
+ ifc=open(source, "rb",1)
+ except:
+ self.logger(_('Reading error.'))
+ self.emergency()
+ else:
+ try:
+ ofc= 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)
+ while gtk.events_pending():
+ gtk.main_iteration(True)
+ steps=range(0, b+1, b/100)
+ indice=1
+ written=0
+ ncuts=b/bs
+ for i in xrange(0,ncuts):
+ try:
+ buf=ifc.read(bs)
+ except:
+ self.logger(_("Reading error."))
+ self.emergency()
+ try:
+ ofc.write(buf)
+ except:
+ self.logger(_("Writing error."))
+ self.emergency()
+ written= written+bs
+ if written > steps[indice]:
+ if indice%5==0:
+ self.logger(_('Wrote: ')+str(indice)+'% '+str(written)+' bytes')
+ mark = self.log.create_mark("end", self.log.get_end_iter(), False)
+ self.logview.scroll_to_mark(mark, 0.05, True, 0.0, 1.0)
+ progress.set_fraction(float(indice)/100)
+ indice +=1
+ os.fsync(ofc)
+ yield True
+ progress.set_fraction(1.0)
+ self.logger(_('Image ')+source.split('/')[-1]+_(' successfully written to')+target)
+ self.logger(_('Bytes written: ')+str(written))
+ ofc.close()
+ self.success()
+ ifc.close()
+ yield False
+
+ def success(self):
+ dialog = self.wTree.get_widget("success_dialog")
+ self.final_unsensitive()
+ resp = dialog.run()
+ if resp:
+ exit(0)
+ dialog.destroy()
+
+ def emergency(self):
+ self.final_unsensitive()
+ dialog = self.wTree.get_widget("emergency_dialog")
+ expander = self.wTree.get_widget("detail_expander")
+ expander.set_expanded(True)
+ mark = self.log.create_mark("end", self.log.get_end_iter(), False)
+ self.logview.scroll_to_mark(mark, 0.05, True, 0.0, 1.0)
+ resp = dialog.run()
+ if resp:
+ dialog.destroy()
+
+ def final_unsensitive(self):
+ self.chooser.set_sensitive(False)
+ self.devicelist.set_sensitive(False)
+ write_button = self.wTree.get_widget("write_button")
+ write_button.set_sensitive(False)
+ progress = self.wTree.get_widget("progressbar")
+ progress.set_sensitive(False)
+
+ def close(self, widget):
+ self.write_logfile()
+ if self.ddpid > 0:
+ try:
+ os.killpg(os.getpgid(self.ddpid), signal.SIGKILL)
+ except:
+ gtk.main_quit()
+ else:
+ gtk.main_quit()
+
+ def write_logfile(self):
+ start = self.log.get_start_iter()
+ end = self.log.get_end_iter()
+ from os.path import expanduser
+ home = expanduser("~")
+ if not(os.path.isdir(home+'/.isodumper')):
+ os.mkdir(home+'/.isodumper')
+ logfile=open(home+'/.isodumper/isodumper.log',"w")
+ logfile.write(self.log.get_text(start, end, False))
+ print self.log.get_text(start, end, False)
+
+ def logger(self, text):
+ self.log.insert_at_cursor(text+"\n")
+
+ def activate_devicelist(self, widget):
+ label = self.wTree.get_widget("to_label")
+ expander = self.wTree.get_widget("detail_expander")
+ self.devicelist.set_sensitive(True)
+ expander.set_sensitive(True)
+ label.set_sensitive(True)
+ self.img_name = self.chooser.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
+ if widget.get_expanded():
+ gobject.timeout_add(130, lambda: self.window.reshow_with_initial_size())
+
+if __name__ == "__main__":
+ app = ImageWriter()
+ gtk.main()
diff --git a/share/applications/isodumper.desktop b/share/applications/isodumper.desktop
new file mode 100644
index 0000000..20bda04
--- /dev/null
+++ b/share/applications/isodumper.desktop
@@ -0,0 +1,9 @@
+
+[Desktop Entry]
+Version=1.0
+Type=Application
+Terminal=false
+Icon=gtk-execute
+Exec=gksudo isodumper
+Name=ImageWriter
+Categories=GNOME;GTK;Utility
diff --git a/share/isodumper/header.png b/share/isodumper/header.png
new file mode 100644
index 0000000..b722cce
--- /dev/null
+++ b/share/isodumper/header.png
Binary files differ
diff --git a/share/isodumper/isodumper.glade b/share/isodumper/isodumper.glade
new file mode 100644
index 0000000..2d7b0c4
--- /dev/null
+++ b/share/isodumper/isodumper.glade
@@ -0,0 +1,649 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<glade-interface>
+ <!-- interface-requires gtk+ 2.16 -->
+ <!-- interface-naming-policy toplevel-contextual -->
+ <widget class="GtkDialog" id="confirm_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">IsoDumper</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="icon_name">gtk-execute</property>
+ <property name="type_hint">dialog</property>
+ <property name="transient_for">main_dialog</property>
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="confirm_cancel_button">
+ <property name="label">gtk-cancel</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="confirm_ok_button">
+ <property name="label">gtk-ok</property>
+ <property name="response_id">1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkImage" id="image2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-dialog-warning</property>
+ <property name="icon-size">6</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">&lt;b&gt;Warning&lt;/b&gt;
+ This will &lt;b&gt;destroy all data&lt;/b&gt; on the target
+ device, are you sure you want to proceed ?
+
+ If you say ok here, please &lt;b&gt;do not unplug&lt;/b&gt;
+ the device during the following operation.</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="GtkDialog" id="emergency_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">IsoDumper</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="icon_name">gtk-execute</property>
+ <property name="type_hint">dialog</property>
+ <property name="transient_for">main_dialog</property>
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="emergency_button">
+ <property name="label">gtk-ok</property>
+ <property name="response_id">1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_emergency_button_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox7">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkImage" id="image6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-dialog-error</property>
+ <property name="icon-size">6</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Error&lt;/b&gt;
+ Something went wrong, please see the details
+ window for the exact error.
+
+ A logfile isodumper.log with the content will be saved in your
+ homedir/.isodumper when the application is closed.</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="GtkWindow" id="main_dialog">
+ <property name="can_focus">False</property>
+ <property name="title" translatable="yes">IsoDumper</property>
+ <property name="resizable">False</property>
+ <property name="window_position">center-always</property>
+ <property name="icon_name">gtk-execute</property>
+ <property name="type_hint">dialog</property>
+ <child>
+ <widget class="GtkVBox" id="vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkEventBox" id="eventbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkImage" id="image4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixbuf">/usr/share/isodumper/header.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkVBox" id="vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkHBox" id="hbox5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkLabel" id="label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">Write Image:</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkFileChooserButton" id="filechooserbutton">
+ <property name="width_request">180</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_tooltip">True</property>
+ <property name="tooltip" translatable="yes">Select an image file to be written to the device</property>
+ <property name="title" translatable="yes">Select Image</property>
+ <signal name="file_set" handler="on_filechooserbutton_file_set" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="to_label">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">to</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkComboBox" id="device_combobox">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">False</property>
+ <property name="tooltip" translatable="yes">Select target device to write the image to</property>
+ <property name="items" translatable="yes"></property>
+ <signal name="changed" handler="on_device_combobox_changed" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">10</property>
+ <property name="position">0</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="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>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHSeparator" id="hseparator2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkExpander" id="detail_expander">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <signal name="activate" handler="on_detail_expander_activate" swapped="no"/>
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="vscrollbar_policy">automatic</property>
+ <child>
+ <widget class="GtkTextView" id="detail_text">
+ <property name="height_request">100</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">False</property>
+ <property name="wrap_mode">char</property>
+ <property name="left_margin">5</property>
+ <property name="cursor_visible">False</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="detail_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Details</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">5</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="cancel_button">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_cancel_button_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkButton" id="write_button">
+ <property name="visible">True</property>
+ <property name="sensitive">False</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <signal name="clicked" handler="on_write_button_clicked" swapped="no"/>
+ <child>
+ <widget class="GtkHBox" id="hbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-execute</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Write to device</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="padding">5</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="GtkDialog" id="nodev_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">IsoDumper</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="icon_name">gtk-execute</property>
+ <property name="type_hint">dialog</property>
+ <property name="skip_taskbar_hint">True</property>
+ <property name="transient_for">main_dialog</property>
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="button1">
+ <property name="label">gtk-close</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</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>
+ <child>
+ <widget class="GtkImage" id="image3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-dialog-error</property>
+ <property name="icon-size">6</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Error&lt;/b&gt;
+ No target devices were found.
+
+ You need to plug in a USB Key
+ to which the image can be written.</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+ <widget class="GtkDialog" id="success_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="title" translatable="yes">IsoDumper</property>
+ <property name="modal">True</property>
+ <property name="window_position">center-on-parent</property>
+ <property name="icon_name">gtk-execute</property>
+ <property name="type_hint">dialog</property>
+ <property name="transient_for">main_dialog</property>
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox3">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <widget class="GtkButton" id="success_button">
+ <property name="label">gtk-ok</property>
+ <property name="response_id">1</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_stock">True</property>
+ <signal name="clicked" handler="on_success_button_clicked" swapped="no"/>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkHBox" id="hbox6">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <widget class="GtkImage" id="image5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stock">gtk-dialog-info</property>
+ <property name="icon-size">6</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="GtkLabel" id="label5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="xpad">5</property>
+ <property name="label" translatable="yes">&lt;b&gt;Success&lt;/b&gt;
+ The image was successfully written to the
+ target device.
+
+ You are free to unplug it now, a log isodumper.log
+ of the operation will be saved in your homedir/.isodumper/ when
+ you close the application.</property>
+ <property name="use_markup">True</property>
+ </widget>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</glade-interface>