diff options
author | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2009-08-31 16:27:43 +0100 |
---|---|---|
committer | Jonny Lamb <jonny.lamb@collabora.co.uk> | 2009-09-01 11:05:27 +0100 |
commit | 36ecf4514db396367aa24f79944d7a141806f09c (patch) | |
tree | 4c187043163f526b790f8015fef8a28deb8a5c02 | |
parent | 21a677d51d64544b4176ee5b96e17475231ed2b5 (diff) |
roster: add wocky_roster_contact_approve_async
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
-rw-r--r-- | wocky/wocky-roster.c | 92 | ||||
-rw-r--r-- | wocky/wocky-roster.h | 11 |
2 files changed, 103 insertions, 0 deletions
diff --git a/wocky/wocky-roster.c b/wocky/wocky-roster.c index 9f0887b..d9f371f 100644 --- a/wocky/wocky-roster.c +++ b/wocky/wocky-roster.c @@ -1616,3 +1616,95 @@ wocky_roster_contact_subscribe_finish (WockyRoster *self, return TRUE; } + +typedef struct +{ + WockyRoster *roster; + GSimpleAsyncResult *result; + WockyBareContact *contact; +} ApproveData; + +static void +approve_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + WockyPorter *porter = WOCKY_PORTER (source_object); + ApproveData *data = (ApproveData *) user_data; + WockyRosterPrivate *priv = WOCKY_ROSTER_GET_PRIVATE (data->roster); + GError *error = NULL; + + if (!wocky_porter_send_finish (porter, res, &error)) + { + g_simple_async_result_set_from_error (data->result, error); + g_simple_async_result_complete (data->result); + g_error_free (error); + } + else + { + g_object_weak_unref (G_OBJECT (data->contact), contact_disposed_cb, + data->roster); + priv->pending_subscriptions = g_slist_remove ( + priv->pending_subscriptions, data->contact); + + g_simple_async_result_complete (data->result); + } + + g_object_unref (data->contact); + g_slice_free (ApproveData, data); +} + +void +wocky_roster_contact_approve_async (WockyRoster *self, + WockyBareContact *contact, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + WockyRosterPrivate *priv = WOCKY_ROSTER_GET_PRIVATE (self); + WockyXmppStanza *stanza; + ApproveData *data; + + if (g_slist_index (priv->pending_subscriptions, contact) < 0) + { + g_simple_async_report_error_in_idle (G_OBJECT (self), callback, + user_data, WOCKY_ROSTER_ERROR, + WOCKY_ROSTER_ERROR_NO_SUBSCRIPTION_REQUEST, + "No subscription request from contact %s", + wocky_bare_contact_get_jid (contact)); + return; + } + + data = g_slice_new0 (ApproveData); + data->roster = self; + data->contact = g_object_ref (contact); + + data->result = g_simple_async_result_new (G_OBJECT (self), + callback, user_data, wocky_roster_contact_approve_finish); + + stanza = wocky_xmpp_stanza_build (WOCKY_STANZA_TYPE_PRESENCE, + WOCKY_STANZA_SUB_TYPE_SUBSCRIBED, NULL, + wocky_bare_contact_get_jid (contact), + WOCKY_STANZA_END); + + wocky_porter_send_async (priv->porter, stanza, cancellable, approve_cb, + data); + + g_object_unref (stanza); +} + +gboolean +wocky_roster_contact_approve_finish (WockyRoster *self, + GAsyncResult *result, + GError **error) +{ + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), + error)) + return FALSE; + + g_return_val_if_fail (g_simple_async_result_is_valid (result, + G_OBJECT (self), wocky_roster_contact_approve_finish), + FALSE); + + return TRUE; +} diff --git a/wocky/wocky-roster.h b/wocky/wocky-roster.h index f2efab8..966f915 100644 --- a/wocky/wocky-roster.h +++ b/wocky/wocky-roster.h @@ -81,6 +81,7 @@ typedef enum typedef enum { WOCKY_ROSTER_ERROR_INVALID_STANZA, WOCKY_ROSTER_ERROR_NOT_IN_ROSTER, + WOCKY_ROSTER_ERROR_NO_SUBSCRIPTION_REQUEST, } WockyRosterError; GQuark wocky_roster_error_quark (void); @@ -171,6 +172,16 @@ gboolean wocky_roster_contact_subscribe_finish (WockyRoster *self, GAsyncResult *result, GError **error); +void wocky_roster_contact_approve_async (WockyRoster *self, + WockyBareContact *contact, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + +gboolean wocky_roster_contact_approve_finish (WockyRoster *self, + GAsyncResult *result, + GError **error); + /* For debugging only */ const gchar * wocky_roster_subscription_to_string ( WockyRosterSubscriptionFlags subscription); |