Example #1
0
    def init_incoming(self, stanza):
        self._id = stanza.jingle.sid
        self._local_identity = Identity(FrozenURI.parse(stanza.recipient))
        self._remote_identity = Identity(FrozenURI.parse(stanza.sender))
        self._local_jid = self._local_identity.uri.as_xmpp_jid()
        self._remote_jid = self._remote_identity.uri.as_xmpp_jid()

        remote_sdp = jingle_to_sdp(stanza.jingle)
        try:
            self._sdp_negotiator = SDPNegotiator.create_with_remote_offer(remote_sdp)
        except SIPCoreError, e:
            self._fail(originator='local', reason='general-error', description=str(e))
            return
Example #2
0
    def init_incoming(self, stanza):
        self._id = stanza.jingle.sid
        self._local_identity = Identity(FrozenURI.parse(stanza.recipient))
        self._remote_identity = Identity(FrozenURI.parse(stanza.sender))
        self._local_jid = self._local_identity.uri.as_xmpp_jid()
        self._remote_jid = self._remote_identity.uri.as_xmpp_jid()

        remote_sdp = jingle_to_sdp(stanza.jingle)
        try:
            self._sdp_negotiator = SDPNegotiator.create_with_remote_offer(remote_sdp)
        except SIPCoreError, e:
            self._fail(originator='local', reason='general-error', description=str(e))
            return
Example #3
0
    def init_incoming(self, stanza):
        self._id = stanza.jingle.sid
        self._local_identity = Identity(FrozenURI.parse(stanza.recipient))
        self._remote_identity = Identity(FrozenURI.parse(stanza.sender))
        self._local_jid = self._local_identity.uri.as_xmpp_jid()
        self._remote_jid = self._remote_identity.uri.as_xmpp_jid()

        remote_sdp = jingle_to_sdp(stanza.jingle)
        try:
            self._sdp_negotiator = SDPNegotiator.create_with_remote_offer(
                remote_sdp)
        except SIPCoreError as e:
            self._fail(originator='local',
                       reason='general-error',
                       description=str(e))
            return

        self.proposed_streams = []
        for index, media_stream in enumerate(remote_sdp.media):
            if media_stream.port != 0:
                for stream_type in MediaStreamRegistry:
                    try:
                        stream = stream_type.new_from_sdp(
                            self, remote_sdp, index)
                    except InvalidStreamError:
                        break
                    except UnknownStreamError:
                        continue
                    else:
                        stream.index = index
                        self.proposed_streams.append(stream)
                        break

        if self.proposed_streams:
            self.direction = 'incoming'
            self.state = 'incoming'
            NotificationCenter().post_notification(
                'JingleSessionNewIncoming',
                sender=self,
                data=NotificationData(streams=self.proposed_streams))
        else:
            self._fail(originator='local', reason='unsupported-applications')
Example #4
0
    def _OH_ConnectOperation(self, operation):
        if self.state is not None:
            return

        settings = SIPSimpleSettings()
        notification_center = NotificationCenter()

        self.direction = 'outgoing'
        self.state = 'connecting'
        self.proposed_streams = operation.streams
        self.local_focus = operation.is_focus
        self._id = random_id()
        self._local_identity = operation.sender
        self._remote_identity = operation.recipient
        self._local_jid = self._local_identity.uri.as_xmpp_jid()
        self._remote_jid = self._remote_identity.uri.as_xmpp_jid()

        notification_center.post_notification('JingleSessionNewOutgoing', self, NotificationData(streams=operation.streams))

        for stream in self.proposed_streams:
            notification_center.add_observer(self, sender=stream)
            stream.initialize(self, direction='outgoing')

        try:
            wait_count = len(self.proposed_streams)
            while wait_count > 0:
                notification = operation.channel.wait()
                if notification.name == 'MediaStreamDidInitialize':
                    wait_count -= 1
            # Build local SDP and negotiator
            local_ip = SIPConfig.local_ip.normalized
            local_sdp = SDPSession(local_ip, connection=SDPConnection(local_ip), name=settings.user_agent)
            for index, stream in enumerate(self.proposed_streams):
                stream.index = index
                media = stream.get_local_media(remote_sdp=None, index=index)
                local_sdp.media.append(media)
            self._sdp_negotiator = SDPNegotiator.create_with_local_offer(local_sdp)
            # Build the payload and send it over
            payload = sdp_to_jingle(local_sdp)
            payload.sid = self._id
            if self.local_focus:
                payload.conference_info = jingle.ConferenceInfo(True)
            stanza = self._protocol.sessionInitiate(self._local_jid, self._remote_jid, payload)
            d = self._send_stanza(stanza)
            block_on(d)
        except (MediaStreamDidNotInitializeError, MediaStreamDidFailError, IqTimeoutError, StanzaError, SIPCoreError), e:
            for stream in self.proposed_streams:
                notification_center.remove_observer(self, sender=stream)
                stream.deactivate()
                stream.end()
            if isinstance(e, IqTimeoutError):
                error = 'timeout sending IQ stanza'
            elif isinstance(e, StanzaError):
                error = str(e.condition)
            elif isinstance(e, SIPCoreError):
                error = str(e)
            else:
                error = 'media stream failed: %s' % e.data.reason
            self.state = 'terminated'
            NotificationCenter().post_notification('JingleSessionDidFail', sender=self, data=NotificationData(originator='local', reason=error))
            self._channel.send_exception(proc.ProcExit)
