]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-tp-call.c
On incoming calls don't request a new audio stream. This makes streams collide and...
[empathy.git] / libempathy / empathy-tp-call.c
index 8e1ba52b907caa61771036575e0910756508cedf..6c90f49d890a967fba8feac6b387f5627df86c92 100644 (file)
 
 #include <telepathy-glib/proxy-subclass.h>
 #include <telepathy-glib/dbus.h>
+#include <telepathy-glib/interfaces.h>
 
 #include <extensions/extensions.h>
-#include <libempathy/empathy-contact-factory.h>
-#include <libempathy/empathy-tp-group.h>
-#include <libempathy/empathy-utils.h>
 
 #include "empathy-tp-call.h"
+#include "empathy-contact-factory.h"
+#include "empathy-tp-group.h"
+#include "empathy-utils.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_TP
 #include "empathy-debug.h"
 
-#define GET_PRIV(object) (G_TYPE_INSTANCE_GET_PRIVATE \
-    ((object), EMPATHY_TYPE_TP_CALL, EmpathyTpCallPriv))
-
 #define STREAM_ENGINE_BUS_NAME "org.freedesktop.Telepathy.StreamEngine"
 #define STREAM_ENGINE_OBJECT_PATH "/org/freedesktop/Telepathy/StreamEngine"
 
-typedef struct _EmpathyTpCallPriv EmpathyTpCallPriv;
-
-struct _EmpathyTpCallPriv
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyTpCall)
+typedef struct
 {
   TpChannel *channel;
   TpProxy *stream_engine;
@@ -57,7 +54,7 @@ struct _EmpathyTpCallPriv
 
   EmpathyTpCallStream *audio;
   EmpathyTpCallStream *video;
-};
+} EmpathyTpCallPriv;
 
 enum
 {
@@ -276,16 +273,15 @@ tp_call_member_added_cb (EmpathyTpGroup *group,
 {
   EmpathyTpCallPriv *priv = GET_PRIV (call);
 
+  g_object_ref (call);
   if (!priv->contact && !empathy_contact_is_user (contact))
     {
       priv->contact = g_object_ref (contact);
       priv->is_incoming = TRUE;
       priv->status = EMPATHY_TP_CALL_STATUS_PENDING;
       g_object_notify (G_OBJECT (call), "is-incoming");
-      g_object_notify (G_OBJECT (call), "contact"); 
-      g_object_notify (G_OBJECT (call), "status");     
-      tp_call_request_streams_for_capabilities (call,
-          EMPATHY_CAPABILITIES_AUDIO);
+      g_object_notify (G_OBJECT (call), "contact");
+      g_object_notify (G_OBJECT (call), "status");
     }
 
   if (priv->status == EMPATHY_TP_CALL_STATUS_PENDING &&
@@ -295,6 +291,7 @@ tp_call_member_added_cb (EmpathyTpGroup *group,
       priv->status = EMPATHY_TP_CALL_STATUS_ACCEPTED;
       g_object_notify (G_OBJECT (call), "status");
     }
+  g_object_unref (call);
 }
 
 static void
@@ -307,6 +304,7 @@ tp_call_remote_pending_cb (EmpathyTpGroup *group,
 {
   EmpathyTpCallPriv *priv = GET_PRIV (call);
 
+  g_object_ref (call);
   if (!priv->contact && !empathy_contact_is_user (contact))
     {
       priv->contact = g_object_ref (contact);
@@ -318,6 +316,7 @@ tp_call_remote_pending_cb (EmpathyTpGroup *group,
       tp_call_request_streams_for_capabilities (call,
           EMPATHY_CAPABILITIES_AUDIO);
     }
+  g_object_unref (call);
 }
 
 static void
@@ -629,8 +628,10 @@ empathy_tp_call_class_init (EmpathyTpCallClass *klass)
 static void
 empathy_tp_call_init (EmpathyTpCall *call)
 {
-  EmpathyTpCallPriv *priv = GET_PRIV (call);
+  EmpathyTpCallPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (call,
+               EMPATHY_TYPE_TP_CALL, EmpathyTpCallPriv);
 
+  call->priv = priv;
   priv->status = EMPATHY_TP_CALL_STATUS_READYING;
   priv->contact = NULL;
   priv->stream_engine_running = FALSE;
@@ -838,3 +839,14 @@ empathy_tp_call_stop_tone (EmpathyTpCall *call)
       "stoping tone", NULL, G_OBJECT (call));
 }
 
+gboolean
+empathy_tp_call_has_dtmf (EmpathyTpCall *call)
+{
+  EmpathyTpCallPriv *priv = GET_PRIV (call);
+
+  g_return_val_if_fail (EMPATHY_IS_TP_CALL (call), FALSE);
+
+  return tp_proxy_has_interface_by_id (priv->channel,
+      TP_IFACE_QUARK_CHANNEL_INTERFACE_DTMF);
+}
+