* check for invalid folders in many places
authorDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Mon, 29 Oct 2007 14:06:11 +0000 (14:06 +0000)
committerDirk-Jan C. Binnema <dirk-jan.binnema@nokia.com>
Mon, 29 Oct 2007 14:06:11 +0000 (14:06 +0000)
* 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

13 files changed:
src/dbus_api/modest-dbus-callbacks.c
src/maemo/modest-main-window.c
src/maemo/modest-msg-edit-window.c
src/modest-email-clipboard.c
src/modest-mail-operation.c
src/modest-tny-folder.c
src/modest-tny-folder.h
src/modest-ui-actions.c
src/modest-ui-dimming-rules.c
src/modest-widget-memory.c
src/widgets/modest-details-dialog.c
src/widgets/modest-folder-view.c
src/widgets/modest-header-view.c

index 79eb8be..131c071 100644 (file)
@@ -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
index 73eed0f..6de49fc 100644 (file)
@@ -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;
index 96a883a..f1885ca 100644 (file)
@@ -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)
index e3b489a..5c898ca 100644 (file)
@@ -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)));
        
index 3a24c88..8d8ec23 100644 (file)
@@ -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 
index 12b5022..f9227e1 100644 (file)
@@ -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. 
index 0ae722c..6f2ec64 100644 (file)
@@ -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,
index ab84241..62c9403 100644 (file)
@@ -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";
                        }
index b123c57..50e38a1 100644 (file)
@@ -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];
index b480fd2..9e543db 100644 (file)
@@ -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,
index fcbf32a..3a8ec1c 100644 (file)
@@ -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"));
index 5a4bee4..b2e6695 100644 (file)
@@ -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, 
index 9f5a1f2..972a7dd 100644 (file)
@@ -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