[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