[telepathy-butterfly/master] Added support to make call invitations
Louis-Francis Ratté-Boulianne
louis-francis.ratte-boulianne at collabora.co.uk
Thu Sep 10 06:48:10 PDT 2009
---
butterfly/channel/media.py | 30 ++++++++++++++++++++-------
butterfly/media/session_handler.py | 20 +++++++++++++----
butterfly/media/stream_handler.py | 39 ++++++++++++++++++++++++------------
3 files changed, 63 insertions(+), 26 deletions(-)
diff --git a/butterfly/channel/media.py b/butterfly/channel/media.py
index 84fa4c9..72296d0 100644
--- a/butterfly/channel/media.py
+++ b/butterfly/channel/media.py
@@ -52,16 +52,15 @@ class ButterflyMediaChannel(
self._call = call
self._handle = handle
- self._session_handler = ButterflySessionHandler(self._conn, self,
- call.media_session, handle)
+ self._session_handler = ButterflySessionHandler(self._conn, self, call)
self.NewSessionHandler(self._session_handler, self._session_handler.type)
self.GroupFlagsChanged(telepathy.CHANNEL_GROUP_FLAG_CAN_ADD, 0)
self.__add_initial_participants()
def Close(self):
- telepathy.server.ChannelTypeStreamedMedia.Close(self)
- self.remove_from_connection()
+ print "Channel closed by client"
+ self._call.end()
def GetSessionHandlers(self):
return [(self._session_handler, self._session_handler.type)]
@@ -94,6 +93,8 @@ class ButterflyMediaChannel(
print "RemoveStreams %r" % streams
for id in streams:
self._session_handler.RemoveStream(id)
+ if not self._session_handler.HasStreams():
+ self.Close()
#papyon.event.call.CallEventInterface
def on_call_incoming(self):
@@ -105,15 +106,22 @@ class ButterflyMediaChannel(
#papyon.event.call.CallEventInterface
def on_call_accepted(self):
- pass
+ self.on_call_answered(3, 0)
#papyon.event.call.CallEventInterface
- def on_call_rejected(self):
- pass
+ def on_call_rejected(self, response):
+ self.on_call_answered(0, 0)
+
+ def on_call_answered(self, direction, pending_send):
+ for handler in self._session_handler.ListStreams():
+ handler.set_direction(direction, pending_send)
+ self.StreamDirectionChanged(handler.id, direction, pending_send)
#papyon.event.call.CallEventInterface
def on_call_ended(self):
- pass
+ print "Call ended"
+ telepathy.server.ChannelTypeStreamedMedia.Close(self)
+ self.remove_from_connection()
#papyon.event.media.MediaSessionEventInterface
def on_stream_created(self, stream):
@@ -123,6 +131,12 @@ class ButterflyMediaChannel(
self.StreamDirectionChanged(handler.id, handler.direction,
handler.pending_send)
+ #papyon.event.media.MediaSessionEventInterface
+ def on_stream_removed(self, stream):
+ print "Media Stream removed"
+ id = self._session_handler.FindStream(stream)
+ self._session_handler.RemoveStream(id)
+
def on_stream_state_changed(self, id, state):
self.StreamStateChanged(id, state)
diff --git a/butterfly/media/session_handler.py b/butterfly/media/session_handler.py
index 2a9cd47..0475a7f 100644
--- a/butterfly/media/session_handler.py
+++ b/butterfly/media/session_handler.py
@@ -31,11 +31,10 @@ from butterfly.media import ButterflyStreamHandler
__all__ = ['ButterflySessionHandler']
class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
- def __init__(self, connection, channel, session, handle):
+ def __init__(self, connection, channel, call):
self._conn = connection
self._channel = channel
- self._session = session
- self._handle = handle
+ self._call = call
self._stream_handlers = {}
self._next_stream_id = 0
@@ -60,6 +59,7 @@ class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
path = self.get_stream_path(handler.id)
self.NewStreamHandler(path, handler.id, handler.type,
handler.direction)
+ #self._call.invite()
def Error(self, code, message):
print "Session error", code, message
@@ -67,6 +67,16 @@ class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
def GetStream(self, id):
return self._stream_handlers[id]
+ def FindStream(self, stream):
+ id = None
+ for handler in self.ListStreams():
+ if handler._stream == stream:
+ id = handler.id
+ return id
+
+ def HasStreams(self):
+ return bool(self._stream_handlers)
+
def ListStreams(self):
return self._stream_handlers.values()
@@ -82,12 +92,12 @@ class ButterflySessionHandler (telepathy.server.MediaSessionHandler):
media_type = "audio"
else:
media_type = "video"
- stream = self._session.create_stream(media_type)
+ stream = self._call.media_session.add_stream(media_type, True)
handler = ButterflyStreamHandler(self._conn, self, stream)
return handler
def RemoveStream(self, id):
- pass
+ del self._stream_handlers[id]
def on_stream_state_changed(self, id, state):
self._channel.on_stream_state_changed(id, state)
diff --git a/butterfly/media/stream_handler.py b/butterfly/media/stream_handler.py
index 7d64d19..16cc96c 100644
--- a/butterfly/media/stream_handler.py
+++ b/butterfly/media/stream_handler.py
@@ -46,8 +46,11 @@ class ButterflyStreamHandler (
self._interfaces = set()
self._state = 1
- self._direction = 3
- self._pending_send = 1
+ self._direction = telepathy.MEDIA_STREAM_DIRECTION_BIDIRECTIONAL
+ if self._stream.controlling:
+ self._pending_send = telepathy.MEDIA_STREAM_PENDING_REMOTE_SEND
+ else:
+ self._pending_send = telepathy.MEDIA_STREAM_PENDING_LOCAL_SEND
self._type = StreamTypes[stream.name]
self._remote_candidates = None
@@ -95,6 +98,10 @@ class ButterflyStreamHandler (
def stun_servers(self):
return [("64.14.48.28", dbus.UInt32(3478))]
+ def set_direction(self, direction, pending_send):
+ self._direction = direction
+ self._pending_send = pending_send
+
def Ready(self, codecs):
print "StreamReady : ", codecs
if self._remote_candidates is not None:
@@ -103,7 +110,8 @@ class ButterflyStreamHandler (
self.SetRemoteCodecs(self._remote_codecs)
self.SetStreamPlaying(True)
self.SetStreamSending(True)
- self.SetLocalCodecs(codecs)
+ if self._stream.controlling:
+ self.SetLocalCodecs(codecs)
#if self._session is None:
# self._session = ButterflyWebcamSession(self._conn, self._handle.contact)
@@ -127,11 +135,12 @@ class ButterflyStreamHandler (
def NewActiveCandidatePair(self, native_id, remote_id):
print "New active candidate pair %s %s" % (native_id, remote_id)
- remote_id = '1'
self._stream.new_active_candidate_pair(native_id, remote_id)
def SetLocalCodecs(self, codecs):
- pass
+ print "Set Local Codecs"
+ list = self.convert_tp_codecs(codecs)
+ self._stream.set_local_codecs(list)
def SupportedCodecs(self, codecs):
print "SupportedCodecs: ", codecs
@@ -148,23 +157,27 @@ class ButterflyStreamHandler (
def on_remote_candidates_received(self, candidates):
list = self.convert_ice_candidates(candidates)
self._remote_candidates = list
+ if self._stream.controlling:
+ self.SetRemoteCandidateList(list)
#papyon.event.MediaStreamEventInterface
def on_remote_codecs_received(self, codecs):
- list = []
- for codec in codecs:
- list.append(self.convert_sdp_codec(codec))
+ list = self.convert_sdp_codecs(codecs)
self._remote_codecs = list
-
- #papyon.event.MediaStreamEventInterface
- def on_stream_direction_changed(self):
- self._session.StreamDirectionChanged(self.id, self.direction,
- self.flag_send)
+ if self._stream.controlling:
+ self.SetRemoteCodecs(list)
#papyon.event.MediaStreamEventInterface
def on_stream_closed(self):
+ print "Stream Closed"
self.Close()
+ def convert_sdp_codecs(self, codecs):
+ list = []
+ for codec in codecs:
+ list.append(self.convert_sdp_codec(codec))
+ return list
+
def convert_sdp_codec(self, codec):
return (codec.payload, codec.encoding, self._type, codec.clockrate, 0,
codec.params)
--
1.5.6.5
More information about the telepathy-commits
mailing list