/* Async operations for TpContact * * Copyright © 2011 Collabora Ltd. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.h" #include #include #define DEBUG_FLAG TP_DEBUG_CONTACTS #include "telepathy-glib/debug-internal.h" #include "telepathy-glib/util-internal.h" static void generic_callback (TpConnection *self, const GError *error, gpointer user_data, GObject *weak_object) { GSimpleAsyncResult *result = user_data; if (error != NULL) { DEBUG ("Operation failed: %s", error->message); g_simple_async_result_set_from_error (result, error); } /* tp_cli callbacks can potentially be called in a re-entrant way, * so we can't necessarily complete @result without using an idle. */ g_simple_async_result_complete_in_idle (result); } /* Small macro trick because DBus method is remove_contacts and in this * TpContact helper API we removed the redundant _contacts. */ #define tp_contact_remove_contacts_async tp_contact_remove_async #define contact_list_generic_async(method, ...) \ G_STMT_START { \ GSimpleAsyncResult *result; \ TpHandle handle; \ GArray *handles; \ \ g_return_if_fail (TP_IS_CONTACT (self)); \ \ handle = tp_contact_get_handle (self); \ handles = g_array_new (FALSE, FALSE, sizeof (TpHandle)); \ g_array_append_val (handles, handle); \ \ result = g_simple_async_result_new ((GObject *) self, callback, user_data, \ tp_contact_##method##_async); \ \ tp_cli_connection_interface_contact_list_call_##method ( \ tp_contact_get_connection (self), -1, handles, ##__VA_ARGS__, \ generic_callback, result, g_object_unref, NULL); \ g_array_unref (handles); \ } G_STMT_END #define generic_finish(method) \ _tp_implement_finish_void (self, tp_contact_##method##_async); /** * tp_contact_request_subscription_async: * @self: a #TpContact * @message: an optional message * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Convenience wrapper for tp_connection_request_subscription_async() * on a single contact. * * Since: 0.15.5 */ void tp_contact_request_subscription_async (TpContact *self, const gchar *message, GAsyncReadyCallback callback, gpointer user_data) { contact_list_generic_async (request_subscription, message); } /** * tp_contact_request_subscription_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_request_subscription_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.15.5 */ gboolean tp_contact_request_subscription_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (request_subscription); } /** * tp_contact_authorize_publication_async: * @self: a #TpContact * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Convenience wrapper for tp_connection_authorize_publication_async() * on a single contact. * * Since: 0.15.5 */ void tp_contact_authorize_publication_async (TpContact *self, GAsyncReadyCallback callback, gpointer user_data) { contact_list_generic_async (authorize_publication); } /** * tp_contact_authorize_publication_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_authorize_publication_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.15.5 */ gboolean tp_contact_authorize_publication_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (authorize_publication); } /** * tp_contact_remove_async: * @self: a #TpContact * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Convenience wrapper for tp_connection_remove_contacts_async() * on a single contact. * * Since: 0.15.5 */ void tp_contact_remove_async (TpContact *self, GAsyncReadyCallback callback, gpointer user_data) { contact_list_generic_async (remove_contacts); } /** * tp_contact_remove_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_remove_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.15.5 */ gboolean tp_contact_remove_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (remove_contacts); } /** * tp_contact_unsubscribe_async: * @self: a #TpContact * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Convenience wrapper for tp_connection_unsubscribe_async() * on a single contact. * * Since: 0.15.5 */ void tp_contact_unsubscribe_async (TpContact *self, GAsyncReadyCallback callback, gpointer user_data) { contact_list_generic_async (unsubscribe); } /** * tp_contact_unsubscribe_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_unsubscribe_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.15.5 */ gboolean tp_contact_unsubscribe_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (unsubscribe); } /** * tp_contact_unpublish_async: * @self: a #TpContact * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Convenience wrapper for tp_connection_unpublish_async() * on a single contact. * * Since: 0.15.5 */ void tp_contact_unpublish_async (TpContact *self, GAsyncReadyCallback callback, gpointer user_data) { contact_list_generic_async (unpublish); } /** * tp_contact_unpublish_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_unpublish_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.15.5 */ gboolean tp_contact_unpublish_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (unpublish); } #define contact_groups_generic_async(method) \ G_STMT_START { \ GSimpleAsyncResult *result; \ TpHandle handle; \ GArray *handles; \ \ g_return_if_fail (TP_IS_CONTACT (self)); \ \ handle = tp_contact_get_handle (self); \ handles = g_array_new (FALSE, FALSE, sizeof (TpHandle)); \ g_array_append_val (handles, handle); \ \ result = g_simple_async_result_new ((GObject *) self, callback, user_data, \ tp_contact_##method##_async); \ \ tp_cli_connection_interface_contact_groups_call_##method ( \ tp_contact_get_connection (self), -1, group, handles, \ generic_callback, result, g_object_unref, NULL); \ g_array_unref (handles); \ } G_STMT_END /** * tp_contact_add_to_group_async: * @self: a #TpContact * @group: the group to alter. * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Convenience wrapper for tp_connection_add_to_group_async() * on a single contact. * * Since: 0.15.5 */ void tp_contact_add_to_group_async (TpContact *self, const gchar *group, GAsyncReadyCallback callback, gpointer user_data) { contact_groups_generic_async (add_to_group); } /** * tp_contact_add_to_group_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_add_to_group_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.15.5 */ gboolean tp_contact_add_to_group_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (add_to_group); } /** * tp_contact_remove_from_group_async: * @self: a #TpContact * @group: the group to alter. * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Convenience wrapper for tp_connection_remove_from_group_async() * on a single contact. * * Since: 0.15.5 */ void tp_contact_remove_from_group_async (TpContact *self, const gchar *group, GAsyncReadyCallback callback, gpointer user_data) { contact_groups_generic_async (remove_from_group); } /** * tp_contact_remove_from_group_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_remove_from_group_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.15.5 */ gboolean tp_contact_remove_from_group_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (remove_from_group); } /* ContactBlocking */ /** * tp_contact_block_async: * @self: a #TpContact * @report_abusive: If %TRUE, report this contact as abusive to the * server administrators as well as blocking him. See * #TpConnection:can-report-abusive to discover whether reporting abuse is * supported. If #TpConnection:can-report-abusive is %FALSE, this parameter will * be ignored. * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Block communications with a contact, optionally reporting the contact as * abusive to the server administrators. To block more than one contact at once, * see tp_connection_block_contacts_async(). * * Since: 0.17.0 */ void tp_contact_block_async (TpContact *self, gboolean report_abusive, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *result; TpHandle handle; GArray *handles; g_return_if_fail (TP_IS_CONTACT (self)); handle = tp_contact_get_handle (self); handles = g_array_new (FALSE, FALSE, sizeof (TpHandle)); g_array_append_val (handles, handle); result = g_simple_async_result_new ((GObject *) self, callback, user_data, tp_contact_block_async); tp_cli_connection_interface_contact_blocking_call_block_contacts ( tp_contact_get_connection (self), -1, handles, report_abusive, generic_callback, result, g_object_unref, NULL); g_array_unref (handles); } /** * tp_contact_block_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_block_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.17.0 */ gboolean tp_contact_block_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (block); } /** * tp_contact_unblock_async: * @self: a #TpContact * @callback: a callback to call when the operation finishes * @user_data: data to pass to @callback * * Unblock communications with a contact. To unblock more than one contact * at once, see tp_connection_unblock_contacts_async(). * * Since: 0.17.0 */ void tp_contact_unblock_async (TpContact *self, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *result; TpHandle handle; GArray *handles; g_return_if_fail (TP_IS_CONTACT (self)); handle = tp_contact_get_handle (self); handles = g_array_new (FALSE, FALSE, sizeof (TpHandle)); g_array_append_val (handles, handle); result = g_simple_async_result_new ((GObject *) self, callback, user_data, tp_contact_unblock_async); tp_cli_connection_interface_contact_blocking_call_unblock_contacts ( tp_contact_get_connection (self), -1, handles, generic_callback, result, g_object_unref, NULL); g_array_unref (handles); } /** * tp_contact_unblock_finish: * @self: a #TpContact * @result: a #GAsyncResult * @error: a #GError to fill * * Finishes tp_contact_unblock_async() * * Returns: %TRUE if the operation was successful, otherwise %FALSE. * * Since: 0.17.0 */ gboolean tp_contact_unblock_finish (TpContact *self, GAsyncResult *result, GError **error) { generic_finish (unblock); }