#! /usr/bin/env python
import gnomevfs
import gtk
import termios
import sys
from optparse import OptionParser
from xml.sax.saxutils import escape
import gobject
class GUITransfer(object):
def __init__(self, src, dst):
self.__progress = None
self.__progress_timeout = None
self.cancel = False
self.dialog = gtk.Dialog(title="Copying...",
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
self.dialog.set_border_width(12)
self.dialog.set_has_separator(False)
self.dialog.vbox.set_spacing(8)
label = gtk.Label("")
label.set_markup("Copying file\n"
"%s -> %s" %
(escape(str(src)), escape(str(dst))))
self.dialog.vbox.add(label)
self.progress_bar = gtk.ProgressBar()
self.dialog.vbox.add(self.progress_bar)
self.status_label = gtk.Label()
self.dialog.vbox.add(self.status_label)
self.dialog.show_all()
self.handle = gnomevfs.async.xfer(
source_uri_list=[src], target_uri_list=[dst],
xfer_options=gnomevfs.XFER_DEFAULT,
error_mode=gnomevfs.XFER_ERROR_MODE_ABORT,
overwrite_mode=gnomevfs.XFER_OVERWRITE_MODE_ABORT,
progress_update_callback=self.update_info_cb,
update_callback_data=0x4321,
progress_sync_callback=self.progress_info_cb,
sync_callback_data=0x1234)
self.dialog.connect("response", self.__dialog_response)
def __dialog_response(self, dialog, response):
if response == gtk.RESPONSE_REJECT or \
response == gtk.RESPONSE_DELETE_EVENT:
self.cancel = True
def update_info_cb(self, _reserved, info, data):
assert data == 0x4321
if info.phase == gnomevfs.XFER_PHASE_COMPLETED:
self.dialog.destroy()
gtk.main_quit()
if self.cancel:
return 0
return 1
def _do_set_progress(self):
self.progress_bar.set_fraction(self.__progress)
self.__progress_timeout = None
return False
def set_progress(self, progress):
assert isinstance(progress, (float, int, long))
self.__progress = progress
if self.__progress_timeout is None:
self.__progress_timeout = gobject.timeout_add(100, self._do_set_progress)
def progress_info_cb(self, info, data):
assert data == 0x1234
#print "progress_info_cb", info.status
try:
progress = float(info.bytes_copied)/float(info.bytes_total)
self.set_progress(progress)
except Exception, ex:
pass
if self.cancel:
return 0
return 1
def main():
parser = OptionParser(usage="usage: %prog [options] source-uri dest-uri")
options, args = parser.parse_args()
if len(args) != 2:
parser.error("wrong number of arguments")
src = gnomevfs.URI(args[0])
dst = gnomevfs.URI(args[1])
GUITransfer(src, dst)
gtk.main()
if __name__ == '__main__':
main()