[gedit] File browser: don't use GIOScheduler (deprecated)



commit 2d1eb80d3d670d1420635e25042de248b6ce8fbb
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Apr 14 19:22:05 2013 +0200

    File browser: don't use GIOScheduler (deprecated)
    
    The GIOScheduler was used because there was no async version of
    g_file_delete() and g_file_trash(). Now that the async versions exist,
    no need to use GIOScheduler or GTask.
    
    gio >= 2.37.0 is required.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=693018

 configure.ac                                   |   2 +-
 plugins/filebrowser/gedit-file-browser-store.c | 131 ++++++++++++++-----------
 2 files changed, 74 insertions(+), 59 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 831ca5e..b7c7c15 100644
--- a/configure.ac
+++ b/configure.ac
@@ -325,7 +325,7 @@ dnl ================================================================
 PKG_CHECK_MODULES(GEDIT, [
        libxml-2.0 >= 2.5.0
        glib-2.0 >= 2.28.0
-       gio-2.0 >= 2.35.4
+       gio-2.0 >= 2.37.0
        gtk+-3.0 >= 3.7.10
        gtksourceview-3.0 >= 3.2.0
        libpeas-1.0 >= 1.7.0
diff --git a/plugins/filebrowser/gedit-file-browser-store.c b/plugins/filebrowser/gedit-file-browser-store.c
index abf8589..ba487d4 100644
--- a/plugins/filebrowser/gedit-file-browser-store.c
+++ b/plugins/filebrowser/gedit-file-browser-store.c
@@ -196,6 +196,8 @@ static void model_check_dummy                               (GeditFileBrowserSto
 static void next_files_async                               (GFileEnumerator        *enumerator,
                                                             AsyncNode              *async);
 
+static void delete_files                                    (AsyncData              *data);
+
 G_DEFINE_DYNAMIC_TYPE_EXTENDED (GeditFileBrowserStore, gedit_file_browser_store,
                                G_TYPE_OBJECT,
                                0,
@@ -3521,84 +3523,101 @@ emit_no_trash (AsyncData *data)
        return ret;
 }
 
-typedef struct {
-       GeditFileBrowserStore *model;
-       GFile *file;
-} IdleDelete;
-
-static gboolean
-file_deleted (IdleDelete *data)
-{
-       FileBrowserNode *node;
-       node = model_find_node (data->model, NULL, data->file);
-
-       if (node != NULL)
-               model_remove_node (data->model, node, NULL, TRUE);
-
-       return FALSE;
-}
-
-static gboolean
-delete_files (GIOSchedulerJob *job,
-             GCancellable    *cancellable,
-             AsyncData       *data)
+static void
+delete_file_finished (GFile        *file,
+                     GAsyncResult *res,
+                     AsyncData    *data)
 {
-       GFile *file;
        GError *error = NULL;
-       gboolean ret;
-       gint code;
-       IdleDelete delete;
-
-       /* Check if our job is done */
-       if (!data->iter)
-               return FALSE;
-
-       /* Move a file to the trash */
-       file = G_FILE (data->iter->data);
+       gboolean ok;
 
        if (data->trash)
-               ret = g_file_trash (file, cancellable, &error);
+       {
+               ok = g_file_trash_finish (file, res, &error);
+       }
        else
-               ret = g_file_delete (file, cancellable, &error);
+       {
+               ok = g_file_delete_finish (file, res, &error);
+       }
 
-       if (ret)
+       if (ok)
        {
-               delete.model = data->model;
-               delete.file = file;
+               /* Remove the file from the model */
+               FileBrowserNode *node = model_find_node (data->model, NULL, file);
 
-               /* Remove the file from the model in the main loop */
-               g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc)file_deleted, &delete, NULL);
+               if (node != NULL)
+               {
+                       model_remove_node (data->model, node, NULL, TRUE);
+               }
+
+               /* Process the next file */
+               data->iter = data->iter->next;
        }
-       else if (!ret && error)
+       else if (!ok && error != NULL)
        {
-               code = error->code;
+               gint code = error->code;
                g_error_free (error);
 
                if (data->trash && code == G_IO_ERROR_NOT_SUPPORTED)
                {
-                       /* Trash is not supported on this system ... */
-                       if (g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc)emit_no_trash, data, NULL))
+                       /* Trash is not supported on this system. Ask the user
+                        * if he wants to delete completely the files instead.
+                        */
+                       if (emit_no_trash (data))
                        {
                                /* Changes this into a delete job */
                                data->trash = FALSE;
                                data->iter = data->files;
-
-                               return TRUE;
                        }
-
-                       /* End the job */
-                       return FALSE;
+                       else
+                       {
+                               /* End the job */
+                               async_data_free (data);
+                               return;
+                       }
                }
                else if (code == G_IO_ERROR_CANCELLED)
                {
-                       /* Job has been cancelled, just let the job end */
-                       return FALSE;
+                       /* Job has been cancelled, end the job */
+                       async_data_free (data);
+                       return;
                }
        }
 
-       /* Process the next item */
-       data->iter = data->iter->next;
-       return TRUE;
+       /* Continue the job */
+       delete_files (data);
+}
+
+static void
+delete_files (AsyncData *data)
+{
+       GFile *file;
+
+       /* Check if our job is done */
+       if (data->iter == NULL)
+       {
+               async_data_free (data);
+               return;
+       }
+
+       file = G_FILE (data->iter->data);
+
+       if (data->trash)
+       {
+               g_file_trash_async (file,
+                                   G_PRIORITY_DEFAULT,
+                                   data->cancellable,
+                                   (GAsyncReadyCallback)delete_file_finished,
+                                   data);
+       }
+       else
+       {
+               g_file_delete_async (file,
+                                    G_PRIORITY_DEFAULT,
+                                    data->cancellable,
+                                    (GAsyncReadyCallback)delete_file_finished,
+                                    data);
+       }
 }
 
 GeditFileBrowserStoreResult
@@ -3652,11 +3671,7 @@ gedit_file_browser_store_delete_all (GeditFileBrowserStore *model,
 
        model->priv->async_handles = g_slist_prepend (model->priv->async_handles, data);
 
-       g_io_scheduler_push_job ((GIOSchedulerJobFunc)delete_files,
-                                data,
-                                (GDestroyNotify)async_data_free,
-                                G_PRIORITY_DEFAULT,
-                                data->cancellable);
+       delete_files (data);
        g_list_free (rows);
 
        return GEDIT_FILE_BROWSER_STORE_RESULT_OK;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]