From 9373a406dc6ac62a374958051d1f72b7bff79642 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Mon, 29 Oct 2007 14:06:11 +0000 Subject: [PATCH] * check for invalid folders in many places * add TNY_FOLDER_TYPE_INVALID (todo: move this to tinymail) * add the check when moving messages to folders (this fixes a crasher) Fixes: NB#74469 pmo-trunk-r3597 --- src/dbus_api/modest-dbus-callbacks.c | 11 ++++------- src/maemo/modest-main-window.c | 3 +++ src/maemo/modest-msg-edit-window.c | 3 +++ src/modest-email-clipboard.c | 4 ++++ src/modest-mail-operation.c | 10 ++++++++-- src/modest-tny-folder.c | 19 ++++++++++++++----- src/modest-tny-folder.h | 3 +++ src/modest-ui-actions.c | 6 ++++++ src/modest-ui-dimming-rules.c | 4 +++- src/modest-widget-memory.c | 6 ++++++ src/widgets/modest-details-dialog.c | 7 +++++++ src/widgets/modest-folder-view.c | 32 ++++++++++++++++++++++++++++---- src/widgets/modest-header-view.c | 18 ++++++++++-------- 13 files changed, 99 insertions(+), 27 deletions(-) diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index 79eb8be..131c071 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -1186,20 +1186,17 @@ add_single_folder_to_list (TnyFolder *folder, GList** list) case TNY_FOLDER_TYPE_ARCHIVE: prefix = "MAND:"; break; + case TNY_FOLDER_TYPE_INVALID: + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + return; /* don't add it */ default: prefix = "USER:"; + } *list = g_list_append(*list, g_strdup_printf ("%s%s", prefix, id)); } - /* - else { - g_warning ("DEBUG: %s: folder has no name or ID.\n", __FUNCTION__); - } - - } - */ } static void diff --git a/src/maemo/modest-main-window.c b/src/maemo/modest-main-window.c index 73eed0f..6de49fc 100644 --- a/src/maemo/modest-main-window.c +++ b/src/maemo/modest-main-window.c @@ -2388,6 +2388,9 @@ modest_main_window_on_folder_selection_changed (ModestFolderView *folder_view, show_clipboard = show_delete = show_cancel_send = TRUE; show_reply = show_forward = FALSE; break; + case TNY_FOLDER_TYPE_INVALID: + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + break; default: show_reply = show_forward = show_clipboard = show_delete = TRUE; show_cancel_send = FALSE; diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index 96a883a..f1885ca 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -968,6 +968,9 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg, gboolean preserve_is_rich) if (msg_folder) { if (modest_tny_folder_is_local_folder (msg_folder)) { TnyFolderType type = modest_tny_folder_get_local_or_mmc_folder_type (msg_folder); + if (type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + if (type == TNY_FOLDER_TYPE_DRAFTS) priv->draft_msg = g_object_ref(msg); if (type == TNY_FOLDER_TYPE_OUTBOX) diff --git a/src/modest-email-clipboard.c b/src/modest-email-clipboard.c index e3b489a..5c898ca 100644 --- a/src/modest-email-clipboard.c +++ b/src/modest-email-clipboard.c @@ -281,6 +281,10 @@ modest_email_clipboard_check_source_folder (ModestEmailClipboard *self, id2 = tny_folder_get_id (TNY_FOLDER(folder)); folder_type1 = modest_tny_folder_guess_folder_type (priv->src); folder_type2 = modest_tny_folder_guess_folder_type (folder); + + if (folder_type1 == TNY_FOLDER_TYPE_INVALID || folder_type2 == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: folder of type TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + same_folder = ((folder_type1 == folder_type2) && (!g_ascii_strcasecmp (id1, id2))); diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 3a24c88..8d8ec23 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -750,8 +750,10 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self, modest_mail_operation_send_mail (self, info->transport_account, msg); /* Remove old mail from its source folder */ - draft_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_DRAFTS); - outbox_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_OUTBOX); + draft_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), + TNY_FOLDER_TYPE_DRAFTS); + outbox_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), + TNY_FOLDER_TYPE_OUTBOX); if (info->draft_msg != NULL) { TnyFolder *folder = NULL; TnyFolder *src_folder = NULL; @@ -759,6 +761,10 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self, folder = tny_msg_get_folder (info->draft_msg); if (folder == NULL) goto end; folder_type = modest_tny_folder_guess_folder_type (folder); + + if (folder_type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: folder of type TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + if (folder_type == TNY_FOLDER_TYPE_OUTBOX) src_folder = outbox_folder; else diff --git a/src/modest-tny-folder.c b/src/modest-tny-folder.c index 12b5022..f9227e1 100644 --- a/src/modest-tny-folder.c +++ b/src/modest-tny-folder.c @@ -44,7 +44,7 @@ static TnyFolderType modest_tny_folder_guess_folder_type_from_name (const gchar* full_name) { - g_return_val_if_fail (full_name, TNY_FOLDER_TYPE_UNKNOWN); + g_return_val_if_fail (full_name, TNY_FOLDER_TYPE_INVALID); if (strcmp (full_name, modest_local_folder_info_get_type_name(TNY_FOLDER_TYPE_OUTBOX)) == 0) return TNY_FOLDER_TYPE_OUTBOX; @@ -61,7 +61,7 @@ modest_tny_folder_guess_folder_type (const TnyFolder *folder) { TnyFolderType type; - g_return_val_if_fail (TNY_IS_FOLDER(folder), TNY_FOLDER_TYPE_UNKNOWN); + g_return_val_if_fail (TNY_IS_FOLDER(folder), TNY_FOLDER_TYPE_INVALID); if (modest_tny_folder_is_local_folder ((TnyFolder*)folder)) type = modest_tny_folder_get_local_or_mmc_folder_type ((TnyFolder*)folder); @@ -74,6 +74,9 @@ modest_tny_folder_guess_folder_type (const TnyFolder *folder) type = modest_tny_folder_guess_folder_type_from_name (folder_name); } + if (type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + return type; } @@ -86,11 +89,12 @@ modest_tny_folder_get_rules (TnyFolder *folder) TnyFolderType type; g_return_val_if_fail (TNY_IS_FOLDER(folder), -1); - + if (modest_tny_folder_is_local_folder (folder) || modest_tny_folder_is_memory_card_folder (folder)) { type = modest_tny_folder_get_local_or_mmc_folder_type (folder); + g_return_val_if_fail (type != TNY_FOLDER_TYPE_INVALID, -1); switch (type) { case TNY_FOLDER_TYPE_OUTBOX: @@ -139,6 +143,8 @@ modest_tny_folder_get_rules (TnyFolder *folder) /* Neither INBOX nor ROOT, nor ARCHIVE folders should me moveable */ folder_type = modest_tny_folder_guess_folder_type (folder); + g_return_val_if_fail (folder_type != TNY_FOLDER_TYPE_INVALID, -1); + if ((folder_type == TNY_FOLDER_TYPE_INBOX) || (folder_type == TNY_FOLDER_TYPE_ROOT) || (folder_type == TNY_FOLDER_TYPE_ARCHIVE)) { @@ -196,6 +202,8 @@ gboolean modest_tny_folder_is_memory_card_folder (TnyFolder *folder) { g_return_val_if_fail (folder, FALSE); + g_return_val_if_fail (modest_tny_folder_guess_folder_type (folder) != + TNY_FOLDER_TYPE_INVALID, FALSE); /* The merge folder is a special case, * used to merge the per-account local outbox folders. @@ -231,13 +239,14 @@ modest_tny_folder_is_remote_folder (TnyFolder *folder) return !is_local; } + TnyFolderType modest_tny_folder_get_local_or_mmc_folder_type (TnyFolder *folder) { - g_return_val_if_fail (folder, TNY_FOLDER_TYPE_UNKNOWN); + g_return_val_if_fail (folder, TNY_FOLDER_TYPE_INVALID); g_return_val_if_fail (modest_tny_folder_is_local_folder(folder)|| modest_tny_folder_is_memory_card_folder(folder), - TNY_FOLDER_TYPE_UNKNOWN); + TNY_FOLDER_TYPE_INVALID); /* The merge folder is a special case, * used to merge the per-account local outbox folders. diff --git a/src/modest-tny-folder.h b/src/modest-tny-folder.h index 0ae722c..6f2ec64 100644 --- a/src/modest-tny-folder.h +++ b/src/modest-tny-folder.h @@ -39,6 +39,9 @@ G_BEGIN_DECLS +/* TODO: move this to tinymail */ +#define TNY_FOLDER_TYPE_INVALID -1 + typedef enum { MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE = 1 << 1, MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE = 1 << 2, diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index ab84241..62c9403 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -888,8 +888,11 @@ open_msg_cb (ModestMailOperation *mail_op, TnyHeader *header, TnyMsg *msg, gpoi /* Gets folder type (OUTBOX headers will be opened in edit window */ if (modest_tny_folder_is_local_folder (folder)) { folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder); + if (folder_type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); } + if (folder_type == TNY_FOLDER_TYPE_OUTBOX) { TnyTransportAccount *traccount = NULL; ModestTnyAccountStore *accstore = modest_runtime_get_account_store(); @@ -4615,6 +4618,9 @@ modest_ui_actions_on_help (GtkAction *action, case TNY_FOLDER_TYPE_ARCHIVE: help_id = "applications_email_managefolders"; break; + case TNY_FOLDER_TYPE_INVALID: + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + break; default: help_id = "applications_email_managefolders"; } diff --git a/src/modest-ui-dimming-rules.c b/src/modest-ui-dimming-rules.c index b123c57..50e38a1 100644 --- a/src/modest-ui-dimming-rules.c +++ b/src/modest-ui-dimming-rules.c @@ -2173,7 +2173,9 @@ _folder_is_any_of_type (TnyFolder *folder, /* Get folder type */ folder_type = modest_tny_folder_guess_folder_type (folder); - + if (folder_type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + /* Check foler type */ for (i=0; i < ntypes; i++) { result = result || folder_type == types[i]; diff --git a/src/modest-widget-memory.c b/src/modest-widget-memory.c index b480fd2..9e543db 100644 --- a/src/modest-widget-memory.c +++ b/src/modest-widget-memory.c @@ -277,6 +277,9 @@ save_settings_header_view (ModestConf *conf, ModestHeaderView *header_view, } type = modest_tny_folder_guess_folder_type (folder); + if (type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + style = modest_header_view_get_style (header_view); key = _modest_widget_memory_get_keyname_with_double_type (name, type, style, @@ -365,6 +368,9 @@ restore_settings_header_view (ModestConf *conf, ModestHeaderView *header_view, return TRUE; /* no folder: no settings */ type = modest_tny_folder_guess_folder_type (folder); + if (type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + style = modest_header_view_get_style (header_view); key = _modest_widget_memory_get_keyname_with_double_type (name, type, style, diff --git a/src/widgets/modest-details-dialog.c b/src/widgets/modest-details-dialog.c index fcbf32a..3a8ec1c 100644 --- a/src/widgets/modest-details-dialog.c +++ b/src/widgets/modest-details-dialog.c @@ -202,6 +202,8 @@ modest_details_dialog_set_header_default (ModestDetailsDialog *self, folder_type = modest_tny_folder_guess_folder_type (folder); g_object_unref (folder); + g_return_if_fail (folder_type != TNY_FOLDER_TYPE_INVALID); + /* Get header data */ from = g_strdup (tny_header_get_from (header)); to = g_strdup (tny_header_get_to (header)); @@ -284,6 +286,11 @@ modest_details_dialog_set_folder_default (ModestDetailsDialog *self, { gchar *count_s, *size_s, *name = NULL; gint size, count; + + + g_return_if_fail (folder && TNY_IS_FOLDER (folder)); + g_return_if_fail (modest_tny_folder_get_local_or_mmc_folder_type (folder) + != TNY_FOLDER_TYPE_INVALID); /* Set window title */ gtk_window_set_title (GTK_WINDOW (self), _("mcen_ti_folder_properties")); diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index 5a4bee4..b2e6695 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -511,10 +511,14 @@ icon_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, the local OUTBOX folder */ if (type == TNY_FOLDER_TYPE_NORMAL || type == TNY_FOLDER_TYPE_UNKNOWN) { - type = modest_tny_folder_guess_folder_type (TNY_FOLDER (instance)); + type = modest_tny_folder_guess_folder_type (TNY_FOLDER (instance)); } switch (type) { + case TNY_FOLDER_TYPE_INVALID: + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + break; + case TNY_FOLDER_TYPE_ROOT: if (TNY_IS_ACCOUNT (instance)) { @@ -1179,6 +1183,9 @@ filter_row (GtkTreeModel *model, case TNY_FOLDER_TYPE_UNKNOWN: case TNY_FOLDER_TYPE_NORMAL: type = modest_tny_folder_guess_folder_type(TNY_FOLDER(instance)); + if (type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + if (type == TNY_FOLDER_TYPE_OUTBOX || type == TNY_FOLDER_TYPE_SENT || type == TNY_FOLDER_TYPE_DRAFTS) @@ -1471,12 +1478,14 @@ cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, GtkTreeIter *iter2, if ((parent_type == TNY_FOLDER_TYPE_ROOT) && TNY_IS_ACCOUNT (parent_folder) && modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (parent_folder))) { - cmp1 = get_cmp_subfolder_type_pos (modest_tny_folder_get_local_or_mmc_folder_type (TNY_FOLDER (folder1))); - cmp2 = get_cmp_subfolder_type_pos (modest_tny_folder_get_local_or_mmc_folder_type (TNY_FOLDER (folder2))); + cmp1 = get_cmp_subfolder_type_pos (modest_tny_folder_get_local_or_mmc_folder_type + (TNY_FOLDER (folder1))); + cmp2 = get_cmp_subfolder_type_pos (modest_tny_folder_get_local_or_mmc_folder_type + (TNY_FOLDER (folder2))); } g_object_unref (parent_folder); } - + /* if they are not local folders */ if (cmp1 == cmp2) { cmp1 = get_cmp_subfolder_type_pos (tny_folder_get_folder_type (TNY_FOLDER (folder1))); @@ -1604,6 +1613,7 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model, { TnyList *headers = NULL; TnyFolder *folder = NULL; + TnyFolderType folder_type; ModestMailOperation *mail_op = NULL; GtkTreeIter source_iter, dest_iter; ModestWindowMgr *mgr = NULL; @@ -1645,6 +1655,20 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model, TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder, -1); + if (!folder || TNY_IS_FOLDER_STORE(folder)) { + //g_warning ("%s: not a valid target folder", __FUNCTION__); + goto cleanup; + } + + folder_type = modest_tny_folder_guess_folder_type (folder); + if (folder_type == TNY_FOLDER_TYPE_INVALID) { + g_warning ("%s: invalid target folder", __FUNCTION__); + goto cleanup; /* cannot move messages there */ + } + + if (modest_tny_folder_get_rules((TNY_FOLDER(folder))) & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE) + goto cleanup; /* verboten! */ + /* Ask for confirmation to move */ main_win = modest_window_mgr_get_main_window (mgr); response = modest_ui_actions_msgs_move_to_confirmation (main_win, folder, diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 9f5a1f2..972a7dd 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -1014,6 +1014,9 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder) /* Restore sort column id */ if (cols) { type = modest_tny_folder_guess_folder_type (folder); + if (type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + sort_colid = modest_header_view_get_sort_column_id (self, type); sort_type = modest_header_view_get_sort_type (self, type); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(sortable), @@ -1058,16 +1061,15 @@ modest_header_view_sort_by_column_id (ModestHeaderView *self, /* Sort tree model */ type = modest_tny_folder_guess_folder_type (priv->folder); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(sortable), + if (type == TNY_FOLDER_TYPE_INVALID) + g_warning ("%s: BUG: TNY_FOLDER_TYPE_INVALID", __FUNCTION__); + else { + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(sortable), sort_colid, sort_type); - /* Store new sort parameters */ - modest_header_view_set_sort_params (self, sort_colid, sort_type, type); - - /* Save GConf parameters */ -/* modest_widget_memory_save (modest_runtime_get_conf(), */ -/* G_OBJECT(self), "header-view"); */ - + /* Store new sort parameters */ + modest_header_view_set_sort_params (self, sort_colid, sort_type, type); + } } void -- 1.7.9.5