complete IBB jingle support, fixes #6998

This commit is contained in:
Jefry Lagrange 2012-01-06 23:18:50 -05:00
parent f3b09203d6
commit 930c71cc04
2 changed files with 32 additions and 15 deletions

View File

@ -22,7 +22,7 @@ Handles Jingle File Transfer (XEP 0234)
import gajim
import xmpp
from jingle_content import contents, JingleContent
from jingle_transport import JingleTransportICEUDP, JingleTransportSocks5
from jingle_transport import JingleTransportICEUDP, JingleTransportSocks5, JingleTransportIBB, TransportType
from common import helpers
from common.socks5 import Socks5ReceiverClient, Socks5SenderClient
from common.connection_handlers_events import FileRequestReceivedEvent
@ -61,7 +61,7 @@ class JingleFileTransfer(JingleContent):
self.callbacks['session-terminate'] += [self.__on_session_terminate]
self.callbacks['transport-accept'] += [self.__on_transport_accept]
self.callbacks['transport-replace'] += [self.__on_transport_replace]
self.callbacks['session-accept-sent'] += [self._listen_host]
self.callbacks['session-accept-sent'] += [self.__transport_setup]
# fallback transport method
self.callbacks['transport-reject'] += [self.__on_transport_reject]
self.callbacks['transport-info'] += [self.__on_transport_info]
@ -119,10 +119,7 @@ class JingleFileTransfer(JingleContent):
response.delChild(response.getQuery())
con.connection.send(response)
# We send the file
con.files_props[self.file_props['sid']] = self.file_props
fp = open(self.file_props['file-name'], 'r')
con.OpenStream( self.transport.sid, self.session.peerjid,
fp, blocksize=4096)
self.__start_IBB_transfer(con)
raise xmpp.NodeProcessed
self.file_props['streamhosts'] = self.transport.remote_candidates
@ -142,11 +139,14 @@ class JingleFileTransfer(JingleContent):
fingerprint = None
if self.use_security:
fingerprint = 'client'
gajim.socks5queue.connect_to_hosts(self.session.connection.name,
if self.transport.type == TransportType.SOCKS5:
gajim.socks5queue.connect_to_hosts(self.session.connection.name,
self.file_props['sid'], self.send_candidate_used,
self._on_connect_error, fingerprint=fingerprint,
receiving=False)
elif self.transport.type == TransportType.IBB:
self.state = STATE_TRANSFERING
self.__start_IBB_transfer(self.session.connection)
raise xmpp.NodeProcessed
def __on_session_terminate(self, stanza, content, error, action):
@ -224,6 +224,7 @@ class JingleFileTransfer(JingleContent):
self.file_props
# Listen on configured port for file transfer
self._listen_host()
elif not self.weinitiate and self.state == STATE_NOT_STARTED:
# session-accept iq-result
if not self.negotiated:
@ -254,6 +255,22 @@ class JingleFileTransfer(JingleContent):
return
# initiate transfer
self.start_transfer()
def __start_IBB_transfer(self, con):
con.files_props[self.file_props['sid']] = self.file_props
fp = open(self.file_props['file-name'], 'r')
con.OpenStream( self.transport.sid, self.session.peerjid,
fp, blocksize=4096)
def __transport_setup(self, stanza=None, content=None, error=None
, action=None):
# Sets up a few transport specific things for the file transfer
if self.transport.type == TransportType.SOCKS5:
self._listen_host()
if self.transport.type == TransportType.IBB:
self.state = STATE_TRANSFERING
def send_candidate_used(self, streamhost):
"""
@ -328,8 +345,7 @@ class JingleFileTransfer(JingleContent):
# callback from socsk5queue.start_listener
self.file_props['hash'] = hash_id
def _listen_host(self, stanza=None, content=None, error=None
, action=None):
def _listen_host(self):
receiver = self.file_props['receiver']
sender = self.file_props['sender']

View File

@ -36,8 +36,9 @@ class TransportType(object):
"""
Possible types of a JingleTransport
"""
datagram = 1
streaming = 2
ICEUDP = 1
SOCKS5 = 2
IBB = 3
class JingleTransport(object):
@ -98,7 +99,7 @@ class JingleTransportSocks5(JingleTransport):
Note: Don't forget to call set_file_props after initialization
"""
def __init__(self, node=None):
JingleTransport.__init__(self, TransportType.streaming)
JingleTransport.__init__(self, TransportType.SOCKS5)
self.connection = None
self.remote_candidates = []
self.sid = None
@ -300,7 +301,7 @@ class JingleTransportIBB(JingleTransport):
def __init__(self, node=None, block_sz=None):
JingleTransport.__init__(self, TransportType.streaming)
JingleTransport.__init__(self, TransportType.IBB)
if block_sz:
self.block_sz = block_sz
@ -328,7 +329,7 @@ except Exception:
class JingleTransportICEUDP(JingleTransport):
def __init__(self, node):
JingleTransport.__init__(self, TransportType.datagram)
JingleTransport.__init__(self, TransportType.ICEUDP)
def make_candidate(self, candidate):
types = {farsight.CANDIDATE_TYPE_HOST: 'host',