we can now resume filetransfert

This commit is contained in:
Yann Leboulanger 2006-01-07 10:43:47 +00:00
parent 507fae1ccb
commit aad4e2cd71
4 changed files with 67 additions and 3 deletions

View File

@ -871,6 +871,15 @@ class Connection:
return
file_props['receiver'] = self.get_full_jid(iq_obj)
si = iq_obj.getTag('si')
file_tag = si.getTag('file')
range_tag = file_tag.getTag('range')
if range_tag:
offset = range_tag.getAttr('offset')
if offset:
file_props['offset'] = int(offset)
length = range_tag.getAttr('length')
if length:
file_props['length'] = int(length)
feature = si.setTag('feature')
if feature.getNamespace() != common.xmpp.NS_FEATURE:
return
@ -1054,6 +1063,9 @@ class Connection:
si.setNamespace(common.xmpp.NS_SI)
file_tag = si.setTag('file')
file_tag.setNamespace(common.xmpp.NS_FILE)
if file_props.has_key('offset') and file_props['offset']:
range_tag = file_tag.setTag('range')
range_tag.setAttr('offset', file_props['offset'])
feature = si.setTag('feature')
feature.setNamespace(common.xmpp.NS_FEATURE)
_feature = common.xmpp.DataForm(typ='submit')

View File

@ -366,6 +366,10 @@ class Socks5:
if self.fd == None:
try:
self.fd = open(self.file_props['file-name'],'rb')
if self.file_props.has_key('offset') and self.file_props['offset']:
self.size = self.file_props['offset']
self.fd.seek(self.size)
self.file_props['received-len'] = self.size
except IOError, e:
self.close_file()
raise IOError, e
@ -383,11 +387,16 @@ class Socks5:
if self.file_props.has_key('fd'):
fd = self.file_props['fd']
else:
fd = open(self.file_props['file-name'],'wb')
offset = 0
opt = 'wb'
if self.file_props.has_key('offset') and self.file_props['offset']:
offset = self.file_props['offset']
opt = 'ab'
fd = open(self.file_props['file-name'], opt)
self.file_props['fd'] = fd
self.file_props['elapsed-time'] = 0
self.file_props['last-time'] = time.time()
self.file_props['received-len'] = 0
self.file_props['received-len'] = offset
return fd
def rem_fd(self, fd):

View File

@ -562,7 +562,30 @@ class ConfirmationDialogCheck(ConfirmationDialog):
def is_checked(self):
''' Get active state of the checkbutton '''
return self.checkbutton.get_active()
class FTOverwriteConfirmationDialog(ConfirmationDialog):
'''HIG compliant confirmation dialog to overwrite or resume a file transfert'''
def __init__(self, pritext, sectext='', propose_resume=True):
HigDialog.__init__(self, None, gtk.MESSAGE_QUESTION, gtk.BUTTONS_CANCEL,
pritext, sectext)
if propose_resume:
b = gtk.Button('', gtk.STOCK_REFRESH)
align = b.get_children()[0]
hbox = align.get_children()[0]
label = hbox.get_children()[1]
label.set_text('_Resume')
label.set_use_underline(True)
self.add_action_widget(b, 100)
b = gtk.Button('', gtk.STOCK_SAVE_AS)
align = b.get_children()[0]
hbox = align.get_children()[0]
label = hbox.get_children()[1]
label.set_text('Re_place')
label.set_use_underline(True)
self.add_action_widget(b, 200)
class InputDialog:
'''Class for Input dialog'''
def __init__(self, title, label_str, input_str = None, is_modal = True,

View File

@ -300,6 +300,24 @@ _('Connection with peer cannot be established.'))
gajim.connections[account].send_file_request(file_props)
return True
def confirm_overwrite_cb(self, dialog, file_props):
file_path = dialog.get_filename()
file_path = file_path.decode('utf-8')
if os.path.exists(file_path):
stat = os.stat(file_path)
dl_size = stat.st_size
file_size = file_props['size']
dl_finished = dl_size >= file_size
dialog = dialogs.FTOverwriteConfirmationDialog(
_('This file already exists'), _('Would you like to overwrite it?'),
not dl_finished)
response = dialog.get_response()
if response == gtk.RESPONSE_CANCEL:
return gtk.FILE_CHOOSER_CONFIRMATION_SELECT_AGAIN
elif response == 100:
file_props['offset'] = dl_size
return gtk.FILE_CHOOSER_CONFIRMATION_ACCEPT_FILENAME
def show_file_request(self, account, contact, file_props):
''' show dialog asking for comfirmation and store location of new
file requested by a contact'''
@ -326,6 +344,8 @@ _('Connection with peer cannot be established.'))
gtk28 = False
if gtk.gtk_version >= (2, 8, 0) and gtk.pygtk_version >= (2, 8, 0):
dialog.props.do_overwrite_confirmation = True
dialog.connect('confirm-overwrite', self.confirm_overwrite_cb,
file_props)
gtk28 = True
if last_save_dir and os.path.isdir(last_save_dir):
dialog.set_current_folder(last_save_dir)