aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libempathy/empathy-tp-call.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/libempathy/empathy-tp-call.c b/libempathy/empathy-tp-call.c
index eb70c1a87..b537ccf51 100644
--- a/libempathy/empathy-tp-call.c
+++ b/libempathy/empathy-tp-call.c
@@ -29,6 +29,7 @@
#include "empathy-tp-call.h"
#include "empathy-tp-contact-factory.h"
#include "empathy-utils.h"
+#include "empathy-marshal.h"
#define DEBUG_FLAG EMPATHY_DEBUG_TP
#include "empathy-debug.h"
@@ -46,6 +47,15 @@ typedef struct
EmpathyTpCallStream *video;
} EmpathyTpCallPriv;
+/* signal enum */
+enum {
+ AUDIO_STREAM_ERROR,
+ VIDEO_STREAM_ERROR,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = {0};
+
enum
{
PROP_0,
@@ -364,6 +374,34 @@ tp_call_async_cb (TpProxy *proxy,
DEBUG ("Error %s: %s", (gchar *) user_data, error->message);
}
+static void
+tp_call_stream_error_cb (TpChannel *channel,
+ guint stream_id,
+ guint error_code,
+ const gchar *msg,
+ gpointer user_data,
+ GObject *call)
+{
+ EmpathyTpCall *self = EMPATHY_TP_CALL (call);
+ EmpathyTpCallPriv *priv = GET_PRIV (self);
+
+ DEBUG ("Stream error on stream %u: %s (code: %u)", stream_id, msg,
+ error_code);
+
+ if (priv->audio->id == stream_id)
+ {
+ g_signal_emit (call, signals[AUDIO_STREAM_ERROR], 0, error_code, msg);
+ }
+ else if (priv->video->id == stream_id)
+ {
+ g_signal_emit (call, signals[VIDEO_STREAM_ERROR], 0, error_code, msg);
+ }
+ else
+ {
+ DEBUG ("Unknown stream id: %u", stream_id);
+ }
+}
+
static GObject *
tp_call_constructor (GType type,
guint n_construct_params,
@@ -390,6 +428,8 @@ tp_call_constructor (GType type,
tp_call_stream_state_changed_cb, NULL, NULL, G_OBJECT (call), NULL);
tp_cli_channel_type_streamed_media_connect_to_stream_direction_changed (priv->channel,
tp_call_stream_direction_changed_cb, NULL, NULL, G_OBJECT (call), NULL);
+ tp_cli_channel_type_streamed_media_connect_to_stream_error (priv->channel,
+ tp_call_stream_error_cb, NULL, NULL, G_OBJECT (call), NULL);
tp_cli_channel_type_streamed_media_call_list_streams (priv->channel, -1,
tp_call_request_streams_cb, NULL, NULL, G_OBJECT (call));
@@ -532,6 +572,24 @@ empathy_tp_call_class_init (EmpathyTpCallClass *klass)
g_param_spec_pointer ("video-stream", "Video stream data",
"Video stream data",
G_PARAM_READABLE | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+ signals[AUDIO_STREAM_ERROR] =
+ g_signal_new ("audio-stream-error",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0,
+ NULL, NULL,
+ _empathy_marshal_VOID__UINT_STRING,
+ G_TYPE_NONE,
+ 2, G_TYPE_UINT, G_TYPE_STRING);
+
+ signals[VIDEO_STREAM_ERROR] =
+ g_signal_new ("video-stream-error",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0,
+ NULL, NULL,
+ _empathy_marshal_VOID__UINT_STRING,
+ G_TYPE_NONE,
+ 2, G_TYPE_UINT, G_TYPE_STRING);
}
static void