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 | ||||
| 		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') | ||||
|  |  | |||
|  | @ -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): | ||||
|  |  | |||
|  | @ -563,6 +563,29 @@ class ConfirmationDialogCheck(ConfirmationDialog): | |||
| 		''' 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, | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue