From b6e030fc577477fb6bf87d8833f2404ab8c6fc48 Mon Sep 17 00:00:00 2001 From: Danielle Madeley Date: Mon, 7 Mar 2011 11:21:43 +1100 Subject: Warn the user if she has insufficient disk space to receive a file Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=644062 --- libempathy-gtk/empathy-ui-utils.c | 61 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c index 4d9f4d4c7..90bafb1e4 100644 --- a/libempathy-gtk/empathy-ui-utils.c +++ b/libempathy-gtk/empathy-ui-utils.c @@ -1839,11 +1839,66 @@ file_manager_receive_file_response_cb (GtkDialog *dialog, GFile *file; if (response == GTK_RESPONSE_OK) { - factory = empathy_ft_factory_dup_singleton (); + GFile *parent; + GFileInfo *info; + guint64 free_space, file_size; + GError *error = NULL; + file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog)); + parent = g_file_get_parent (file); + info = g_file_query_filesystem_info (parent, + G_FILE_ATTRIBUTE_FILESYSTEM_FREE, + NULL, &error); + + g_object_unref (parent); + + if (error != NULL) { + g_warning ("Error: %s", error->message); + + g_object_unref (file); + return; + } + + free_space = g_file_info_get_attribute_uint64 (info, + G_FILE_ATTRIBUTE_FILESYSTEM_FREE); + file_size = empathy_ft_handler_get_total_bytes (handler); + + g_object_unref (info); + + if (file_size > free_space) { + GtkWidget *message = gtk_message_dialog_new ( + GTK_WINDOW (dialog), + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Insufficient free space to save file")); + char *file_size_str, *free_space_str; + + file_size_str = g_format_size_for_display (file_size); + free_space_str = g_format_size_for_display (free_space); + + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (message), + _("%s of free space are required to save this " + "file, but only %s is available. Please " + "choose another location."), + file_size_str, free_space_str); + + gtk_dialog_run (GTK_DIALOG (message)); + + g_free (file_size_str); + g_free (free_space_str); + gtk_widget_destroy (message); + + g_object_unref (file); + + return; + } + + factory = empathy_ft_factory_dup_singleton (); - empathy_ft_factory_set_destination_for_incoming_handler - (factory, handler, file); + empathy_ft_factory_set_destination_for_incoming_handler ( + factory, handler, file); g_object_unref (factory); g_object_unref (file); -- cgit v1.2.3