diff options
author | vyasgiridhar <vyasgiridhar27@gmail.com> | 2017-03-13 22:51:46 +0530 |
---|---|---|
committer | Carlos Soriano <csoriano@gnome.org> | 2017-04-22 17:16:16 +0200 |
commit | cc9511bb18975dde0ea806395d02b8e60176923f (patch) | |
tree | 36dca4b0347b932fcbc429212ddc7fa7b5315f16 | |
parent | 28dd203d02317e6f5da7d7655ab4a5db6a571e5f (diff) | |
download | nautilus-cc9511bb18975dde0ea806395d02b8e60176923f.tar.gz |
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
-rw-r--r-- | 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 125be8d55..e4a3cf465 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); |