[telepathy-mission-control/master] McdChannel: add _mcd_channel_depart(), which departs with a reason code

Simon McVittie simon.mcvittie at collabora.co.uk
Tue Jun 30 10:28:58 PDT 2009


---
 src/mcd-channel-priv.h |    4 ++
 src/mcd-channel.c      |   94 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 98 insertions(+), 0 deletions(-)

diff --git a/src/mcd-channel-priv.h b/src/mcd-channel-priv.h
index e8d3a6c..7497f49 100644
--- a/src/mcd-channel-priv.h
+++ b/src/mcd-channel-priv.h
@@ -76,6 +76,10 @@ void _mcd_channel_set_request_proxy (McdChannel *channel, McdChannel *source);
 
 void _mcd_channel_close (McdChannel *channel);
 
+G_GNUC_INTERNAL void _mcd_channel_depart (McdChannel *channel,
+                                          TpChannelGroupChangeReason reason,
+                                          const gchar *message);
+
 G_END_DECLS
 #endif
 
diff --git a/src/mcd-channel.c b/src/mcd-channel.c
index 2d490d2..43d8520 100644
--- a/src/mcd-channel.c
+++ b/src/mcd-channel.c
@@ -1554,3 +1554,97 @@ request_iface_init (gpointer g_iface,
     IMPLEMENT (cancel);
 #undef IMPLEMENT
 }
+
+static void
+mcd_channel_depart_cb (TpChannel *channel,
+                       const GError *error,
+                       gpointer data G_GNUC_UNUSED,
+                       GObject *weak_object G_GNUC_UNUSED)
+{
+    if (error == NULL)
+    {
+        DEBUG ("successful");
+        return;
+    }
+
+    DEBUG ("failed to depart, calling Close instead: %s %d: %s",
+           g_quark_to_string (error->domain), error->code, error->message);
+    tp_cli_channel_call_close (channel, -1, NULL, NULL, NULL, NULL);
+}
+
+typedef struct {
+    TpChannelGroupChangeReason reason;
+    gchar *message;
+} DepartData;
+
+static void
+mcd_channel_ready_to_depart_cb (TpChannel *channel,
+                                const GError *error,
+                                gpointer data)
+{
+    DepartData *d = data;
+
+    if (error != NULL)
+    {
+        DEBUG ("%s %d: %s", g_quark_to_string (error->domain), error->code,
+               error->message);
+        g_free (d->message);
+        g_slice_free (DepartData, d);
+        return;
+    }
+
+    if (tp_proxy_has_interface_by_id (channel,
+                                      TP_IFACE_QUARK_CHANNEL_INTERFACE_GROUP))
+    {
+        GArray *a = g_array_sized_new (FALSE, FALSE, sizeof (guint), 1);
+        guint self_handle = tp_channel_group_get_self_handle (channel);
+
+        g_array_append_val (a, self_handle);
+
+        tp_cli_channel_interface_group_call_remove_members_with_reason (
+            channel, -1, a, d->message, d->reason,
+            mcd_channel_depart_cb, NULL, NULL, NULL);
+
+        g_array_free (a, TRUE);
+        g_free (d->message);
+        g_slice_free (DepartData, d);
+    }
+}
+
+void
+_mcd_channel_depart (McdChannel *channel,
+                     TpChannelGroupChangeReason reason,
+                     const gchar *message)
+{
+    DepartData *d;
+    const GError *invalidated;
+
+    g_return_if_fail (MCD_IS_CHANNEL (channel));
+
+    g_return_if_fail (channel->priv->tp_chan != NULL);
+    g_return_if_fail (message != NULL);
+
+    invalidated = tp_proxy_get_invalidated (channel->priv->tp_chan);
+
+    if (invalidated != NULL)
+    {
+        DEBUG ("%s %d: %s", g_quark_to_string (invalidated->domain),
+               invalidated->code, invalidated->message);
+        return;
+    }
+
+    if (message[0] == '\0' && reason == TP_CHANNEL_GROUP_CHANGE_REASON_NONE)
+    {
+        /* exactly equivalent to Close(), so skip the Group interface */
+        tp_cli_channel_call_close (channel->priv->tp_chan, -1,
+                                   NULL, NULL, NULL, NULL);
+        return;
+    }
+
+    d = g_slice_new (DepartData);
+    d->reason = reason;
+    d->message = g_strdup (message == NULL ? "" : message);
+
+    tp_channel_call_when_ready (channel->priv->tp_chan,
+                                mcd_channel_ready_to_depart_cb, d);
+}
-- 
1.5.6.5




More information about the telepathy-commits mailing list