From 3cdb1f15ed7489b2c3b954f55bb5a251f3cf8181 Mon Sep 17 00:00:00 2001 From: djcb Date: Sun, 22 Aug 2010 19:31:21 +0300 Subject: [PATCH] * next step in attachment handling infra; still WIP --- src/mu-cmd-extract.c | 16 +++++- src/mu-msg-gmime.c | 105 +++++++++++++++++++++------------- src/mu-msg-gmime.h | 33 ++++++++++- src/mu-msg-part-info.c | 24 ++++---- src/mu-msg-part-info.h | 27 +++++---- src/tests/test-mu-msg-gmime.c | 8 +-- 6 files changed, 136 insertions(+), 77 deletions(-) diff --git a/src/mu-cmd-extract.c b/src/mu-cmd-extract.c index 0db0639c..06d87063 100644 --- a/src/mu-cmd-extract.c +++ b/src/mu-cmd-extract.c @@ -24,6 +24,18 @@ #include "mu-cmd.h" +static void +each_part (MuMsgPartInfo* part, gpointer user_data) +{ + g_print ("%u %s %s/%s [%s]\n", + part->index, + part->file_name ? part->file_name : "", + part->type ? part->type : "", + part->subtype ? part->subtype : "", + part->disposition ? part->disposition : ""); +} + + static gboolean show_parts (const char* path) { @@ -33,7 +45,9 @@ show_parts (const char* path) if (!msg) return FALSE; - mu_msg_gmime_mime_part_foreach (msg, NULL, NULL); + mu_msg_gmime_msg_part_infos_foreach (msg, each_part, NULL); + + mu_msg_gmime_destroy (msg); return TRUE; diff --git a/src/mu-msg-gmime.c b/src/mu-msg-gmime.c index a3b42c44..a34140e0 100644 --- a/src/mu-msg-gmime.c +++ b/src/mu-msg-gmime.c @@ -772,46 +772,6 @@ mu_msg_gmime_get_summary (MuMsgGMime *msg, size_t max_lines) -struct _PartData { - MuMsgMimePartForeachFunc _func; - gpointer _user_data; -}; -typedef struct _PartData PartData; - - -static void -part_foreach_cb (GMimeObject *parent, GMimeObject *part, PartData *data) -{ - GMimeContentType *ct; - - ct = g_mime_object_get_content_type (part); - - if (!GMIME_IS_CONTENT_TYPE(ct)) { - g_warning ("not a content type!"); - return; - } - - g_print ("%s\n", g_mime_content_type_to_string (ct)); -} - - - -void -mu_msg_gmime_mime_part_foreach (MuMsgGMime* msg, MuMsgMimePartForeachFunc func, - gpointer user_data) -{ - PartData pdata; - - g_return_if_fail (msg); - g_return_if_fail (GMIME_IS_OBJECT(msg->_mime_msg)); - - pdata._func = func; - pdata._user_data = user_data; - - g_mime_message_foreach (msg->_mime_msg, - (GMimeObjectForeachFunc)part_foreach_cb, - &pdata); -} gboolean @@ -986,7 +946,7 @@ each_contact (MuMsgContact *contact, GSList **lst) GSList * -mu_msg_gmime_contacts_list (MuMsgGMime *msg) +mu_msg_gmime_get_contacts (MuMsgGMime *msg) { GSList *contacts; @@ -1023,3 +983,66 @@ mu_msg_gmime_uninit (void) g_debug ("%s", __FUNCTION__); } } + + +struct _PartData { + unsigned _idx; + MuMsgPartInfoForeachFunc _func; + gpointer _user_data; +}; +typedef struct _PartData PartData; + + +static void +part_foreach_cb (GMimeObject *parent, GMimeObject *part, PartData *pdata) +{ + GMimeContentType *ct; + GMimeContentDisposition *cd; + MuMsgPartInfo pi; + + ct = g_mime_object_get_content_type (part); + + /* ignore non-MIME */ + if (!GMIME_IS_CONTENT_TYPE(ct)) { + g_debug ("not a content type!"); + return; + } + + memset (&pi, 0, sizeof pi); + pi.index = pdata->_idx++; + pi.content_id = (char*)g_mime_object_get_content_id (part); + pi.type = (char*)g_mime_content_type_get_media_type (ct); + pi.subtype = (char*)g_mime_content_type_get_media_subtype (ct); + pi.disposition = (char*)g_mime_object_get_disposition (part); + + cd = g_mime_object_get_content_disposition (part); + if (GMIME_IS_CONTENT_DISPOSITION(cd)) + pi.file_name = (char*)g_mime_content_disposition_get_parameter + (cd , "filename"); + + pdata->_func(&pi, pdata->_user_data); +} + + + +void +mu_msg_gmime_msg_part_infos_foreach (MuMsgGMime *msg, + MuMsgPartInfoForeachFunc func, + gpointer user_data) +{ + PartData pdata; + + g_return_if_fail (msg); + g_return_if_fail (GMIME_IS_OBJECT(msg->_mime_msg)); + + pdata._idx = 0; + pdata._func = func; + pdata._user_data = user_data; + + g_mime_message_foreach (msg->_mime_msg, + (GMimeObjectForeachFunc)part_foreach_cb, + &pdata); +} + + + diff --git a/src/mu-msg-gmime.h b/src/mu-msg-gmime.h index 36274c9b..3668c544 100644 --- a/src/mu-msg-gmime.h +++ b/src/mu-msg-gmime.h @@ -22,6 +22,7 @@ #include "mu-msg.h" #include "mu-msg-contact.h" +#include "mu-msg-part-info.h" G_BEGIN_DECLS @@ -323,10 +324,10 @@ time_t mu_msg_gmime_get_timestamp (MuMsgGMime *msg); * * @param msg a valid MuMsgGMime* instance * - * @return a list of contacts for this message; use mu_msg_contact_list_free - * to free it when done + * @return a list of contacts for this message; use + * mu_msg_contacts_free to free it when done */ -GSList * mu_msg_gmime_contacts_list (MuMsgGMime *msg); +GSList * mu_msg_gmime_get_contacts (MuMsgGMime *msg); /** @@ -341,6 +342,32 @@ GSList * mu_msg_gmime_contacts_list (MuMsgGMime *msg); void mu_msg_gmime_contacts_foreach (MuMsgGMime *msg, MuMsgContactForeachFunc func, gpointer user_data); + +/* /\** */ +/* * get a list of message part info objects (MuMsgPartInfo) for this */ +/* * message; you can use GSList functions or */ +/* * mu_msg_part_info_list_foreach to read the items. */ +/* * */ +/* * @param msg a valid MuMsgGMime* instance */ +/* * */ +/* * @return a list of contacts for this message; use */ +/* * mu_msg_part_infos_free to free it when done */ +/* *\/ */ +/* GSList *mu_msg_gmime_get_part_infos (MuMsgGMime *msg); */ + + +/** + * call a function for each of the contacts in a message + * + * @param msg a valid MuMsgGMime* instance + * @param func a callback function to call for each contact; when + * the callback does not return TRUE, it won't be called again + * @param user_data a user-provide pointer that will be passed to the callback + * + */ +void mu_msg_gmime_msg_part_infos_foreach (MuMsgGMime *msg, + MuMsgPartInfoForeachFunc func, + gpointer user_data); G_END_DECLS #endif /*__MU_MSG_GIME_H__*/ diff --git a/src/mu-msg-part-info.c b/src/mu-msg-part-info.c index 488d5e4e..da19a3c4 100644 --- a/src/mu-msg-part-info.c +++ b/src/mu-msg-part-info.c @@ -21,10 +21,8 @@ #include "config.h" #endif /*HAVE_CONFIG_H*/ -#include #include "mu-msg-part-info.h" - MuMsgPartInfo* mu_msg_part_info_new (void) { @@ -33,16 +31,16 @@ mu_msg_part_info_new (void) void -mu_msg_part_info_destroy (MuMsgPartInfo *pi, gboolean destroy_members) +mu_msg_part_info_destroy (MuMsgPartInfo *pi) { if (!pi) return; - if (destroy_members) { + if (pi->own_members) { g_free (pi->content_id); g_free (pi->type); g_free (pi->subtype); - g_free (pi->content_type); + /* g_free (pi->content_type); */ g_free (pi->file_name); g_free (pi->disposition); } @@ -53,20 +51,18 @@ mu_msg_part_info_destroy (MuMsgPartInfo *pi, gboolean destroy_members) void -mu_msg_part_info_list_foreach (GSList *lst, - MuMsgPartInfoForeachFunc func, - gpointer user_data) +mu_msg_part_infos_foreach (GSList *lst, + MuMsgPartInfoForeachFunc func, + gpointer user_data) { - while (lst && func((MuMsgPartInfo*)lst->data, user_data)) - lst = g_slist_next(lst); + for (; lst ; lst = g_slist_next (lst)) + func((MuMsgPartInfo*)lst->data, user_data); } - -void /* FIXME: destroy_members */ -mu_msg_part_info_list_free (GSList *lst, gboolean destroy_members) +void +mu_msg_part_infos_free (GSList *lst) { - g_slist_foreach (lst, (GFunc)mu_msg_part_info_destroy, NULL); g_slist_free (lst); } diff --git a/src/mu-msg-part-info.h b/src/mu-msg-part-info.h index 7931bd72..b0239e29 100644 --- a/src/mu-msg-part-info.h +++ b/src/mu-msg-part-info.h @@ -25,7 +25,7 @@ struct _MuMsgPartInfo { /* index of this message */ - guint index; + unsigned index; /* cid */ char *content_id; @@ -34,7 +34,7 @@ struct _MuMsgPartInfo { char *type; char *subtype; /* full content-type, e.g. image/jpeg */ - char *content_type; + /* char *content_type; */ /* the file name (if any) */ char *file_name; @@ -46,6 +46,10 @@ struct _MuMsgPartInfo { /* size of the part; or 0 if unknown */ size_t *size; + + /* if TRUE, mu_msg_part_info_destroy will free the member vars + * as well*/ + gboolean own_members; }; typedef struct _MuMsgPartInfo MuMsgPartInfo; @@ -64,12 +68,8 @@ MuMsgPartInfo *mu_msg_part_info_new (void); * destroy a MuMsgPartInfo object * * @param ct a MuMsgPartInfo object, or NULL - * @param destroy_members TRUE if members should be destroyed as well, - * FALSE otherwise */ -void mu_msg_part_info_destroy (MuMsgPartInfo *pinfo, - gboolean destroy_members); - +void mu_msg_part_info_destroy (MuMsgPartInfo *pinfo); /** * macro to get the file name for this mime-part @@ -96,10 +96,9 @@ void mu_msg_part_info_destroy (MuMsgPartInfo *pinfo, * @param a msg part info object * @param user_data a user provided data pointer * - * @return TRUE if we should continue the foreach, FALSE otherwise */ -typedef gboolean (*MuMsgPartInfoForeachFunc) (MuMsgPartInfo* part, - gpointer user_data); +typedef void (*MuMsgPartInfoForeachFunc) (MuMsgPartInfo* part, + gpointer user_data); /** * call a function for each MuMsgPartInfo (MIME-part) in the list @@ -108,15 +107,15 @@ typedef gboolean (*MuMsgPartInfoForeachFunc) (MuMsgPartInfo* part, * @param func a callback function * @param user_data user pointer, passed to the callback */ -void mu_msg_part_info_list_foreach (GSList *lst, - MuMsgPartInfoForeachFunc func, - gpointer user_data); +void mu_msg_part_infos_foreach (GSList *lst, + MuMsgPartInfoForeachFunc func, + gpointer user_data); /** * free a list of MuMsgPartInfo objects * * @param lst list of MuMsgPartInfo object */ -void mu_msg_part_info_list_free (GSList *lst, gboolean destroy_members); +void mu_msg_part_infos_free (GSList *lst); #endif /*__MU_MSG_PART_INFO_H__*/ diff --git a/src/tests/test-mu-msg-gmime.c b/src/tests/test-mu-msg-gmime.c index 9ac69792..d1f99e84 100644 --- a/src/tests/test-mu-msg-gmime.c +++ b/src/tests/test-mu-msg-gmime.c @@ -91,7 +91,7 @@ test_mu_msg_gmime_01 (void) ==, 1217530645); { GSList *lst, *cur; - lst = mu_msg_gmime_contacts_list (msg); + lst = mu_msg_gmime_get_contacts (msg); g_assert_cmpuint (g_slist_length(lst),==, 2); cur = lst; @@ -108,7 +108,7 @@ test_mu_msg_gmime_01 (void) ==, "gcc-help@gcc.gnu.org"); - mu_msg_contact_list_free (lst); + mu_msg_contacts_free (lst); } mu_msg_gmime_destroy (msg); @@ -148,7 +148,7 @@ test_mu_msg_gmime_02 (void) { GSList *lst, *cur; - lst = mu_msg_gmime_contacts_list (msg); + lst = mu_msg_gmime_get_contacts (msg); g_assert_cmpuint (g_slist_length(lst),==, 2); cur = lst; @@ -165,7 +165,7 @@ test_mu_msg_gmime_02 (void) ==, "help-gnu-emacs@gnu.org"); - mu_msg_contact_list_free (lst); + mu_msg_contacts_free (lst); }