aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-folder-summary.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@HelixCode.com>2000-11-30 19:05:36 +0800
committerMichael Zucci <zucchi@src.gnome.org>2000-11-30 19:05:36 +0800
commit1fbfdbd43e88e490ea11d56a3abde4631dab8cb5 (patch)
tree540ed9a6001f488d2f8918a8de07ea3f4acbae3b /camel/camel-folder-summary.c
parenta49aa686202136919d0988b81790c8b2b4a57e92 (diff)
downloadgsoc2013-evolution-1fbfdbd43e88e490ea11d56a3abde4631dab8cb5.tar
gsoc2013-evolution-1fbfdbd43e88e490ea11d56a3abde4631dab8cb5.tar.gz
gsoc2013-evolution-1fbfdbd43e88e490ea11d56a3abde4631dab8cb5.tar.bz2
gsoc2013-evolution-1fbfdbd43e88e490ea11d56a3abde4631dab8cb5.tar.lz
gsoc2013-evolution-1fbfdbd43e88e490ea11d56a3abde4631dab8cb5.tar.xz
gsoc2013-evolution-1fbfdbd43e88e490ea11d56a3abde4631dab8cb5.tar.zst
gsoc2013-evolution-1fbfdbd43e88e490ea11d56a3abde4631dab8cb5.zip
Remove assertion that content is there, when it no longer can be.
2000-11-30 Not Zed <NotZed@HelixCode.com> * providers/local/camel-mbox-folder.c (mbox_get_message): Remove assertion that content is there, when it no longer can be. * camel-folder-summary.h: Removed pos/bodypos/endpos from camelmeessagecontentinfo. (CamelMessageFlags): Added an attachments flag. * providers/local/camel-local-summary.h: Added load virtual function. * tests/lib/folders.c (test_message_info): Accessors. (test_folder_message): " * camel-folder-thread.c (get_root_subject): Fix accessors. (dump_tree_rec): " * camel-folder-search.c (camel_folder_search_execute_expression): Accessors for messageinfo. (search_match_all): " (search_header_contains): " (search_header_contains): " (search_body_contains): " (camel_folder_search_execute_expression): Use mepool_strdup. * providers/local/camel-mbox-summary.c (summary_update): Accessors for messageinfo. (mbox_summary_sync_full): " * providers/local/camel-mh-summary.c (remove_summary): Accessors for messageinfo. (mh_summary_check): " (mh_summary_sync_message): " (mh_summary_sync): " * providers/local/camel-mh-folder.c (mh_append_message): Use accessor for uid. * providers/local/camel-local-summary.c (local_summary_decode_x_evolution): Use accessor to uid. (local_summary_encode_x_evolution): Likewise. (message_info_new): And here. (camel_local_summary_load): Call virtual load function. (local_summary_load): Default load function, load summary. (camel_local_summary_load): Check file exists before trying to load. (camel_local_summary_construct): Turn off building content info! (CAMEL_LOCAL_SUMMARY_VERSION): Bump, since we dont build content info anymore. (camel_local_summary_load): After a successful load/check, do a save too so we dont have to go through it again randomly. * providers/nntp/camel-nntp-utils.c (get_XOVER_headers): Use accessors for messageinfo. * providers/nntp/camel-nntp-folder.c (nntp_folder_get_uids): Use accessors for uid. * providers/imap/camel-imap-folder.c (imap_refresh_info): Use accessor for uid. (imap_sync): Likewise. (imap_get_uids): Likewise. (imap_update_summary): And here. * providers/vee/camel-vee-folder.c (vfolder_remove_match): Use accessor for uid. (vfolder_add_match): Handle estrv stuff. (vfolder_change_match): Accessor for uid. (get_real_message): " (vee_get_uids): " (vee_folder_build): " + estrv. (vee_folder_build_folder): " * providers/local/camel-maildir-folder.c (maildir_append_message): Use acccessors for uid's. (maildir_get_message): Here too. * providers/local/camel-maildir-summary.c (camel_maildir_summary_init): Setup the string count for us. (message_info_new): Access the string array directly. (message_info_free): No need to free string if using array. (camel_maildir_summary_info_to_name): Use accessor to get to uid. (remove_summary): And here. (maildir_summary_check): Likewise. (maildir_summary_sync): And here. (maildir_summary_load): Load up a cache of uid->filename mappings before loading the actual summary file. This saves us having to waste the diskspace storing the filenames in the summary itself, and also helps us sync the summary better on load. (message_info_load): If we have the load_map setup, and the uid exists, then set the filename cache from it, and update the flags from the name, incase our summary mismatches it. * camel-folder-summary.c (camel_folder_summary_init): Setup string count for compressed info record. An optional compile mode which stores all strings for a given messageinfo into a packed array, which should save 36-50 bytes/record. (camel_folder_summary_info_new): Init the string array. (message_info_new): Set the string array items, as required. (message_info_load): And here too. (message_info_save): Use accessors to get to strings. (message_info_free): Free strings as one. (camel_message_info_dup_to): Handle packed array case. (camel_folder_summary_add): Use accessors. And pack the strv before storing it. (summary_assign_uid): New function to assign a unique uid to a message, if it doesn't have one. (camel_folder_summary_add): Call assign_uid instead of doing it ourselves. (camel_folder_summary_info_new_from_parser): " (camel_folder_summary_info_new_from_message): " (camel_folder_summary_encode_string): constify. (camel_folder_summary_encode_token): " (summary_build_content_info_message): Fix accessors to messageinfo. (CAMEL_FOLDER_SUMMARY_VERSION): Bumped, for removal of contentinfo->pos data. (camel_folder_summary_info_new_from_parser): Calculate the size based on the parser position, not the removed contentinfo stuff. (camel_folder_summary_info_new_from_message): Remove size stuff. (camel_folder_summary_offset_content): Removed, no longer means anything. (content_info_new): (content_info_load): (content_info_save): (summary_build_content_info): Remove stuff for contentinfo->pos*. (summary_build_content_info): Take a msginfo argument, set attachments flag if we find any attachments. (summary_build_content_info_message): set attachments flag if we find any attachments. (camel_folder_summary_info_new_from_parser): Always scan the content info, even if we dont save it. (camel_folder_summary_info_new_from_message): And here too. (summary_build_content_info): Only create the contentinfo stuff if we have it turned on, otherwise just parse and discard. (summary_build_content_info_message): Likewise. svn path=/trunk/; revision=6731
Diffstat (limited to 'camel/camel-folder-summary.c')
-rw-r--r--camel/camel-folder-summary.c253
1 files changed, 141 insertions, 112 deletions
diff --git a/camel/camel-folder-summary.c b/camel/camel-folder-summary.c
index 12e276245d..4879d547ee 100644
--- a/camel/camel-folder-summary.c
+++ b/camel/camel-folder-summary.c
@@ -53,7 +53,7 @@
extern int strdup_count, malloc_count, free_count;
#endif
-#define CAMEL_FOLDER_SUMMARY_VERSION (10)
+#define CAMEL_FOLDER_SUMMARY_VERSION (11)
struct _CamelFolderSummaryPrivate {
GHashTable *filter_charset; /* CamelMimeFilterCharset's indexed by source charset */
@@ -95,7 +95,7 @@ static void content_info_free(CamelFolderSummary *, CamelMessageConten
static char *next_uid_string(CamelFolderSummary *s);
-static CamelMessageContentInfo * summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp);
+static CamelMessageContentInfo * summary_build_content_info(CamelFolderSummary *s, CamelMessageInfo *msginfo, CamelMimeParser *mp);
static CamelMessageContentInfo * summary_build_content_info_message(CamelFolderSummary *s, CamelMessageInfo *msginfo, CamelMimePart *object);
static void camel_folder_summary_class_init (CamelFolderSummaryClass *klass);
@@ -144,6 +144,10 @@ camel_folder_summary_init (CamelFolderSummary *s)
s->message_info_chunks = NULL;
s->content_info_chunks = NULL;
+#ifdef DOESTRV
+ s->message_info_strings = CAMEL_MESSAGE_INFO_LAST;
+#endif
+
s->version = CAMEL_FOLDER_SUMMARY_VERSION;
s->flags = 0;
s->time = 0;
@@ -247,8 +251,7 @@ void camel_folder_summary_set_filename(CamelFolderSummary *s, const char *name)
* Set the index used to index body content. If the index is NULL, or
* not set (the default), no indexing of body content will take place.
*
- * Also see :set_build_content(), which must be enabled to perform
- * body indexing.
+ * Unlike earlier behaviour, build_content need not be set to perform indexing.
**/
void camel_folder_summary_set_index(CamelFolderSummary *s, ibex *index)
{
@@ -265,8 +268,6 @@ void camel_folder_summary_set_index(CamelFolderSummary *s, ibex *index)
* Set a flag to tell the summary to build the content info summary
* (CamelMessageInfo.content). The default is not to build content info
* summaries.
- *
- * This flag must also be set to on to perform indexing, see :set_index().
**/
void camel_folder_summary_set_build_content(CamelFolderSummary *s, gboolean state)
{
@@ -503,6 +504,25 @@ camel_folder_summary_save(CamelFolderSummary *s)
return 0;
}
+static void
+summary_assign_uid(CamelFolderSummary *s, CamelMessageInfo *info)
+{
+ const char *uid;
+
+ uid = camel_message_info_uid(info);
+ if (uid == NULL || uid[0] == 0) {
+ camel_message_info_set_uid(info, camel_folder_summary_next_uid_string(s));
+ uid = camel_message_info_uid(info);
+ }
+
+ while (g_hash_table_lookup(s->messages_uid, uid)) {
+ g_warning("Trying to insert message with clashing uid (%s). new uid re-assigned", camel_message_info_uid(info));
+ camel_message_info_set_uid(info, camel_folder_summary_next_uid_string(s));
+ uid = camel_message_info_uid(info);
+ info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
+ }
+}
+
/**
* camel_folder_summary_add:
* @s:
@@ -520,18 +540,16 @@ void camel_folder_summary_add(CamelFolderSummary *s, CamelMessageInfo *info)
if (info == NULL)
return;
- if (info->uid == NULL)
- info->uid = camel_folder_summary_next_uid_string(s);
+ summary_assign_uid(s, info);
- while (g_hash_table_lookup(s->messages_uid, info->uid)) {
- g_warning("Trying to insert message with clashing uid (%s). new uid re-assigned", info->uid);
- g_free(info->uid);
- info->uid = camel_folder_summary_next_uid_string(s);
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- }
+#ifdef DOESTRV
+ /* this is vitally important, and also if this is ever modified, then
+ the hash table needs to be resynced */
+ info->strings = e_strv_pack(info->strings);
+#endif
g_ptr_array_add(s->messages, info);
- g_hash_table_insert(s->messages_uid, info->uid, info);
+ g_hash_table_insert(s->messages_uid, (char *)camel_message_info_uid(info), info);
s->flags |= CAMEL_SUMMARY_DIRTY;
}
@@ -636,9 +654,11 @@ CamelMessageInfo *camel_folder_summary_info_new_from_parser(CamelFolderSummary *
char *buffer;
int len;
struct _CamelFolderSummaryPrivate *p = _PRIVATE(s);
+ off_t start;
/* should this check the parser is in the right state, or assume it is?? */
+ start = camel_mime_parser_tell(mp);
if (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_EOF) {
info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->message_info_new_from_parser(s, mp);
@@ -646,30 +666,18 @@ CamelMessageInfo *camel_folder_summary_info_new_from_parser(CamelFolderSummary *
/* assign a unique uid, this is slightly 'wrong' as we do not really
* know if we are going to store this in the summary, but no matter */
- if (info->uid == NULL)
- info->uid = camel_folder_summary_next_uid_string(s);
-
- while (g_hash_table_lookup(s->messages_uid, info->uid)) {
- g_free(info->uid);
- info->uid = camel_folder_summary_next_uid_string(s);
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- }
+ summary_assign_uid(s, info);
if (p->index) {
if (p->filter_index == NULL)
p->filter_index = camel_mime_filter_index_new_ibex(p->index);
- camel_mime_filter_index_set_name(p->filter_index, info->uid);
- ibex_unindex(p->index, info->uid);
+ camel_mime_filter_index_set_name(p->filter_index, (char *)camel_message_info_uid(info));
+ ibex_unindex(p->index, (char *)camel_message_info_uid(info));
}
- /* build the content info, if we're supposed to */
- if (s->build_content) {
- info->content = summary_build_content_info(s, mp);
- if (info->content->pos != -1)
- info->size = info->content->endpos - info->content->pos;
- } else {
- camel_mime_parser_drop_step(mp);
- }
+ /* always scan the content info, even if we dont save it */
+ info->content = summary_build_content_info(s, info, mp);
+ info->size = camel_mime_parser_tell(mp) - start;
}
return info;
}
@@ -692,24 +700,14 @@ CamelMessageInfo *camel_folder_summary_info_new_from_message(CamelFolderSummary
/* assign a unique uid, this is slightly 'wrong' as we do not really
* know if we are going to store this in the summary, but no matter */
- if (info->uid == NULL)
- info->uid = camel_folder_summary_next_uid_string(s);
-
- while (g_hash_table_lookup(s->messages_uid, info->uid)) {
- g_free(info->uid);
- info->uid = camel_folder_summary_next_uid_string(s);
- info->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED;
- }
+ summary_assign_uid(s, info);
if (p->index)
- ibex_unindex(p->index, info->uid);
+ ibex_unindex(p->index, (char *)camel_message_info_uid(info));
- /* build the content info, if we're supposed to */
- if (s->build_content) {
- info->content = summary_build_content_info_message(s, info, (CamelMimePart *)msg);
- if (info->content->pos != -1)
- info->size = info->content->endpos - info->content->pos;
- }
+ info->content = summary_build_content_info_message(s, info, (CamelMimePart *)msg);
+ /* FIXME: calculate the size as part of build_content_info_message */
+ /* info->size = ... */
return info;
}
@@ -794,7 +792,7 @@ camel_folder_summary_clear(CamelFolderSummary *s)
**/
void camel_folder_summary_remove(CamelFolderSummary *s, CamelMessageInfo *info)
{
- g_hash_table_remove(s->messages_uid, info->uid);
+ g_hash_table_remove(s->messages_uid, camel_message_info_uid(info));
g_ptr_array_remove(s->messages, info);
camel_folder_summary_info_free(s, info);
s->flags |= CAMEL_SUMMARY_DIRTY;
@@ -1089,7 +1087,7 @@ token_search_cmp(char *key, char **index)
* Return value: -1 on error.
**/
int
-camel_folder_summary_encode_token(FILE *out, char *str)
+camel_folder_summary_encode_token(FILE *out, const char *str)
{
io(printf("Encoding token: '%s'\n", str));
@@ -1195,7 +1193,7 @@ camel_folder_summary_decode_token(FILE *in, char **str)
* Return value: -1 on error.
**/
int
-camel_folder_summary_encode_string(FILE *out, char *str)
+camel_folder_summary_encode_string(FILE *out, const char *str)
{
register int len;
@@ -1256,26 +1254,6 @@ camel_folder_summary_decode_string(FILE *in, char **str)
return 0;
}
-/**
- * camel_folder_summary_offset_content:
- * @content:
- * @offset:
- *
- * Offset the content info @content by @offset characters.
- **/
-void
-camel_folder_summary_offset_content(CamelMessageContentInfo *content, off_t offset)
-{
- content->pos += offset;
- content->bodypos += offset;
- content->endpos += offset;
- content = content->childs;
- while (content) {
- camel_folder_summary_offset_content(content, offset);
- content = content->next;
- }
-}
-
static struct _node *
my_list_append(struct _node **list, struct _node *n)
{
@@ -1454,6 +1432,9 @@ camel_folder_summary_info_new(CamelFolderSummary *s)
s->message_info_chunks = e_memchunk_new(32, s->message_info_size);
mi = e_memchunk_alloc(s->message_info_chunks);
memset(mi, 0, s->message_info_size);
+#ifdef DOESTRV
+ mi->strings = e_strv_new(s->message_info_strings);
+#endif
return mi;
}
@@ -1481,10 +1462,21 @@ message_info_new(CamelFolderSummary *s, struct _header_raw *h)
mi = camel_folder_summary_info_new(s);
+#ifdef DOESTRV
+ msgid = camel_folder_summary_format_string(h, "subject");
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_SUBJECT, msgid);
+ msgid = camel_folder_summary_format_address(h, "from");
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_FROM, msgid);
+ msgid = camel_folder_summary_format_address(h, "to");
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_TO, msgid);
+ msgid = camel_folder_summary_format_address(h, "cc");
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_CC, msgid);
+#else
mi->subject = camel_folder_summary_format_string(h, "subject");
mi->from = camel_folder_summary_format_address(h, "from");
mi->to = camel_folder_summary_format_address(h, "to");
mi->cc = camel_folder_summary_format_address(h, "cc");
+#endif
mi->user_flags = NULL;
mi->user_tags = NULL;
mi->date_sent = header_decode_date(header_raw_find(&h, "date", NULL), NULL);
@@ -1533,11 +1525,29 @@ message_info_load(CamelFolderSummary *s, FILE *in)
CamelMessageInfo *mi;
guint count;
int i;
+#ifdef DOESTRV
+ char *tmp;
+#endif
mi = camel_folder_summary_info_new(s);
io(printf("Loading message info\n"));
-
+#ifdef DOESTRV
+ camel_folder_summary_decode_string(in, &tmp);
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_UID, tmp);
+ camel_folder_summary_decode_uint32(in, &mi->flags);
+ camel_folder_summary_decode_uint32(in, &mi->size);
+ camel_folder_summary_decode_time_t(in, &mi->date_sent);
+ camel_folder_summary_decode_time_t(in, &mi->date_received);
+ camel_folder_summary_decode_string(in, &tmp);
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_SUBJECT, tmp);
+ camel_folder_summary_decode_string(in, &tmp);
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_FROM, tmp);
+ camel_folder_summary_decode_string(in, &tmp);
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_TO, tmp);
+ camel_folder_summary_decode_string(in, &tmp);
+ e_strv_set_ref_free(mi->strings, CAMEL_MESSAGE_INFO_CC, tmp);
+#else
camel_folder_summary_decode_string(in, &mi->uid);
camel_folder_summary_decode_uint32(in, &mi->flags);
camel_folder_summary_decode_uint32(in, &mi->size);
@@ -1547,6 +1557,7 @@ message_info_load(CamelFolderSummary *s, FILE *in)
camel_folder_summary_decode_string(in, &mi->from);
camel_folder_summary_decode_string(in, &mi->to);
camel_folder_summary_decode_string(in, &mi->cc);
+#endif
mi->content = NULL;
camel_folder_summary_decode_fixed_int32(in, &mi->message_id.id.part.hi);
@@ -1593,15 +1604,15 @@ message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi)
io(printf("Saving message info\n"));
- camel_folder_summary_encode_string(out, mi->uid);
+ camel_folder_summary_encode_string(out, camel_message_info_uid(mi));
camel_folder_summary_encode_uint32(out, mi->flags);
camel_folder_summary_encode_uint32(out, mi->size);
camel_folder_summary_encode_time_t(out, mi->date_sent);
camel_folder_summary_encode_time_t(out, mi->date_received);
- camel_folder_summary_encode_string(out, mi->subject);
- camel_folder_summary_encode_string(out, mi->from);
- camel_folder_summary_encode_string(out, mi->to);
- camel_folder_summary_encode_string(out, mi->cc);
+ camel_folder_summary_encode_string(out, camel_message_info_subject(mi));
+ camel_folder_summary_encode_string(out, camel_message_info_from(mi));
+ camel_folder_summary_encode_string(out, camel_message_info_to(mi));
+ camel_folder_summary_encode_string(out, camel_message_info_cc(mi));
camel_folder_summary_encode_fixed_int32(out, mi->message_id.id.part.hi);
camel_folder_summary_encode_fixed_int32(out, mi->message_id.id.part.lo);
@@ -1639,11 +1650,15 @@ message_info_save(CamelFolderSummary *s, FILE *out, CamelMessageInfo *mi)
static void
message_info_free(CamelFolderSummary *s, CamelMessageInfo *mi)
{
+#ifdef DOESTRV
+ e_strv_destroy(mi->strings);
+#else
g_free(mi->uid);
g_free(mi->subject);
g_free(mi->from);
g_free(mi->to);
g_free(mi->cc);
+#endif
g_free(mi->references);
camel_flag_list_free(&mi->user_flags);
camel_tag_list_free(&mi->user_tags);
@@ -1661,9 +1676,6 @@ content_info_new(CamelFolderSummary *s, struct _header_raw *h)
ci->description = header_decode_string(header_raw_find(&h, "content-description", NULL));
ci->encoding = header_content_encoding_decode(header_raw_find(&h, "content-transfer-encoding", NULL));
- ci->pos = -1;
- ci->bodypos = -1;
- ci->endpos = -1;
return ci;
}
@@ -1678,10 +1690,6 @@ content_info_load(CamelFolderSummary *s, FILE *in)
io(printf("Loading content info\n"));
ci = content_info_alloc(s);
-
- camel_folder_summary_decode_off_t(in, &ci->pos);
- camel_folder_summary_decode_off_t(in, &ci->bodypos);
- camel_folder_summary_decode_off_t(in, &ci->endpos);
camel_folder_summary_decode_token(in, &type);
camel_folder_summary_decode_token(in, &subtype);
@@ -1716,10 +1724,6 @@ content_info_save(CamelFolderSummary *s, FILE *out, CamelMessageContentInfo *ci)
io(printf("Saving content info\n"));
- camel_folder_summary_encode_off_t(out, ci->pos);
- camel_folder_summary_encode_off_t(out, ci->bodypos);
- camel_folder_summary_encode_off_t(out, ci->endpos);
-
ct = ci->type;
if (ct) {
camel_folder_summary_encode_token(out, ct->type);
@@ -1764,7 +1768,7 @@ next_uid_string(CamelFolderSummary *s)
*/
static CamelMessageContentInfo *
-summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp)
+summary_build_content_info(CamelFolderSummary *s, CamelMessageInfo *msginfo, CamelMimeParser *mp)
{
int state, len;
char *buffer;
@@ -1782,15 +1786,17 @@ summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp)
state = camel_mime_parser_step(mp, &buffer, &len);
body = camel_mime_parser_tell(mp);
- info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new_from_parser(s, mp);
-
- info->pos = camel_mime_parser_tell_start_headers(mp);
- info->bodypos = body;
+ if (s->build_content)
+ info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new_from_parser(s, mp);
switch(state) {
case HSCAN_HEADER:
/* check content type for indexing, then read body */
ct = camel_mime_parser_content_type(mp);
+ /* update attachments flag as we go */
+ if (!header_content_type_is(ct, "text", "*"))
+ msginfo->flags |= CAMEL_MESSAGE_ATTACHMENTS;
+
if (p->index && header_content_type_is(ct, "text", "*")) {
char *encoding;
const char *charset;
@@ -1846,25 +1852,29 @@ summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp)
break;
case HSCAN_MULTIPART:
d(printf("Summarising multipart\n"));
+ /* update attachments flag as we go */
+ ct = camel_mime_parser_content_type(mp);
+ if (header_content_type_is(ct, "multipart", "mixed"))
+ msginfo->flags |= CAMEL_MESSAGE_ATTACHMENTS;
+
while (camel_mime_parser_step(mp, &buffer, &len) != HSCAN_MULTIPART_END) {
camel_mime_parser_unstep(mp);
- part = summary_build_content_info(s, mp);
+ part = summary_build_content_info(s, msginfo, mp);
if (part) {
part->parent = info;
my_list_append((struct _node **)&info->childs, (struct _node *)part);
- } else {
- g_error("Parsing failed: could not build part of a multipart");
}
}
break;
case HSCAN_MESSAGE:
d(printf("Summarising message\n"));
- part = summary_build_content_info(s, mp);
+ /* update attachments flag as we go */
+ msginfo->flags |= CAMEL_MESSAGE_ATTACHMENTS;
+
+ part = summary_build_content_info(s, msginfo, mp);
if (part) {
part->parent = info;
my_list_append((struct _node **)&info->childs, (struct _node *)part);
- } else {
- g_error("Parsing failed: no content of a message?");
}
state = camel_mime_parser_step(mp, &buffer, &len);
if (state != HSCAN_MESSAGE_END) {
@@ -1874,8 +1884,6 @@ summary_build_content_info(CamelFolderSummary *s, CamelMimeParser *mp)
break;
}
- info->endpos = camel_mime_parser_tell(mp);
-
d(printf("finished building content info\n"));
return info;
@@ -1890,7 +1898,8 @@ summary_build_content_info_message(CamelFolderSummary *s, CamelMessageInfo *msgi
struct _CamelFolderSummaryPrivate *p = _PRIVATE(s);
CamelMessageContentInfo *info = NULL, *child;
- info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new_from_message(s, object);
+ if (s->build_content)
+ info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(s)))->content_info_new_from_message(s, object);
containee = camel_medium_get_content_object(CAMEL_MEDIUM(object));
@@ -1900,6 +1909,13 @@ summary_build_content_info_message(CamelFolderSummary *s, CamelMessageInfo *msgi
/* TODO: I find it odd that get_part and get_content_object do not
add a reference, probably need fixing for multithreading */
+ /* check for attachments */
+ if (gmime_content_field_is_type(CAMEL_DATA_WRAPPER(containee)->mime_type, "multipart", "*")) {
+ if (gmime_content_field_is_type(CAMEL_DATA_WRAPPER(containee)->mime_type, "multipart", "mixed"))
+ msginfo->flags |= CAMEL_MESSAGE_ATTACHMENTS;
+ } else if (!gmime_content_field_is_type(CAMEL_DATA_WRAPPER(containee)->mime_type, "text", "*"))
+ msginfo->flags |= CAMEL_MESSAGE_ATTACHMENTS;
+
/* using the object types is more accurate than using the mime/types */
if (CAMEL_IS_MULTIPART(containee)) {
parts = camel_multipart_get_number(CAMEL_MULTIPART(containee));
@@ -1925,7 +1941,7 @@ summary_build_content_info_message(CamelFolderSummary *s, CamelMessageInfo *msgi
CamelStreamMem *mem = (CamelStreamMem *)camel_stream_mem_new();
camel_data_wrapper_write_to_stream(containee, (CamelStream *)mem);
- ibex_index_buffer(p->index, msginfo->uid, mem->buffer->data, mem->buffer->len, NULL);
+ ibex_index_buffer(p->index, (char *)camel_message_info_uid(msginfo), mem->buffer->data, mem->buffer->len, NULL);
camel_object_unref((CamelObject *)mem);
}
@@ -2145,11 +2161,20 @@ camel_message_info_dup_to(const CamelMessageInfo *from, CamelMessageInfo *to)
to->date_received = from->date_received;
/* Copy strings */
+#ifdef DOESTRV
+ to->strings = e_strv_new(CAMEL_MESSAGE_INFO_LAST);
+ e_strv_set(to->strings, CAMEL_MESSAGE_INFO_SUBJECT, camel_message_info_subject(from));
+ e_strv_set(to->strings, CAMEL_MESSAGE_INFO_FROM, camel_message_info_from(from));
+ e_strv_set(to->strings, CAMEL_MESSAGE_INFO_TO, camel_message_info_to(from));
+ e_strv_set(to->strings, CAMEL_MESSAGE_INFO_CC, camel_message_info_cc(from));
+ e_strv_set(to->strings, CAMEL_MESSAGE_INFO_UID, camel_message_info_uid(from));
+#else
to->subject = g_strdup(from->subject);
to->from = g_strdup(from->from);
to->to = g_strdup(from->to);
to->cc = g_strdup(from->cc);
to->uid = g_strdup(from->uid);
+#endif
memcpy(&to->message_id, &from->message_id, sizeof(from->message_id));
/* Copy structures */
@@ -2192,11 +2217,15 @@ camel_message_info_dup_to(const CamelMessageInfo *from, CamelMessageInfo *to)
void
camel_message_info_free(CamelMessageInfo *mi)
{
+#ifdef DOESTRV
+ e_strv_destroy(mi->strings);
+#else
g_free(mi->uid);
g_free(mi->subject);
g_free(mi->from);
g_free(mi->to);
g_free(mi->cc);
+#endif
g_free(mi->references);
camel_flag_list_free(&mi->user_flags);
camel_tag_list_free(&mi->user_tags);
@@ -2205,18 +2234,18 @@ camel_message_info_free(CamelMessageInfo *mi)
}
#ifdef DOESTRV
-const char *camel_message_info_string(CamelMessageInfo *mi, int type)
+const char *camel_message_info_string(const CamelMessageInfo *mi, int type)
{
- if (mi->strings == NULL || type >= CAMEL_MESSAGE_INFO_STRING_COUNT)
+ if (mi->strings == NULL)
return "";
return e_strv_get(mi->strings, type);
}
-void camel_message_info_set_string(CamelMessageInfo *mi, int type, const char *str)
+void camel_message_info_set_string(CamelMessageInfo *mi, int type, char *str)
{
g_assert(mi->strings != NULL);
- mi->strings = e_strv_set(mi->strings, type, str);
+ mi->strings = e_strv_set_ref_free(mi->strings, type, str);
}
#endif
@@ -2254,11 +2283,11 @@ message_info_dump(CamelMessageInfo *mi)
return;
}
- printf("Subject: %s\n", mi->subject);
- printf("To: %s\n", mi->to);
- printf("Cc: %s\n", mi->cc);
- printf("From: %s\n", mi->from);
- printf("UID: %s\n", mi->uid);
+ printf("Subject: %s\n", camel_message_info_subject(mi));
+ printf("To: %s\n", camel_message_info_to(to));
+ printf("Cc: %s\n", camel_message_info_cc(cc));
+ printf("From: %s\n", camel_message_info_from(from));
+ printf("UID: %s\n", camel_message_info_uid(uid));
printf("Flags: %04x\n", mi->flags & 0xffff);
content_info_dump(mi->content, 0);
}