Changeset 805

Show
Ignore:
Timestamp:
08/28/06 16:55:06
Author:
pvanhoof
Message:

Fixed a ugly memory leak

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r803 r805  
    33        *  Added unit tests for TnyFolderStoreQuery 
    44        *  Added unit tests for TnyMsgIface 
    5          
     5        *  Fixed some ugly memory leaks (reference count problems) 
     6 
     7        * This was a major API change 
     8 
    692006-08-27  Philip Van Hoof <pvanhoof@gnome.org> 
    710 
  • trunk/docs/devel/reference/tmpl/tny-account-tree-model.sgml

    r670 r805  
    1313#GtkTreeView will display the account name as parent row with the 
    1414account-folders as the child rows. 
     15</para> 
     16<para> 
     17It's very important to unreference the instance you will get when doing something like this: 
     18<programlisting> 
     19TnyFolderface *folder; 
     20gtk_tree_model_get (model, &iter, 
     21  TNY_ACCOUNT_TREE_MODEL_INSTANCE_COLUMN, 
     22  &folder, -1); 
     23/* use folder */ 
     24g_object_unref (G_OBJECT(folder)); 
     25</programlisting> 
     26The column is indeed a G_TYPE_OBJECT column and getting it from the #GtkTreeModel will indeed add a reference. 
    1527</para> 
    1628 
  • trunk/docs/devel/reference/tmpl/tny-attach-list-model.sgml

    r708 r805  
    1313automatically. 
    1414</para> 
    15  
     15<para> 
     16It's very important to unreference the instance you will get when doing something like this: 
     17<programlisting> 
     18TnyMimePartIface *part; 
     19gtk_tree_model_get (model, &iter, 
     20  TNY_ATTACH_LIST_MODEL_INSTANCE_COLUMN, 
     21  &part, -1); 
     22/* use part */ 
     23g_object_unref (G_OBJECT(partr)); 
     24</programlisting> 
     25The column is indeed a G_TYPE_OBJECT column and getting it from the #GtkTreeModel will indeed add a reference. 
     26</para> 
    1627<!-- ##### SECTION See_Also ##### --> 
    1728<para> 
  • trunk/docs/devel/reference/tmpl/tny-header-list-model.sgml

    r717 r805  
    1111#GtkTreeView become invisible. This reduces memory usage. 
    1212</para> 
    13  
     13<para> 
     14It's very important to unreference the instance you will get when doing something like this: 
     15<programlisting> 
     16TnyHeaderIface *header; 
     17gtk_tree_model_get (model, &iter,  
     18  TNY_HEADER_LIST_MODEL_INSTANCE_COLUMN,  
     19  &header, -1); 
     20/* use header */ 
     21g_object_unref (G_OBJECT(header)); 
     22</programlisting> 
     23The column is indeed a G_TYPE_OBJECT column and getting it from the #GtkTreeModel will indeed add a reference. 
     24</para> 
    1425<!-- ##### SECTION See_Also ##### --> 
    1526<para> 
  • trunk/libtinymail-camel/tny-folder.c

    r804 r805  
    640640                /* Also check out tny-msg.c: tny_msg_finalize (read the stupid hack) */ 
    641641                _tny_header_set_camel_mime_message (TNY_HEADER (nheader), camel_message); 
    642                 /* _tny_header_set_camel_message_info (TNY_HEADER (header), info, TRUE); */ 
    643642             
    644643                tny_msg_iface_set_header (message, nheader); 
    645                 /* strange, g_object_unref (G_OBJECT (header)); should happen here */ 
     644                g_object_unref (G_OBJECT (nheader));   
    646645             
    647646        } else { 
     
    897896void  
    898897_tny_folder_check_uncache (TnyFolder *self, TnyFolderPriv *priv) 
    899 
    900         /* printf ("check %d\n", priv->headers_managed); */ 
    901      
     898{     
    902899        if (priv->headers_managed == 0) 
    903900                tny_folder_uncache (TNY_FOLDER_IFACE (self)); 
  • trunk/libtinymail-camel/tny-header.c

    r799 r805  
    470470{ 
    471471        TnyHeader *me = TNY_HEADER (self); 
     472        fpriv->headers_managed++; 
    472473        me->folder = (TnyFolderIface*)folder; 
    473        fpriv->headers_managed++; 
     474     
    474475        return; 
    475476} 
  • trunk/libtinymail-camel/tny-mime-part.h

    r713 r805  
    5050 
    5151 
    52 GType                 tny_mime_part_get_type (void); 
     52GType tny_mime_part_get_type (void); 
    5353 
    54 TnyMimePart*       tny_mime_part_new      (CamelMimePart *part); 
    55 void                  tny_mime_part_set_part (TnyMimePart *self, CamelMimePart *part); 
    56 CamelMimePart*       tny_mime_part_get_part (TnyMimePart *self); 
     54TnyMimePart* tny_mime_part_new (CamelMimePart *part); 
     55void tny_mime_part_set_part (TnyMimePart *self, CamelMimePart *part); 
     56CamelMimePart* tny_mime_part_get_part (TnyMimePart *self); 
    5757 
    5858G_END_DECLS 
  • trunk/libtinymailui-gtk/tny-attach-list-model-iterator.c

    r759 r805  
    176176        if (retval) 
    177177                g_object_ref (G_OBJECT(retval)); 
    178          
     178 
    179179        return (GObject*)retval; 
    180180} 
  • trunk/libtinymailui-gtk/tny-attach-list-model.c

    r723 r805  
    126126destroy_parts (gpointer item, gpointer user_data) 
    127127{ 
    128         g_object_unref (G_OBJECT (item)); 
     128        if (item && G_IS_OBJECT (item)) 
     129                g_object_unref (G_OBJECT (item)); 
     130        return; 
    129131} 
    130132 
     
    203205        /* Prepend something to the list */ 
    204206        g_object_ref (G_OBJECT (item)); 
     207     
    205208        me->first = g_list_prepend (me->first, item); 
     209     
    206210        tny_attach_list_model_add (me, TNY_MIME_PART_IFACE (item),  
    207211                gtk_list_store_prepend); 
     
    219223        /* Append something to the list */ 
    220224        g_object_ref (G_OBJECT (item)); 
     225     
    221226        me->first = g_list_append (me->first, item); 
    222227        tny_attach_list_model_add (me, TNY_MIME_PART_IFACE (item),  
     
    270275                        gtk_list_store_remove (GTK_LIST_STORE (me), &iter); 
    271276                        g_object_unref (G_OBJECT (item)); 
    272  
    273277                        break; 
    274278                } 
  • trunk/libtinymailui-gtk/tny-header-view.c

    r784 r805  
    6565 
    6666        if (G_LIKELY (priv->header)) 
    67                 g_object_unref (G_OBJECT (priv->header)); 
    68      
    69         if (header) 
     67                g_object_unref (G_OBJECT (priv->header)); 
     68        priv->header = NULL; 
     69 
     70        if (header && G_IS_OBJECT (header)) 
    7071        { 
    7172                gchar *str; 
    7273                g_object_ref (G_OBJECT (header));  
    73  
    7474                priv->header = header; 
    7575 
     
    8181                gtk_label_set_text (GTK_LABEL (priv->date_label), (const gchar*)str); 
    8282                g_free (str); 
    83         } else  
    84                 priv->header = NULL; 
    85      
    86         return; 
    87 
     83        } 
     84     
     85        return; 
     86
     87 
     88 
     89static void  
     90tny_header_view_clear (TnyHeaderViewIface *self) 
     91
     92        TnyHeaderViewPriv *priv = TNY_HEADER_VIEW_GET_PRIVATE (self); 
     93 
     94        if (G_LIKELY (priv->header)) 
     95                g_object_unref (G_OBJECT (priv->header)); 
     96        priv->header = NULL; 
     97     
     98        gtk_label_set_text (GTK_LABEL (priv->to_label), ""); 
     99        gtk_label_set_text (GTK_LABEL (priv->from_label), ""); 
     100        gtk_label_set_text (GTK_LABEL (priv->subject_label), ""); 
     101        gtk_label_set_text (GTK_LABEL (priv->date_label), ""); 
     102     
     103        return; 
     104
     105 
    88106 
    89107/** 
     
    185203        if (G_LIKELY (priv->header)) 
    186204                g_object_unref (G_OBJECT (priv->header)); 
    187  
     205        priv->header = NULL; 
     206     
    188207        (*parent_class->finalize) (object); 
    189208 
     
    197216 
    198217        klass->set_header_func = tny_header_view_set_header; 
    199  
     218        klass->clear_func = tny_header_view_clear; 
     219     
    200220        return; 
    201221} 
  • trunk/libtinymailui-gtk/tny-msg-view.c

    r783 r805  
    7777        TnyIteratorIface *iterator; 
    7878        gboolean first_attach = TRUE; 
    79         TnyAttachListModel *model = tny_attach_list_model_new ();; 
    80  
    81         g_return_if_fail (priv->msg); 
    82  
    83         buffer = gtk_text_view_get_buffer (priv->textview); 
     79        TnyAttachListModel *model; 
     80 
     81        g_return_if_fail (TNY_IS_MSG_IFACE (priv->msg)); 
     82 
     83        header = TNY_HEADER_IFACE (tny_msg_iface_get_header (priv->msg)); 
     84        g_return_if_fail (TNY_IS_HEADER_IFACE (header)); 
     85        tny_header_view_iface_set_header (priv->headerview, header); 
     86        g_object_unref (G_OBJECT (header)); 
     87 
     88        buffer = gtk_text_view_get_buffer (priv->textview); 
    8489        dest = TNY_STREAM_IFACE (tny_text_buffer_stream_new (buffer)); 
    85         header = TNY_HEADER_IFACE (tny_msg_iface_get_header (priv->msg)); 
    86  
    87         g_return_if_fail (header); 
    88  
     90     
     91        model = tny_attach_list_model_new (); 
    8992        tny_msg_iface_get_parts (priv->msg, TNY_LIST_IFACE (model)); 
    9093        iterator = tny_list_iface_create_iterator (TNY_LIST_IFACE (model)); 
     
    9396        gtk_text_buffer_set_text (buffer, "", 0); 
    9497 
    95         tny_header_view_iface_set_header (priv->headerview, header); 
    96         g_object_unref (G_OBJECT (header)); 
    9798     
    9899        gtk_widget_show (GTK_WIDGET (priv->headerview)); 
     
    127128        } 
    128129 
    129         g_object_unref (G_OBJECT (header)); 
    130130        g_object_unref (G_OBJECT (model)); 
    131131 
     
    227227 
    228228static void 
    229 tny_msg_view_set_unavailable (TnyMsgViewIface *self, TnyHeaderIface *header
     229tny_msg_view_set_unavailable (TnyMsgViewIface *self
    230230{ 
    231231        TnyMsgViewPriv *priv = TNY_MSG_VIEW_GET_PRIVATE (self); 
     
    242242        gtk_text_buffer_set_text (buffer, _("Message is unavailable"), -1); 
    243243 
    244         if (header) 
    245         { 
    246                 tny_header_view_iface_set_header (priv->headerview, header); 
    247                 gtk_widget_show (GTK_WIDGET (priv->headerview)); 
    248         } else { 
    249                 gtk_widget_hide (GTK_WIDGET (priv->headerview)); 
    250         } 
     244        tny_header_view_iface_clear (priv->headerview); 
     245        gtk_widget_hide (GTK_WIDGET (priv->headerview)); 
    251246 
    252247        return; 
  • trunk/libtinymailui-gtk/tny-msg-window.c

    r760 r805  
    4747 
    4848static void 
    49 tny_msg_window_set_unavailable (TnyMsgViewIface *self, TnyHeaderIface *header
    50 { 
    51         TnyMsgWindowPriv *priv = TNY_MSG_WINDOW_GET_PRIVATE (self); 
    52  
    53         tny_msg_view_iface_set_unavailable (priv->msg_view, header); 
     49tny_msg_window_set_unavailable (TnyMsgViewIface *self
     50{ 
     51        TnyMsgWindowPriv *priv = TNY_MSG_WINDOW_GET_PRIVATE (self); 
     52 
     53        tny_msg_view_iface_set_unavailable (priv->msg_view); 
    5454 
    5555        return; 
  • trunk/libtinymailui-mozembed/tny-moz-embed-msg-view.c

    r783 r805  
    9393        TnyIteratorIface *iterator; 
    9494        gboolean first_attach = TRUE; 
    95         TnyAttachListModel *model = tny_attach_list_model_new ();
     95        TnyAttachListModel *model
    9696        gboolean have_html = FALSE; 
    9797 
    98         g_return_if_fail (priv->msg); 
    99  
    100         buffer = gtk_text_view_get_buffer (priv->textview); 
     98        tny_header_view_iface_clear (TNY_HEADER_VIEW_IFACE (priv->headerview)); 
     99     
     100        g_return_if_fail (TNY_IS_MSG_IFACE (priv->msg)); 
     101 
     102        header = TNY_HEADER_IFACE (tny_msg_iface_get_header (priv->msg));     
     103        g_return_if_fail (TNY_IS_HEADER_IFACE (header)); 
     104        tny_header_view_iface_set_header (priv->headerview, header); 
     105        g_object_unref (G_OBJECT (header)); 
     106 
     107     
     108        buffer = gtk_text_view_get_buffer (priv->textview); 
    101109        dest = TNY_STREAM_IFACE (tny_text_buffer_stream_new (buffer)); 
    102         header = TNY_HEADER_IFACE (tny_msg_iface_get_header (priv->msg)); 
    103  
    104         g_return_if_fail (header); 
    105  
     110     
     111        model = tny_attach_list_model_new ();; 
    106112        tny_msg_iface_get_parts (priv->msg, TNY_LIST_IFACE (model)); 
    107113        iterator = tny_list_iface_create_iterator (TNY_LIST_IFACE (model)); 
     
    109115 
    110116        gtk_text_buffer_set_text (buffer, "", 0); 
    111  
    112         tny_header_view_iface_set_header (priv->headerview, header); 
    113         g_object_unref (G_OBJECT (header)); 
    114      
    115117        gtk_widget_show (GTK_WIDGET (priv->headerview)); 
    116118 
     
    169171        } 
    170172 
    171         g_object_unref (G_OBJECT (header)); 
    172173        g_object_unref (G_OBJECT (model)); 
    173174 
     
    183184        if (priv->save_strategy) 
    184185                g_object_unref (G_OBJECT (priv->save_strategy)); 
    185  
     186        priv->save_strategy = NULL; 
     187     
    186188        g_object_ref (G_OBJECT (strategy)); 
    187189        priv->save_strategy = strategy; 
     
    191193 
    192194static void 
    193 tny_mozembed_msg_view_set_unavailable (TnyMsgViewIface *self, TnyHeaderIface *header
     195tny_mozembed_msg_view_set_unavailable (TnyMsgViewIface *self
    194196{ 
    195197        TnyMozEmbedMsgViewPriv *priv = TNY_MOZ_EMBED_MSG_VIEW_GET_PRIVATE (self); 
     
    209211        gtk_text_buffer_set_text (buffer, _("Message is unavailable"), -1); 
    210212 
    211         if (header) 
    212         { 
    213                 tny_header_view_iface_set_header (priv->headerview, header); 
    214              
    215                 gtk_widget_show (GTK_WIDGET (priv->headerview)); 
    216         } else { 
    217                 gtk_widget_hide (GTK_WIDGET (priv->headerview)); 
    218         } 
     213        tny_header_view_iface_clear (priv->headerview); 
     214        gtk_widget_hide (GTK_WIDGET (priv->headerview)); 
    219215 
    220216 
     
    308304        if (G_LIKELY (priv->msg)) 
    309305                g_object_unref (G_OBJECT (priv->msg)); 
     306        priv->msg = NULL; 
    310307     
    311308        if (msg) 
     
    325322        gtk_widget_hide (priv->attachview_sw); 
    326323        gtk_text_buffer_set_text (buffer, "", 0); 
    327         tny_header_view_iface_set_header (priv->headerview, NULL); 
     324        tny_header_view_iface_clear (priv->headerview); 
    328325        gtk_widget_hide (GTK_WIDGET (priv->headerview)); 
    329326     
     
    357354 
    358355        priv->save_strategy = NULL; 
    359  
     356        priv->msg = NULL; 
     357     
    360358        gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (self), NULL); 
    361359        gtk_scrolled_window_set_vadjustment (GTK_SCROLLED_WINDOW (self), NULL); 
     
    433431        if (G_LIKELY (priv->msg)) 
    434432                g_object_unref (G_OBJECT (priv->msg)); 
    435  
     433        priv->msg = NULL; 
     434     
    436435        if (G_LIKELY (priv->save_strategy)) 
    437436                g_object_unref (G_OBJECT (priv->save_strategy)); 
    438  
    439         /*if (G_LIKELY (priv->headerview)) 
    440                 g_object_unref (G_OBJECT (priv->headerview));*/ 
    441  
     437        priv->save_strategy = NULL; 
     438     
     439        if (G_LIKELY (priv->headerview)) 
     440        { 
     441                tny_header_view_iface_clear (priv->headerview); 
     442                /* g_object_unref (G_OBJECT (priv->headerview)); */ 
     443        } 
     444     
    442445        (*parent_class->finalize) (object); 
    443446 
  • trunk/libtinymailui/tny-header-view-iface.c

    r715 r805  
    2222#include <tny-header-view-iface.h> 
    2323 
     24void 
     25tny_header_view_iface_clear (TnyHeaderViewIface *self) 
     26{ 
     27#ifdef DEBUG 
     28        if (!TNY_HEADER_VIEW_IFACE_GET_CLASS (self)->clear_func) 
     29                g_critical ("You must implement tny_header_view_iface_clear\n"); 
     30#endif 
     31 
     32        TNY_HEADER_VIEW_IFACE_GET_CLASS (self)->clear_func (self); 
     33        return;     
     34} 
    2435 
    2536 
  • trunk/libtinymailui/tny-header-view-iface.h

    r715 r805  
    4343        GTypeInterface parent; 
    4444 
    45         void (*set_header_func)           (TnyHeaderViewIface *self, TnyHeaderIface *header); 
     45        void (*set_header_func) (TnyHeaderViewIface *self, TnyHeaderIface *header); 
     46        void (*clear_func) (TnyHeaderViewIface *self);    
    4647}; 
    4748 
    48 GType tny_header_view_iface_get_type          (void); 
     49GType tny_header_view_iface_get_type (void); 
    4950 
    50 void  tny_header_view_iface_set_header    (TnyHeaderViewIface *self, TnyHeaderIface *header); 
     51void  tny_header_view_iface_set_header (TnyHeaderViewIface *self, TnyHeaderIface *header); 
     52void  tny_header_view_iface_clear (TnyHeaderViewIface *self); 
    5153 
    5254 
  • trunk/libtinymailui/tny-msg-view-iface.c

    r783 r805  
    4646 * tny_msg_view_iface_set_unavailable: 
    4747 * @self: A #TnyMsgViewIface instance 
    48  * @header: a #TnyHeaderIface instance or NULL 
    4948 * 
    5049 * Set the view to display the fact that the message was unavailable 
     
    5251 **/ 
    5352void 
    54 tny_msg_view_iface_set_unavailable (TnyMsgViewIface *self, TnyHeaderIface *header
     53tny_msg_view_iface_set_unavailable (TnyMsgViewIface *self
    5554{ 
    5655#ifdef DEBUG 
     
    5958#endif 
    6059 
    61         TNY_MSG_VIEW_IFACE_GET_CLASS (self)->set_unavailable_func (self, header); 
     60        TNY_MSG_VIEW_IFACE_GET_CLASS (self)->set_unavailable_func (self); 
    6261        return; 
    6362} 
  • trunk/libtinymailui/tny-msg-view-iface.h

    r783 r805  
    4646        void (*set_msg_func)           (TnyMsgViewIface *self, TnyMsgIface *msg); 
    4747        void (*set_save_strategy_func) (TnyMsgViewIface *self, TnySaveStrategyIface *strategy); 
    48         void (*set_unavailable_func)   (TnyMsgViewIface *self, TnyHeaderIface *header); 
     48        void (*set_unavailable_func)   (TnyMsgViewIface *self); 
    4949        void (*clear_func)             (TnyMsgViewIface *self); 
    5050     
     
    5555void  tny_msg_view_iface_set_msg           (TnyMsgViewIface *self, TnyMsgIface *msg); 
    5656void  tny_msg_view_iface_set_save_strategy (TnyMsgViewIface *self, TnySaveStrategyIface *strategy); 
    57 void  tny_msg_view_iface_set_unavailable   (TnyMsgViewIface *self, TnyHeaderIface *header); 
     57void  tny_msg_view_iface_set_unavailable   (TnyMsgViewIface *self); 
    5858void  tny_msg_view_iface_clear             (TnyMsgViewIface *self); 
    5959 
  • trunk/tinymail/tny-summary-view.c

    r794 r805  
    291291 
    292292                                gtk_widget_destroy (dialog); 
     293                                g_object_unref (G_OBJECT (header)); 
    293294                        } 
    294295                } 
     
    315316                        TNY_HEADER_LIST_MODEL_INSTANCE_COLUMN,  
    316317                        &header, -1); 
    317  
     318             
    318319                if (G_LIKELY (header)) 
    319320                { 
    320  
    321321                        TnyFolderIface *folder; 
    322322                        TnyMsgIface *msg; 
     
    329329                                { 
    330330                                        tny_msg_view_iface_set_msg (priv->msg_view, TNY_MSG_IFACE (msg)); 
    331                                         /* Reparent */ 
    332331                                        g_object_unref (G_OBJECT (msg)); 
    333332                                } else {  
    334                                         tny_msg_view_iface_set_unavailable (priv->msg_view, header); 
    335                                         /* Reparent */ 
    336                                         g_object_unref (G_OBJECT (header)); 
     333                                        tny_msg_view_iface_set_unavailable (priv->msg_view); 
    337334                                } 
    338335                                g_object_unref (G_OBJECT (folder)); 
    339336                        } 
    340                          
     337 
     338                        g_object_unref (G_OBJECT (header)); 
     339                     
    341340                } else { 
    342                         tny_msg_view_iface_set_unavailable (priv->msg_view, NULL); 
     341                        tny_msg_view_iface_set_unavailable (priv->msg_view); 
    343342                } 
    344343        } 
     
    466465                refresh_current_folder (folder, FALSE, user_data); 
    467466#endif 
     467             
     468                g_object_unref (G_OBJECT (folder)); 
    468469        } 
    469470 
     
    518519                                                tny_platform_factory_iface_new_msg_view (platfact))); 
    519520 
    520                                         tny_msg_view_iface_set_unavailable (TNY_MSG_VIEW_IFACE (msgwin), header); 
     521                                        tny_msg_view_iface_set_unavailable (TNY_MSG_VIEW_IFACE (msgwin)); 
    521522                         
    522523                                        gtk_widget_show (GTK_WIDGET (msgwin)); 
     
    524525                                g_object_unref (G_OBJECT (folder)); 
    525526                        } 
    526  
     527                        g_object_unref (G_OBJECT (header)); 
    527528                } 
    528529        }