summaryrefslogtreecommitdiff
path: root/telepathy-glib/base-contact-list.c
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2010-11-30 18:39:14 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2010-11-30 18:39:14 +0000
commit10f4652a2a79d69bed2915b04113ba435105160d (patch)
treea4ae141845a77921e5345a3482422d04e8889c0c /telepathy-glib/base-contact-list.c
parente75ee0bb96ef82a7246656b12f8be6e186c4935f (diff)
downloadtelepathy-glib-10f4652a2a79d69bed2915b04113ba435105160d.tar.gz
fd.o #31997: in contact list channels, return asynchronously from AddMembers etc.
This matches the behaviour of Conn.I.ContactList, Conn.I.ContactGroups.
Diffstat (limited to 'telepathy-glib/base-contact-list.c')
-rw-r--r--telepathy-glib/base-contact-list.c242
1 files changed, 145 insertions, 97 deletions
diff --git a/telepathy-glib/base-contact-list.c b/telepathy-glib/base-contact-list.c
index 2f9e1a852..1dd274a56 100644
--- a/telepathy-glib/base-contact-list.c
+++ b/telepathy-glib/base-contact-list.c
@@ -1285,49 +1285,53 @@ tp_base_contact_list_add_to_group_cb (GObject *source,
if (tp_base_contact_list_add_to_group_finish (self, result, &error))
{
- DEBUG ("Adding to group '%s' succeeded", (gchar *) user_data);
+ dbus_g_method_return (user_data);
}
else
{
- DEBUG ("Adding to group '%s' failed: %s #%d: %s", (gchar *) user_data,
- g_quark_to_string (error->domain), error->code, error->message);
+ dbus_g_method_return_error (user_data, error);
g_clear_error (&error);
}
-
- g_free (user_data);
}
-gboolean
+void
_tp_base_contact_list_add_to_group (TpBaseContactList *self,
TpHandle group,
- TpHandle contact,
+ const GArray *contacts_arr,
const gchar *message G_GNUC_UNUSED,
- GError **error)
+ DBusGMethodInvocation *context)
{
TpHandleSet *contacts;
const gchar *group_name;
+ GError *error = NULL;
- /* fail if not ready yet, failed, or disconnected */
- if (tp_base_contact_list_get_state (self, error) !=
- TP_CONTACT_LIST_STATE_SUCCESS)
- return FALSE;
+ /* fail if not ready yet, failed, or disconnected, or if handles are bad */
+ if (tp_base_contact_list_get_state (self, &error) !=
+ TP_CONTACT_LIST_STATE_SUCCESS ||
+ !tp_handles_are_valid (self->priv->contact_repo, contacts_arr, FALSE,
+ &error))
+ goto error;
if (!TP_IS_MUTABLE_CONTACT_GROUP_LIST (self))
{
- g_set_error (error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
+ g_set_error (&error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
"Cannot add contacts to a group");
- return FALSE;
+ goto error;
}
- contacts = tp_handle_set_new (self->priv->contact_repo);
- tp_handle_set_add (contacts, contact);
+ contacts = tp_handle_set_new_from_array (self->priv->contact_repo,
+ contacts_arr);
group_name = tp_handle_inspect (self->priv->group_repo, group);
tp_base_contact_list_add_to_group_async (self, group_name, contacts,
- tp_base_contact_list_add_to_group_cb, g_strdup (group_name));
+ tp_base_contact_list_add_to_group_cb, context);
tp_handle_set_destroy (contacts);
- return TRUE;
+ return;
+
+error:
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
}
static void
@@ -1342,49 +1346,54 @@ tp_base_contact_list_remove_from_group_cb (GObject *source,
if (tp_base_contact_list_remove_from_group_finish (self, result, &error))
{
- DEBUG ("Removing from group '%s' succeeded", (gchar *) user_data);
+ dbus_g_method_return (user_data);
}
else
{
- DEBUG ("Removing from group '%s' failed: %s #%d: %s",
- (gchar *) user_data,
- g_quark_to_string (error->domain), error->code, error->message);
+ dbus_g_method_return_error (user_data, error);
g_clear_error (&error);
}
-
- g_free (user_data);
}
-gboolean
+void
_tp_base_contact_list_remove_from_group (TpBaseContactList *self,
TpHandle group,
- TpHandle contact,
+ const GArray *contacts_arr,
const gchar *message G_GNUC_UNUSED,
- GError **error)
+ guint reason G_GNUC_UNUSED,
+ DBusGMethodInvocation *context)
{
TpHandleSet *contacts;
const gchar *group_name;
+ GError *error = NULL;
- if (tp_base_contact_list_get_state (self, error) !=
- TP_CONTACT_LIST_STATE_SUCCESS)
- return FALSE;
+ /* fail if not ready yet, failed, or disconnected, or if handles are bad */
+ if (tp_base_contact_list_get_state (self, &error) !=
+ TP_CONTACT_LIST_STATE_SUCCESS ||
+ !tp_handles_are_valid (self->priv->contact_repo, contacts_arr, FALSE,
+ &error))
+ goto error;
if (!TP_IS_MUTABLE_CONTACT_GROUP_LIST (self))
{
- g_set_error (error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
+ g_set_error (&error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
"Cannot remove contacts from a group");
- return FALSE;
+ goto error;
}
- contacts = tp_handle_set_new (self->priv->contact_repo);
- tp_handle_set_add (contacts, contact);
+ contacts = tp_handle_set_new_from_array (self->priv->contact_repo,
+ contacts_arr);
group_name = tp_handle_inspect (self->priv->group_repo, group);
tp_base_contact_list_remove_from_group_async (self, group_name, contacts,
- tp_base_contact_list_remove_from_group_cb, g_strdup (group_name));
+ tp_base_contact_list_remove_from_group_cb, context);
tp_handle_set_destroy (contacts);
- return TRUE;
+ return;
+
+error:
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
}
static void
@@ -1439,19 +1448,52 @@ _tp_base_contact_list_delete_group_by_handle (TpBaseContactList *self,
return TRUE;
}
+typedef struct {
+ DBusGMethodInvocation *context;
+ TpListHandle list;
+} ListContext;
+
+static ListContext *
+list_context_new (DBusGMethodInvocation *context,
+ TpListHandle list)
+{
+ ListContext *lc = g_slice_new0 (ListContext);
+
+ lc->context = context;
+ lc->list = list;
+ return lc;
+}
+
+static void
+list_context_finish_take_error (ListContext *lc,
+ GError *error)
+{
+ if (error == NULL)
+ {
+ dbus_g_method_return (lc->context);
+ }
+ else
+ {
+ dbus_g_method_return_error (lc->context, error);
+ g_error_free (error);
+ }
+
+ g_slice_free (ListContext, lc);
+}
+
static void
tp_base_contact_list_add_to_list_cb (GObject *source,
GAsyncResult *result,
- gpointer list_p)
+ gpointer user_data)
{
TpBaseContactList *self = TP_BASE_CONTACT_LIST (source);
- guint list = GPOINTER_TO_UINT (list_p);
+ ListContext *lc = user_data;
GError *error = NULL;
gboolean ok;
g_return_if_fail (TP_IS_BASE_CONTACT_LIST (source));
- switch (list)
+ switch (lc->list)
{
case TP_LIST_HANDLE_SUBSCRIBE:
ok = tp_base_contact_list_request_subscription_finish (self, result,
@@ -1475,84 +1517,86 @@ tp_base_contact_list_add_to_list_cb (GObject *source,
g_return_if_reached ();
}
- if (ok)
- {
- DEBUG ("Adding contact to '%s' list succeeded",
- tp_base_contact_list_contact_lists[list - 1]);
- }
- else
- {
- DEBUG ("Adding contact to '%s' list failed: %s #%d: %s",
- tp_base_contact_list_contact_lists[list - 1],
- g_quark_to_string (error->domain), error->code, error->message);
- g_clear_error (&error);
- }
+ g_assert (ok == (error == NULL));
+ list_context_finish_take_error (lc, error);
}
-gboolean
+void
_tp_base_contact_list_add_to_list (TpBaseContactList *self,
TpHandle list,
- TpHandle contact,
+ const GArray *contacts_arr,
const gchar *message,
- GError **error)
+ DBusGMethodInvocation *context)
{
TpHandleSet *contacts;
+ GError *error = NULL;
+ ListContext *lc;
- if (tp_base_contact_list_get_state (self, error) !=
- TP_CONTACT_LIST_STATE_SUCCESS)
- return FALSE;
+ /* fail if not ready yet, failed, or disconnected, or if handles are bad */
+ if (tp_base_contact_list_get_state (self, &error) !=
+ TP_CONTACT_LIST_STATE_SUCCESS ||
+ !tp_handles_are_valid (self->priv->contact_repo, contacts_arr, FALSE,
+ &error))
+ goto error;
if (!tp_base_contact_list_can_change_contact_list (self))
{
- g_set_error (error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
+ g_set_error (&error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
"Cannot change subscriptions");
- return FALSE;
+ goto error;
}
- contacts = tp_handle_set_new (self->priv->contact_repo);
- tp_handle_set_add (contacts, contact);
+ contacts = tp_handle_set_new_from_array (self->priv->contact_repo,
+ contacts_arr);
+ lc = list_context_new (context, list);
switch (list)
{
case TP_LIST_HANDLE_SUBSCRIBE:
tp_base_contact_list_request_subscription_async (self, contacts,
- message, tp_base_contact_list_add_to_list_cb,
- GUINT_TO_POINTER (list));
+ message, tp_base_contact_list_add_to_list_cb, lc);
break;
case TP_LIST_HANDLE_PUBLISH:
tp_base_contact_list_authorize_publication_async (self, contacts,
- tp_base_contact_list_add_to_list_cb, GUINT_TO_POINTER (list));
+ tp_base_contact_list_add_to_list_cb, lc);
break;
case TP_LIST_HANDLE_STORED:
tp_base_contact_list_store_contacts_async (self, contacts,
- tp_base_contact_list_add_to_list_cb, GUINT_TO_POINTER (list));
+ tp_base_contact_list_add_to_list_cb, lc);
break;
case TP_LIST_HANDLE_DENY:
tp_base_contact_list_block_contacts_async (self, contacts,
- tp_base_contact_list_add_to_list_cb, GUINT_TO_POINTER (list));
+ tp_base_contact_list_add_to_list_cb, lc);
break;
+
+ default:
+ g_assert_not_reached ();
}
tp_handle_set_destroy (contacts);
- return TRUE;
+ return;
+
+error:
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
}
static void
tp_base_contact_list_remove_from_list_cb (GObject *source,
GAsyncResult *result,
- gpointer list_p)
+ gpointer user_data)
{
TpBaseContactList *self = TP_BASE_CONTACT_LIST (source);
- guint list = GPOINTER_TO_UINT (list_p);
+ ListContext *lc = user_data;
GError *error = NULL;
gboolean ok;
g_return_if_fail (TP_IS_BASE_CONTACT_LIST (source));
- switch (list)
+ switch (lc->list)
{
case TP_LIST_HANDLE_SUBSCRIBE:
ok = tp_base_contact_list_unsubscribe_finish (self, result, &error);
@@ -1574,68 +1618,72 @@ tp_base_contact_list_remove_from_list_cb (GObject *source,
g_return_if_reached ();
}
- if (ok)
- {
- DEBUG ("Removing contact from '%s' list succeeded",
- tp_base_contact_list_contact_lists[list - 1]);
- }
- else
- {
- DEBUG ("Removing contact from '%s' list failed: %s #%d: %s",
- tp_base_contact_list_contact_lists[list - 1],
- g_quark_to_string (error->domain), error->code, error->message);
- g_clear_error (&error);
- }
+ g_assert (ok == (error == NULL));
+ list_context_finish_take_error (lc, error);
}
-gboolean
+void
_tp_base_contact_list_remove_from_list (TpBaseContactList *self,
TpHandle list,
- TpHandle contact,
+ const GArray *contacts_arr,
const gchar *message G_GNUC_UNUSED,
- GError **error)
+ guint reason G_GNUC_UNUSED,
+ DBusGMethodInvocation *context)
{
TpHandleSet *contacts;
+ GError *error = NULL;
+ ListContext *lc;
- if (tp_base_contact_list_get_state (self, error) !=
- TP_CONTACT_LIST_STATE_SUCCESS)
- return FALSE;
+ /* fail if not ready yet, failed, or disconnected, or if handles are bad */
+ if (tp_base_contact_list_get_state (self, &error) !=
+ TP_CONTACT_LIST_STATE_SUCCESS ||
+ !tp_handles_are_valid (self->priv->contact_repo, contacts_arr, FALSE,
+ &error))
+ goto error;
if (!tp_base_contact_list_can_change_contact_list (self))
{
- g_set_error (error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
+ g_set_error (&error, TP_ERRORS, TP_ERROR_NOT_IMPLEMENTED,
"Cannot change subscriptions");
- return FALSE;
+ goto error;
}
- contacts = tp_handle_set_new (self->priv->contact_repo);
- tp_handle_set_add (contacts, contact);
+ contacts = tp_handle_set_new_from_array (self->priv->contact_repo,
+ contacts_arr);
+ lc = list_context_new (context, list);
switch (list)
{
case TP_LIST_HANDLE_SUBSCRIBE:
tp_base_contact_list_unsubscribe_async (self, contacts,
- tp_base_contact_list_remove_from_list_cb, GUINT_TO_POINTER (list));
+ tp_base_contact_list_remove_from_list_cb, lc);
break;
case TP_LIST_HANDLE_PUBLISH:
tp_base_contact_list_unpublish_async (self, contacts,
- tp_base_contact_list_remove_from_list_cb, GUINT_TO_POINTER (list));
+ tp_base_contact_list_remove_from_list_cb, lc);
break;
case TP_LIST_HANDLE_STORED:
tp_base_contact_list_remove_contacts_async (self, contacts,
- tp_base_contact_list_remove_from_list_cb, GUINT_TO_POINTER (list));
+ tp_base_contact_list_remove_from_list_cb, lc);
break;
case TP_LIST_HANDLE_DENY:
tp_base_contact_list_unblock_contacts_async (self, contacts,
- tp_base_contact_list_remove_from_list_cb, GUINT_TO_POINTER (list));
+ tp_base_contact_list_remove_from_list_cb, lc);
break;
+
+ default:
+ g_assert_not_reached ();
}
tp_handle_set_destroy (contacts);
- return TRUE;
+ return;
+
+error:
+ dbus_g_method_return_error (context, error);
+ g_error_free (error);
}
/**