home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / share / doc / python-gnome2 / examples / vfs / async-xfer.py next >
Encoding:
Python Source  |  2004-12-25  |  3.1 KB  |  97 lines

  1. #! /usr/bin/env python
  2. import gnomevfs
  3. import gtk
  4. import termios
  5. import sys
  6. from optparse import OptionParser
  7. from xml.sax.saxutils import escape
  8. import gobject
  9.  
  10. class GUITransfer(object):
  11.     def __init__(self, src, dst):
  12.         self.__progress = None
  13.         self.__progress_timeout = None
  14.         self.cancel = False
  15.         self.dialog = gtk.Dialog(title="Copying...",
  16.                                  buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
  17.         self.dialog.set_border_width(12)
  18.         self.dialog.set_has_separator(False)
  19.         self.dialog.vbox.set_spacing(8)
  20.         label = gtk.Label("")
  21.         label.set_markup("<big><b>Copying file</b></big>\n"
  22.                          "<tt>%s -> %s</tt>" %
  23.                          (escape(str(src)), escape(str(dst))))
  24.         self.dialog.vbox.add(label)
  25.         self.progress_bar = gtk.ProgressBar()
  26.         self.dialog.vbox.add(self.progress_bar)
  27.  
  28.         self.status_label = gtk.Label()
  29.         self.dialog.vbox.add(self.status_label)        
  30.         self.dialog.show_all()
  31.  
  32.         self.handle = gnomevfs.async.xfer(
  33.             source_uri_list=[src], target_uri_list=[dst],
  34.             xfer_options=gnomevfs.XFER_DEFAULT,
  35.             error_mode=gnomevfs.XFER_ERROR_MODE_ABORT,
  36.             overwrite_mode=gnomevfs.XFER_OVERWRITE_MODE_ABORT,
  37.             progress_update_callback=self.update_info_cb,
  38.             update_callback_data=0x4321,
  39.             progress_sync_callback=self.progress_info_cb,
  40.             sync_callback_data=0x1234)
  41.         
  42.         self.dialog.connect("response", self.__dialog_response)
  43.     
  44.     def __dialog_response(self, dialog, response):
  45.         if response == gtk.RESPONSE_REJECT or \
  46.            response == gtk.RESPONSE_DELETE_EVENT:
  47.             self.cancel = True
  48.  
  49.     def update_info_cb(self, _reserved, info, data):
  50.         assert data == 0x4321
  51.         if info.phase == gnomevfs.XFER_PHASE_COMPLETED:
  52.             self.dialog.destroy()
  53.             gtk.main_quit()
  54.         if self.cancel:
  55.             return 0
  56.         return 1
  57.  
  58.     def _do_set_progress(self):
  59.         self.progress_bar.set_fraction(self.__progress)
  60.         self.__progress_timeout = None
  61.         return False
  62.         
  63.     def set_progress(self, progress):
  64.         assert isinstance(progress, (float, int, long))
  65.         self.__progress = progress
  66.         if self.__progress_timeout is None:
  67.             self.__progress_timeout = gobject.timeout_add(100, self._do_set_progress)
  68.  
  69.     def progress_info_cb(self, info, data):
  70.         assert data == 0x1234
  71.         #print "progress_info_cb", info.status
  72.         try:
  73.             progress = float(info.bytes_copied)/float(info.bytes_total)
  74.             self.set_progress(progress)
  75.         except Exception, ex:
  76.             pass
  77.         if self.cancel:
  78.             return 0
  79.         return 1
  80.  
  81. def main():
  82.     parser = OptionParser(usage="usage: %prog [options] source-uri dest-uri")
  83.     options, args = parser.parse_args()
  84.  
  85.     if len(args) != 2:
  86.         parser.error("wrong number of arguments")
  87.  
  88.     src = gnomevfs.URI(args[0])
  89.     dst = gnomevfs.URI(args[1])
  90.  
  91.     GUITransfer(src, dst)
  92.     
  93.     gtk.main()
  94.  
  95. if __name__ == '__main__':
  96.     main()
  97.