Cancel an IBB transfer

This commit is contained in:
Jefry Lagrange 2012-12-26 18:41:31 -04:00
parent 6894db0224
commit c4ca6a80c3
2 changed files with 23 additions and 2 deletions

View File

@ -803,6 +803,16 @@ class ConnectionIBBytestream(ConnectionBytestream):
file_props.fp = open(file_props.file_name, 'w') file_props.fp = open(file_props.file_name, 'w')
conn.send(rep) 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): def OpenStream(self, sid, to, fp, blocksize=4096):
""" """
Start new stream. You should provide stream id 'sid', the endpoind jid 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.direction[0] == '>':
if file_props.paused: if file_props.paused:
continue continue
if not file_props.connected:
#TODO: Reply with out of order error
continue
chunk = file_props.fp.read(file_props.block_size) chunk = file_props.fp.read(file_props.block_size)
if chunk: if chunk:
datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid, datanode = nbxmpp.Node(nbxmpp.NS_IBB + ' data', {'sid': sid,
@ -939,6 +952,9 @@ class ConnectionIBBytestream(ConnectionBytestream):
reply.delChild('close') reply.delChild('close')
conn.send(reply) conn.send(reply)
file_props.fp.close() 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) gajim.socks5queue.complete_transfer_cb(self.name, file_props)
else: else:
conn.send(nbxmpp.Error(stanza, nbxmpp.ERR_ITEM_NOT_FOUND)) conn.send(nbxmpp.Error(stanza, nbxmpp.ERR_ITEM_NOT_FOUND))
@ -953,8 +969,9 @@ class ConnectionIBBytestream(ConnectionBytestream):
syn_id = stanza.getID() syn_id = stanza.getID()
log.debug('IBBAllIqHandler called syn_id->%s' % syn_id) log.debug('IBBAllIqHandler called syn_id->%s' % syn_id)
for file_props in FilesProp.getAllFileProp(): 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 # It's socks5 bytestream
# Or we closed the IBB stream
continue continue
if file_props.syn_id == syn_id: if file_props.syn_id == syn_id:
if stanza.getType() == 'error': if stanza.getType() == 'error':

View File

@ -943,7 +943,11 @@ class FileTransfersWindow:
account = file_props.tt_account account = file_props.tt_account
if account not in gajim.connections: if account not in gajim.connections:
return 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') self.set_status(file_props, 'stop')
def show_tooltip(self, widget): def show_tooltip(self, widget):