[epiphany] ephy-snapshot-service: Port to GTask
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany] ephy-snapshot-service: Port to GTask
- Date: Fri, 14 Mar 2014 14:29:13 +0000 (UTC)
commit 64cb0dd095c04ec55f710fcd183558677849ba9c
Author: Carlos Garcia Campos <cgarcia igalia com>
Date: Tue Mar 11 15:49:19 2014 +0100
ephy-snapshot-service: Port to GTask
https://bugzilla.gnome.org/show_bug.cgi?id=725815
lib/ephy-snapshot-service.c | 686 +++++++++++++++++++++----------------------
1 files changed, 336 insertions(+), 350 deletions(-)
---
diff --git a/lib/ephy-snapshot-service.c b/lib/ephy-snapshot-service.c
index 3faf6b2..ec9ac81 100644
--- a/lib/ephy-snapshot-service.c
+++ b/lib/ephy-snapshot-service.c
@@ -61,104 +61,6 @@ ephy_snapshot_service_init (EphySnapshotService *self)
(GDestroyNotify)g_free);
}
-typedef struct {
- char *url;
- time_t mtime;
-
- GdkPixbuf *snapshot;
- char *path;
-} SnapshotForURLAsyncData;
-
-static SnapshotForURLAsyncData *
-snapshot_for_url_async_data_new (const char *url,
- time_t mtime)
-{
- SnapshotForURLAsyncData *data;
-
- data = g_slice_new0 (SnapshotForURLAsyncData);
- data->url = g_strdup (url);
- data->mtime = mtime;
-
- return data;
-}
-
-static void
-snapshot_for_url_async_data_free (SnapshotForURLAsyncData *data)
-{
- g_free (data->url);
- g_clear_object (&data->snapshot);
- g_free (data->path);
-
- g_slice_free (SnapshotForURLAsyncData, data);
-}
-
-static void
-get_snapshot_for_url_thread (GSimpleAsyncResult *result,
- EphySnapshotService *service,
- GCancellable *cancellable)
-{
- SnapshotForURLAsyncData *data;
- GError *error = NULL;
-
- data = (SnapshotForURLAsyncData *)g_simple_async_result_get_op_res_gpointer (result);
-
- data->path = gnome_desktop_thumbnail_factory_lookup (service->priv->factory, data->url, data->mtime);
- if (data->path == NULL) {
- g_simple_async_result_set_error (result,
- EPHY_SNAPSHOT_SERVICE_ERROR,
- EPHY_SNAPSHOT_SERVICE_ERROR_NOT_FOUND,
- "Snapshot for url \"%s\" not found in cache", data->url);
- return;
- }
-
- g_hash_table_insert (service->priv->cache, g_strdup (data->url), g_strdup (data->path));
-
- data->snapshot = gdk_pixbuf_new_from_file (data->path, &error);
- if (data->snapshot == NULL) {
- g_simple_async_result_set_error (result,
- EPHY_SNAPSHOT_SERVICE_ERROR,
- EPHY_SNAPSHOT_SERVICE_ERROR_INVALID,
- "Error creating pixbuf for snapshot file \"%s\": %s",
- data->path, error->message);
- g_error_free (error);
- }
-}
-
-typedef struct {
- WebKitWebView *web_view;
- time_t mtime;
- GCancellable *cancellable;
-
- GdkPixbuf *snapshot;
- char *path;
-} SnapshotAsyncData;
-
-static SnapshotAsyncData *
-snapshot_async_data_new (WebKitWebView *web_view,
- time_t mtime,
- GCancellable *cancellable)
-{
- SnapshotAsyncData *data;
-
- data = g_slice_new0 (SnapshotAsyncData);
- data->web_view = g_object_ref (web_view);
- data->mtime = mtime;
- data->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
-
- return data;
-}
-
-static void
-snapshot_async_data_free (SnapshotAsyncData *data)
-{
- g_object_unref (data->web_view);
- g_clear_object (&data->cancellable);
- g_clear_object (&data->snapshot);
- g_free (data->path);
-
- g_slice_free (SnapshotAsyncData, data);
-}
-
static GdkPixbuf *
ephy_snapshot_service_prepare_snapshot (cairo_surface_t *surface,
cairo_surface_t *favicon)
@@ -221,144 +123,249 @@ ephy_snapshot_service_prepare_snapshot (cairo_surface_t *surface,
return scaled;
}
+typedef struct {
+ WebKitWebView *web_view;
+ time_t mtime;
+ gboolean for_snapshot;
+
+ GdkPixbuf *snapshot;
+ char *path;
+} SnapshotAsyncData;
+
+static SnapshotAsyncData *
+snapshot_async_data_new (WebKitWebView *web_view,
+ time_t mtime)
+{
+ SnapshotAsyncData *data;
+
+ data = g_slice_new0 (SnapshotAsyncData);
+ data->web_view = web_view;
+ data->mtime = mtime;
+
+ g_object_add_weak_pointer (G_OBJECT (web_view), (gpointer *)&data->web_view);
+
+ return data;
+}
+
+static SnapshotAsyncData *
+snapshot_async_data_new_for_snapshot (WebKitWebView *web_view,
+ time_t mtime)
+{
+ SnapshotAsyncData *data = snapshot_async_data_new (web_view, mtime);
+
+ data->for_snapshot = TRUE;
+
+ return data;
+}
+
+static void
+snapshot_async_data_free (SnapshotAsyncData *data)
+{
+ if (data->web_view)
+ g_object_remove_weak_pointer (G_OBJECT (data->web_view), (gpointer *)&data->web_view);
+ g_clear_object(&data->snapshot);
+ g_free (data->path);
+
+ g_slice_free (SnapshotAsyncData, data);
+}
+
static void
snapshot_saved (EphySnapshotService *service,
GAsyncResult *result,
- GSimpleAsyncResult *simple)
+ GTask *task)
{
- SnapshotAsyncData *data;
+ SnapshotAsyncData *data = g_task_get_task_data (task);
+ char *path;
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (simple);
- data->path = ephy_snapshot_service_save_snapshot_finish (service, result, NULL);
- g_simple_async_result_complete (simple);
- g_object_unref (simple);
+ path = ephy_snapshot_service_save_snapshot_finish (service, result, NULL);
+ if (data->for_snapshot) {
+ data->path = path;
+ g_task_return_pointer (task, g_object_ref (data->snapshot), g_object_unref);
+ } else {
+ g_task_return_pointer (task, path, g_free);
+ }
+ g_object_unref (task);
}
static void
save_snapshot (cairo_surface_t *surface,
- GSimpleAsyncResult *result)
+ GTask *task)
{
- SnapshotAsyncData *data;
- EphySnapshotService *service;
+ SnapshotAsyncData *data = g_task_get_task_data (task);
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (result);
data->snapshot = ephy_snapshot_service_prepare_snapshot (surface,
webkit_web_view_get_favicon (data->web_view));
- service = (EphySnapshotService *)g_async_result_get_source_object (G_ASYNC_RESULT (result));
- ephy_snapshot_service_save_snapshot_async (service, data->snapshot,
+ ephy_snapshot_service_save_snapshot_async (g_task_get_source_object (task),
+ data->snapshot,
webkit_web_view_get_uri (data->web_view),
- data->mtime, data->cancellable,
- (GAsyncReadyCallback)snapshot_saved, result);
+ data->mtime,
+ g_task_get_cancellable (task),
+ (GAsyncReadyCallback)snapshot_saved,
+ task);
}
static void
-on_snapshot_ready (WebKitWebView *webview,
+on_snapshot_ready (WebKitWebView *web_view,
GAsyncResult *result,
- GSimpleAsyncResult *simple)
+ GTask *task)
{
cairo_surface_t *surface;
GError *error = NULL;
- surface = webkit_web_view_get_snapshot_finish (webview, result, &error);
+ surface = webkit_web_view_get_snapshot_finish (web_view, result, &error);
if (error) {
- g_simple_async_result_take_error (simple, error);
- g_simple_async_result_complete (simple);
- g_object_unref (simple);
+ g_task_return_error (task, error);
+ g_object_unref (task);
return;
}
- save_snapshot (surface, simple);
+ save_snapshot (surface, task);
cairo_surface_destroy (surface);
}
static gboolean
-retrieve_snapshot_from_web_view (GSimpleAsyncResult *result)
+retrieve_snapshot_from_web_view (GTask *task)
{
SnapshotAsyncData *data;
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (result);
+ data = g_task_get_task_data (task);
+ if (!data->web_view) {
+ g_task_return_new_error (task,
+ EPHY_SNAPSHOT_SERVICE_ERROR,
+ EPHY_SNAPSHOT_SERVICE_ERROR_WEB_VIEW,
+ "%s", "Error getting snapshot, web view was destroyed");
+ g_object_unref (task);
+ return FALSE;
+ }
webkit_web_view_get_snapshot (data->web_view,
WEBKIT_SNAPSHOT_REGION_VISIBLE,
WEBKIT_SNAPSHOT_OPTIONS_NONE,
NULL, (GAsyncReadyCallback)on_snapshot_ready,
- result);
+ task);
return FALSE;
}
static void
-webview_load_changed_cb (WebKitWebView *webview,
+webview_destroyed_cb (GtkWidget *web_view,
+ GTask *task)
+{
+ g_task_return_new_error (task,
+ EPHY_SNAPSHOT_SERVICE_ERROR,
+ EPHY_SNAPSHOT_SERVICE_ERROR_WEB_VIEW,
+ "%s", "Error getting snapshot, web view was destroyed");
+ g_object_unref (task);
+}
+
+static void
+webview_load_changed_cb (WebKitWebView *web_view,
WebKitLoadEvent load_event,
- GSimpleAsyncResult *result)
+ GTask *task)
{
if (load_event != WEBKIT_LOAD_FINISHED)
return;
/* Load finished doesn't ensure that we actually have visible content yet,
so hold a bit before retrieving the snapshot. */
- g_idle_add ((GSourceFunc) retrieve_snapshot_from_web_view, result);
+ g_idle_add ((GSourceFunc) retrieve_snapshot_from_web_view, task);
/* Some pages might end up causing this condition to happen twice, so remove
the handler in order to avoid calling the above idle function twice. */
- g_signal_handlers_disconnect_by_func (webview, webview_load_changed_cb, result);
+ g_signal_handlers_disconnect_by_func (web_view, webview_load_changed_cb, task);
+ g_signal_handlers_disconnect_by_func (web_view, webview_destroyed_cb, task);
}
static gboolean
-webview_load_failed_cb (WebKitWebView *webview,
+webview_load_failed_cb (WebKitWebView *web_view,
WebKitLoadEvent load_event,
const char failing_uri,
GError *error,
- GSimpleAsyncResult *result)
-{
- g_signal_handlers_disconnect_by_func (webview, webview_load_changed_cb, result);
- g_signal_handlers_disconnect_by_func (webview, webview_load_failed_cb, result);
- g_simple_async_result_set_error (result,
- EPHY_SNAPSHOT_SERVICE_ERROR,
- EPHY_SNAPSHOT_SERVICE_ERROR_WEB_VIEW,
- "Error getting snapshot, web view failed to load: %s",
- error->message);
- g_simple_async_result_complete_in_idle (result);
- g_object_unref (result);
+ GTask *task)
+{
+ g_signal_handlers_disconnect_by_func (web_view, webview_load_changed_cb, task);
+ g_signal_handlers_disconnect_by_func (web_view, webview_load_failed_cb, task);
+ g_signal_handlers_disconnect_by_func (web_view, webview_destroyed_cb, task);
+ g_task_return_new_error (task,
+ EPHY_SNAPSHOT_SERVICE_ERROR,
+ EPHY_SNAPSHOT_SERVICE_ERROR_WEB_VIEW,
+ "Error getting snapshot, web view failed to load: %s",
+ error->message);
+ g_object_unref (task);
- return FALSE;
+ return TRUE;
}
static gboolean
-ephy_snapshot_service_take_from_webview (GSimpleAsyncResult *result)
+ephy_snapshot_service_take_from_webview (GTask *task)
{
SnapshotAsyncData *data;
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (result);
+ data = g_task_get_task_data (task);
+ if (!data->web_view) {
+ g_task_return_new_error (task,
+ EPHY_SNAPSHOT_SERVICE_ERROR,
+ EPHY_SNAPSHOT_SERVICE_ERROR_WEB_VIEW,
+ "%s", "Error getting snapshot, web view was destroyed");
+ g_object_unref (task);
+ return FALSE;
+ }
if (webkit_web_view_get_estimated_load_progress (WEBKIT_WEB_VIEW (data->web_view)) == 1.0)
- retrieve_snapshot_from_web_view (result);
+ retrieve_snapshot_from_web_view (task);
else {
- g_signal_connect (data->web_view, "load-changed",
- G_CALLBACK (webview_load_changed_cb), result);
- g_signal_connect (data->web_view, "load-failed",
- G_CALLBACK (webview_load_failed_cb), result);
+ g_signal_connect_object (data->web_view, "destroy",
+ G_CALLBACK (webview_destroyed_cb),
+ task, 0);
+ g_signal_connect_object (data->web_view, "load-changed",
+ G_CALLBACK (webview_load_changed_cb),
+ task, 0);
+ g_signal_connect_object (data->web_view, "load-failed",
+ G_CALLBACK (webview_load_failed_cb),
+ task, 0);
}
return FALSE;
}
+GQuark
+ephy_snapshot_service_error_quark (void)
+{
+ return g_quark_from_static_string ("ephy-snapshot-service-error-quark");
+}
+
+/**
+ * ephy_snapshot_service_get_default:
+ *
+ * Gets the default instance of #EphySnapshotService.
+ *
+ * Returns: a #EphySnapshotService
+ **/
+EphySnapshotService *
+ephy_snapshot_service_get_default (void)
+{
+ static EphySnapshotService *service = NULL;
+
+ if (service == NULL)
+ service = g_object_new (EPHY_TYPE_SNAPSHOT_SERVICE, NULL);
+
+ return service;
+}
+
typedef struct {
- GdkPixbuf *snapshot;
char *url;
time_t mtime;
+
char *path;
-} SaveSnapshotAsyncData;
+} SnapshotForURLAsyncData;
-static SaveSnapshotAsyncData *
-save_snapshot_async_data_new (GdkPixbuf *snapshot,
- const char *url,
- time_t mtime)
+static SnapshotForURLAsyncData *
+snapshot_for_url_async_data_new (const char *url,
+ time_t mtime)
{
- SaveSnapshotAsyncData *data;
+ SnapshotForURLAsyncData *data;
- data = g_slice_new0 (SaveSnapshotAsyncData);
- data->snapshot = g_object_ref (snapshot);
+ data = g_slice_new0 (SnapshotForURLAsyncData);
data->url = g_strdup (url);
data->mtime = mtime;
@@ -366,53 +373,45 @@ save_snapshot_async_data_new (GdkPixbuf *snapshot,
}
static void
-save_snapshot_async_data_free (SaveSnapshotAsyncData *data)
+snapshot_for_url_async_data_free (SnapshotForURLAsyncData *data)
{
- g_object_unref (data->snapshot);
g_free (data->url);
g_free (data->path);
- g_slice_free (SaveSnapshotAsyncData, data);
+ g_slice_free (SnapshotForURLAsyncData, data);
}
static void
-save_snapshot_thread (GSimpleAsyncResult *result,
- EphySnapshotService *service,
- GCancellable *cancellable)
+get_snapshot_for_url_thread (GTask *task,
+ EphySnapshotService *service,
+ SnapshotForURLAsyncData *data,
+ GCancellable *cancellable)
{
- SaveSnapshotAsyncData *data;
-
- data = (SaveSnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (result);
- gnome_desktop_thumbnail_factory_save_thumbnail (service->priv->factory,
- data->snapshot,
- data->url,
- data->mtime);
- data->path = gnome_desktop_thumbnail_path_for_uri (data->url, GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
- g_hash_table_insert (service->priv->cache, g_strdup (data->url), g_strdup (data->path));
-}
+ GdkPixbuf *snapshot;
+ GError *error = NULL;
-GQuark
-ephy_snapshot_service_error_quark (void)
-{
- return g_quark_from_static_string ("ephy-snapshot-service-error-quark");
-}
+ data->path = gnome_desktop_thumbnail_factory_lookup (service->priv->factory, data->url, data->mtime);
+ if (data->path == NULL) {
+ g_task_return_new_error (task,
+ EPHY_SNAPSHOT_SERVICE_ERROR,
+ EPHY_SNAPSHOT_SERVICE_ERROR_NOT_FOUND,
+ "Snapshot for url \"%s\" not found in cache", data->url);
+ return;
+ }
-/**
- * ephy_snapshot_service_get_default:
- *
- * Gets the default instance of #EphySnapshotService.
- *
- * Returns: a #EphySnapshotService
- **/
-EphySnapshotService *
-ephy_snapshot_service_get_default (void)
-{
- static EphySnapshotService *service = NULL;
+ g_hash_table_insert (service->priv->cache, g_strdup (data->url), g_strdup (data->path));
- if (service == NULL)
- service = g_object_new (EPHY_TYPE_SNAPSHOT_SERVICE, NULL);
+ snapshot = gdk_pixbuf_new_from_file (data->path, &error);
+ if (snapshot == NULL) {
+ g_task_return_new_error (task,
+ EPHY_SNAPSHOT_SERVICE_ERROR,
+ EPHY_SNAPSHOT_SERVICE_ERROR_INVALID,
+ "Error creating pixbuf for snapshot file \"%s\": %s",
+ data->path, error->message);
+ g_error_free (error);
+ }
- return service;
+ g_task_return_pointer (task, snapshot, g_object_unref);
}
/**
@@ -435,21 +434,18 @@ ephy_snapshot_service_get_snapshot_for_url_async (EphySnapshotService *service,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *result;
+ GTask *task;
g_return_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service));
g_return_if_fail (url != NULL);
- result = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
- ephy_snapshot_service_get_snapshot_for_url_async);
-
- g_simple_async_result_set_op_res_gpointer (result,
- snapshot_for_url_async_data_new (url, mtime),
- (GDestroyNotify)snapshot_for_url_async_data_free);
- g_simple_async_result_run_in_thread (result,
- (GSimpleAsyncThreadFunc)get_snapshot_for_url_thread,
- G_PRIORITY_LOW, cancellable);
- g_object_unref (result);
+ task = g_task_new (service, cancellable, callback, user_data);
+ g_task_set_priority (task, G_PRIORITY_LOW);
+ g_task_set_task_data (task,
+ snapshot_for_url_async_data_new (url, mtime),
+ (GDestroyNotify)snapshot_for_url_async_data_free);
+ g_task_run_in_thread (task, (GTaskThreadFunc)get_snapshot_for_url_thread);
+ g_object_unref (task);
}
/**
@@ -470,47 +466,43 @@ ephy_snapshot_service_get_snapshot_for_url_finish (EphySnapshotService *service,
gchar **path,
GError **error)
{
- GSimpleAsyncResult *simple;
- SnapshotForURLAsyncData *data;
-
- g_return_val_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service), NULL);
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (service),
- ephy_snapshot_service_get_snapshot_for_url_async),
- NULL);
+ GTask *task = G_TASK (result);
+ GdkPixbuf *snapshot;
- simple = (GSimpleAsyncResult *)result;
+ g_return_val_if_fail (g_task_is_valid (result, service), NULL);
- if (g_simple_async_result_propagate_error (simple, error))
+ snapshot = g_task_propagate_pointer (task, error);
+ if (!snapshot)
return NULL;
- data = (SnapshotForURLAsyncData *)g_simple_async_result_get_op_res_gpointer (simple);
-
if (path) {
+ SnapshotForURLAsyncData *data;
+
+ data = g_task_get_task_data (task);
*path = data->path;
data->path = NULL;
}
- return data->snapshot ? g_object_ref (data->snapshot) : NULL;
+ return snapshot;
}
static void
got_snapshot_for_url (EphySnapshotService *service,
GAsyncResult *result,
- GSimpleAsyncResult *simple)
+ GTask *task)
{
+ GdkPixbuf *snapshot;
SnapshotAsyncData *data;
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (simple);
- data->snapshot = ephy_snapshot_service_get_snapshot_for_url_finish (service, result, &data->path, NULL);
- if (data->snapshot) {
- g_simple_async_result_complete (simple);
- g_object_unref (simple);
-
+ data = g_task_get_task_data (task);
+ snapshot = ephy_snapshot_service_get_snapshot_for_url_finish (service, result, &data->path, NULL);
+ if (snapshot) {
+ g_task_return_pointer (task, snapshot, g_object_unref);
+ g_object_unref (task);
return;
}
- ephy_snapshot_service_take_from_webview (simple);
+ ephy_snapshot_service_take_from_webview (task);
}
/**
@@ -534,19 +526,17 @@ ephy_snapshot_service_get_snapshot_async (EphySnapshotService *service,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *result;
+ GTask *task;
const char *uri;
time_t current_time = time (NULL);
g_return_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service));
g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
- result = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
- ephy_snapshot_service_get_snapshot_async);
-
- g_simple_async_result_set_op_res_gpointer (result,
- snapshot_async_data_new (web_view, mtime, cancellable),
- (GDestroyNotify)snapshot_async_data_free);
+ task = g_task_new (service, cancellable, callback, user_data);
+ g_task_set_task_data (task,
+ snapshot_async_data_new_for_snapshot (web_view, mtime),
+ (GDestroyNotify)snapshot_async_data_free);
/* Try to get the snapshot from the cache first if we have a URL */
uri = webkit_web_view_get_uri (web_view);
@@ -554,9 +544,9 @@ ephy_snapshot_service_get_snapshot_async (EphySnapshotService *service,
ephy_snapshot_service_get_snapshot_for_url_async (service,
uri, mtime, cancellable,
(GAsyncReadyCallback)got_snapshot_for_url,
- result);
+ task);
else
- g_idle_add ((GSourceFunc)ephy_snapshot_service_take_from_webview, result);
+ g_idle_add ((GSourceFunc)ephy_snapshot_service_take_from_webview, task);
}
/**
@@ -577,27 +567,72 @@ ephy_snapshot_service_get_snapshot_finish (EphySnapshotService *service,
gchar **path,
GError **error)
{
- GSimpleAsyncResult *simple;
- SnapshotAsyncData *data;
-
- g_return_val_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service), NULL);
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (service),
- ephy_snapshot_service_get_snapshot_async),
- NULL);
+ GTask *task = G_TASK (result);
+ GdkPixbuf *snapshot;
- simple = (GSimpleAsyncResult *)result;
+ g_return_val_if_fail (g_task_is_valid (result, service), NULL);
- if (g_simple_async_result_propagate_error (simple, error))
+ snapshot = g_task_propagate_pointer (task, error);
+ if (!snapshot)
return NULL;
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (simple);
if (path) {
+ SnapshotAsyncData *data;
+
+ data = g_task_get_task_data (task);
*path = data->path;
data->path = NULL;
}
- return data->snapshot ? g_object_ref (data->snapshot) : NULL;
+ return snapshot;
+}
+
+typedef struct {
+ GdkPixbuf *snapshot;
+ char *url;
+ time_t mtime;
+} SaveSnapshotAsyncData;
+
+static SaveSnapshotAsyncData *
+save_snapshot_async_data_new (GdkPixbuf *snapshot,
+ const char *url,
+ time_t mtime)
+{
+ SaveSnapshotAsyncData *data;
+
+ data = g_slice_new0 (SaveSnapshotAsyncData);
+ data->snapshot = g_object_ref (snapshot);
+ data->url = g_strdup (url);
+ data->mtime = mtime;
+
+ return data;
+}
+
+static void
+save_snapshot_async_data_free (SaveSnapshotAsyncData *data)
+{
+ g_object_unref (data->snapshot);
+ g_free (data->url);
+
+ g_slice_free (SaveSnapshotAsyncData, data);
+}
+
+static void
+save_snapshot_thread (GTask *task,
+ EphySnapshotService *service,
+ SaveSnapshotAsyncData *data,
+ GCancellable *cancellable)
+{
+ char *path;
+
+ gnome_desktop_thumbnail_factory_save_thumbnail (service->priv->factory,
+ data->snapshot,
+ data->url,
+ data->mtime);
+
+ path = gnome_desktop_thumbnail_path_for_uri (data->url, GNOME_DESKTOP_THUMBNAIL_SIZE_LARGE);
+ g_hash_table_insert (service->priv->cache, g_strdup (data->url), g_strdup (path));
+ g_task_return_pointer (task, path, g_free);
}
void
@@ -609,22 +644,19 @@ ephy_snapshot_service_save_snapshot_async (EphySnapshotService *service,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *result;
+ GTask *task;
g_return_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service));
g_return_if_fail (GDK_IS_PIXBUF (snapshot));
g_return_if_fail (url != NULL);
- result = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
- ephy_snapshot_service_save_snapshot_async);
-
- g_simple_async_result_set_op_res_gpointer (result,
- save_snapshot_async_data_new (snapshot, url, mtime),
- (GDestroyNotify)save_snapshot_async_data_free);
- g_simple_async_result_run_in_thread (result,
- (GSimpleAsyncThreadFunc)save_snapshot_thread,
- G_PRIORITY_LOW, cancellable);
- g_object_unref (result);
+ task = g_task_new (service, cancellable, callback, user_data);
+ g_task_set_priority (task, G_PRIORITY_LOW);
+ g_task_set_task_data (task,
+ save_snapshot_async_data_new (snapshot, url, mtime),
+ (GDestroyNotify)save_snapshot_async_data_free);
+ g_task_run_in_thread (task, (GTaskThreadFunc)save_snapshot_thread);
+ g_object_unref (task);
}
char *
@@ -632,23 +664,9 @@ ephy_snapshot_service_save_snapshot_finish (EphySnapshotService *service,
GAsyncResult *result,
GError **error)
{
- SaveSnapshotAsyncData *data;
- char *retval;
-
- g_return_val_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service), FALSE);
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (service),
- ephy_snapshot_service_save_snapshot_async),
- FALSE);
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
- return NULL;
-
- data = (SaveSnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
- retval = data->path;
- data->path = NULL;
+ g_return_val_if_fail (g_task_is_valid (result, service), NULL);
- return retval;
+ return g_task_propagate_pointer (G_TASK (result), error);
}
const char *
@@ -661,22 +679,24 @@ ephy_snapshot_service_lookup_snapshot_path (EphySnapshotService *service,
}
static void
-get_snapshot_path_for_url_thread (GSimpleAsyncResult *result,
+get_snapshot_path_for_url_thread (GTask *task,
EphySnapshotService *service,
+ SnapshotForURLAsyncData *data,
GCancellable *cancellable)
{
- SnapshotForURLAsyncData *data;
+ char *path;
- data = (SnapshotForURLAsyncData *)g_simple_async_result_get_op_res_gpointer (result);
- data->path = gnome_desktop_thumbnail_factory_lookup (service->priv->factory, data->url, data->mtime);
- if (!data->path) {
- g_simple_async_result_set_error (result,
- EPHY_SNAPSHOT_SERVICE_ERROR,
- EPHY_SNAPSHOT_SERVICE_ERROR_NOT_FOUND,
- "Snapshot for url \"%s\" not found in cache", data->url);
- } else {
- g_hash_table_insert (service->priv->cache, g_strdup (data->url), g_strdup (data->path));
+ path = gnome_desktop_thumbnail_factory_lookup (service->priv->factory, data->url, data->mtime);
+ if (!path) {
+ g_task_return_new_error (task,
+ EPHY_SNAPSHOT_SERVICE_ERROR,
+ EPHY_SNAPSHOT_SERVICE_ERROR_NOT_FOUND,
+ "Snapshot for url \"%s\" not found in cache", data->url);
+ return;
}
+
+ g_hash_table_insert (service->priv->cache, g_strdup (data->url), g_strdup (path));
+ g_task_return_pointer (task, path, g_free);
}
void
@@ -687,29 +707,27 @@ ephy_snapshot_service_get_snapshot_path_for_url_async (EphySnapshotService *serv
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *result;
- SnapshotForURLAsyncData *data;
+ GTask *task;
const char *path;
g_return_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service));
g_return_if_fail (url != NULL);
- result = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
- ephy_snapshot_service_get_snapshot_path_for_url_async);
-
- data = snapshot_for_url_async_data_new (url, mtime);
- g_simple_async_result_set_op_res_gpointer (result, data, (GDestroyNotify)snapshot_for_url_async_data_free);
+ task = g_task_new (service, cancellable, callback, user_data);
path = g_hash_table_lookup (service->priv->cache, url);
if (path) {
- data->path = g_strdup (path);
- g_simple_async_result_complete_in_idle (result);
- } else {
- g_simple_async_result_run_in_thread (result,
- (GSimpleAsyncThreadFunc)get_snapshot_path_for_url_thread,
- G_PRIORITY_LOW, cancellable);
+ g_task_return_pointer (task, g_strdup (path), g_free);
+ g_object_unref (task);
+ return;
}
- g_object_unref (result);
+
+ g_task_set_priority (task, G_PRIORITY_LOW);
+ g_task_set_task_data (task,
+ snapshot_for_url_async_data_new (url, mtime),
+ (GDestroyNotify)snapshot_for_url_async_data_free);
+ g_task_run_in_thread (task, (GTaskThreadFunc)get_snapshot_path_for_url_thread);
+ g_object_unref (task);
}
char *
@@ -717,40 +735,24 @@ ephy_snapshot_service_get_snapshot_path_for_url_finish (EphySnapshotService *ser
GAsyncResult *result,
GError **error)
{
- SnapshotForURLAsyncData *data;
- char *retval;
+ g_return_val_if_fail (g_task_is_valid (result, service), NULL);
- g_return_val_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service), NULL);
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (service),
-
ephy_snapshot_service_get_snapshot_path_for_url_async),
- NULL);
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
- return NULL;
-
- data = (SnapshotForURLAsyncData *)g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT
(result));
-
- retval = data->path;
- data->path = NULL;
-
- return retval;
+ return g_task_propagate_pointer (G_TASK (result), error);
}
static void
got_snapshot_path_for_url (EphySnapshotService *service,
GAsyncResult *result,
- GSimpleAsyncResult *simple)
+ GTask *task)
{
- SnapshotAsyncData *data;
+ char *path;
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (simple);
- data->path = ephy_snapshot_service_get_snapshot_path_for_url_finish (service, result, NULL);
- if (data->path) {
- g_simple_async_result_complete (simple);
- g_object_unref (simple);
+ path = ephy_snapshot_service_get_snapshot_path_for_url_finish (service, result, NULL);
+ if (path) {
+ g_task_return_pointer (task, path, g_free);
+ g_object_unref (task);
} else {
- ephy_snapshot_service_take_from_webview (simple);
+ ephy_snapshot_service_take_from_webview (task);
}
}
@@ -762,38 +764,37 @@ ephy_snapshot_service_get_snapshot_path_async (EphySnapshotService *service,
GAsyncReadyCallback callback,
gpointer user_data)
{
- GSimpleAsyncResult *result;
- SnapshotAsyncData *data;
+ GTask *task;
const char *uri;
time_t current_time = time (NULL);
g_return_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service));
g_return_if_fail (WEBKIT_IS_WEB_VIEW (web_view));
- result = g_simple_async_result_new (G_OBJECT (service), callback, user_data,
- ephy_snapshot_service_get_snapshot_path_async);
-
- data = snapshot_async_data_new (web_view, mtime, cancellable);
- g_simple_async_result_set_op_res_gpointer (result, data, (GDestroyNotify)snapshot_async_data_free);
+ task = g_task_new (service, cancellable, callback, user_data);
uri = webkit_web_view_get_uri (web_view);
if (uri && current_time - mtime <= SNAPSHOT_UPDATE_THRESHOLD) {
const char *path = g_hash_table_lookup (service->priv->cache, uri);
if (path) {
- data->path = g_strdup (path);
- g_simple_async_result_complete_in_idle (result);
+ g_task_return_pointer (task, g_strdup (path), g_free);
+ g_object_unref (task);
} else {
+ g_task_set_task_data (task,
+ snapshot_async_data_new (web_view, mtime),
+ (GDestroyNotify)snapshot_async_data_free);
ephy_snapshot_service_get_snapshot_path_for_url_async (service,
uri, mtime, cancellable,
(GAsyncReadyCallback)got_snapshot_path_for_url,
- g_object_ref (result));
+ task);
}
} else {
- g_idle_add ((GSourceFunc)ephy_snapshot_service_take_from_webview, g_object_ref (result));
+ g_task_set_task_data (task,
+ snapshot_async_data_new (web_view, mtime),
+ (GDestroyNotify)snapshot_async_data_free);
+ g_idle_add ((GSourceFunc)ephy_snapshot_service_take_from_webview, task);
}
-
- g_object_unref (result);
}
char *
@@ -801,22 +802,7 @@ ephy_snapshot_service_get_snapshot_path_finish (EphySnapshotService *service,
GAsyncResult *result,
GError **error)
{
- SnapshotAsyncData *data;
- char *retval;
-
- g_return_val_if_fail (EPHY_IS_SNAPSHOT_SERVICE (service), FALSE);
- g_return_val_if_fail (g_simple_async_result_is_valid (result,
- G_OBJECT (service),
- ephy_snapshot_service_get_snapshot_path_async),
- FALSE);
-
- if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error))
- return NULL;
-
- data = (SnapshotAsyncData *)g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
-
- retval = data->path;
- data->path = NULL;
+ g_return_val_if_fail (g_task_is_valid (result, service), NULL);
- return retval;
+ return g_task_propagate_pointer (G_TASK (result), error);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]