Example #5
0
    def _OH_ConnectOperation(self, operation):
        if self.state is not None:
            return

        settings = SIPSimpleSettings()
        notification_center = NotificationCenter()

        self.direction = 'outgoing'
        self.state = 'connecting'
        self.proposed_streams = operation.streams
        self.local_focus = operation.is_focus
        self._id = random_id()
        self._local_identity = operation.sender
        self._remote_identity = operation.recipient
        self._local_jid = self._local_identity.uri.as_xmpp_jid()
        self._remote_jid = self._remote_identity.uri.as_xmpp_jid()

        notification_center.post_notification(
            'JingleSessionNewOutgoing', self,
            NotificationData(streams=operation.streams))

        for stream in self.proposed_streams:
            notification_center.add_observer(self, sender=stream)
            stream.initialize(self, direction='outgoing')

        try:
            wait_count = len(self.proposed_streams)
            while wait_count > 0:
                notification = operation.channel.wait()
                if notification.name == 'MediaStreamDidInitialize':
                    wait_count -= 1
            # Build local SDP and negotiator
            local_ip = SIPConfig.local_ip.normalized
            local_sdp = SDPSession(local_ip,
                                   connection=SDPConnection(local_ip),
                                   name=settings.user_agent)
            for index, stream in enumerate(self.proposed_streams):
                stream.index = index
                media = stream.get_local_media(remote_sdp=None, index=index)
                local_sdp.media.append(media)
            self._sdp_negotiator = SDPNegotiator.create_with_local_offer(
                local_sdp)
            # Build the payload and send it over
            payload = sdp_to_jingle(local_sdp)
            payload.sid = self._id
            if self.local_focus:
                payload.conference_info = jingle.ConferenceInfo(True)
            stanza = self._protocol.sessionInitiate(self._local_jid,
                                                    self._remote_jid, payload)
            d = self._send_stanza(stanza)
            block_on(d)
        except (MediaStreamDidNotInitializeError, MediaStreamDidFailError,
                IqTimeoutError, StanzaError, SIPCoreError) as e:
            for stream in self.proposed_streams:
                notification_center.remove_observer(self, sender=stream)
                stream.deactivate()
                stream.end()
            if isinstance(e, IqTimeoutError):
                error = 'timeout sending IQ stanza'
            elif isinstance(e, StanzaError):
                error = str(e.condition)
            elif isinstance(e, SIPCoreError):
                error = str(e)
            else:
                error = 'media stream failed: %s' % e.data.reason
            self.state = 'terminated'
            NotificationCenter().post_notification('JingleSessionDidFail',
                                                   sender=self,
                                                   data=NotificationData(
                                                       originator='local',
                                                       reason=error))
            self._channel.send_exception(proc.ProcExit)
        else:
            self._timer = reactor.callLater(settings.sip.invite_timeout,
                                            self.end)