Changeset 2926

Show
Ignore:
Timestamp:
11/08/07 15:32:09
Author:
pvanhoof
Message:

Correctly unregistering when finalizing

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.c

    r2925 r2926  
    5050        if (TNY_IS_FOLDER (folder)) { 
    5151                tny_folder_add_observer (folder, TNY_FOLDER_OBSERVER (self)); 
     52                self->fol_obs = g_list_prepend (self->fol_obs, folder); 
    5253                g_object_unref (self); 
    5354        } 
     
    5960        if (TNY_IS_FOLDER_STORE (store)) { 
    6061                tny_folder_store_add_observer (store, TNY_FOLDER_STORE_OBSERVER (self)); 
     62                self->store_obs = g_list_prepend (self->store_obs, store); 
    6163                g_object_unref (self); 
    6264        } 
     
    6466 
    6567static void  
    66 remove_folder_observer_weak (TnyGtkFolderStoreTreeModel *self, TnyFolder *folder
     68remove_folder_observer_weak (TnyGtkFolderStoreTreeModel *self, TnyFolder *folder, gboolean final
    6769{ 
    6870        if (TNY_IS_FOLDER (folder)) { 
    6971                g_object_ref (self); 
     72                if (!final) 
     73                        self->fol_obs = g_list_remove (self->fol_obs, folder); 
    7074                tny_folder_remove_observer (folder, TNY_FOLDER_OBSERVER (self)); 
    7175        } 
     
    7377 
    7478static void  
    75 remove_folder_store_observer_weak (TnyGtkFolderStoreTreeModel *self, TnyFolderStore *store
     79remove_folder_store_observer_weak (TnyGtkFolderStoreTreeModel *self, TnyFolderStore *store, gboolean final
    7680{ 
    7781        if (TNY_IS_FOLDER_STORE (store)) { 
    7882                g_object_ref (self); 
     83                if (!final) 
     84                        self->store_obs = g_list_remove (self->store_obs, store); 
    7985                tny_folder_store_remove_observer (store, TNY_FOLDER_STORE_OBSERVER (self)); 
    8086        } 
     
    487493{ 
    488494        TnyGtkFolderStoreTreeModel *me = (TnyGtkFolderStoreTreeModel*) object; 
     495        GList *copy = me->fol_obs; 
     496 
     497        while (copy) { 
     498                remove_folder_observer_weak (me, (TnyFolder *) copy->data, TRUE); 
     499                copy = g_list_next (copy); 
     500        } 
     501 
     502        copy = me->store_obs; 
     503        while (copy) { 
     504                remove_folder_store_observer_weak (me, (TnyFolderStore *) copy->data, TRUE); 
     505                copy = g_list_next (copy); 
     506        } 
     507 
     508        if (me->fol_obs) 
     509                g_list_free (me->fol_obs); 
     510        me->fol_obs = NULL; 
     511 
     512        if (me->store_obs) 
     513                g_list_free (me->store_obs); 
     514        me->store_obs = NULL; 
    489515 
    490516        g_mutex_lock (me->iterator_lock); 
     
    526552        static GType types[] = { G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_INT, G_TYPE_OBJECT }; 
    527553 
     554        me->fol_obs = NULL; 
     555        me->store_obs = NULL; 
    528556        me->iterator_lock = g_mutex_new (); 
    529557 
     
    830858                if (fol == folder) { 
    831859 
    832                         remove_folder_observer_weak (me, TNY_FOLDER (folder)); 
    833                         remove_folder_store_observer_weak (me, TNY_FOLDER_STORE (folder)); 
     860                        remove_folder_observer_weak (me, TNY_FOLDER (folder), FALSE); 
     861                        remove_folder_store_observer_weak (me, TNY_FOLDER_STORE (folder), FALSE); 
    834862 
    835863                        gtk_tree_store_remove (GTK_TREE_STORE (model), iter); 
  • trunk/libtinymailui-gtk/tny-gtk-folder-store-tree-model.h

    r2924 r2926  
    5858{ 
    5959        GtkTreeStore parent; 
    60         GList *first
     60        GList *first, *store_obs, *fol_obs
    6161        GMutex *iterator_lock; 
    6262        TnyFolderStoreQuery *query;