[nautilus/wip/csoriano/nautilus-3.24.1: 4/14] file-operations: check filespace before extracting



commit cc9511bb18975dde0ea806395d02b8e60176923f
Author: vyasgiridhar <vyasgiridhar27 gmail com>
Date:   Mon Mar 13 22:51:46 2017 +0530

    file-operations: check filespace before extracting
    
    Currently, the extraction starts without checking
    for enough filesystem space to store the extracted files.
    
    This commit checks for filespace before the extraction takes place.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=775253

 src/nautilus-file-operations.c |   49 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)
---
diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c
index 125be8d..e4a3cf4 100644
--- a/src/nautilus-file-operations.c
+++ b/src/nautilus-file-operations.c
@@ -8384,6 +8384,51 @@ extract_job_on_completed (AutoarExtractor *extractor,
 }
 
 static void
+extract_job_on_scanned (AutoarExtractor *extractor,
+                        guint            total_files,
+                        gpointer         user_data)
+{
+    guint64 total_size;
+    ExtractJob *extract_job;
+    GFile *source_file;
+    g_autofree gchar *basename;
+    GFileInfo *fsinfo;
+    guint64 free_size;
+
+    extract_job = user_data;
+    total_size = autoar_extractor_get_total_size (extractor);
+    source_file = autoar_extractor_get_source_file (extractor);
+    basename = get_basename (source_file);
+
+    fsinfo = g_file_query_filesystem_info (source_file,
+                                           G_FILE_ATTRIBUTE_FILESYSTEM_FREE ","
+                                           G_FILE_ATTRIBUTE_FILESYSTEM_READONLY,
+                                           extract_job->common.cancellable,
+                                           NULL);
+    free_size = g_file_info_get_attribute_uint64 (fsinfo,
+                                                  G_FILE_ATTRIBUTE_FILESYSTEM_FREE);
+
+    /* FIXME: G_MAXUINT64 is the value used by autoar when the file size cannot
+     * be determined. Ideally an API should be used instead.
+     */
+    if (total_size != G_MAXUINT64 && total_size > free_size )
+    {
+      nautilus_progress_info_take_status (extract_job->common.progress,
+                                          g_strdup_printf (_("Error extracting ā€œ%sā€"),
+                                                           basename));
+      run_error (&extract_job->common,
+                 g_strdup_printf (_("Not enough free space to extract %s"),basename),
+                 NULL,
+                 NULL,
+                 FALSE,
+                 CANCEL,
+                 NULL);
+
+      abort_job ((CommonJob *) extract_job);
+    }
+}
+
+static void
 report_extract_final_progress (ExtractJob *extract_job,
                                gint        total_files)
 {
@@ -8483,7 +8528,9 @@ extract_task_thread_func (GTask        *task,
 
         autoar_extractor_set_notify_interval (extractor,
                                               PROGRESS_NOTIFY_INTERVAL);
-
+        g_signal_connect (extractor, "scanned",
+                          G_CALLBACK (extract_job_on_scanned),
+                          extract_job);
         g_signal_connect (extractor, "error",
                           G_CALLBACK (extract_job_on_error),
                           extract_job);


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