From c4ca6a80c3a77f6b53f1f5db025e3d98603c0449 Mon Sep 17 00:00:00 2001 From: Jefry Lagrange Date: Wed, 26 Dec 2012 18:41:31 -0400 Subject: [PATCH] Cancel an IBB transfer --- src/common/protocol/bytestream.py | 19 ++++++++++++++++++- src/filetransfers_window.py | 6 +++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index 4f6df6f8a..a8f317b32 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -803,6 +803,16 @@ class ConnectionIBBytestream(ConnectionBytestream): file_props.fp = open(file_props.file_name, 'w') conn.send(rep) + def CloseIBBStream(self, file_props): + file_props.connected = False + file_props.fp.close() + file_props.stopped = True + self.connection.send(nbxmpp.Protocol('iq', + file_props.direction[1:], 'set', + payload=[nbxmpp.Node(nbxmpp.NS_IBB + ' close', + {'sid':file_props.sid})])) + + def OpenStream(self, sid, to, fp, blocksize=4096): """ Start new stream. You should provide stream id 'sid', the endpoind jid @@ -849,6 +859,9 @@ class ConnectionIBBytestream(ConnectionBytestream): if file_props.direction[0] == '>': if file_props.paused: continue + if not file_props.connected: + #TODO: Reply with out of order error + continue chunk = file_props.fp.read(file_props.block_size) if chunk: datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid, @@ -939,6 +952,9 @@ class ConnectionIBBytestream(ConnectionBytestream): reply.delChild('close') conn.send(reply) file_props.fp.close() + file_props.completed = file_props.received_len >= file_props.size + if not file_props.completed: + file_props.error = -1 gajim.socks5queue.complete_transfer_cb(self.name, file_props) else: conn.send(nbxmpp.Error(stanza, nbxmpp.ERR_ITEM_NOT_FOUND)) @@ -953,8 +969,9 @@ class ConnectionIBBytestream(ConnectionBytestream): syn_id = stanza.getID() log.debug('IBBAllIqHandler called syn_id->%s' % syn_id) for file_props in FilesProp.getAllFileProp(): - if not file_props.direction: + if not file_props.direction or not file_props.connected: # It's socks5 bytestream + # Or we closed the IBB stream continue if file_props.syn_id == syn_id: if stanza.getType() == 'error': diff --git a/src/filetransfers_window.py b/src/filetransfers_window.py index 40edc2d26..d91539f80 100644 --- a/src/filetransfers_window.py +++ b/src/filetransfers_window.py @@ -943,7 +943,11 @@ class FileTransfersWindow: account = file_props.tt_account if account not in gajim.connections: return - gajim.connections[account].disconnect_transfer(file_props) + con = gajim.connections[account] + # Check if we are in a IBB transfer + if file_props.direction: + con.CloseIBBStream(file_props) + con.disconnect_transfer(file_props) self.set_status(file_props, 'stop') def show_tooltip(self, widget):