Changeset 3646

Show
Ignore:
Timestamp:
05/06/08 18:36:22
Author:
jdapena
Message:

* libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.[ch]:

Now references to current_folder, old_folder and last_folder
are weak references. This way, when they're finalized we
properly remove the store reference to them.
Removed some small leaks and compilation warnings.
* libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store-priv.h:
Added. Includes internal declarations of weak reference handlers
for folders in the imap store.
* libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-command.c,
libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-folder.c:
Use weak references to folders in accesses to store.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r3645 r3646  
    1111        Protect PR_Reads and writes to avoid calls to PR_Close before one of 
    1212        them. Should avoid some crashes and bad memory accesses. 
     13 
     14        * libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.[ch]: 
     15        Now references to current_folder, old_folder and last_folder 
     16        are weak references. This way, when they're finalized we 
     17        properly remove the store reference to them. 
     18        Removed some small leaks and compilation warnings. 
     19 
     20        * libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store-priv.h: 
     21        Added. Includes internal declarations of weak reference handlers 
     22        for folders in the imap store. 
     23 
     24        * libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-command.c, 
     25        libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-folder.c: 
     26        Use weak references to folders in accesses to store. 
    1327 
    14282008-04-30  Philip Van Hoof <pvanhoof@gnome.org> 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/Makefile.am

    r3442 r3646  
    3434        camel-imap-search.h                     \ 
    3535        camel-imap-store.h                      \ 
     36        camel-imap-store-priv.h                 \ 
    3637        camel-imap-store-summary.h              \ 
    3738        camel-imap-summary.h                    \ 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-command.c

    r3483 r3646  
    4646#include "camel-imap-store-summary.h" 
    4747#include "camel-imap-store.h" 
     48#include "camel-imap-store-priv.h" 
    4849#include "camel-imap-utils.h" 
    4950#include "camel-imap-summary.h" 
     
    136137                        camel_object_unref(store->current_folder); */ 
    137138 
    138                 if (!folder) 
     139                if (!folder) { 
    139140                        store->last_folder = store->current_folder; 
    140                 else { 
     141                        if (store->last_folder) 
     142                                camel_object_hook_event (store->last_folder, "finalize", 
     143                                                         _camel_imap_store_last_folder_finalize, store); 
     144                } else { 
    141145                        modseq = camel_imap_folder_get_highestmodseq (CAMEL_IMAP_FOLDER (folder)); 
     146                        if (store->last_folder) 
     147                                camel_object_unhook_event (store->last_folder, "finalize", 
     148                                                           _camel_imap_store_last_folder_finalize, store); 
    142149                        store->last_folder = NULL; 
    143150                } 
    144  
     151                 
     152                if (store->current_folder) 
     153                        camel_object_unhook_event (store->current_folder, "finalize", 
     154                                                   _camel_imap_store_current_folder_finalize, store); 
    145155                store->current_folder = folder; 
    146  
     156                if (store->current_folder) 
     157                        camel_object_hook_event (store->current_folder, "finalize", 
     158                                                 _camel_imap_store_current_folder_finalize, store); 
     159                 
    147160                if (modseq && (store->capabilities & IMAP_CAPABILITY_QRESYNC)) 
    148161                { 
     
    286299                if (!store->current_folder) { 
    287300                        store->current_folder = store->last_folder; 
     301                        if (store->current_folder) 
     302                                camel_object_hook_event (store->current_folder, "finalize", 
     303                                                         _camel_imap_store_current_folder_finalize, store); 
    288304                        wasnull = TRUE; 
    289305                } 
    290306                camel_imap_store_stop_idle (store); 
    291                 if (wasnull) 
    292                         store->current_folder = NULL; 
     307                if (wasnull) { 
     308                        if (store->current_folder) { 
     309                                camel_object_unhook_event (store->current_folder, "finalize", 
     310                                                           _camel_imap_store_current_folder_finalize, store); 
     311                                store->current_folder = NULL; 
     312                        } 
     313                } 
    293314        } 
    294315 
     
    12841305                start = *p ? p + 1 : p; 
    12851306        } 
    1286  
     1307         
    12871308        g_ptr_array_free (args, TRUE); 
    1288  
     1309         
    12891310        return out; 
    12901311} 
     
    12951316        va_list ap; 
    12961317        char *result; 
    1297  
     1318         
    12981319        va_start (ap, fmt); 
    12991320        result = imap_command_strdup_vprintf (store, fmt, ap); 
    13001321        va_end (ap); 
    1301  
     1322         
    13021323        return result; 
    13031324} 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-folder.c

    r3586 r3646  
    9090#include "camel-imap-search.h" 
    9191#include "camel-imap-store.h" 
     92#include "camel-imap-store-priv.h" 
    9293#include "camel-imap-summary.h" 
    9394#include "camel-imap-utils.h" 
     
    799800        } 
    800801 
    801         if (store->current_folder == (CamelFolder*) object) 
     802        if (store->current_folder == (CamelFolder*) object) { 
     803                camel_object_unhook_event (store->current_folder, "finalize", 
     804                                           _camel_imap_store_current_folder_finalize, store); 
    802805                store->current_folder = NULL; 
     806        } 
    803807 
    804808        if (imap_folder->search) 
     
    38273831                        break; 
    38283832        } 
     3833        camel_exception_clear (&ex); 
    38293834        if (resp) 
    38303835                g_free (resp); 
  • trunk/libtinymail-camel/camel-lite/camel/providers/imap/camel-imap-store.c

    r3565 r3646  
    7171#include "camel-imap-store-summary.h" 
    7272#include "camel-imap-store.h" 
     73#include "camel-imap-store-priv.h" 
    7374#include "camel-imap-summary.h" 
    7475#include "camel-imap-utils.h" 
     
    322323                        camel_imap_response_free (imap_store, response2); 
    323324                } 
     325                camel_exception_clear (&nex); 
    324326                camel_imap_store_start_idle (imap_store); 
    325327        } 
     
    395397 
    396398        let_idle_die (imap_store, TRUE); 
     399 
     400        if (imap_store->current_folder) { 
     401                camel_object_unhook_event (imap_store->current_folder, "finalize", 
     402                                           _camel_imap_store_current_folder_finalize, imap_store); 
     403                imap_store->current_folder = NULL; 
     404        } 
     405 
     406        if (imap_store->old_folder) { 
     407                camel_object_unhook_event (imap_store->old_folder, "finalize", 
     408                                           _camel_imap_store_old_folder_finalize, imap_store); 
     409                imap_store->old_folder = NULL; 
     410        } 
    397411 
    398412        /* This frees current_folder, folders, authtypes, streams, and namespace. */ 
     
    902916        CamelStream *tcp_stream; 
    903917        CamelSockOptData sockopt; 
    904         gboolean force_imap4 = FALSE, ssl_ena = FALSE
     918        gboolean force_imap4 = FALSE
    905919        gboolean clean_quit = TRUE; 
    906920        char *buf; 
     
    21222136                camel_object_unref (store->current_folder); */ 
    21232137        store->old_folder = store->current_folder; 
     2138        if (store->old_folder) 
     2139                camel_object_hook_event (store->old_folder, "finalize", 
     2140                                         _camel_imap_store_old_folder_finalize, store); 
     2141        if (store->current_folder) 
     2142                camel_object_unhook_event (store->current_folder, "finalize", 
     2143                                           _camel_imap_store_current_folder_finalize, store); 
    21242144        store->current_folder = NULL; 
    21252145 
     
    26302650        if (imap_store->current_folder) { 
    26312651                /* camel_object_unref (imap_store->current_folder); */ 
     2652                camel_object_unhook_event (imap_store->current_folder, "finalize", 
     2653                                           _camel_imap_store_current_folder_finalize, imap_store); 
    26322654                imap_store->current_folder = NULL; 
    26332655        } 
     
    28072829 
    28082830                imap_store->current_folder = new_folder; 
     2831                camel_object_hook_event (imap_store, "finalize", 
     2832                                         _camel_imap_store_current_folder_finalize, imap_store); 
    28092833                /* camel_object_ref (new_folder); */ 
    28102834                camel_exception_init (&local_ex); 
     
    28142838                        camel_exception_xfer (ex, &local_ex); 
    28152839                        /* camel_object_unref (imap_store->current_folder); */ 
     2840                        camel_object_unhook_event (imap_store, "finalize", 
     2841                                                   _camel_imap_store_current_folder_finalize, imap_store); 
    28162842                        imap_store->current_folder = NULL; 
    28172843                        camel_object_unref (new_folder); 
     
    28822908 
    28832909        /* no need to actually create a CamelFolder for INBOX */ 
     2910        camel_object_unhook_event (imap_store->current_folder, "finalize", 
     2911                                   _camel_imap_store_current_folder_finalize, imap_store); 
    28842912        imap_store->current_folder = NULL; 
    28852913 
     
    30473075                g_mkdir (newpath, S_IRWXU); 
    30483076 
    3049                 while (file = g_dir_read_name (dir)) { 
     3077                while ((file = g_dir_read_name (dir)) != NULL) { 
    30503078                        gchar *old_fullname; 
    30513079                        gchar *new_fullname; 
     
    31063134                camel_object_unref (imap_store->current_folder); */ 
    31073135        /* no need to actually create a CamelFolder for INBOX */ 
     3136        camel_object_unhook_event (imap_store->current_folder, "finalize", 
     3137                                   _camel_imap_store_current_folder_finalize, imap_store); 
    31083138        imap_store->current_folder = NULL; 
    31093139 
     
    44554485        return nread; 
    44564486} 
     4487 
     4488void  
     4489_camel_imap_store_current_folder_finalize (CamelObject *stream, gpointer event_data, gpointer user_data) 
     4490{ 
     4491        CamelImapStore *store = (CamelImapStore *) user_data; 
     4492 
     4493        store->current_folder = NULL; 
     4494} 
     4495void  
     4496_camel_imap_store_old_folder_finalize (CamelObject *stream, gpointer event_data, gpointer user_data) 
     4497{ 
     4498        CamelImapStore *store = (CamelImapStore *) user_data; 
     4499 
     4500        store->old_folder = NULL; 
     4501} 
     4502 
     4503void  
     4504_camel_imap_store_last_folder_finalize (CamelObject *stream, gpointer event_data, gpointer user_data) 
     4505{ 
     4506        CamelImapStore *store = (CamelImapStore *) user_data; 
     4507 
     4508        store->last_folder = NULL; 
     4509}