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

View File

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