changeset 4dbe49e6e8a9 in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=4dbe49e6e8a9
description: fix sending multiple files at the same time
diffstat:
src/common/jingle_ft.py | 5 ++++-
src/common/jingle_session.py | 10 +++++++---
src/common/socks5.py | 42 ++++++++++++++++++++++++++++--------------
3 files changed, 39 insertions(+), 18 deletions(-)
diffs (144 lines):
diff -r b8c439e2d76b -r 4dbe49e6e8a9 src/common/jingle_ft.py
--- a/src/common/jingle_ft.py Sat Dec 24 18:12:05 2011 -0500
+++ b/src/common/jingle_ft.py Mon Dec 26 21:18:45 2011 -0500
@@ -372,7 +372,10 @@
def start_transfer(self):
-
+
+ # We start the transfer, session negociation is over.
+ self.session.state = 0 # STATE 0 SESSION_ENDED
+
self.state = STATE_TRANSFERING
# It tells wether we start the transfer as client or server
diff -r b8c439e2d76b -r 4dbe49e6e8a9 src/common/jingle_session.py
--- a/src/common/jingle_session.py Sat Dec 24 18:12:05 2011 -0500
+++ b/src/common/jingle_session.py Mon Dec 26 21:18:45 2011 -0500
@@ -243,10 +243,15 @@
elif content and self.weinitiate:
self.__content_accept(content)
elif self.state == JingleStates.active:
- # We can either send a content-add or a content-accept
+ # We can either send a content-add or a content-accept. However, if
+ # we are sending a file we can only use session_initiate.
if not content:
return
- if (content.creator == 'initiator') == self.weinitiate:
+ we_created_content = (content.creator == 'initiator') \
+ == self.weinitiate
+ if we_created_content and content.media == 'file':
+ self.__session_initiate()
+ if we_created_content:
# We initiated this content. It's a pending content-add.
self.__content_add(content)
else:
@@ -694,7 +699,6 @@
self.connection.connection.send(stanza)
def _session_terminate(self, reason=None):
- assert self.state != JingleStates.ended
stanza, jingle = self.__make_jingle('session-terminate', reason=reason)
self.__broadcast_all(stanza, jingle, None, 'session-terminate-sent')
if self.connection.connection and self.connection.connected >= 2:
diff -r b8c439e2d76b -r 4dbe49e6e8a9 src/common/socks5.py
--- a/src/common/socks5.py Sat Dec 24 18:12:05 2011 -0500
+++ b/src/common/socks5.py Mon Dec 26 21:18:45 2011 -0500
@@ -93,17 +93,22 @@
sid = fp['sid']
self.type = type # It says whether we are sending or receiving
self.sha_handlers[sha_str] = (sha_handler, sid)
- self.listener = Socks5Listener(self.idlequeue, port, fp,
- fingerprint=fingerprint)
- self.listener.queue = self
- self.listener.bind()
- if self.listener.started is False:
- self.listener = None
- # We cannot bind port, call error callback and fail
- self.error_cb(_('Unable to bind to port %s.') % port,
- _('Maybe you have another running instance of Gajim. File '
- 'Transfer will be cancelled.'))
- return None
+ if self.listener is None or self.listener.connections == []:
+ self.listener = Socks5Listener(self.idlequeue, port, fp,
+ fingerprint=fingerprint)
+ self.listener.queue = self
+ self.listener.bind()
+ if self.listener.started is False:
+ self.listener = None
+ # We cannot bind port, call error callback and fail
+ self.error_cb(_('Unable to bind to port %s.') % port,
+ _('Maybe you have another running instance of Gajim. File '
+ 'Transfer will be cancelled.'))
+ return None
+ else:
+ # There is already a listener, we update the file's information
+ # on the new connection.
+ self.listener.file_props = fp
self.connected += 1
return self.listener
@@ -724,6 +729,7 @@
"""
Read file contents from socket and write them to file
"""
+
if self.file_props is None or ('file-name' in self.file_props) is False:
self.file_props['error'] = -2
return None
@@ -773,14 +779,14 @@
# Transfer stopped somehow:
# reset, paused or network error
self.rem_fd(fd)
- self.disconnect(False)
+ self.disconnect()
self.file_props['error'] = -1
return 0
try:
fd.write(buff)
except IOError, e:
self.rem_fd(fd)
- self.disconnect(False)
+ self.disconnect()
self.file_props['error'] = -6 # file system error
return 0
if self.file_props['received-len'] >= int(self.file_props['size']):
@@ -809,7 +815,12 @@
self.idlequeue.remove_timeout(self.fd)
self.idlequeue.unplug_idle(self.fd)
if self.mode == 'server':
- self.queue.listener.disconnect()
+ try:
+ self.queue.listener.connections.remove(self._sock)
+ except ValueError:
+ pass # Not in list
+ if self.queue.listener.connections == []:
+ self.queue.listener.disconnect()
try:
self._sock.shutdown(socket.SHUT_RDWR)
self._sock.close()
@@ -1127,6 +1138,7 @@
def pollin(self):
+ self.idlequeue.remove_timeout(self.fd)
if self.connected:
try:
if self.state < 5:
@@ -1426,6 +1438,7 @@
self.fd = -1
self.fingerprint = fingerprint
self.file_props = fp
+ self.connections = []
def bind(self):
for ai in self.ais:
@@ -1501,6 +1514,7 @@
"""
_sock = self._serv.accept()
_sock[0].setblocking(False)
+ self.connections.append(_sock[0])
return _sock
changeset b8c439e2d76b in /home/hg/repos/gajim
details:http://hg.gajim.org/gajim?cmd=changeset;node=b8c439e2d76b
description: fix closing listening port
diffstat:
src/common/socks5.py | 46 ++++++++++++++++++++++++++++++----------------
src/gui_interface.py | 5 +++--
2 files changed, 33 insertions(+), 18 deletions(-)
diffs (135 lines):
diff -r 2ef1876c2266 -r b8c439e2d76b src/common/socks5.py
--- a/src/common/socks5.py Thu Dec 22 21:52:37 2011 -0500
+++ b/src/common/socks5.py Sat Dec 24 18:12:05 2011 -0500
@@ -93,19 +93,19 @@
sid = fp['sid']
self.type = type # It says whether we are sending or receiving
self.sha_handlers[sha_str] = (sha_handler, sid)
- if self.listener is None:
- self.listener = Socks5Listener(self.idlequeue, port, fp,
+ self.listener = Socks5Listener(self.idlequeue, port, fp,
fingerprint=fingerprint)
- self.listener.queue = self
- self.listener.bind()
- if self.listener.started is False:
- self.listener = None
- # We cannot bind port, call error callback and fail
- self.error_cb(_('Unable to bind to port %s.') % port,
+ self.listener.queue = self
+ self.listener.bind()
+ if self.listener.started is False:
+ self.listener = None
+ # We cannot bind port, call error callback and fail
+ self.error_cb(_('Unable to bind to port %s.') % port,
_('Maybe you have another running instance of Gajim. File '
'Transfer will be cancelled.'))
- return None
- self.connected += 1
+ return None
+
+ self.connected += 1
return self.listener
def send_success_reply(self, file_props, streamhost):
@@ -311,6 +311,12 @@
def send_file(self, file_props, account, mode):
for key in self.senders.keys():
+ if self.senders == {}:
+ # Python acts very weird with this. When there is no keys
+ # in the dictionary It says that it has a key.
+ # Maybe it is my machine. Without this there is a KeyError
+ # traceback.
+ return
if file_props['name'] in key and file_props['sid'] in key \
and self.senders[key].mode == mode:
@@ -416,7 +422,7 @@
elif self.progress_transfer_cb is not None:
self.progress_transfer_cb(actor.account, actor.file_props)
- def remove_receiver(self, idx, do_disconnect=True):
+ def remove_receiver(self, idx, do_disconnect=True, remove_all=False):
"""
Remove reciver from the list and decrease the number of active
connections with 1
@@ -429,14 +435,16 @@
self.idlequeue.remove_timeout(reader.fd)
if do_disconnect:
reader.disconnect()
- break
+ if not remove_all:
+ break
else:
if reader.streamhost is not None:
reader.streamhost['state'] = -1
del(self.readers[key])
- break
-
- def remove_sender(self, idx, do_disconnect=True):
+ if not remove_all:
+ break
+
+ def remove_sender(self, idx, do_disconnect=True, remove_all=False):
"""
Remove sender from the list of senders and decrease the number of active
connections with 1
@@ -447,13 +455,16 @@
sender = self.senders[key]
if do_disconnect:
sender.disconnect()
- return
+ if not remove_all:
+ break
else:
self.idlequeue.unplug_idle(sender.fd)
self.idlequeue.remove_timeout(sender.fd)
del(self.senders[key])
if self.connected > 0:
self.connected -= 1
+ if not remove_all:
+ break
if len(self.senders) == 0 and self.listener is not None:
self.listener.disconnect()
self.listener = None
@@ -483,6 +494,7 @@
self.file = None
self.connected = False
self.type = ''
+ self.mode = ''
def _is_connected(self):
@@ -796,6 +808,8 @@
self.close_file()
self.idlequeue.remove_timeout(self.fd)
self.idlequeue.unplug_idle(self.fd)
+ if self.mode == 'server':
+ self.queue.listener.disconnect()
try:
self._sock.shutdown(socket.SHUT_RDWR)
self._sock.close()
diff -r 2ef1876c2266 -r b8c439e2d76b src/gui_interface.py
--- a/src/gui_interface.py Thu Dec 22 21:52:37 2011 -0500
+++ b/src/gui_interface.py Sat Dec 24 18:12:05 2011 -0500
@@ -918,9 +918,10 @@
if file_props['type'] == 'r': # we receive a file
jid = unicode(file_props['sender'])
+ gajim.socks5queue.remove_receiver(file_props['sid'], True, True)
else: # we send a file
jid = unicode(file_props['receiver'])
-
+ gajim.socks5queue.remove_sender(file_props['sid'], True, True)
# End jingle session
if file_props.get('session-type') == 'jingle' and file_props['type'] ==\
'r':
@@ -957,7 +958,7 @@
elif file_props['error'] in (-1, -6):
msg_type = 'file-stopped'
event_type = _('File Transfer Stopped')
-
+
if event_type == '':
# FIXME: ugly workaround (this can happen Gajim sent, Gaim recvs)
# this should never happen but it does. see process_result() in