summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonny Lamb <jonny.lamb@collabora.co.uk>2009-08-31 16:27:43 +0100
committerJonny Lamb <jonny.lamb@collabora.co.uk>2009-09-01 11:05:27 +0100
commit36ecf4514db396367aa24f79944d7a141806f09c (patch)
tree4c187043163f526b790f8015fef8a28deb8a5c02
parent21a677d51d64544b4176ee5b96e17475231ed2b5 (diff)
roster: add wocky_roster_contact_approve_async
Signed-off-by: Jonny Lamb <jonny.lamb@collabora.co.uk>
-rw-r--r--wocky/wocky-roster.c92
-rw-r--r--wocky/wocky-roster.h11
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);