Changeset 2

Show
Ignore:
Timestamp:
02/02/06 01:43:34
Author:
pvanhoof
Message:

Further camel stuff

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/libtinymail-camel/Makefile.am

    r1 r2  
    1515libtinymail_camel_1_0_la_SOURCES =              \ 
    1616        tny-msg-account-priv.h                  \ 
     17        tny-msg-priv.h                          \ 
     18        tny-msg-header-priv.h                   \ 
    1719        $(libtinymail_camel_1_0_headers)        \ 
    1820        tny-msg.c                               \ 
  • trunk/libtinymail-camel/tny-msg-folder.c

    r1 r2  
    4646struct _TnyMsgFolderPriv 
    4747{ 
     48        GList *cached_hdrs; 
     49        GHashTable *cached_msgs; 
     50 
    4851        CamelFolder *folder; 
    4952        gchar *folder_name; 
     
    119122} 
    120123 
     124static void 
     125add_message_with_uid (gpointer data, gpointer user_data) 
     126{ 
     127        CamelMessageInfo *msginfo = data; 
     128        TnyMsgFolderIface *self = user_data; 
     129        TnyMsgFolderPriv *priv = TNY_MSG_FOLDER_GET_PRIVATE (TNY_MSG_FOLDER (self)); 
     130        TnyMsgHeaderIface *header = TNY_MSG_HEADER_IFACE ( 
     131                tny_msg_header_new ()); 
     132 
     133         
     134        _tny_msg_header_set_camel_message_info (TNY_MSG_HEADER (header), msginfo); 
     135        tny_msg_header_iface_set_folder (header, self); 
     136 
     137        priv->cached_hdrs = g_list_append (priv->cached_hdrs, header); 
     138 
     139        return; 
     140} 
     141 
    121142static const GList* 
    122143tny_msg_folder_get_headers (TnyMsgFolderIface *self) 
    123144{ 
    124145        TnyMsgFolderPriv *priv = TNY_MSG_FOLDER_GET_PRIVATE (TNY_MSG_FOLDER (self)); 
    125  
    126146        load_folder (priv); 
    127147 
    128         /* TODO: Implement */ 
    129  
    130         return NULL; 
    131 
    132  
    133 static const GList* 
    134 tny_msg_folder_get_messages (TnyMsgFolderIface *self) 
    135 
    136         TnyMsgFolderPriv *priv = TNY_MSG_FOLDER_GET_PRIVATE (TNY_MSG_FOLDER (self)); 
     148        /* TODO: Cache this on disk, compare it. Don't just cache in memory */ 
     149 
     150        if (!priv->cached_hdrs) 
     151        { 
     152                GPtrArray *uids = camel_folder_get_summary (priv->folder); 
     153                g_ptr_array_foreach (uids, add_message_with_uid, self); 
     154                camel_folder_free_uids (priv->folder, uids); 
     155        } 
     156 
     157        return priv->cached_hdrs; 
     158
     159 
     160static void 
     161destroy_cached_key (gpointer data) 
     162
     163        /* data is a const */ 
     164        return; 
     165
     166 
     167 
     168static void 
     169destroy_cached_value (gpointer data) 
     170
     171        /* Data is a TnyMsgIface or a TnyMsgHeaderIface */ 
     172        g_object_unref (G_OBJECT (data)); 
     173        return; 
     174
     175 
     176 
     177static const TnyMsgIface* 
     178tny_msg_folder_get_message (TnyMsgFolderIface *self, TnyMsgHeaderIface *header) 
     179
     180        TnyMsgFolderPriv *priv = TNY_MSG_FOLDER_GET_PRIVATE (TNY_MSG_FOLDER (self)); 
     181        TnyMsgIface *message = NULL; 
     182        const gchar *id = tny_msg_header_iface_get_id (header); 
    137183 
    138184        load_folder (priv); 
    139185 
    140         /* TODO: Implement */ 
    141  
    142         return NULL; 
     186        if (!priv->cached_msgs) 
     187        { 
     188                priv->cached_msgs = g_hash_table_new_full  
     189                        (g_str_hash, g_str_equal, destroy_cached_key, 
     190                        destroy_cached_value); 
     191        } else { 
     192                message = g_hash_table_lookup (priv->cached_msgs, id); 
     193        } 
     194         
     195        if (!message) 
     196        { 
     197                CamelException ex; 
     198                CamelMimeMessage *camel_message = camel_folder_get_message   
     199                        (priv->folder, (const char *) id, &ex); 
     200 
     201                if (camel_exception_get_id (&ex) == CAMEL_EXCEPTION_NONE) 
     202                { 
     203                        message = TNY_MSG_IFACE (tny_msg_new ()); 
     204                        _tny_msg_set_camel_mime_message (TNY_MSG (message), camel_message); 
     205                        g_hash_table_insert (priv->cached_msgs, (gpointer)id, message); 
     206                } 
     207        } 
     208 
     209        return message; 
    143210} 
    144211 
     
    237304} 
    238305 
     306 
    239307static void 
    240308tny_msg_folder_finalize (GObject *object) 
     
    246314                camel_object_unref (priv->folder); 
    247315 
     316        if (priv->cached_msgs) 
     317                g_hash_table_destroy (priv->cached_msgs); 
     318 
     319        if (priv->cached_hdrs) 
     320                g_list_foreach (priv->cached_hdrs, (GFunc)g_object_unref, NULL); 
     321 
    248322        (*parent_class->finalize) (object); 
    249323 
     
    258332 
    259333        klass->get_headers_func = tny_msg_folder_get_headers; 
    260         klass->get_messages_func = tny_msg_folder_get_messages
     334        klass->get_message_func = tny_msg_folder_get_message
    261335 
    262336        klass->set_id_func = tny_msg_folder_set_id; 
     
    301375        priv->folder = NULL; 
    302376        priv->folders = NULL; 
     377        priv->cached_hdrs = NULL; 
     378        priv->cached_msgs = NULL; 
    303379 
    304380        return; 
  • trunk/libtinymail-camel/tny-msg-header.c

    r1 r2  
    2222#include <tny-msg-header-iface.h> 
    2323#include <tny-msg-header.h> 
     24#include <tny-msg-folder-iface.h> 
    2425 
    2526static GObjectClass *parent_class = NULL; 
    2627 
    27 typedef struct _TnyMsgHeaderPriv TnyMsgHeaderPriv; 
    28  
    29 struct _TnyMsgHeaderPriv 
    30 
    31         gchar *from; 
    32         gchar *to; 
    33         gchar *subject; 
    34         gint id; 
    35 }; 
     28#include "tny-msg-header-priv.h" 
    3629 
    3730#define TNY_MSG_HEADER_GET_PRIVATE(o)   \ 
    3831        (G_TYPE_INSTANCE_GET_PRIVATE ((o), TNY_MSG_HEADER_TYPE, TnyMsgHeaderPriv)) 
    3932 
     33 
     34void 
     35_tny_msg_header_set_camel_message_info (TnyMsgHeader *self, CamelMessageInfo *camel_message_info) 
     36{ 
     37        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (self); 
     38 
     39        if (priv->message_info) 
     40                camel_object_unref (priv->message_info); 
     41 
     42        camel_object_ref (camel_message_info); 
     43 
     44        priv->message_info = camel_message_info; 
     45 
     46        return; 
     47} 
     48 
     49const TnyMsgFolderIface*  
     50tny_msg_header_get_folder (TnyMsgHeaderIface *self) 
     51{ 
     52        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
     53         
     54        return priv->folder; 
     55} 
     56 
     57 
     58void 
     59tny_msg_header_set_folder (TnyMsgHeaderIface *self, const TnyMsgFolderIface *folder) 
     60{ 
     61        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
     62         
     63        if (priv->folder) 
     64                g_object_unref (G_OBJECT (priv->folder)); 
     65 
     66        g_object_ref (G_OBJECT (folder)); 
     67 
     68        priv->folder = (TnyMsgFolderIface*)folder; 
     69 
     70        return; 
     71} 
    4072         
    4173static const gchar* 
     
    4476        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    4577         
    46         return priv->from
     78        return camel_message_info_from (priv->message_info)
    4779} 
    4880 
     
    5284        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    5385 
    54         return priv->subject
     86        return camel_message_info_subject (priv->message_info)
    5587} 
    5688 
     
    6193        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    6294 
    63         return priv->to
    64 } 
    65  
    66 static const gint 
     95        return camel_message_info_to (priv->message_info)
     96} 
     97 
     98static const gchar* 
    6799tny_msg_header_get_id (TnyMsgHeaderIface *self) 
    68100{ 
    69101        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    70102 
    71         return priv->id; 
    72 
    73  
    74 static void 
    75 tny_msg_header_set_id (TnyMsgHeaderIface *self, gint id) 
    76 
    77         TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    78  
    79         priv->id = id; 
    80  
     103        return camel_message_info_uid (priv->message_info); 
     104
     105 
     106static void 
     107tny_msg_header_set_id (TnyMsgHeaderIface *self, const gchar *id) 
     108
    81109        return; 
    82110} 
     
    85113tny_msg_header_set_from (TnyMsgHeaderIface *self, const gchar *from) 
    86114{ 
    87         TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    88  
    89         if (priv->from) 
    90                 g_free (priv->from); 
    91  
    92         priv->from = g_strdup (from); 
    93  
    94115        return; 
    95116} 
     
    98119tny_msg_header_set_to (TnyMsgHeaderIface *self, const gchar *to) 
    99120{ 
    100         TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    101  
    102         if (priv->to) 
    103                 g_free (priv->to); 
    104  
    105         priv->to = g_strdup (to); 
    106  
    107121        return; 
    108122} 
     
    111125tny_msg_header_set_subject (TnyMsgHeaderIface *self, const gchar *subject) 
    112126{ 
    113         TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (TNY_MSG_HEADER (self)); 
    114  
    115         if (priv->subject) 
    116                 g_free (priv->subject); 
    117  
    118         priv->subject = g_strdup (subject); 
    119  
    120127        return; 
    121128} 
     
    127134        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (self); 
    128135 
    129         if (priv->from) 
    130                 g_free (priv->from); 
    131  
    132         if (priv->to) 
    133                 g_free (priv->to); 
    134  
    135         if (priv->subject) 
    136                 g_free (priv->subject); 
     136        if (priv->folder) 
     137                g_object_unref (G_OBJECT (priv->folder)); 
     138 
     139        if (priv->message_info) 
     140                camel_object_unref (priv->message_info); 
    137141 
    138142        (*parent_class->finalize) (object); 
     
    191195{ 
    192196        TnyMsgHeader *self = (TnyMsgHeader *)instance; 
    193         TnyMsgHeaderIface *iface = TNY_MSG_HEADER_IFACE (self); 
    194         /* TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (self); */ 
    195  
    196         /* TODO: Remove these default values */ 
    197  
    198         tny_msg_header_set_from (iface, "From"); 
    199         tny_msg_header_set_to (iface, "To"); 
    200         tny_msg_header_set_subject (iface, "Subject"); 
    201          
     197        TnyMsgHeaderPriv *priv = TNY_MSG_HEADER_GET_PRIVATE (self); 
     198 
     199        priv->folder = NULL; 
     200        priv->message_info = NULL; 
     201 
    202202        return; 
    203203} 
  • trunk/libtinymail-camel/tny-msg.c

    r1 r2  
    2828static GObjectClass *parent_class = NULL; 
    2929 
    30 typedef struct _TnyMsgPriv TnyMsgPriv; 
    31  
    32 struct _TnyMsgPriv 
    33 
    34         TnyMsgHeaderIface *header; 
    35         TnyMsgBodyIface *body; 
    36         GList *attachments; 
    37 }; 
     30#include "tny-msg-priv.h" 
    3831 
    3932#define TNY_MSG_GET_PRIVATE(o)  \ 
    4033        (G_TYPE_INSTANCE_GET_PRIVATE ((o), TNY_MSG_TYPE, TnyMsgPriv)) 
     34 
     35void 
     36_tny_msg_set_camel_mime_message (TnyMsg *self, CamelMimeMessage *message) 
     37{ 
     38        TnyMsgPriv *priv = TNY_MSG_GET_PRIVATE (self); 
     39 
     40        if (priv->message) 
     41                camel_object_unref (priv->message); 
     42 
     43        camel_object_ref (message); 
     44 
     45        priv->message = message; 
     46 
     47        return; 
     48} 
    4149 
    4250static const GList* 
     
    229237{ 
    230238        TnyMsg *self = (TnyMsg *)instance; 
     239        TnyMsgPriv *priv = TNY_MSG_GET_PRIVATE (self); 
     240 
     241        priv->message = NULL; 
     242        priv->body = NULL; 
     243        priv->attachments = NULL; 
     244        priv->header = NULL; 
    231245 
    232246        return; 
  • trunk/libtinymail/tny-msg-folder-iface.c

    r1 r2  
    1919 
    2020#include <tny-msg-folder-iface.h> 
     21#include <tny-msg-header-iface.h> 
    2122 
    2223 
     
    4950} 
    5051 
    51 const GList
    52 tny_msg_folder_iface_get_messages (TnyMsgFolderIface *self
     52const TnyMsgIface
     53tny_msg_folder_iface_get_message (TnyMsgFolderIface *self, TnyMsgHeaderIface *header
    5354{ 
    54         return TNY_MSG_FOLDER_IFACE_GET_CLASS (self)->get_messages_func (self); 
     55        return TNY_MSG_FOLDER_IFACE_GET_CLASS (self)->get_message_func (self, header); 
    5556} 
    5657 
  • trunk/libtinymail/tny-msg-folder-iface.h

    r1 r2  
    2323#include <glib.h> 
    2424 
     25#include <tny-msg-iface.h> 
    2526#include <tny-msg-header-iface.h> 
    26 #include <tny-msg-iface.h> 
    2727#include <tny-msg-account-iface.h> 
    2828 
     
    4646        void          (*add_folder_func)   (TnyMsgFolderIface *self, TnyMsgFolderIface *folder); 
    4747 
    48         const GList*  (*get_messages_func) (TnyMsgFolderIface *self); 
    49         const GList*  (*get_headers_func)  (TnyMsgFolderIface *self); 
     48        const TnyMsgIface*   
     49                       (*get_message_func)  (TnyMsgFolderIface *self, TnyMsgHeaderIface *header); 
     50        const GList*   (*get_headers_func)  (TnyMsgFolderIface *self); 
    5051 
    5152        const gchar*   (*get_name_func)    (TnyMsgFolderIface *self); 
     
    6263}; 
    6364 
    64 GType          tny_msg_folder_iface_get_type            (void); 
     65GType          tny_msg_folder_iface_get_type     (void); 
    6566 
    6667const GList*   tny_msg_folder_iface_get_folders  (TnyMsgFolderIface *self); 
    6768void           tny_msg_folder_iface_add_folder   (TnyMsgFolderIface *self, TnyMsgFolderIface *folder); 
    6869 
    69 const GList*   tny_msg_folder_iface_get_messages (TnyMsgFolderIface *self); 
     70const TnyMsgIface* 
     71               tny_msg_folder_iface_get_message  (TnyMsgFolderIface *self, TnyMsgHeaderIface *header); 
    7072const GList*   tny_msg_folder_iface_get_headers  (TnyMsgFolderIface *self); 
    7173 
  • trunk/libtinymail/tny-msg-header-iface.c

    r1 r2  
    1919 
    2020#include <tny-msg-header-iface.h> 
     21#include <tny-msg-folder-iface.h> 
    2122 
    2223const gchar* 
     
    4344{ 
    4445        return TNY_MSG_HEADER_IFACE_GET_CLASS (self)->get_to_func (self); 
     46} 
     47 
     48gconstpointer  
     49tny_msg_header_iface_get_folder (TnyMsgHeaderIface *self) 
     50{ 
     51        return TNY_MSG_HEADER_IFACE_GET_CLASS (self)->get_folder_func (self); 
     52} 
     53 
     54 
     55void 
     56tny_msg_header_iface_set_folder (TnyMsgHeaderIface *self, gconstpointer folder) 
     57{ 
     58        TNY_MSG_HEADER_IFACE_GET_CLASS (self)->set_folder_func (self, folder); 
     59        return; 
    4560} 
    4661 
  • trunk/libtinymail/tny-msg-header-iface.h

    r1 r2  
    4646        const gchar*   (*get_id_func)             (TnyMsgHeaderIface *self); 
    4747 
     48          
     49        gconstpointer       (*get_folder_func)         (TnyMsgHeaderIface *self); 
     50        void           (*set_folder_func)         (TnyMsgHeaderIface *self, gconstpointer folder); 
    4851 
    4952        void           (*set_subject_func)        (TnyMsgHeaderIface *self, const gchar *subject); 
     
    6871void           tny_msg_header_iface_set_subject   (TnyMsgHeaderIface *self, const gchar *subject); 
    6972 
     73 
     74gconstpointer  tny_msg_header_iface_get_folder    (TnyMsgHeaderIface *self); 
     75void           tny_msg_header_iface_set_folder    (TnyMsgHeaderIface *self, gconstpointer folder); 
     76 
    7077void           tny_msg_header_iface_uncache       (TnyMsgHeaderIface *self); 
    7178const gboolean tny_msg_header_iface_has_cache     (TnyMsgHeaderIface *self); 
  • trunk/libtinymail/tny-msg-header-proxy.c

    r1 r2  
    2121#include <tny-msg-header.h> 
    2222#include <tny-msg-header-iface.h> 
     23#include <tny-msg-folder-iface.h> 
    2324 
    2425static GObjectClass *parent_class = NULL; 
     
    3031 
    3132        return tny_msg_header_new (); 
     33} 
     34 
     35const TnyMsgFolderIface*  
     36tny_msg_header_proxy_get_folder (TnyMsgHeaderIface *self) 
     37{ 
     38        TnyMsgHeader *real = TNY_MSG_HEADER_PROXY (self)->real; 
     39 
     40        if (real == NULL) 
     41        { 
     42                real = tny_msg_header_proxy_get_real (TNY_MSG_HEADER_PROXY (self)); 
     43                TNY_MSG_HEADER_PROXY (self)->real = real; 
     44        } 
     45 
     46        return tny_msg_header_iface_get_folder (TNY_MSG_HEADER_IFACE(real)); 
     47} 
     48 
     49 
     50void 
     51tny_msg_header_proxy_set_folder (TnyMsgHeaderIface *self, const TnyMsgFolderIface *folder) 
     52{ 
     53        TnyMsgHeader *real = TNY_MSG_HEADER_PROXY (self)->real; 
     54 
     55        if (real == NULL) 
     56        { 
     57                real = tny_msg_header_proxy_get_real (TNY_MSG_HEADER_PROXY (self)); 
     58                TNY_MSG_HEADER_PROXY (self)->real = real; 
     59        } 
     60 
     61        tny_msg_header_iface_set_folder (TNY_MSG_HEADER_IFACE (real), folder); 
     62 
     63        return; 
    3264} 
    3365 
  • trunk/tinymail/tny-main.c

    r1 r2  
    3131                gpointer user_data) 
    3232{ 
    33 /* 
     33 
    3434        GtkTreeView *header_view = GTK_TREE_VIEW (user_data); 
    3535        GtkTreeIter iter; 
     
    6060 
    6161        } 
    62 */ 
     62 
    6363} 
    6464