* added extra checking to on_account_inserted, on_account_changed.
[modest] / src / widgets / modest-folder-view.c
index b547afb..f1aee88 100644 (file)
@@ -241,7 +241,9 @@ static void
 modest_folder_view_class_init (ModestFolderViewClass *klass)
 {
        GObjectClass *gobject_class;
+       GtkTreeViewClass *treeview_class;
        gobject_class = (GObjectClass*) klass;
+       treeview_class = (GtkTreeViewClass*) klass;
 
        parent_class            = g_type_class_peek_parent (klass);
        gobject_class->finalize = modest_folder_view_finalize;
@@ -275,6 +277,9 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
                              NULL, NULL,
                              g_cclosure_marshal_VOID__STRING,
                              G_TYPE_NONE, 1, G_TYPE_STRING);
+
+       treeview_class->select_cursor_parent = NULL;
+
 }
 
 /* Simplify checks for NULLs: */
@@ -377,13 +382,8 @@ text_cell_data  (GtkTreeViewColumn *column,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type,
                            TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &instance,
                            -1);
-       if (!fname)
-               return;
-
-       if (!instance) {
-               g_free (fname);
-               return;
-       }
+       if (!fname || !instance)
+               goto end;
 
        ModestFolderView *self = MODEST_FOLDER_VIEW (data);
        priv =  MODEST_FOLDER_VIEW_GET_PRIVATE (self);
@@ -482,9 +482,11 @@ text_cell_data  (GtkTreeViewColumn *column,
                modest_tny_account_get_mmc_account_name (TNY_STORE_ACCOUNT (instance), 
                                                         on_get_mmc_account_name, callback_data);
        }
-                       
-       g_object_unref (G_OBJECT (instance));
-       g_free (fname);
+ end:                  
+       if (instance)
+               g_object_unref (G_OBJECT (instance));
+       if (fname)
+               g_free (fname);
 }
 
 
@@ -1136,6 +1138,7 @@ modest_folder_view_finalize (GObject *obj)
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                         mail_op);
                        modest_mail_operation_sync_folder (mail_op, TNY_FOLDER (priv->cur_folder_store), FALSE);
+                       g_object_unref (mail_op);
                }
 
                g_object_unref (priv->cur_folder_store);
@@ -1212,6 +1215,7 @@ on_account_inserted (TnyAccountStore *account_store,
 
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
 
+
        /* If we're adding a new account, and there is no previous
           one, we need to select the visible server account */
        if (priv->style == MODEST_FOLDER_VIEW_STYLE_SHOW_ONE &&
@@ -1220,14 +1224,32 @@ on_account_inserted (TnyAccountStore *account_store,
                                              G_OBJECT (user_data),
                                              MODEST_CONF_FOLDER_VIEW_KEY);
 
+       if (!GTK_IS_TREE_VIEW(user_data)) {
+               g_warning ("BUG: %s: not a valid tree view", __FUNCTION__);
+               return;
+       }
+       
        /* Get the inner model */
+       /* check, is some rare cases, we did not get the right thing here,
+        * NB#84097 */
        filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
+       if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+               g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+               return;
+       }
+
+       /* check, is some rare cases, we did not get the right thing here,
+        * NB#84097 */
        sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+       if (!GTK_IS_TREE_MODEL_SORT(sort_model)) {
+               g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
+               return;
+       }
 
        /* Insert the account in the model */
        tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (account));
-
+       
        /* Refilter the model */
        gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model));
 }
@@ -1246,16 +1268,32 @@ on_account_changed (TnyAccountStore *account_store,
        if (TNY_IS_TRANSPORT_ACCOUNT (tny_account))
                return;
 
+       if (!MODEST_IS_FOLDER_VIEW(user_data)) {
+               g_warning ("BUG: %s: not a valid folder view", __FUNCTION__);
+               return;
+       }
+
+
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (user_data);
 
        /* Get the inner model */
        filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data));
+       if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+               g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+               return;
+       }
+
+
        sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+       if (!GTK_IS_TREE_MODEL_SORT(sort_model)) {
+               g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
+               return;
+       }
 
        /* Remove the account from the model */
        tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (tny_account));
-
+       
        /* Insert the account in the model */
        tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (tny_account));
@@ -1273,7 +1311,9 @@ on_idle_select_first_inbox_or_local (gpointer user_data)
 {
        ModestFolderView *self = MODEST_FOLDER_VIEW (user_data);
 
+       gdk_threads_enter ();
        modest_folder_view_select_first_inbox_or_local (self);
+       gdk_threads_leave ();
 
        return FALSE;
 }
@@ -1295,6 +1335,11 @@ on_account_removed (TnyAccountStore *account_store,
        if (TNY_IS_TRANSPORT_ACCOUNT (account))
                return;
 
+       if (!MODEST_IS_FOLDER_VIEW(user_data)) {
+               g_warning ("BUG: %s: not a valid folder view", __FUNCTION__);
+               return;
+       }
+
        self = MODEST_FOLDER_VIEW (user_data);
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
 
@@ -1335,7 +1380,17 @@ on_account_removed (TnyAccountStore *account_store,
 
        /* Remove the account from the model */
        filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+       if (!GTK_IS_TREE_MODEL_FILTER(filter_model)) {
+               g_warning ("BUG: %s: not a valid filter model", __FUNCTION__);
+               return;
+       }
+
        sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model));
+       if (!GTK_IS_TREE_MODEL_SORT(sort_model)) {
+               g_warning ("BUG: %s: not a valid sort model", __FUNCTION__);
+               return;
+       }
+       
        tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))),
                         G_OBJECT (account));
 
@@ -1577,7 +1632,7 @@ modest_folder_view_update_model (ModestFolderView *self,
        priv =  MODEST_FOLDER_VIEW_GET_PRIVATE(self);
        
        /* Notify that there is no folder selected */
-       g_signal_emit (G_OBJECT(self), 
+       g_signal_emit (G_OBJECT(self),
                       signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
                       NULL, FALSE);
        if (priv->cur_folder_store) {
@@ -1614,7 +1669,6 @@ modest_folder_view_update_model (ModestFolderView *self,
        g_signal_connect (G_OBJECT(filter_model), "row-inserted",
                          (GCallback) on_row_inserted_maybe_select_folder, self);
 
-
        g_object_unref (model);
        g_object_unref (filter_model);          
        g_object_unref (sortable);