we can now resume filetransfert
This commit is contained in:
		
							parent
							
								
									507fae1ccb
								
							
						
					
					
						commit
						aad4e2cd71
					
				
					 4 changed files with 67 additions and 3 deletions
				
			
		| 
						 | 
					@ -871,6 +871,15 @@ class Connection:
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		file_props['receiver'] = self.get_full_jid(iq_obj)
 | 
							file_props['receiver'] = self.get_full_jid(iq_obj)
 | 
				
			||||||
		si = iq_obj.getTag('si')
 | 
							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')
 | 
							feature = si.setTag('feature')
 | 
				
			||||||
		if feature.getNamespace() != common.xmpp.NS_FEATURE:
 | 
							if feature.getNamespace() != common.xmpp.NS_FEATURE:
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
| 
						 | 
					@ -1054,6 +1063,9 @@ class Connection:
 | 
				
			||||||
		si.setNamespace(common.xmpp.NS_SI)
 | 
							si.setNamespace(common.xmpp.NS_SI)
 | 
				
			||||||
		file_tag = si.setTag('file')
 | 
							file_tag = si.setTag('file')
 | 
				
			||||||
		file_tag.setNamespace(common.xmpp.NS_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 = si.setTag('feature')
 | 
				
			||||||
		feature.setNamespace(common.xmpp.NS_FEATURE)
 | 
							feature.setNamespace(common.xmpp.NS_FEATURE)
 | 
				
			||||||
		_feature = common.xmpp.DataForm(typ='submit')
 | 
							_feature = common.xmpp.DataForm(typ='submit')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -366,6 +366,10 @@ class Socks5:
 | 
				
			||||||
		if self.fd == None:
 | 
							if self.fd == None:
 | 
				
			||||||
			try:
 | 
								try:
 | 
				
			||||||
				self.fd = open(self.file_props['file-name'],'rb')
 | 
									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:
 | 
								except IOError, e:
 | 
				
			||||||
				self.close_file()
 | 
									self.close_file()
 | 
				
			||||||
				raise IOError, e
 | 
									raise IOError, e
 | 
				
			||||||
| 
						 | 
					@ -383,11 +387,16 @@ class Socks5:
 | 
				
			||||||
		if self.file_props.has_key('fd'):
 | 
							if self.file_props.has_key('fd'):
 | 
				
			||||||
			fd = self.file_props['fd']
 | 
								fd = self.file_props['fd']
 | 
				
			||||||
		else:
 | 
							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['fd'] = fd
 | 
				
			||||||
			self.file_props['elapsed-time'] = 0
 | 
								self.file_props['elapsed-time'] = 0
 | 
				
			||||||
			self.file_props['last-time'] = time.time()
 | 
								self.file_props['last-time'] = time.time()
 | 
				
			||||||
			self.file_props['received-len'] = 0
 | 
								self.file_props['received-len'] = offset
 | 
				
			||||||
		return fd
 | 
							return fd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	def rem_fd(self, fd):
 | 
						def rem_fd(self, fd):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -562,7 +562,30 @@ class ConfirmationDialogCheck(ConfirmationDialog):
 | 
				
			||||||
	def is_checked(self):
 | 
						def is_checked(self):
 | 
				
			||||||
		''' Get active state of the checkbutton '''
 | 
							''' Get active state of the checkbutton '''
 | 
				
			||||||
		return self.checkbutton.get_active()
 | 
							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 InputDialog:
 | 
				
			||||||
	'''Class for Input dialog'''
 | 
						'''Class for Input dialog'''
 | 
				
			||||||
	def __init__(self, title, label_str, input_str = None, is_modal = True,
 | 
						def __init__(self, title, label_str, input_str = None, is_modal = True,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -300,6 +300,24 @@ _('Connection with peer cannot be established.'))
 | 
				
			||||||
		gajim.connections[account].send_file_request(file_props)
 | 
							gajim.connections[account].send_file_request(file_props)
 | 
				
			||||||
		return True
 | 
							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):
 | 
						def show_file_request(self, account, contact, file_props):
 | 
				
			||||||
		''' show dialog asking for comfirmation and store location of new
 | 
							''' show dialog asking for comfirmation and store location of new
 | 
				
			||||||
		file requested by a contact'''
 | 
							file requested by a contact'''
 | 
				
			||||||
| 
						 | 
					@ -326,6 +344,8 @@ _('Connection with peer cannot be established.'))
 | 
				
			||||||
			gtk28 = False
 | 
								gtk28 = False
 | 
				
			||||||
			if gtk.gtk_version >= (2, 8, 0) and gtk.pygtk_version >= (2, 8, 0):
 | 
								if gtk.gtk_version >= (2, 8, 0) and gtk.pygtk_version >= (2, 8, 0):
 | 
				
			||||||
				dialog.props.do_overwrite_confirmation = True
 | 
									dialog.props.do_overwrite_confirmation = True
 | 
				
			||||||
 | 
									dialog.connect('confirm-overwrite', self.confirm_overwrite_cb,
 | 
				
			||||||
 | 
										file_props)
 | 
				
			||||||
				gtk28 = True
 | 
									gtk28 = True
 | 
				
			||||||
			if last_save_dir and os.path.isdir(last_save_dir):
 | 
								if last_save_dir and os.path.isdir(last_save_dir):
 | 
				
			||||||
				dialog.set_current_folder(last_save_dir)
 | 
									dialog.set_current_folder(last_save_dir)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue