summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2011-04-25 15:45:56 +0200
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2011-05-27 13:03:24 +0200
commitf88dfe4f53cd448a99dd47995d063eeee0ffbcb1 (patch)
treeac87502a6b7588d47fdd5566b4539fc3239a1bcc
parent9200886c1bcb440d5df5a865ab50b6cf82831d2e (diff)
Add tp_channel_dispatch_operation_close_channels_async() (#28015)
-rw-r--r--docs/reference/telepathy-glib-sections.txt2
-rw-r--r--telepathy-glib/channel-dispatch-operation.c91
-rw-r--r--telepathy-glib/channel-dispatch-operation.h12
-rw-r--r--tests/dbus/channel-dispatch-operation.c53
4 files changed, 158 insertions, 0 deletions
diff --git a/docs/reference/telepathy-glib-sections.txt b/docs/reference/telepathy-glib-sections.txt
index 8084b2f7..fc49aac6 100644
--- a/docs/reference/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib-sections.txt
@@ -4548,6 +4548,8 @@ tp_channel_dispatch_operation_claim_async
tp_channel_dispatch_operation_claim_finish
tp_channel_dispatch_operation_claim_with_async
tp_channel_dispatch_operation_claim_with_finish
+tp_channel_dispatch_operation_close_channels_async
+tp_channel_dispatch_operation_close_channels_finish
<SUBSECTION Standard>
TP_CHANNEL_DISPATCH_OPERATION
TP_CHANNEL_DISPATCH_OPERATION_CLASS
diff --git a/telepathy-glib/channel-dispatch-operation.c b/telepathy-glib/channel-dispatch-operation.c
index dbfbb958..669541d3 100644
--- a/telepathy-glib/channel-dispatch-operation.c
+++ b/telepathy-glib/channel-dispatch-operation.c
@@ -1578,3 +1578,94 @@ tp_channel_dispatch_operation_claim_with_finish (
_tp_implement_finish_void (self, \
tp_channel_dispatch_operation_claim_with_async)
}
+
+static void
+channel_close_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GError *error = NULL;
+
+ if (!tp_channel_close_finish (TP_CHANNEL (source), result, &error))
+ {
+ DEBUG ("Failed to close %s: %s", tp_proxy_get_object_path (source),
+ error->message);
+
+ g_error_free (error);
+ }
+}
+
+static void
+claim_close_channels_cb (TpChannelDispatchOperation *self,
+ GSimpleAsyncResult *result)
+{
+ guint i;
+
+ for (i = 0; i < self->priv->channels->len; i++)
+ {
+ TpChannel *channel = g_ptr_array_index (self->priv->channels, i);
+
+ tp_channel_close_async (channel, channel_close_cb, NULL);
+ }
+
+ g_simple_async_result_complete (result);
+ g_object_unref (result);
+}
+
+/**
+ * tp_channel_dispatch_operation_close_channels_async:
+ * @self: a #TpChannelDispatchOperation
+ * @callback: a callback to call when the request has been satisfied
+ * @user_data: data to pass to @callback
+ *
+ * Called by an approver to claim channels and close them all right away.
+ * If this method is called successfully, @self has been claimed and
+ * tp_channel_close_async() has been called on all of its channels.
+ *
+ * If successful, this method will cause the #TpProxy::invalidated signal
+ * to be emitted, in the same way as for
+ * tp_channel_dispatch_operation_handle_with_async().
+ *
+ * This method may fail because the dispatch operation has already
+ * been completed. Again, see tp_channel_dispatch_operation_handle_with_async()
+ * for more details.
+ *
+ * Since: 0.15.UNRELEASED
+ */
+void
+tp_channel_dispatch_operation_close_channels_async (
+ TpChannelDispatchOperation *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *result;
+
+ result = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
+ tp_channel_dispatch_operation_close_channels_async);
+
+ prepare_core_and_claim (self, claim_close_channels_cb, result);
+}
+
+/**
+ * tp_channel_dispatch_operation_close_channels_finish:
+ * @self: a #TpChannelDispatchOperation
+ * @result: a #GAsyncResult
+ * @error: a #GError to fill
+ *
+ * Finishes an async operation initiated using
+ * tp_channel_dispatch_operation_close_channels_finish().
+ *
+ * Returns: %TRUE if the Claim() call was successful and
+ * Close() has at least been attempted on all the channels, otherwise %FALSE
+ *
+ * Since: 0.15.UNRELEASED
+ */
+gboolean
+tp_channel_dispatch_operation_close_channels_finish (
+ TpChannelDispatchOperation *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ _tp_implement_finish_void (self, \
+ tp_channel_dispatch_operation_close_channels_async)
+}
diff --git a/telepathy-glib/channel-dispatch-operation.h b/telepathy-glib/channel-dispatch-operation.h
index 605f98f0..387496d9 100644
--- a/telepathy-glib/channel-dispatch-operation.h
+++ b/telepathy-glib/channel-dispatch-operation.h
@@ -142,6 +142,18 @@ gboolean tp_channel_dispatch_operation_claim_with_finish (
GAsyncResult *result,
GError **error);
+/* Reject API */
+
+void tp_channel_dispatch_operation_close_channels_async (
+ TpChannelDispatchOperation *self,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean tp_channel_dispatch_operation_close_channels_finish (
+ TpChannelDispatchOperation *self,
+ GAsyncResult *result,
+ GError **error);
+
G_END_DECLS
#include <telepathy-glib/_gen/tp-cli-channel-dispatch-operation.h>
diff --git a/tests/dbus/channel-dispatch-operation.c b/tests/dbus/channel-dispatch-operation.c
index 4f7f9e27..fa57d5da 100644
--- a/tests/dbus/channel-dispatch-operation.c
+++ b/tests/dbus/channel-dispatch-operation.c
@@ -779,6 +779,57 @@ test_handle_with_time (Test *test,
g_assert_no_error (test->error);
}
+static void
+close_channels_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ Test *test = user_data;
+
+ tp_channel_dispatch_operation_close_channels_finish (
+ TP_CHANNEL_DISPATCH_OPERATION (source), result, &test->error);
+
+ test->sig--;
+ if (test->sig == 0)
+ g_main_loop_quit (test->mainloop);
+}
+
+static void
+channel_invalidated_cb (TpProxy *proxy,
+ guint domain,
+ gint code,
+ gchar *message,
+ gpointer user_data)
+{
+ Test *test = user_data;
+
+ test->sig--;
+ if (test->sig == 0)
+ g_main_loop_quit (test->mainloop);
+}
+
+static void
+test_close_channels (Test *test,
+ gconstpointer data G_GNUC_UNUSED)
+{
+ test->cdo = tp_channel_dispatch_operation_new (test->dbus,
+ "/whatever", NULL, &test->error);
+ g_assert_no_error (test->error);
+
+ g_signal_connect (test->text_chan, "invalidated",
+ G_CALLBACK (channel_invalidated_cb), test);
+ g_signal_connect (test->text_chan_2, "invalidated",
+ G_CALLBACK (channel_invalidated_cb), test);
+
+ tp_channel_dispatch_operation_close_channels_async (test->cdo,
+ close_channels_cb, test);
+
+ test->sig = 3;
+ g_main_loop_run (test->mainloop);
+
+ g_assert_no_error (test->error);
+}
+
int
main (int argc,
char **argv)
@@ -805,6 +856,8 @@ main (int argc,
test_finished_preparing, teardown_services);
g_test_add ("/cdo/handle-with-time", Test, NULL, setup_services,
test_handle_with_time, teardown_services);
+ g_test_add ("/cdo/close-channels", Test, NULL, setup_services,
+ test_close_channels, teardown_services);
return g_test_run ();
}