From 1c7b265c9ca42171e0e65c977342516670cc21c3 Mon Sep 17 00:00:00 2001
From: Yann Leboulanger <asterix@lagaule.org>
Date: Tue, 28 Jul 2009 23:13:34 +0200
Subject: [PATCH] better file transfer error handling. Fixes #5064

---
 src/common/socks5.py        | 14 ++++++++++++--
 src/filetransfers_window.py |  3 +--
 src/gajim.py                |  7 +++++--
 src/roster_window.py        |  7 ++++++-
 4 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/src/common/socks5.py b/src/common/socks5.py
index d9d591c79f..e1c1099ad8 100644
--- a/src/common/socks5.py
+++ b/src/common/socks5.py
@@ -489,7 +489,12 @@ class Socks5:
 			return None
 		fd = None
 		if self.remaining_buff != '':
-			fd = self.get_fd()
+			try:
+				fd = self.get_fd()
+			except IOError, e:
+				self.disconnect(False)
+				self.file_props['error'] = -6 # file system error
+				return 0
 			fd.write(self.remaining_buff)
 			lenn = len(self.remaining_buff)
 			current_time = self.idlequeue.current_time()
@@ -505,7 +510,12 @@ class Socks5:
 				self.file_props['completed'] = True
 				return 0
 		else:
-			fd = self.get_fd()
+			try:
+				fd = self.get_fd()
+			except IOError, e:
+				self.disconnect(False)
+				self.file_props['error'] = -6 # file system error
+				return 0
 			try:
 				buff = self._recv(MAX_BUFF_LEN)
 			except Exception:
diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py
index 82974ca5b5..2b3642da7d 100644
--- a/src/filetransfers_window.py
+++ b/src/filetransfers_window.py
@@ -228,8 +228,7 @@ _('Connection with peer cannot be established.'))
 		sectext += '\n\t' + _('Recipient: %s') % jid
 		if error_msg:
 			sectext += '\n\t' + _('Error message: %s') % error_msg
-		dialogs.ErrorDialog(_('File transfer stopped by the contact at the other '
-			'end'), sectext)
+		dialogs.ErrorDialog(_('File transfer stopped'), sectext)
 		self.tree.get_selection().unselect_all()
 
 	def show_file_send_request(self, account, contact):
diff --git a/src/gajim.py b/src/gajim.py
index 1f114563dc..5bdea09a9d 100644
--- a/src/gajim.py
+++ b/src/gajim.py
@@ -1768,7 +1768,10 @@ class Interface:
 				if gajim.config.get('notify_on_file_complete'):
 					ft.show_completed(jid, file_props)
 			elif file_props['error'] == -1:
-				ft.show_stopped(jid, file_props)
+				ft.show_stopped(jid, file_props,
+					error_msg=_('Remote contact stopped transfer'))
+			elif file_props['error'] == -6:
+				ft.show_stopped(jid, file_props, error_msg=_('Error opening file'))
 			return
 
 		msg_type = ''
@@ -1777,7 +1780,7 @@ class Interface:
 		'notify_on_file_complete'):
 			msg_type = 'file-completed'
 			event_type = _('File Transfer Completed')
-		elif file_props['error'] == -1:
+		elif file_props['error'] in (-1, -6):
 			msg_type = 'file-stopped'
 			event_type = _('File Transfer Stopped')
 
diff --git a/src/roster_window.py b/src/roster_window.py
index f2ccdc3707..65fc33bafd 100644
--- a/src/roster_window.py
+++ b/src/roster_window.py
@@ -1838,7 +1838,12 @@ class RosterWindow:
 			gajim.events.remove_events(account, jid, event)
 			return True
 		elif event.type_ in ('file-error', 'file-stopped'):
-			ft.show_stopped(jid, data)
+			msg_error = ''
+			if data['error'] == -1:
+				msg_err = _('Remote contact stopped transfer')
+			elif data['error'] == -6:
+				msg_err = _('Error opening file')
+			ft.show_stopped(jid, data, error_msg=msg_err)
 			gajim.events.remove_events(account, jid, event)
 			return True
 		elif event.type_ == 'file-completed':
-- 
GitLab