diff options
author | Xavier Claessens <xavier.claessens@collabora.co.uk> | 2012-05-29 13:25:13 +0200 |
---|---|---|
committer | Xavier Claessens <xavier.claessens@collabora.co.uk> | 2012-06-28 13:50:00 +0200 |
commit | 6b1bbb146e12426d3bda22b9281c83abbe4cc38a (patch) | |
tree | 9a3f168baef7702a5bb27209dc777520114d6e30 | |
parent | 005b08101e316ac0bdf375f18cc75df7f6990857 (diff) | |
download | telepathy-glib-6b1bbb146e12426d3bda22b9281c83abbe4cc38a.tar.gz |
TpDynamicHandleRepo: Support async normalization function
Override TpHandleRepoIface::ensure_handle_async() and use an
user provided async normalization function.
https://bugs.freedesktop.org/show_bug.cgi?id=50341
-rw-r--r-- | docs/reference/telepathy-glib-sections.txt | 3 | ||||
-rw-r--r-- | telepathy-glib/handle-repo-dynamic.c | 116 | ||||
-rw-r--r-- | telepathy-glib/handle-repo-dynamic.h | 15 |
3 files changed, 134 insertions, 0 deletions
diff --git a/docs/reference/telepathy-glib-sections.txt b/docs/reference/telepathy-glib-sections.txt index a2fabbc87..be3ad0c98 100644 --- a/docs/reference/telepathy-glib-sections.txt +++ b/docs/reference/telepathy-glib-sections.txt @@ -299,7 +299,10 @@ TpDynamicHandleRepo TpDynamicHandleRepoClass tp_dynamic_handle_repo_lookup_exact tp_dynamic_handle_repo_new +tp_dynamic_handle_repo_set_normalize_async TpDynamicHandleRepoNormalizeFunc +TpDynamicHandleRepoNormalizeAsync +TpDynamicHandleRepoNormalizeFinish <SUBSECTION Standard> TP_DYNAMIC_HANDLE_REPO TP_IS_DYNAMIC_HANDLE_REPO diff --git a/telepathy-glib/handle-repo-dynamic.c b/telepathy-glib/handle-repo-dynamic.c index 9bd651387..c5d025bfb 100644 --- a/telepathy-glib/handle-repo-dynamic.c +++ b/telepathy-glib/handle-repo-dynamic.c @@ -75,6 +75,33 @@ */ /** + * TpDynamicHandleRepoNormalizeAsync: + * @repo: The repository on which tp_handle_ensure_async() was called + * @connection: the #TpBaseConnection using this handle repo + * @id: The name to be normalized + * @context: Arbitrary context passed to tp_handle_ensure_async() + * @callback: a callback to call when the operation finishes + * @user_data: data to pass to @callback + * + * Signature of a function to asynchronously normalize an identifier. See + * tp_dynamic_handle_repo_set_normalize_async(). + * + * Since: 0.UNRELEASED + */ + +/** + * TpDynamicHandleRepoNormalizeFinish: + * @repo: The repository on which tp_handle_ensure_async() was called + * @result: a #GAsyncResult + * @error: a #GError to fill + * + * Signature of a function to finish the operation started with + * #TpDynamicHandleRepoNormalizeAsync. + * + * Since: 0.UNRELEASED + */ + +/** * tp_dynamic_handle_repo_new: * @handle_type: The handle type * @normalize_func: The function to be used to normalize and validate handles, @@ -160,6 +187,10 @@ struct _TpDynamicHandleRepo { gpointer normalization_data; /* Destructor for extra data */ GDestroyNotify free_normalization_data; + + /* Async normalization function */ + TpDynamicHandleRepoNormalizeAsync normalize_async; + TpDynamicHandleRepoNormalizeFinish normalize_finish; }; static void dynamic_repo_iface_init (gpointer g_iface, @@ -522,6 +553,66 @@ dynamic_ensure_handle (TpHandleRepoIface *irepo, } static void +normalize_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + TpDynamicHandleRepo *self = (TpDynamicHandleRepo *) source; + TpHandleRepoIface *repo = (TpHandleRepoIface *) self; + GSimpleAsyncResult *my_result = user_data; + gchar *normal_id; + GError *error = NULL; + + normal_id = self->normalize_finish (repo, result, &error); + if (normal_id == NULL) + { + g_simple_async_result_take_error (my_result, error); + } + else + { + TpHandle handle; + + handle = ensure_handle_take_normalized_id (self, normal_id); + g_simple_async_result_set_op_res_gpointer (my_result, + GUINT_TO_POINTER (handle), NULL); + } + + g_simple_async_result_complete (my_result); + g_object_unref (my_result); +} + +static void +dynamic_ensure_handle_async (TpHandleRepoIface *repo, + TpBaseConnection *connection, + const gchar *id, + gpointer context, + GAsyncReadyCallback callback, + gpointer user_data) +{ + TpDynamicHandleRepo *self = TP_DYNAMIC_HANDLE_REPO (repo); + GSimpleAsyncResult *result; + + if (self->normalize_async == NULL) + { + TpHandleRepoIfaceClass *klass; + + /* Fallback to default implementation */ + klass = g_type_default_interface_peek (TP_TYPE_HANDLE_REPO_IFACE); + klass->ensure_handle_async (repo, connection, id, + context, callback, user_data); + return; + } + + if (context == NULL) + context = self->default_normalize_context; + + result = g_simple_async_result_new (G_OBJECT (repo), callback, user_data, + dynamic_ensure_handle_async); + + self->normalize_async (repo, connection, id, context, normalize_cb, result); +} + +static void dynamic_set_qdata (TpHandleRepoIface *repo, TpHandle handle, GQuark key_id, gpointer data, GDestroyNotify destroy) { @@ -560,6 +651,7 @@ dynamic_repo_iface_init (gpointer g_iface, klass->inspect_handle = dynamic_inspect_handle; klass->lookup_handle = dynamic_lookup_handle; klass->ensure_handle = dynamic_ensure_handle; + klass->ensure_handle_async = dynamic_ensure_handle_async; klass->set_qdata = dynamic_set_qdata; klass->get_qdata = dynamic_get_qdata; } @@ -612,3 +704,27 @@ _tp_dynamic_handle_repo_set_normalization_data (TpHandleRepoIface *irepo, self->normalization_data = data; self->free_normalization_data = destroy; } + +/** + * tp_dynamic_handle_repo_set_normalize_async: + * @self: A #TpDynamicHandleRepo + * @normalize_async: a #TpDynamicHandleRepoNormalizeAsync + * @normalize_finish: a #TpDynamicHandleRepoNormalizeFinish + * + * Set an asynchronous normalization function. This is to be used if handle + * normalization requires a server round-trip. See tp_handle_ensure_async(). + * + * Since: 0.UNRELEASED + */ +void +tp_dynamic_handle_repo_set_normalize_async (TpDynamicHandleRepo *self, + TpDynamicHandleRepoNormalizeAsync normalize_async, + TpDynamicHandleRepoNormalizeFinish normalize_finish) +{ + g_return_if_fail (TP_IS_DYNAMIC_HANDLE_REPO (self)); + g_return_if_fail (normalize_async != NULL); + g_return_if_fail (normalize_finish != NULL); + + self->normalize_async = normalize_async; + self->normalize_finish = normalize_finish; +} diff --git a/telepathy-glib/handle-repo-dynamic.h b/telepathy-glib/handle-repo-dynamic.h index be4f33f40..a4372f14d 100644 --- a/telepathy-glib/handle-repo-dynamic.h +++ b/telepathy-glib/handle-repo-dynamic.h @@ -37,6 +37,16 @@ typedef struct _TpDynamicHandleRepoClass TpDynamicHandleRepoClass; typedef gchar *(*TpDynamicHandleRepoNormalizeFunc)(TpHandleRepoIface *repo, const gchar *id, gpointer context, GError **error); +typedef void (*TpDynamicHandleRepoNormalizeAsync) (TpHandleRepoIface *repo, + TpBaseConnection *connection, + const gchar *id, + gpointer context, + GAsyncReadyCallback callback, + gpointer user_data); +typedef gchar * (*TpDynamicHandleRepoNormalizeFinish) (TpHandleRepoIface *repo, + GAsyncResult *result, + GError **error); + GType tp_dynamic_handle_repo_get_type (void); #define TP_TYPE_DYNAMIC_HANDLE_REPO \ @@ -76,6 +86,11 @@ tp_dynamic_handle_repo_new (TpHandleType handle_type, NULL); } +_TP_AVAILABLE_IN_UNRELEASED +void tp_dynamic_handle_repo_set_normalize_async (TpDynamicHandleRepo *self, + TpDynamicHandleRepoNormalizeAsync normalize_async, + TpDynamicHandleRepoNormalizeFinish normalize_finish); + G_END_DECLS #endif |