Fix somes issues with content-add/content-accept/session-accept, and other things.

This commit is contained in:
Thibaut GIRKA 2009-09-26 21:55:43 +02:00
parent b5c7519740
commit 5a1a36e348
2 changed files with 24 additions and 15 deletions

View file

@ -17,10 +17,7 @@
# - 'senders' attribute of 'content' element # - 'senders' attribute of 'content' element
# - security preconditions # - security preconditions
# * actions: # * actions:
# - content-accept: see content-add # - content-modify
# - content-reject: sending it ; receiving is ok
# - content-add: handling ; sending is ok
# - content-modify: both
# - description-info, session-info # - description-info, session-info
# - security-info # - security-info
# - transport-accept, transport-reject # - transport-accept, transport-reject
@ -223,7 +220,20 @@ class JingleSession(object):
pass pass
def on_session_state_changed(self, content=None): def on_session_state_changed(self, content=None):
if self.state == JingleStates.active and self.accepted: if self.state == JingleStates.ended:
# Session not yet started, only one action possible: session-initiate
if self.is_ready() and self.weinitiate:
self.__session_initiate()
elif self.state == JingleStates.pending:
# We can either send a session-accept or a content-add
if self.is_ready() and not self.weinitiate:
self.__session_accept()
elif content and (content.creator == 'initiator') == self.weinitiate:
self.__content_add(content)
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
if not content: if not content:
return return
if (content.creator == 'initiator') == self.weinitiate: if (content.creator == 'initiator') == self.weinitiate:
@ -232,11 +242,6 @@ class JingleSession(object):
else: else:
# The other side created this content, we accept it. # The other side created this content, we accept it.
self.__content_accept(content) self.__content_accept(content)
elif self.is_ready():
if not self.weinitiate and self.state == JingleStates.pending:
self.__session_accept()
elif self.weinitiate and self.state == JingleStates.ended:
self.__session_initiate()
def is_ready(self): def is_ready(self):
''' Returns True when all codecs and candidates are ready ''' Returns True when all codecs and candidates are ready
@ -388,7 +393,6 @@ class JingleSession(object):
name = content['name']#TODO... name = content['name']#TODO...
def __contentAddCB(self, stanza, jingle, error, action): def __contentAddCB(self, stanza, jingle, error, action):
#TODO: Needs to be rewritten
if self.state == JingleStates.ended: if self.state == JingleStates.ended:
raise OutOfOrder raise OutOfOrder
@ -476,7 +480,7 @@ class JingleSession(object):
''' Internal methods. ''' ''' Internal methods. '''
def __parse_contents(self, jingle): def __parse_contents(self, jingle):
#TODO: WIP #TODO: Needs some reworking
contents = [] contents = []
contents_rejected = [] contents_rejected = []
contents_ok = False contents_ok = False
@ -627,6 +631,9 @@ class JingleSession(object):
stanza, jingle = self.__make_jingle('content-reject') stanza, jingle = self.__make_jingle('content-reject')
self.__append_content(jingle, content) self.__append_content(jingle, content)
self.connection.connection.send(stanza) self.connection.connection.send(stanza)
#TODO: this will fail if content is not an RTP content
self.connection.dispatch('JINGLE_DISCONNECTED',
(self.peerjid, self.sid, content.media, 'rejected'))
def __content_modify(self): def __content_modify(self):
assert self.state != JingleStates.ended assert self.state != JingleStates.ended
@ -734,6 +741,7 @@ class JingleContent(object):
# Instead, it should be etablished after session-accept! # Instead, it should be etablished after session-accept!
if len(candidates) > 0: if len(candidates) > 0:
self.p2pstream.set_remote_candidates(candidates) self.p2pstream.set_remote_candidates(candidates)
print self.media, self.creator, self.name, candidates
def __content(self, payload=[]): def __content(self, payload=[]):
''' Build a XML content-wrapper for our data. ''' ''' Build a XML content-wrapper for our data. '''
@ -1002,6 +1010,7 @@ class JingleVideo(JingleRTPContent):
JingleRTPContent.setup_stream(self) JingleRTPContent.setup_stream(self)
# the local parts # the local parts
src_vid = gst.element_factory_make('videotestsrc') src_vid = gst.element_factory_make('videotestsrc')
src_vid.set_property('is-live', True)
videoscale = gst.element_factory_make('videoscale') videoscale = gst.element_factory_make('videoscale')
caps = gst.element_factory_make('capsfilter') caps = gst.element_factory_make('capsfilter')
caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240')) caps.set_property('caps', gst.caps_from_string('video/x-raw-yuv, width=320, height=240'))
@ -1072,7 +1081,7 @@ class ConnectionJingle(object):
def startVoIP(self, jid): def startVoIP(self, jid):
if self.get_jingle_session(jid, media='audio'): if self.get_jingle_session(jid, media='audio'):
return return self.get_jingle_session(jid, media='audio').sid
jingle = self.get_jingle_session(jid, media='video') jingle = self.get_jingle_session(jid, media='video')
if jingle: if jingle:
jingle.add_content('voice', JingleVoIP(jingle)) jingle.add_content('voice', JingleVoIP(jingle))
@ -1085,7 +1094,7 @@ class ConnectionJingle(object):
def startVideoIP(self, jid): def startVideoIP(self, jid):
if self.get_jingle_session(jid, media='video'): if self.get_jingle_session(jid, media='video'):
return return self.get_jingle_session(jid, media='video').sid
jingle = self.get_jingle_session(jid, media='audio') jingle = self.get_jingle_session(jid, media='audio')
if jingle: if jingle:
jingle.add_content('video', JingleVideo(jingle)) jingle.add_content('video', JingleVideo(jingle))

View file

@ -4490,7 +4490,7 @@ class VoIPCallReceivedDialog(object):
def add_contents(self, content_types): def add_contents(self, content_types):
for type_ in content_types: for type_ in content_types:
if type_ not in self.content_types: if type_ not in self.content_types:
self.content_types.append(type_) self.content_types.add(type_)
self.set_secondary_text() self.set_secondary_text()
def on_voip_call_received_messagedialog_destroy(self, dialog): def on_voip_call_received_messagedialog_destroy(self, dialog):