From f30a589cffd85112dbf9082e5b8846a55be615bf Mon Sep 17 00:00:00 2001 From: vyasgiridhar Date: Mon, 13 Mar 2017 22:51:46 +0530 Subject: 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 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c index 125be8d55..e4a3cf465 100644 --- a/src/nautilus-file-operations.c +++ b/src/nautilus-file-operations.c @@ -8383,6 +8383,51 @@ extract_job_on_completed (AutoarExtractor *extractor, nautilus_file_changes_queue_file_added (output_file); } +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); -- cgit v1.2.1