diff --git a/src/common/jingle_ft.py b/src/common/jingle_ft.py index 535e08445..691dbba4b 100644 --- a/src/common/jingle_ft.py +++ b/src/common/jingle_ft.py @@ -98,6 +98,13 @@ class JingleFileTransfer(JingleContent): self.transport = JingleTransportSocks5() self.transport.set_our_jid(self.session.ourjid) self.transport.set_file_props(self.file_props) + if self.file_props.has_key("streamhosts"): + self.file_props['streamhosts'].extend(self.transport.remote_candidates) + else: + self.file_props['streamhosts'] = self.transport.remote_candidates + for host in self.file_props['streamhosts']: + host['initiator'] = self.session.initiator + host['target'] = self.session.responder log.info("FT request: %s" % file_props) self.session.connection.dispatch('FILE_REQUEST', (jid, file_props)) @@ -106,27 +113,22 @@ class JingleFileTransfer(JingleContent): def __on_session_accept(self, stanza, content, error, action): log.info("__on_session_accept") - pass + gajim.socks5queue.send_file(self.file_props, self.session.ourjid) def __on_session_terminate(self, stanza, content, error, action): log.info("__on_session_terminate") - pass def __on_transport_accept(self, stanza, content, error, action): log.info("__on_transport_accept") - pass def __on_transport_replace(self, stanza, content, error, action): log.info("__on_transport_replace") - pass def __on_transport_reject(self, stanza, content, error, action): log.info("__on_transport_reject") - pass def __on_transport_info(self, stanza, content, error, action): log.info("__on_transport_info") - pass def _fill_content(self, content): description_node = xmpp.simplexml.Node(tag=xmpp.NS_JINGLE_FILE_TRANSFER + ' description') diff --git a/src/common/jingle_transport.py b/src/common/jingle_transport.py index 312dcf121..91fc50a64 100644 --- a/src/common/jingle_transport.py +++ b/src/common/jingle_transport.py @@ -85,6 +85,7 @@ class JingleTransportSocks5(JingleTransport): """ def __init__(self): JingleTransport.__init__(self, TransportType.streaming) + self.remote_candidates = [] def set_file_props(self, file_props): self.file_props = file_props @@ -116,7 +117,20 @@ class JingleTransportSocks5(JingleTransport): return transport def parse_transport_stanza(self, transport): - pass + candidates = [] + for candidate in transport.iterTags('candidate'): + cand = { + 'state': 0, + 'target': self.ourjid, + 'host': candidate['host'], + 'port': candidate['port'] + } + candidates.append(cand) + + # we need this when we construct file_props on session-initiation + self.remote_candidates = candidates + return candidates + def _add_local_ips_as_candidates(self): local_ip_cand = [] diff --git a/src/common/protocol/bytestream.py b/src/common/protocol/bytestream.py index f0776181a..f75ceca61 100644 --- a/src/common/protocol/bytestream.py +++ b/src/common/protocol/bytestream.py @@ -137,12 +137,17 @@ class ConnectionBytestream: return jid = gajim.get_jid_without_resource(file_props['sender']) resource = gajim.get_resource_from_jid(file_props['sender']) - + sid = file_props['sid'] gajim.socks5queue.add_file_props(session.ourjid, file_props) if not session.accepted: session.approve_session() session.approve_content('file') + + if not gajim.socks5queue.get_file_props(session.ourjid, sid): + gajim.socks5queue.add_file_props(session.ourjid, file_props) + gajim.socks5queue.connect_to_hosts(session.ourjid, sid, + None, None) return iq = xmpp.Iq(to=unicode(file_props['sender']), typ='result')