[PATCH 1/2] [core] resolve_async implementation
- From: Víctor Manuel Jáquez Leal <vjaquez igalia com>
- To: grilo-list gnome org
- Subject: [PATCH 1/2] [core] resolve_async implementation
- Date: Sun, 11 Apr 2010 19:56:47 +0200
resolve_async is a reimplementation of the resolve method in
GrlMetadataSource using the GAsyncResult mechanism.
Signed-off-by: Víctor Manuel Jáquez Leal <vjaquez igalia com>
---
configure.ac | 3 +-
src/Makefile.am | 2 +-
src/grl-metadata-source.c | 105 +++++++++++++++++++++++++++++++++++++++++++++
src/grl-metadata-source.h | 17 +++++++
4 files changed, 125 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 47d0841..636c644 100644
--- a/configure.ac
+++ b/configure.ac
@@ -143,7 +143,8 @@ GOBJECT_INTROSPECTION_CHECK([0.6.7])
PKG_CHECK_MODULES(DEPS, glib-2.0 \
gobject-2.0 \
- gmodule-2.0)
+ gmodule-2.0 \
+ gio-2.0)
AC_SUBST(DEPS_CFLAGS)
diff --git a/src/Makefile.am b/src/Makefile.am
index 34d768b..4403eba 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -84,7 +84,7 @@ introspection_sources = \
$(lib GRL_NAME@_la_SOURCES)
Grilo- GRL_MAJORMINOR@.gir: lib GRL_NAME@.la
-Grilo_0_1_gir_INCLUDES = GObject-2.0
+Grilo_0_1_gir_INCLUDES = GObject-2.0 Gio-2.0
Grilo_0_1_gir_CFLAGS = $(lib GRL_NAME@_la_CFLAGS)
Grilo_0_1_gir_LIBS = lib GRL_NAME@.la
Grilo_0_1_gir_FILES = $(addprefix $(srcdir)/,$(introspection_sources))
diff --git a/src/grl-metadata-source.c b/src/grl-metadata-source.c
index da9705d..238c3a1 100644
--- a/src/grl-metadata-source.c
+++ b/src/grl-metadata-source.c
@@ -595,6 +595,111 @@ grl_metadata_source_resolve (GrlMetadataSource *source,
g_idle_add (resolve_idle, rs);
}
+typedef struct {
+ GrlMetadataSource *source;
+ GList *keys;
+ GrlMedia *media;
+ GrlMetadataResolutionFlags flags;
+} ResolveAsyncData;
+
+static void
+resolve_async_data_free (gpointer user_data)
+{
+ ResolveAsyncData *data = (ResolveAsyncData *) user_data;
+ g_object_unref (data->source);
+ g_object_unref (data->media);
+ g_list_free (data->keys);
+ g_slice_free (ResolveAsyncData, data);
+}
+
+static gboolean
+resolve_async_idle (gpointer user_data)
+{
+ g_debug (G_STRFUNC);
+ GSimpleAsyncResult *res = G_SIMPLE_ASYNC_RESULT (user_data);
+
+ ResolveAsyncData *data = g_simple_async_result_get_op_res_gpointer (res);
+ GRL_METADATA_SOURCE_GET_CLASS (data->source)->resolve_async (data->source,
+ data->keys,
+ data->media,
+ data->flags);
+
+ g_simple_async_result_complete (res);
+ g_object_unref (res);
+
+ return FALSE;
+}
+
+GrlMedia *
+grl_metadata_source_resolve_finish (GrlMetadataSource *source,
+ GAsyncResult *res,
+ GError **error)
+{
+ g_warn_if_fail (g_simple_async_result_get_source_tag (G_SIMPLE_ASYNC_RESULT (res)) ==
+ grl_metadata_source_resolve_async);
+
+ ResolveAsyncData *data =
+ g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+ return data->media;
+}
+
+/**
+ * grl_metadata_source_resolve_async:
+ * @source: a metadata source
+ * @keys: the #GList of #GrlKeyID to retrieve
+ * @media: Transfer object where all the metadata is stored.
+ * @flags: bitwise mask of #GrlMetadataResolutionFlags with the resolution
+ * strategy
+ * @callback: the callback to call when the request is satisfied
+ * @user_data: data to pass to @callback function
+ *
+ * This is the main method of the #GrlMetadataSource class. It will fetch the
+ * metadata of the requested keys.
+ *
+ * This function is asynchronic and uses the Glib's main loop.
+ */
+void
+grl_metadata_source_resolve_async (GrlMetadataSource *source,
+ const GList *keys,
+ GrlMedia *media,
+ GrlMetadataResolutionFlags flags,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GList *_keys;
+ GSimpleAsyncResult *res;
+ ResolveAsyncData *data;
+
+ g_debug (G_STRFUNC);
+
+ g_return_if_fail (GRL_IS_METADATA_SOURCE (source));
+ g_return_if_fail (callback != NULL);
+ g_return_if_fail (media != NULL);
+ g_return_if_fail (grl_metadata_source_supported_operations (source) &
+ GRL_OP_RESOLVE);
+
+ _keys = g_list_copy ((GList *) keys);
+
+ if (flags & GRL_RESOLVE_FAST_ONLY) {
+ grl_metadata_source_filter_slow (source, &_keys, FALSE);
+ }
+
+ data = g_slice_new0 (ResolveAsyncData);
+ {
+ data->source = g_object_ref (source);
+ data->keys = _keys;
+ data->media = g_object_ref (media);
+ data->flags = flags;
+ }
+
+ res = g_simple_async_result_new (G_OBJECT (source), callback, user_data,
+ grl_metadata_source_resolve_async);
+
+ g_simple_async_result_set_op_res_gpointer (res, data, resolve_async_data_free);
+
+ g_idle_add (resolve_async_idle, res);
+}
+
/**
* grl_metadata_source_filter_supported:
* @source: a metadata source
diff --git a/src/grl-metadata-source.h b/src/grl-metadata-source.h
index f0a482e..f7b11cc 100644
--- a/src/grl-metadata-source.h
+++ b/src/grl-metadata-source.h
@@ -33,6 +33,7 @@
#include <glib.h>
#include <glib-object.h>
+#include <gio/gio.h>
/* Macros */
@@ -245,6 +246,11 @@ struct _GrlMetadataSourceClass {
void (*resolve) (GrlMetadataSource *source,
GrlMetadataSourceResolveSpec *rs);
+ void (*resolve_async) (GrlMetadataSource *source,
+ const GList *keys,
+ GrlMedia *media,
+ GrlMetadataResolutionFlags flags);
+
void (*set_metadata) (GrlMetadataSource *source,
GrlMetadataSourceSetMetadataSpec *sms);
};
@@ -283,6 +289,17 @@ void grl_metadata_source_resolve (GrlMetadataSource *source,
GrlMetadataSourceResolveCb callback,
gpointer user_data);
+GrlMedia *grl_metadata_source_resolve_finish (GrlMetadataSource *source,
+ GAsyncResult *res,
+ GError **error);
+
+void grl_metadata_source_resolve_async (GrlMetadataSource *source,
+ const GList *keys,
+ GrlMedia *media,
+ GrlMetadataResolutionFlags flags,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
void grl_metadata_source_set_metadata (GrlMetadataSource *source,
GrlMedia *media,
GList *keys,
--
1.7.0
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]