[epiphany] ephy-snapshot-service: Port to GTask



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]