From 1ce522641d7a560bbbe9d10b4472ff5d279a2022 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Thu, 4 Jun 2009 17:27:37 +0200 Subject: [PATCH] Fixes NB#101877, no error note shown after configuring an account in memory full conditions * Renamed *_memory_full_* functions to *_disk_full_* * Moved check_disk_full and is_disk_full operations to the ModestTnyAccountStore --- src/modest-tny-account-store.c | 87 ++++++++++++++++-- src/modest-tny-account-store.h | 37 ++++++++ src/modest-ui-actions.c | 193 ++++++++++++++++------------------------ src/modest-utils.h | 16 +++- 4 files changed, 212 insertions(+), 121 deletions(-) diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 687cd21..ee65d62 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -53,7 +53,7 @@ #include #include #include - +#include "modest-utils.h" #include #include "modest-tny-account-store.h" #include "modest-tny-platform-factory.h" @@ -1053,7 +1053,7 @@ modest_tny_account_store_alert (TnyAccountStore *self, /* NOTE: account may be NULL in some cases */ g_return_val_if_fail (error, FALSE); - + /* Get the server name: */ if (account) { server_name = tny_account_get_hostname (account); @@ -1087,7 +1087,6 @@ modest_tny_account_store_alert (TnyAccountStore *self, g_return_val_if_reached (FALSE); } break; - case TNY_SERVICE_ERROR_AUTHENTICATE: /* It seems that there's no better error to show with * POP and IMAP because TNY_SERVICE_ERROR_AUTHENTICATE @@ -1099,15 +1098,17 @@ modest_tny_account_store_alert (TnyAccountStore *self, g_return_val_if_reached (FALSE); } break; - case TNY_SERVICE_ERROR_CERTIFICATE: /* We'll show the proper dialog later */ break; case TNY_SYSTEM_ERROR_MEMORY: /* Can't allocate memory for this operation */ - - case TNY_SERVICE_ERROR_UNKNOWN: + if (modest_tny_account_store_check_disk_full_error ((ModestTnyAccountStore*)self, + NULL, error, account, NULL)) + retval = FALSE; + break; + case TNY_SERVICE_ERROR_UNKNOWN: return FALSE; default: /* We don't treat this as an error, but as a not handled message. Then, @@ -2258,3 +2259,77 @@ modest_tny_account_store_start_send_queues (ModestTnyAccountStore *self) tny_list_foreach (tmp, (GFunc) init_send_queue, NULL); g_object_unref (tmp); } + + +gboolean +modest_tny_account_store_check_disk_full_error (ModestTnyAccountStore *self, + GtkWidget *parent_window, + GError *err, + TnyAccount *account, + const gchar *alternate) +{ + if (err == NULL) + return FALSE; + + if (modest_tny_account_store_is_disk_full_error (self, err, account)) { + gboolean is_mcc = modest_tny_account_is_memory_card_account (account); + if (is_mcc && alternate) { + modest_platform_information_banner (parent_window, NULL, alternate); + } else { + gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), ""); + modest_platform_information_banner (parent_window, NULL, msg); + g_free (msg); + } + } else if (err->code == TNY_SYSTEM_ERROR_MEMORY) + /* If the account was created in memory full + conditions then tinymail won't be able to + connect so it'll return this error code */ + modest_platform_information_banner (parent_window, + NULL, _("emev_ui_imap_inbox_select_error")); + else + return FALSE; + + return TRUE; +} + +gboolean +modest_tny_account_store_is_disk_full_error (ModestTnyAccountStore *self, + GError *error, + TnyAccount *account) +{ + gboolean enough_free_space = TRUE; + GnomeVFSURI *cache_dir_uri; + const gchar *cache_dir = NULL; + GnomeVFSFileSize free_space; + + /* Cache dir is different in case we're using an external storage (like MMC account) */ + if (account && modest_tny_account_is_memory_card_account (account)) + cache_dir = g_getenv (MODEST_MMC1_VOLUMEPATH_ENV); + + /* Get the default local cache dir */ + if (!cache_dir) + cache_dir = tny_account_store_get_cache_dir ((TnyAccountStore *) self); + + cache_dir_uri = gnome_vfs_uri_new (cache_dir); + if (cache_dir_uri) { + if (gnome_vfs_get_volume_free_space (cache_dir_uri, &free_space) == GNOME_VFS_OK) { + if (free_space < MODEST_TNY_ACCOUNT_STORE_MIN_FREE_SPACE) + enough_free_space = FALSE; + } + gnome_vfs_uri_unref (cache_dir_uri); + } + + if ((error->code == TNY_SYSTEM_ERROR_MEMORY || + /* When asking for a mail and no space left on device + tinymail returns this error */ + error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE || + /* When the folder summary could not be read or + written */ + error->code == TNY_IO_ERROR_WRITE || + error->code == TNY_IO_ERROR_READ) && + !enough_free_space) { + return TRUE; + } else { + return FALSE; + } +} diff --git a/src/modest-tny-account-store.h b/src/modest-tny-account-store.h index 30d3f0a..ab7076b 100644 --- a/src/modest-tny-account-store.h +++ b/src/modest-tny-account-store.h @@ -88,6 +88,9 @@ typedef enum { } ModestTnyAccountStoreQueryType; +/* We set 5Mb as the upper limit to consider disk full conditions */ +#define MODEST_TNY_ACCOUNT_STORE_MIN_FREE_SPACE 5 * 1024 * 1024 + /** * modest_tny_account_store_get_type: * @@ -283,6 +286,40 @@ guint modest_tny_account_store_get_num_remote_accounts (ModestTnyAccountStore *s **/ void modest_tny_account_store_start_send_queues (ModestTnyAccountStore *self); +/** + * modest_utils_check_disk_full_error: + * @parent_window: a #GtkWidget that will be used as the parent of information banners that will be shown + * @err: a #GError + * @alternate: a string that contains the error that will be shown if + * the memory full conditions happen in the MMC external storage + * + * Shows an information banner if the passed #GError is a disk full error. + * + * Returns: TRUE if it's a disk full error, false otherwise + **/ +gboolean modest_tny_account_store_check_disk_full_error (ModestTnyAccountStore *self, + GtkWidget *parent_window, + GError *err, + TnyAccount *account, + const gchar *alternate); + +/** + * modest_utils_is_disk_full_error: + * @error: a #GError + * @mail_op: the #ModestMailOperation that returned the error + * @is_mmc: returns if the disk full error happens in the external MMC or not + * + * This function returns if the given #GError is a disk full error or + * not, whithout showing anything to the user. The optional #is_mmc + * returns TRUE if the disk full conditions happen in the external MMC + * account + * + * Returns: TRUE if is a memory full error, FALSE otherwise. + **/ +gboolean modest_tny_account_store_is_disk_full_error (ModestTnyAccountStore *self, + GError *error, + TnyAccount *account); + G_END_DECLS #endif /* __MODEST_TNY_ACCOUNT_STORE_H__ */ diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 3672497..df873dd 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -88,7 +88,6 @@ #include -#define MIN_FREE_SPACE 5 * 1024 * 1024 #define MODEST_MOVE_TO_DIALOG_FOLDER_VIEW "move-to-dialog-folder-view" typedef struct _GetMsgAsyncHelper { @@ -851,8 +850,8 @@ modest_ui_actions_compose_msg(ModestWindow *win, parts_size = count_parts_size (attachments); expected_size = modest_tny_msg_estimate_size (body, NULL, parts_count, parts_size); - /* Double check: memory full condition or message too big */ - if (available_disk < MIN_FREE_SPACE || + /* Double check: disk full condition or message too big */ + if (available_disk < MODEST_TNY_ACCOUNT_STORE_MIN_FREE_SPACE || expected_size > available_disk) { gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), ""); modest_platform_system_banner (NULL, NULL, msg); @@ -1250,92 +1249,6 @@ cleanup: g_object_unref (parent_win); } -static gboolean -is_memory_full_error (GError *error, ModestMailOperation *mail_op, gboolean *is_mmc) -{ - gboolean enough_free_space = TRUE; - GnomeVFSURI *cache_dir_uri; - const gchar *cache_dir = NULL; - GnomeVFSFileSize free_space; - TnyAccountStore *acc_store; - - acc_store = TNY_ACCOUNT_STORE (modest_runtime_get_account_store ()); - - if (is_mmc) - *is_mmc = FALSE; - - /* Cache dir is different in case we're using an external storage (like MMC account) */ - if (mail_op) { - TnyAccount *account = modest_mail_operation_get_account (mail_op); - if (account) { - if (modest_tny_account_is_memory_card_account (account)) { - if (is_mmc) - *is_mmc = TRUE; - cache_dir = g_getenv (MODEST_MMC1_VOLUMEPATH_ENV); - } - g_object_unref (account); - } - } - - /* Get the default local cache dir */ - if (!cache_dir) - cache_dir = tny_account_store_get_cache_dir (acc_store); - - cache_dir_uri = gnome_vfs_uri_new (cache_dir); - if (cache_dir_uri) { - if (gnome_vfs_get_volume_free_space (cache_dir_uri, &free_space) == GNOME_VFS_OK) { - if (free_space < MIN_FREE_SPACE) - enough_free_space = FALSE; - } - gnome_vfs_uri_unref (cache_dir_uri); - } - - if ((error->code == TNY_SYSTEM_ERROR_MEMORY || - /* When asking for a mail and no space left on device - tinymail returns this error */ - error->code == TNY_SERVICE_ERROR_MESSAGE_NOT_AVAILABLE || - /* When the folder summary could not be read or - written */ - error->code == TNY_IO_ERROR_WRITE || - error->code == TNY_IO_ERROR_READ) && - !enough_free_space) { - return TRUE; - } else { - return FALSE; - } -} - -/* Shows an error if we're in memory full conditions. The #alternate - parametter contains the error that will be shown if the memory full - conditions happen in the mmc external storage */ -static gboolean -check_memory_full_error (GtkWidget *parent_window, GError *err, const gchar *alternate) -{ - gboolean is_mcc; - - if (err == NULL) - return FALSE; - - if (is_memory_full_error (err, NULL, &is_mcc)) { - if (is_mcc && alternate) { - modest_platform_information_banner (parent_window, NULL, alternate); - } else { - gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), ""); - modest_platform_information_banner (parent_window, NULL, msg); - g_free (msg); - } - } else if (err->code == TNY_SYSTEM_ERROR_MEMORY) - /* If the account was created in memory full - conditions then tinymail won't be able to - connect so it'll return this error code */ - modest_platform_information_banner (parent_window, - NULL, _("emev_ui_imap_inbox_select_error")); - else - return FALSE; - - return TRUE; -} - void modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op, gpointer user_data) @@ -1351,7 +1264,9 @@ modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op, /* If the mail op has been cancelled then it's not an error: don't show any message */ if (status != MODEST_MAIL_OPERATION_STATUS_CANCELED) { - if (is_memory_full_error ((GError *) error, mail_op, NULL)) { + TnyAccount *account = modest_mail_operation_get_account (mail_op); + if (modest_tny_account_store_is_disk_full_error (modest_runtime_get_account_store(), + (GError *) error, account)) { gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), ""); modest_platform_information_banner ((GtkWidget *) win, NULL, msg); g_free (msg); @@ -1366,6 +1281,8 @@ modest_ui_actions_disk_operations_error_handler (ModestMailOperation *mail_op, modest_platform_information_banner ((GtkWidget *) win, NULL, user_data); } + if (account) + g_object_unref (account); } if (win) @@ -1477,8 +1394,10 @@ open_msg_performer(gboolean canceled, /* Free the helper */ open_msg_helper_destroyer (helper); - /* In memory full conditions we could get this error here */ - check_memory_full_error ((GtkWidget *) parent_window, err, NULL); + /* In disk full conditions we could get this error here */ + modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) parent_window, err, + account, NULL); goto clean; } @@ -2309,8 +2228,10 @@ do_send_receive_performer (gboolean canceled, info = (SendReceiveInfo *) user_data; if (err || canceled) { - /* In memory full conditions we could get this error here */ - check_memory_full_error ((GtkWidget *) parent_window, err, NULL); + /* In disk full conditions we could get this error here */ + modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) parent_window, err, + account, NULL); if (info->mail_op) { modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), @@ -2976,8 +2897,8 @@ enough_space_for_message (ModestMsgEditWindow *edit_window, parts_count, parts_size); - /* Double check: memory full condition or message too big */ - if (available_disk < MIN_FREE_SPACE || + /* Double check: disk full condition or message too big */ + if (available_disk < MODEST_TNY_ACCOUNT_STORE_MIN_FREE_SPACE || expected_size > available_disk) { gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), ""); modest_platform_information_banner (NULL, NULL, msg); @@ -3440,7 +3361,8 @@ do_create_folder_cb (ModestMailOperation *mail_op, error = modest_mail_operation_get_error (mail_op); if (error) { - + gboolean disk_full; + TnyAccount *account; /* Show an error. If there was some problem writing to disk, show it, otherwise show the generic folder create error. We do it here and not in an error @@ -3448,14 +3370,24 @@ do_create_folder_cb (ModestMailOperation *mail_op, stop the main loop in a gtk_dialog_run and then, the message won't be shown until that dialog is closed */ - if (!check_memory_full_error ((GtkWidget *) source_win, (GError *) error, - _("mail_in_ui_folder_create_error_memory"))) { + account = modest_mail_operation_get_account (mail_op); + if (account) { + disk_full = + modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) source_win, + (GError *) error, + account, + _("mail_in_ui_folder_create_error_memory")); + g_object_unref (account); + } + if (!disk_full) { /* Show an error and try again if there is no full memory condition */ modest_platform_information_banner ((GtkWidget *) source_win, NULL, _("mail_in_ui_folder_create_error")); do_create_folder (source_win, parent_folder, (const gchar *) suggested_name); } + } else { /* the 'source_win' is either the ModestMainWindow, or the 'Move to folder'-dialog * FIXME: any other? */ @@ -3498,9 +3430,14 @@ do_create_folder_performer (gboolean canceled, ModestMailOperation *mail_op; if (canceled || err) { - /* In memory full conditions we could get this error here */ - check_memory_full_error ((GtkWidget *) parent_window, err, - _("mail_in_ui_folder_create_error_memory")); + TnyAccount *account = modest_mail_operation_get_account (mail_op); + /* In disk full conditions we could get this error here */ + modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) parent_window, err, + account, + _("mail_in_ui_folder_create_error_memory")); + if (account) + g_object_unref (account); /* This happens if we have selected the outbox folder as the parent */ @@ -3627,13 +3564,15 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op, const GError *error = NULL; gchar *message = NULL; gboolean mem_full; + TnyAccount *account = modest_mail_operation_get_account (mail_op); /* Get error message */ error = modest_mail_operation_get_error (mail_op); if (!error) g_return_if_reached (); - mem_full = is_memory_full_error ((GError *) error, mail_op, NULL); + mem_full = modest_tny_account_store_is_disk_full_error (modest_runtime_get_account_store(), + (GError *) error, account); if (mem_full) { message = g_strdup_printf (_KR("cerm_device_memory_full"), ""); } else if (error->domain == MODEST_MAIL_OPERATION_ERROR && @@ -3652,6 +3591,8 @@ modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op, will be destroyed so the banner won't appear */ modest_platform_information_banner (NULL, NULL, message); + if (account) + g_object_unref (account); if (mem_full) g_free (message); } @@ -3696,8 +3637,10 @@ on_rename_folder_performer (gboolean canceled, RenameFolderInfo *data = (RenameFolderInfo*)user_data; if (canceled || err) { - /* In memory full conditions we could get this error here */ - check_memory_full_error ((GtkWidget *) parent_window, err, NULL); + /* In disk full conditions we could get this error here */ + modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) parent_window, err, + account, NULL); } else { mail_op = @@ -3834,7 +3777,9 @@ on_delete_folder_cb (gboolean canceled, /* Note that the connection process can fail due to memory low conditions as it can not successfully store the summary */ - if (!check_memory_full_error ((GtkWidget*) parent_window, err, NULL)) + if (!modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget*) parent_window, err, + account, NULL)) g_debug ("Error connecting when trying to delete a folder"); g_object_unref (G_OBJECT (info->folder)); g_free (info); @@ -5422,6 +5367,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, { GObject *win = NULL; const GError *error; + TnyAccount *account; #ifndef MODEST_TOOLKIT_HILDON2 ModestWindow *main_window = NULL; @@ -5446,12 +5392,17 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op, #endif win = modest_mail_operation_get_source (mail_op); error = modest_mail_operation_get_error (mail_op); + account = modest_mail_operation_get_account (mail_op); - /* If it's not a memory full error then show a generic error */ - if (!check_memory_full_error ((GtkWidget *) win, (GError *) error, NULL)) + /* If it's not a disk full error then show a generic error */ + if (!modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) win, (GError *) error, + account, NULL)) modest_platform_run_information_dialog ((GtkWindow *) win, _("mail_in_ui_folder_move_target_error"), FALSE); + if (account) + g_object_unref (account); if (win) g_object_unref (win); } @@ -5684,11 +5635,14 @@ xfer_messages_error_handler (ModestMailOperation *mail_op, { GObject *win; const GError *error; + TnyAccount *account; win = modest_mail_operation_get_source (mail_op); error = modest_mail_operation_get_error (mail_op); + account = modest_mail_operation_get_account (mail_op); - if (error && is_memory_full_error ((GError *) error, mail_op, NULL)) { + if (error && modest_tny_account_store_is_disk_full_error (modest_runtime_get_account_store(), + (GError *) error, account)) { gchar *msg = g_strdup_printf (_KR("cerm_device_memory_full"), ""); modest_platform_information_banner ((GtkWidget *) win, NULL, msg); g_free (msg); @@ -5697,6 +5651,8 @@ xfer_messages_error_handler (ModestMailOperation *mail_op, _("mail_in_ui_folder_move_target_error"), FALSE); } + if (account) + g_object_unref (account); if (win) g_object_unref (win); } @@ -5727,7 +5683,9 @@ xfer_messages_performer (gboolean canceled, helper = (XferMsgsHelper *) user_data; if (canceled || err) { - if (!check_memory_full_error ((GtkWidget *) parent_window, err, NULL)) { + if (!modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) parent_window, err, + account, NULL)) { /* Show the proper error message */ modest_ui_actions_on_account_connection_error (parent_window, account); } @@ -5798,8 +5756,11 @@ typedef struct { } MoveFolderInfo; static void -on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, - TnyAccount *account, gpointer user_data) +on_move_folder_cb (gboolean canceled, + GError *err, + GtkWindow *parent_window, + TnyAccount *account, + gpointer user_data) { MoveFolderInfo *info = (MoveFolderInfo*)user_data; GtkTreeSelection *sel; @@ -5809,7 +5770,9 @@ on_move_folder_cb (gboolean canceled, GError *err, GtkWindow *parent_window, /* Note that the connection process can fail due to memory low conditions as it can not successfully store the summary */ - if (!check_memory_full_error ((GtkWidget*) parent_window, err, NULL)) + if (!modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget*) parent_window, err, + account, NULL)) g_debug ("Error connecting when trying to move a folder"); g_object_unref (G_OBJECT (info->src_folder)); @@ -6329,7 +6292,9 @@ retrieve_msg_contents_performer (gboolean canceled, TnyList *headers = TNY_LIST (user_data); if (err || canceled) { - check_memory_full_error ((GtkWidget *) parent_window, err, NULL); + modest_tny_account_store_check_disk_full_error (modest_runtime_get_account_store(), + (GtkWidget *) parent_window, err, + account, NULL); goto out; } diff --git a/src/modest-utils.h b/src/modest-utils.h index fe20265..393f869 100644 --- a/src/modest-utils.h +++ b/src/modest-utils.h @@ -235,8 +235,22 @@ GtkTreeModel *modest_utils_create_country_model (void); */ void modest_utils_fill_country_model (GtkTreeModel *model, gint *locale_mcc); +/** + * modest_utils_create_notification_list_from_header_list: + * @header_list: a #TnyList of #TnyHeader instances + * + * This function transforms a list of #TnyHeader objects into a list + * that will be used to issue new email notifications + * + * Returns: a #GList of #ModestMsgNotificationData + **/ GList *modest_utils_create_notification_list_from_header_list (TnyList *header_list); +/** + * modest_utils_free_notification_list: + * @notification_list: a #GList of #ModestMsgNotificationData + * + * Frees a list of #ModestMsgNotificationData structures + **/ void modest_utils_free_notification_list (GList *notification_list); - #endif /*__MODEST_MAEMO_UTILS_H__*/ -- 1.7.9.5