diff options
Diffstat (limited to 'camel/providers')
-rw-r--r-- | camel/providers/imap/camel-imap-folder.c | 11 | ||||
-rw-r--r-- | camel/providers/local/camel-local-folder.c | 2 | ||||
-rw-r--r-- | camel/providers/local/camel-local-summary.c | 57 | ||||
-rw-r--r-- | camel/providers/local/camel-local-summary.h | 1 | ||||
-rw-r--r-- | camel/providers/local/camel-maildir-folder.c | 10 | ||||
-rw-r--r-- | camel/providers/local/camel-maildir-summary.c | 171 | ||||
-rw-r--r-- | camel/providers/local/camel-maildir-summary.h | 17 | ||||
-rw-r--r-- | camel/providers/local/camel-mbox-folder.c | 7 | ||||
-rw-r--r-- | camel/providers/local/camel-mbox-summary.c | 12 | ||||
-rw-r--r-- | camel/providers/local/camel-mh-folder.c | 4 | ||||
-rw-r--r-- | camel/providers/local/camel-mh-summary.c | 20 | ||||
-rw-r--r-- | camel/providers/nntp/camel-nntp-folder.c | 2 | ||||
-rw-r--r-- | camel/providers/nntp/camel-nntp-utils.c | 11 | ||||
-rw-r--r-- | camel/providers/vee/camel-vee-folder.c | 74 |
14 files changed, 298 insertions, 101 deletions
diff --git a/camel/providers/imap/camel-imap-folder.c b/camel/providers/imap/camel-imap-folder.c index a4b8b459de..892eb71d50 100644 --- a/camel/providers/imap/camel-imap-folder.c +++ b/camel/providers/imap/camel-imap-folder.c @@ -300,7 +300,7 @@ imap_refresh_info (CamelFolder *folder, CamelException *ex) if (!new[i].uid) continue; - if (strcmp (info->uid, new[i].uid) != 0) { + if (strcmp (camel_message_info_uid(info), new[i].uid) != 0) { camel_folder_summary_remove (imap_folder->summary, info); folder_changed = TRUE; @@ -314,7 +314,7 @@ imap_refresh_info (CamelFolder *folder, CamelException *ex) info->flags = new[i].flags; camel_object_trigger_event (CAMEL_OBJECT (folder), "message_changed", - info->uid); + (char *)camel_message_info_uid(info)); } g_free (new[i].uid); @@ -366,7 +366,7 @@ imap_sync (CamelFolder *folder, gboolean expunge, CamelException *ex) response = camel_imap_command ( store, folder, ex, "UID STORE %s FLAGS.SILENT %s", - info->uid, flags); + camel_message_info_uid(info), flags); g_free (flags); if (!response) return; @@ -547,7 +547,7 @@ imap_get_uids (CamelFolder *folder) for (i = 0; i < count; i++) { info = camel_folder_summary_index (imap_folder->summary, i); - array->pdata[i] = g_strdup (info->uid); + array->pdata[i] = g_strdup (camel_message_info_uid(info)); } return array; @@ -697,7 +697,8 @@ imap_update_summary (CamelFolder *folder, int first, int last, */ info = ((CamelFolderSummaryClass *)(CAMEL_OBJECT_GET_CLASS(imap_folder->summary)))->message_info_new(imap_folder->summary, h); header_raw_clear (&h); - info->uid = g_strndup (uid, q - uid); + uid = g_strndup(uid, q-uid); + camel_message_info_set_uid(info, uid); /* now lets grab the FLAGS */ if (!(flags = strstr (headers->pdata[i], "FLAGS "))) { diff --git a/camel/providers/local/camel-local-folder.c b/camel/providers/local/camel-local-folder.c index 787b482169..c1c3256865 100644 --- a/camel/providers/local/camel-local-folder.c +++ b/camel/providers/local/camel-local-folder.c @@ -367,7 +367,7 @@ local_get_uids(CamelFolder *folder) for (i = 0; i < count; i++) { CamelMessageInfo *info = camel_folder_summary_index(CAMEL_FOLDER_SUMMARY(local_folder->summary), i); - array->pdata[i] = g_strdup(info->uid); + array->pdata[i] = g_strdup(camel_message_info_uid(info)); } return array; diff --git a/camel/providers/local/camel-local-summary.c b/camel/providers/local/camel-local-summary.c index 83b0e6313b..5e47ee35c3 100644 --- a/camel/providers/local/camel-local-summary.c +++ b/camel/providers/local/camel-local-summary.c @@ -35,7 +35,7 @@ #define io(x) #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))*/ -#define CAMEL_LOCAL_SUMMARY_VERSION (0x100) +#define CAMEL_LOCAL_SUMMARY_VERSION (0x200) struct _CamelLocalSummaryPrivate { }; @@ -59,6 +59,7 @@ static int message_info_save (CamelFolderSummary *, FILE *, CamelMessageInfo static int local_summary_decode_x_evolution(CamelLocalSummary *cls, const char *xev, CamelMessageInfo *mi); static char *local_summary_encode_x_evolution(CamelLocalSummary *cls, const CamelMessageInfo *mi); +static int local_summary_load(CamelLocalSummary *cls, int forceindex, CamelException *ex); static int local_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, CamelException *ex); static int local_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInfo *changeinfo, CamelException *ex); static CamelMessageInfo *local_summary_add(CamelLocalSummary *cls, CamelMimeMessage *msg, const CamelMessageInfo *info, CamelFolderChangeInfo *, CamelException *ex); @@ -105,6 +106,7 @@ camel_local_summary_class_init(CamelLocalSummaryClass *klass) sklass->message_info_save = message_info_save;*/ /*sklass->message_info_free = message_info_free;*/ + klass->load = local_summary_load; klass->check = local_summary_check; klass->sync = local_summary_sync; klass->add = local_summary_add; @@ -140,20 +142,42 @@ camel_local_summary_finalise(CamelObject *obj) void camel_local_summary_construct(CamelLocalSummary *new, const char *filename, const char *local_name, ibex *index) { - camel_folder_summary_set_build_content(CAMEL_FOLDER_SUMMARY(new), TRUE); + camel_folder_summary_set_build_content(CAMEL_FOLDER_SUMMARY(new), FALSE); camel_folder_summary_set_filename(CAMEL_FOLDER_SUMMARY(new), filename); new->folder_path = g_strdup(local_name); new->index = index; } +static int +local_summary_load(CamelLocalSummary *cls, int forceindex, CamelException *ex) +{ + return camel_folder_summary_load((CamelFolderSummary *)cls); +} + /* load/check the summary */ int camel_local_summary_load(CamelLocalSummary *cls, int forceindex, CamelException *ex) { - if (forceindex || camel_folder_summary_load((CamelFolderSummary *)cls) == -1) { + struct stat st; + CamelFolderSummary *s = (CamelFolderSummary *)cls; + + d(printf("Loading summary ...\n")); + + if (forceindex + || stat(s->summary_path, &st) == -1 + || ((CamelLocalSummaryClass *)(CAMEL_OBJECT_GET_CLASS(cls)))->load(cls, forceindex, ex) == -1) { camel_folder_summary_clear((CamelFolderSummary *)cls); } - return camel_local_summary_check(cls, NULL, ex); + + if (camel_local_summary_check(cls, NULL, ex) == 0) { + if (camel_folder_summary_save(s) == -1) + g_warning("Could not save summary for %s: %s", cls->folder_path, strerror(errno)); + if (cls->index && ibex_save(cls->index) == -1) + g_warning("Could not sync index for %s: %s", cls->folder_path, strerror(errno)); + + return 0; + } + return -1; } char * @@ -322,7 +346,8 @@ camel_local_summary_write_headers(int fd, struct _header_raw *header, char *xevl } while (header) { - if (strcasecmp(header->name, "X-Evolution")) { + if (strcmp(header->name, "X-Evolution")) { + printf("writing header: '%s'\n", header->name); len = fprintf(out, "%s:%s\n", header->name, header->value); if (len == -1) { fclose(out); @@ -439,7 +464,7 @@ local_summary_add(CamelLocalSummary *cls, CamelMimeMessage *msg, const CamelMess xev = camel_local_summary_encode_x_evolution(cls, mi); camel_medium_set_header((CamelMedium *)msg, "X-Evolution", xev); g_free(xev); - camel_folder_change_info_add_uid(ci, mi->uid); + camel_folder_change_info_add_uid(ci, camel_message_info_uid(mi)); } else { d(printf("Failed!\n")); camel_exception_set(ex, 1, "Unable to add message to summary: unknown reason"); @@ -455,18 +480,19 @@ local_summary_encode_x_evolution(CamelLocalSummary *cls, const CamelMessageInfo GString *val = g_string_new(""); CamelFlag *flag = mi->user_flags; CamelTag *tag = mi->user_tags; - char *ret, *p; + char *ret; + const char *p, *uidstr; guint32 uid; /* FIXME: work out what to do with uid's that aren't stored here? */ /* FIXME: perhaps make that a mbox folder only issue?? */ - p = mi->uid; + p = uidstr = camel_message_info_uid(mi); while (*p && isdigit(*p)) p++; - if (*p == 0 && sscanf(mi->uid, "%u", &uid) == 1) { + if (*p == 0 && sscanf(uidstr, "%u", &uid) == 1) { g_string_sprintf(out, "%08x-%04x", uid, mi->flags & 0xffff); } else { - g_string_sprintf(out, "%s-%04x", mi->uid, mi->flags & 0xffff); + g_string_sprintf(out, "%s-%04x", uidstr, mi->flags & 0xffff); } if (flag || tag) { @@ -517,8 +543,7 @@ local_summary_decode_x_evolution(CamelLocalSummary *cls, const char *xev, CamelM char uidstr[20]; if (mi) { sprintf(uidstr, "%u", uid); - g_free(mi->uid); - mi->uid = g_strdup(uidstr); + camel_message_info_set_uid(mi, g_strdup(uidstr)); mi->flags = flags; } } else { @@ -579,7 +604,7 @@ message_info_new(CamelFolderSummary *s, struct _header_raw *h) if (xev==NULL || camel_local_summary_decode_x_evolution(cls, xev, mi) == -1) { /* to indicate it has no xev header */ mi->flags |= CAMEL_MESSAGE_FOLDER_FLAGGED | CAMEL_MESSAGE_FOLDER_NOXEV; - mi->uid = camel_folder_summary_next_uid_string(s); + camel_message_info_set_uid(mi, camel_folder_summary_next_uid_string(s)); /* shortcut, no need to look it up in the index library */ doindex = TRUE; @@ -588,11 +613,11 @@ message_info_new(CamelFolderSummary *s, struct _header_raw *h) if (cls->index && (doindex || cls->index_force - || !ibex_contains_name(cls->index, mi->uid))) { - d(printf("Am indexing message %s\n", mi->uid)); + || !ibex_contains_name(cls->index, (char *)camel_message_info_uid(mi)))) { + d(printf("Am indexing message %s\n", camel_message_info_uid(mi))); camel_folder_summary_set_index(s, cls->index); } else { - d(printf("Not indexing message %s\n", mi->uid)); + d(printf("Not indexing message %s\n", camel_message_info_uid(mi))); camel_folder_summary_set_index(s, NULL); } } diff --git a/camel/providers/local/camel-local-summary.h b/camel/providers/local/camel-local-summary.h index 5349194edf..e0dadde899 100644 --- a/camel/providers/local/camel-local-summary.h +++ b/camel/providers/local/camel-local-summary.h @@ -54,6 +54,7 @@ struct _CamelLocalSummary { struct _CamelLocalSummaryClass { CamelFolderSummaryClass parent_class; + int (*load)(CamelLocalSummary *cls, int forceindex, CamelException *ex); int (*check)(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, CamelException *ex); int (*sync)(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInfo *changeinfo, CamelException *ex); CamelMessageInfo *(*add)(CamelLocalSummary *cls, CamelMimeMessage *msg, const CamelMessageInfo *info, CamelFolderChangeInfo *, CamelException *ex); diff --git a/camel/providers/local/camel-maildir-folder.c b/camel/providers/local/camel-maildir-folder.c index 1cffbdabd2..d4771db5b8 100644 --- a/camel/providers/local/camel-maildir-folder.c +++ b/camel/providers/local/camel-maildir-folder.c @@ -138,12 +138,10 @@ static void maildir_append_message(CamelFolder * folder, CamelMimeMessage * mess mdi = (CamelMaildirMessageInfo *)mi; - g_assert(mdi->filename); - - d(printf("Appending message: uid is %s filename is %s\n", mi->uid, mdi->filename)); + d(printf("Appending message: uid is %s filename is %s\n", camel_message_info_uid(mi), mdi->filename)); /* write it out to tmp, use the uid we got from the summary */ - name = g_strdup_printf("%s/tmp/%s", lf->folder_path, mi->uid); + name = g_strdup_printf("%s/tmp/%s", lf->folder_path, camel_message_info_uid(mi)); output_stream = camel_stream_fs_new_with_name(name, O_WRONLY|O_CREAT, 0600); if (output_stream == NULL) { camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, @@ -163,7 +161,7 @@ static void maildir_append_message(CamelFolder * folder, CamelMimeMessage * mess } /* now move from tmp to cur (bypass new, does it matter?) */ - dest = g_strdup_printf("%s/cur/%s", lf->folder_path, mdi->filename); + dest = g_strdup_printf("%s/cur/%s", lf->folder_path, camel_maildir_info_filename(mdi)); if (rename(name, dest) == 1) { camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, _("Cannot append message to maildir folder: %s: %s"), name, g_strerror(errno)); @@ -201,7 +199,7 @@ static CamelMimeMessage *maildir_get_message(CamelFolder * folder, const gchar * mdi = (CamelMaildirMessageInfo *)info; /* what do we do if the message flags (and :info data) changes? filename mismatch - need to recheck I guess */ - name = g_strdup_printf("%s/cur/%s", lf->folder_path, mdi->filename); + name = g_strdup_printf("%s/cur/%s", lf->folder_path, camel_maildir_info_filename(mdi)); if ((message_stream = camel_stream_fs_new_with_name(name, O_RDONLY, 0)) == NULL) { camel_exception_setv(ex, CAMEL_EXCEPTION_FOLDER_INVALID_UID, _("Cannot get message: %s\n %s"), name, g_strerror(errno)); diff --git a/camel/providers/local/camel-maildir-summary.c b/camel/providers/local/camel-maildir-summary.c index 0fa9f1c0d9..8bf630efe5 100644 --- a/camel/providers/local/camel-maildir-summary.c +++ b/camel/providers/local/camel-maildir-summary.c @@ -33,13 +33,17 @@ #include <ctype.h> +#include "e-util/e-memory.h" + #define d(x) /*(printf("%s(%d): ", __FILE__, __LINE__),(x))*/ #define CAMEL_MAILDIR_SUMMARY_VERSION (0x2000) +static CamelMessageInfo *message_info_load(CamelFolderSummary *s, FILE *in); static CamelMessageInfo *message_info_new(CamelFolderSummary *, struct _header_raw *); static void message_info_free(CamelFolderSummary *, CamelMessageInfo *mi); +static int maildir_summary_load(CamelLocalSummary *cls, int forceindex, CamelException *ex); static int maildir_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, CamelException *ex); static int maildir_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInfo *changeinfo, CamelException *ex); /*static int maildir_summary_add(CamelLocalSummary *cls, CamelMimeMessage *msg, CamelMessageInfo *info, CamelFolderChangeInfo *, CamelException *ex);*/ @@ -55,6 +59,8 @@ static void camel_maildir_summary_finalise (CamelObject *obj); struct _CamelMaildirSummaryPrivate { char *current_file; char *hostname; + + GHashTable *load_map; }; static CamelLocalSummaryClass *parent_class; @@ -86,10 +92,12 @@ camel_maildir_summary_class_init (CamelMaildirSummaryClass *class) parent_class = (CamelLocalSummaryClass *)camel_type_get_global_classfuncs(camel_local_summary_get_type ()); /* override methods */ + sklass->message_info_load = message_info_load; sklass->message_info_new = message_info_new; sklass->message_info_free = message_info_free; sklass->next_uid_string = maildir_summary_next_uid_string; + lklass->load = maildir_summary_load; lklass->check = maildir_summary_check; lklass->sync = maildir_summary_sync; /*lklass->add = maildir_summary_add;*/ @@ -108,6 +116,10 @@ camel_maildir_summary_init (CamelMaildirSummary *o) s->message_info_size = sizeof(CamelMaildirMessageInfo); s->content_info_size = sizeof(CamelMaildirMessageContentInfo); +#ifdef DOESTRV + s->message_info_strings = CAMEL_MAILDIR_INFO_LAST; +#endif + if (gethostname(hostname, 256) == 0) { o->priv->hostname = g_strdup(hostname); } else { @@ -155,9 +167,11 @@ char *camel_maildir_summary_info_to_name(const CamelMessageInfo *info) { char *p, *buf; int i; + const char *uid; - buf = alloca(strlen(info->uid) + strlen(":2,") + (sizeof(flagbits)/sizeof(flagbits[0])) + 1); - p = buf + sprintf(buf, "%s:2,", info->uid); + uid = camel_message_info_uid(info); + buf = alloca(strlen(uid) + strlen(":2,") + (sizeof(flagbits)/sizeof(flagbits[0])) + 1); + p = buf + sprintf(buf, "%s:2,", uid); for (i=0;i<sizeof(flagbits)/sizeof(flagbits[0]);i++) { if (info->flags & flagbits[i].flagbit) *p++ = flagbits[i].flag; @@ -209,18 +223,19 @@ static CamelMessageInfo *message_info_new(CamelFolderSummary * s, struct _header CamelMessageInfo *mi; CamelMaildirSummary *mds = (CamelMaildirSummary *)s; CamelMaildirMessageInfo *mdi; + const char *uid; mi = ((CamelFolderSummaryClass *) parent_class)->message_info_new(s, h); /* assign the uid and new filename */ if (mi) { mdi = (CamelMaildirMessageInfo *)mi; - if (mi->uid == NULL) { - mi->uid = camel_folder_summary_next_uid_string(s); - } + uid = camel_message_info_uid(mi); + if (uid==NULL || uid[0] == 0) + camel_message_info_set_uid(mi, camel_folder_summary_next_uid_string(s)); /* with maildir we know the real received date, from the filename */ - mi->date_received = strtoul(mi->uid, NULL, 10); + mi->date_received = strtoul(camel_message_info_uid(mi), NULL, 10); if (mds->priv->current_file) { #if 0 @@ -228,8 +243,8 @@ static CamelMessageInfo *message_info_new(CamelFolderSummary * s, struct _header unsigned long uid; #endif /* if setting from a file, grab the flags from it */ - mdi->filename = g_strdup(mds->priv->current_file); - camel_maildir_summary_name_to_info(mi, mdi->filename); + camel_maildir_info_set_filename(mi, g_strdup(mds->priv->current_file)); + camel_maildir_summary_name_to_info(mi, mds->priv->current_file); #if 0 /* Actually, I dont think all this effort is worth it at all ... */ @@ -249,19 +264,22 @@ static CamelMessageInfo *message_info_new(CamelFolderSummary * s, struct _header #endif } else { /* if creating a file, set its name from the flags we have */ - mdi->filename = camel_maildir_summary_info_to_name(mi); + camel_maildir_info_set_filename(mdi, camel_maildir_summary_info_to_name(mi)); + d(printf("Setting filename to %s\n", camel_maildir_info_filename(mi))); } } return mi; } + static void message_info_free(CamelFolderSummary *s, CamelMessageInfo *mi) { +#ifndef DOESTRV CamelMaildirMessageInfo *mdi = (CamelMaildirMessageInfo *)mi; g_free(mdi->filename); - +#endif ((CamelFolderSummaryClass *) parent_class)->message_info_free(s, mi); } @@ -312,6 +330,80 @@ static char *maildir_summary_next_uid_string(CamelFolderSummary *s) } } +static CamelMessageInfo * +message_info_load(CamelFolderSummary *s, FILE *in) +{ + CamelMessageInfo *mi; + CamelMaildirSummary *mds = (CamelMaildirSummary *)s; + + mi = ((CamelFolderSummaryClass *) parent_class)->message_info_load(s, in); + if (mi) { + char *name; + + if (mds->priv->load_map + && (name = g_hash_table_lookup(mds->priv->load_map, camel_message_info_uid(mi)))) { + d(printf("Setting filename of %s to %s\n", camel_message_info_uid(mi), name)); + camel_maildir_info_set_filename(mi, g_strdup(name)); + camel_maildir_summary_name_to_info(mi, name); + } + } + + return mi; +} + +static int maildir_summary_load(CamelLocalSummary *cls, int forceindex, CamelException *ex) +{ + char *cur; + DIR *dir; + struct dirent *d; + CamelMaildirSummary *mds = (CamelMaildirSummary *)cls; + char *uid; + EMemPool *pool; + int ret; + + cur = g_strdup_printf("%s/cur", cls->folder_path); + + d(printf("pre-loading uid <> filename map\n")); + + dir = opendir(cur); + if (dir == NULL) { + camel_exception_setv(ex, 1, "Cannot open maildir directory path: %s: %s", cls->folder_path, strerror(errno)); + g_free(cur); + return -1; + } + + mds->priv->load_map = g_hash_table_new(g_str_hash, g_str_equal); + pool = e_mempool_new(1024, 512, E_MEMPOOL_ALIGN_BYTE); + + while ( (d = readdir(dir)) ) { + if (d->d_name[0] == '.') + continue; + + /* map the filename -> uid */ + uid = strchr(d->d_name, ':'); + if (uid) { + int len = uid-d->d_name; + uid = e_mempool_alloc(pool, len+1); + memcpy(uid, d->d_name, len); + uid[len] = 0; + g_hash_table_insert(mds->priv->load_map, uid, e_mempool_strdup(pool, d->d_name)); + } else { + uid = e_mempool_strdup(pool, d->d_name); + g_hash_table_insert(mds->priv->load_map, uid, uid); + } + } + closedir(dir); + g_free(cur); + + ret = ((CamelLocalSummaryClass *) parent_class)->load(cls, forceindex, ex); + + g_hash_table_destroy(mds->priv->load_map); + mds->priv->load_map = NULL; + e_mempool_destroy(pool); + + return ret; +} + static int camel_maildir_summary_add(CamelLocalSummary *cls, const char *name, int forceindex) { CamelMaildirSummary *maildirs = (CamelMaildirSummary *)cls; @@ -350,7 +442,7 @@ remove_summary(char *key, CamelMessageInfo *info, CamelLocalSummary *cls) { d(printf("removing message %s from summary\n", key)); if (cls->index) - ibex_unindex(cls->index, info->uid); + ibex_unindex(cls->index, (char *)camel_message_info_uid(info)); camel_folder_summary_remove((CamelFolderSummary *)cls, info); } @@ -408,7 +500,7 @@ maildir_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changes, Ca for (i=0;i<count;i++) { info = camel_folder_summary_index((CamelFolderSummary *)cls, i); if (info) { - g_hash_table_insert(left, info->uid, info); + g_hash_table_insert(left, (char *)camel_message_info_uid(info), info); } } @@ -429,20 +521,33 @@ maildir_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changes, Ca if (info == NULL || (cls->index && (!ibex_contains_name(cls->index, uid)))) { /* need to add this file to the summary */ if (info != NULL) { - g_hash_table_remove(left, info->uid); + g_hash_table_remove(left, uid); camel_folder_summary_remove((CamelFolderSummary *)cls, info); } camel_maildir_summary_add(cls, d->d_name, forceindex); } else { - if (info) { - mdi = (CamelMaildirMessageInfo *)info; - /* TODO: only store the extension in the mdi->filename struct, not the whole lot */ - if (mdi->filename == NULL || strcmp(mdi->filename, d->d_name) != 0) { - g_free(mdi->filename); - mdi->filename = g_strdup(d->d_name); - } + const char *filename; + + g_hash_table_remove(left, camel_message_info_uid(info)); + + mdi = (CamelMaildirMessageInfo *)info; + filename = camel_maildir_info_filename(mdi); + /* TODO: only store the extension in the mdi->filename struct, not the whole lot */ + if (filename == NULL || strcmp(filename, d->d_name) != 0) { +#ifdef DOESTRV + d(printf("filename changed: %s to %s\n", filename, d->d_name)); + + /* need to update the summary hash string reference since it might (will) change */ + g_hash_table_remove(s->messages_uid, uid); + info->strings = e_strv_set_ref(info->strings, CAMEL_MAILDIR_INFO_FILENAME, d->d_name); + /* we need to re-pack as well */ + info->strings = e_strv_pack(info->strings); + g_hash_table_insert(s->messages_uid, (char *)camel_message_info_uid(info), info); +#else + g_free(mdi->filename); + mdi->filename = g_strdup(d->d_name); +#endif } - g_hash_table_remove(left, info->uid); } g_free(uid); } @@ -473,6 +578,9 @@ maildir_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changes, Ca src = g_strdup_printf("%s/%s", new, name); destfilename = g_strdup_printf("%s:2,", destname); dest = g_strdup_printf("%s/%s", cur, destfilename); + + /* FIXME: This should probably use link/unlink */ + if (rename(src, dest) == 0) { camel_maildir_summary_add(cls, destfilename, forceindex); if (changes) @@ -516,6 +624,9 @@ maildir_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChange int count, i; CamelMessageInfo *info; CamelMaildirMessageInfo *mdi; +#ifdef DOESTRV + CamelFolderSummary *s = (CamelFolderSummary *)cls; +#endif char *name; struct stat st; @@ -530,15 +641,15 @@ maildir_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChange info = camel_folder_summary_index((CamelFolderSummary *)cls, i); mdi = (CamelMaildirMessageInfo *)info; if (info && (info->flags & CAMEL_MESSAGE_DELETED) && expunge) { - name = g_strdup_printf("%s/cur/%s", cls->folder_path, mdi->filename); + name = g_strdup_printf("%s/cur/%s", cls->folder_path, camel_maildir_info_filename(mdi)); d(printf("deleting %s\n", name)); if (unlink(name) == 0 || errno==ENOENT) { /* FIXME: put this in folder_summary::remove()? */ if (cls->index) - ibex_unindex(cls->index, info->uid); + ibex_unindex(cls->index, (char *)camel_message_info_uid(info)); - camel_folder_change_info_remove_uid(changes, info->uid); + camel_folder_change_info_remove_uid(changes, camel_message_info_uid(info)); camel_folder_summary_remove((CamelFolderSummary *)cls, info); } g_free(name); @@ -550,16 +661,24 @@ maildir_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChange /* probably should all go in the filename? */ /* have our flags/ i.e. name changed? */ - if (strcmp(newname, mdi->filename)) { - name = g_strdup_printf("%s/cur/%s", cls->folder_path, mdi->filename); + if (strcmp(newname, camel_maildir_info_filename(mdi))) { + name = g_strdup_printf("%s/cur/%s", cls->folder_path, camel_maildir_info_filename(mdi)); dest = g_strdup_printf("%s/cur/%s", cls->folder_path, newname); rename(name, dest); if (stat(dest, &st) == -1) { /* we'll assume it didn't work, but dont change anything else */ g_free(newname); } else { +#ifdef DOESTRV + /* need to update the summary hash ref */ + g_hash_table_remove(s->messages_uid, camel_message_info_uid(info)); + info->strings = e_strv_set_ref_free(info->strings, CAMEL_MAILDIR_INFO_FILENAME, newname); + info->strings = e_strv_pack(info->strings); + g_hash_table_insert(s->messages_uid, (char *)camel_message_info_uid(info), info); +#else g_free(mdi->filename); mdi->filename = newname; +#endif } g_free(name); g_free(dest); diff --git a/camel/providers/local/camel-maildir-summary.h b/camel/providers/local/camel-maildir-summary.h index 25ea845c21..24c2b5579b 100644 --- a/camel/providers/local/camel-maildir-summary.h +++ b/camel/providers/local/camel-maildir-summary.h @@ -37,10 +37,19 @@ typedef struct _CamelMaildirMessageContentInfo { CamelMessageContentInfo info; } CamelMaildirMessageContentInfo; +#ifdef DOESTRV +enum { + CAMEL_MAILDIR_INFO_FILENAME = CAMEL_MESSAGE_INFO_LAST, + CAMEL_MAILDIR_INFO_LAST, +}; +#endif + typedef struct _CamelMaildirMessageInfo { CamelMessageInfo info; +#ifndef DOESTRV char *filename; /* maildir has this annoying status shit on the end of the filename, use this to get the real message id */ +#endif } CamelMaildirMessageInfo; struct _CamelMaildirSummary { @@ -63,5 +72,13 @@ CamelMaildirSummary *camel_maildir_summary_new (const char *filename, const char char *camel_maildir_summary_info_to_name(const CamelMessageInfo *info); int camel_maildir_summary_name_to_info(CamelMessageInfo *info, const char *name); +#ifdef DOESTRV +#define camel_maildir_info_filename(x) camel_message_info_string((const CamelMessageInfo *)(x), CAMEL_MAILDIR_INFO_FILENAME) +#define camel_maildir_info_set_filename(x, s) camel_message_info_set_string((CamelMessageInfo *)(x), CAMEL_MAILDIR_INFO_FILENAME, s) +#else +#define camel_maildir_info_filename(x) (((CamelMaildirMessageInfo *)x)->filename) +#define camel_maildir_info_set_filename(x, s) (g_free(((CamelMaildirMessageInfo *)x)->filename),((CamelMaildirMessageInfo *)x)->filename = s) +#endif + #endif /* ! _CAMEL_MAILDIR_SUMMARY_H */ diff --git a/camel/providers/local/camel-mbox-folder.c b/camel/providers/local/camel-mbox-folder.c index d5e76f7cab..41fb5865b5 100644 --- a/camel/providers/local/camel-mbox-folder.c +++ b/camel/providers/local/camel-mbox-folder.c @@ -188,7 +188,7 @@ mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const Camel if (camel_exception_is_set(ex)) goto fail; - d(printf("Appending message: uid is %s\n", mi->uid)); + d(printf("Appending message: uid is %s\n", camel_message_info_uid(mi))); output_stream = camel_stream_fs_new_with_name(lf->folder_path, O_WRONLY|O_APPEND, 0600); if (output_stream == NULL) { @@ -248,7 +248,7 @@ mbox_append_message(CamelFolder *folder, CamelMimeMessage * message, const Camel fail_write: camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, - _("Cannot append message to mbox file: %s: %s"), lf->folder_path, g_strerror(errno)); + _("Cannot append message to mbox file: %s: %s"), lf->folder_path, strerror(errno)); if (filter_stream) camel_object_unref(CAMEL_OBJECT(filter_stream)); @@ -313,8 +313,7 @@ retry: return NULL; } - /* if this has no content, its an error in the library */ - g_assert(info->info.content); + /* no frompos, its an error in the library (and we can't do anything with it */ g_assert(info->frompos != -1); /* we use an fd instead of a normal stream here - the reason is subtle, camel_mime_part will cache diff --git a/camel/providers/local/camel-mbox-summary.c b/camel/providers/local/camel-mbox-summary.c index b2a5e13e4a..2dde67b70c 100644 --- a/camel/providers/local/camel-mbox-summary.c +++ b/camel/providers/local/camel-mbox-summary.c @@ -305,7 +305,7 @@ summary_update(CamelLocalSummary *cls, off_t offset, CamelFolderChangeInfo *chan for (i = 0; i < camel_folder_summary_count(s); i++) { CamelMessageInfo *mi = camel_folder_summary_index(s, i); - camel_folder_change_info_add_source(changeinfo, mi->uid); + camel_folder_change_info_add_source(changeinfo, camel_message_info_uid(mi)); } } @@ -317,7 +317,7 @@ summary_update(CamelLocalSummary *cls, off_t offset, CamelFolderChangeInfo *chan count = camel_folder_summary_count(s); for (i = 0; i < count; i++) { CamelMessageInfo *mi = camel_folder_summary_index(s, i); - camel_folder_change_info_add_update(changeinfo, mi->uid); + camel_folder_change_info_add_update(changeinfo, camel_message_info_uid(mi)); } camel_folder_change_info_build_diff(changeinfo); } @@ -523,13 +523,15 @@ mbox_summary_sync_full(CamelLocalSummary *cls, gboolean expunge, CamelFolderChan lastdel = FALSE; if (expunge && info->info.flags & CAMEL_MESSAGE_DELETED) { - d(printf("Deleting %s\n", info->info.uid)); + const char *uid = camel_message_info_uid(info); + + d(printf("Deleting %s\n", uid)); if (cls->index) - ibex_unindex(cls->index, info->info.uid); + ibex_unindex(cls->index, (char *)uid); /* remove it from the change list */ - camel_folder_change_info_remove_uid(changeinfo, info->info.uid); + camel_folder_change_info_remove_uid(changeinfo, uid); camel_folder_summary_remove(s, (CamelMessageInfo *)info); count--; i--; diff --git a/camel/providers/local/camel-mh-folder.c b/camel/providers/local/camel-mh-folder.c index 8f223a34c2..063e7e939e 100644 --- a/camel/providers/local/camel-mh-folder.c +++ b/camel/providers/local/camel-mh-folder.c @@ -137,10 +137,10 @@ static void mh_append_message(CamelFolder * folder, CamelMimeMessage * message, return; } - d(printf("Appending message: uid is %s\n", mi->uid)); + d(printf("Appending message: uid is %s\n", camel_message_info_uid(mi))); /* write it out, use the uid we got from the summary */ - name = g_strdup_printf("%s/%s", lf->folder_path, mi->uid); + name = g_strdup_printf("%s/%s", lf->folder_path, camel_message_info_uid(mi)); output_stream = camel_stream_fs_new_with_name(name, O_WRONLY|O_CREAT, 0600); if (output_stream == NULL) { camel_exception_setv(ex, CAMEL_EXCEPTION_SYSTEM, diff --git a/camel/providers/local/camel-mh-summary.c b/camel/providers/local/camel-mh-summary.c index e9fb9f116c..e5f37d879a 100644 --- a/camel/providers/local/camel-mh-summary.c +++ b/camel/providers/local/camel-mh-summary.c @@ -204,7 +204,7 @@ remove_summary(char *key, CamelMessageInfo *info, CamelLocalSummary *cls) { d(printf("removing message %s from summary\n", key)); if (cls->index) - ibex_unindex(cls->index, info->uid); + ibex_unindex(cls->index, (char *)camel_message_info_uid(info)); camel_folder_summary_remove((CamelFolderSummary *)cls, info); } @@ -238,7 +238,7 @@ mh_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, Came for (i=0;i<count;i++) { info = camel_folder_summary_index((CamelFolderSummary *)cls, i); if (info) { - g_hash_table_insert(left, info->uid, info); + g_hash_table_insert(left, (char *)camel_message_info_uid(info), info); } } @@ -254,12 +254,12 @@ mh_summary_check(CamelLocalSummary *cls, CamelFolderChangeInfo *changeinfo, Came if (info == NULL || (cls->index && (!ibex_contains_name(cls->index, d->d_name)))) { /* need to add this file to the summary */ if (info != NULL) { - g_hash_table_remove(left, info->uid); + g_hash_table_remove(left, camel_message_info_uid(info)); camel_folder_summary_remove((CamelFolderSummary *)cls, info); } camel_mh_summary_add(cls, d->d_name, forceindex); } else { - g_hash_table_remove(left, info->uid); + g_hash_table_remove(left, camel_message_info_uid(info)); } } } @@ -288,7 +288,7 @@ mh_summary_sync_message(CamelLocalSummary *cls, CamelMessageInfo *info, CamelExc int fd, outfd, len, outlen, ret=0; char *name, *tmpname, *xevnew; - name = g_strdup_printf("%s/%s", cls->folder_path, info->uid); + name = g_strdup_printf("%s/%s", cls->folder_path, camel_message_info_uid(info)); fd = open(name, O_RDWR); if (fd == -1) return -1; @@ -306,7 +306,7 @@ mh_summary_sync_message(CamelLocalSummary *cls, CamelMessageInfo *info, CamelExc d(printf("camel local summary_decode_xev = %d\n", camel_local_summary_decode_x_evolution(cls, xev, NULL))); /* need to write a new copy/unlink old */ - tmpname = g_strdup_printf("%s/.tmp.%d.%s", cls->folder_path, getpid(), info->uid); + tmpname = g_strdup_printf("%s/.tmp.%d.%s", cls->folder_path, getpid(), camel_message_info_uid(info)); d(printf("old xev was %d %s new xev is %d %s\n", strlen(xev), xev, strlen(xevnew), xevnew)); d(printf("creating new message %s\n", tmpname)); outfd = open(tmpname, O_CREAT|O_WRONLY|O_TRUNC, 0600); @@ -360,6 +360,7 @@ mh_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInfo int count, i; CamelMessageInfo *info; char *name; + const char *uid; d(printf("summary_sync(expunge=%s)\n", expunge?"true":"false")); @@ -373,15 +374,16 @@ mh_summary_sync(CamelLocalSummary *cls, gboolean expunge, CamelFolderChangeInfo info = camel_folder_summary_index((CamelFolderSummary *)cls, i); g_assert(info); if (expunge && (info->flags & CAMEL_MESSAGE_DELETED)) { - name = g_strdup_printf("%s/%s", cls->folder_path, info->uid); + uid = camel_message_info_uid(info); + name = g_strdup_printf("%s/%s", cls->folder_path, uid); d(printf("deleting %s\n", name)); if (unlink(name) == 0 || errno==ENOENT) { /* FIXME: put this in folder_summary::remove()? */ if (cls->index) - ibex_unindex(cls->index, info->uid); + ibex_unindex(cls->index, (char *)uid); - camel_folder_change_info_remove_uid(changes, info->uid); + camel_folder_change_info_remove_uid(changes, uid); camel_folder_summary_remove((CamelFolderSummary *)cls, info); } g_free(name); diff --git a/camel/providers/nntp/camel-nntp-folder.c b/camel/providers/nntp/camel-nntp-folder.c index e4d53d779f..ba469583e3 100644 --- a/camel/providers/nntp/camel-nntp-folder.c +++ b/camel/providers/nntp/camel-nntp-folder.c @@ -216,7 +216,7 @@ nntp_folder_get_uids (CamelFolder *folder) for (i = 0; i < count; i++) { message_info = camel_folder_summary_index (nntp_folder->summary, i); - out->pdata[i] = g_strdup (message_info->uid); + out->pdata[i] = g_strdup (camel_message_info_uid(message_info)); } return out; diff --git a/camel/providers/nntp/camel-nntp-utils.c b/camel/providers/nntp/camel-nntp-utils.c index 90c09a494e..439626d977 100644 --- a/camel/providers/nntp/camel-nntp-utils.c +++ b/camel/providers/nntp/camel-nntp-utils.c @@ -67,6 +67,7 @@ get_XOVER_headers(CamelNNTPStore *nntp_store, CamelFolder *folder, CamelMessageInfo *new_info = camel_folder_summary_info_new(nntp_folder->summary); char **split_line = g_strsplit (line, "\t", 7); char *subject, *from, *date, *message_id, *bytes; + char *uid; subject = split_line [nntp_store->overview_field [CAMEL_NNTP_OVER_SUBJECT].index]; from = split_line [nntp_store->overview_field [CAMEL_NNTP_OVER_FROM].index]; @@ -88,16 +89,18 @@ get_XOVER_headers(CamelNNTPStore *nntp_store, CamelFolder *folder, if (nntp_store->overview_field [ CAMEL_NNTP_OVER_BYTES ].full) bytes += strlen ("Bytes:"); - new_info->subject = g_strdup(subject); - new_info->from = g_strdup(from); - new_info->to = g_strdup(folder->name); + uid = g_strdup_printf ("%s,%s", split_line[0], message_id); + camel_message_info_set_subject(new_info, g_strdup(subject)); + camel_message_info_set_from(new_info, g_strdup(from)); + camel_message_info_set_to(new_info, g_strdup(folder->name)); + camel_message_info_set_uid(new_info, uid); + new_info->date_sent = header_decode_date(date, NULL); #if 0 /* XXX do we need to fill in both dates? */ new_info->headers.date_received = g_strdup(date); #endif new_info->size = atoi(bytes); - new_info->uid = g_strdup_printf ("%s,%s", split_line[0], message_id); md5_get_digest(message_id, strlen(message_id), digest); memcpy(new_info->message_id.id.hash, digest, sizeof(new_info->message_id.id.hash)); diff --git a/camel/providers/vee/camel-vee-folder.c b/camel/providers/vee/camel-vee-folder.c index 77c3017179..c8ac7f2059 100644 --- a/camel/providers/vee/camel-vee-folder.c +++ b/camel/providers/vee/camel-vee-folder.c @@ -28,6 +28,10 @@ #include "camel-folder-search.h" #endif +#ifdef DOESTRV +#include "e-util/e-memory.h" +#endif + #include <string.h> /* our message info includes the parent folder */ @@ -210,11 +214,13 @@ camel_vee_folder_new (CamelStore *parent_store, const char *name, CamelException static void vfolder_remove_match(CamelVeeFolder *vf, CamelVeeMessageInfo *vinfo) { - printf("removing match %s\n", vinfo->info.uid); + const char *uid = camel_message_info_uid(vinfo); + + printf("removing match %s\n", uid); - g_hash_table_remove(vf->messages_uid, vinfo->info.uid); + g_hash_table_remove(vf->messages_uid, uid); g_ptr_array_remove_fast(vf->messages, vinfo); - camel_folder_change_info_remove_uid(vf->changes, vinfo->info.uid); + camel_folder_change_info_remove_uid(vf->changes, uid); camel_message_info_free((CamelMessageInfo *)vinfo); } @@ -222,18 +228,26 @@ static CamelVeeMessageInfo * vfolder_add_match(CamelVeeFolder *vf, CamelFolder *f, const CamelMessageInfo *info) { CamelVeeMessageInfo *mi; + char *uid; mi = g_malloc0(sizeof(*mi)); camel_message_info_dup_to(info, (CamelMessageInfo*)mi); + uid = g_strdup_printf("%p:%s", f, camel_message_info_uid(info)); +#ifdef DOESTRV + mi->info.strings = e_strv_set_ref_free(mi->info.strings, CAMEL_MESSAGE_INFO_UID, uid); + mi->info.strings = e_strv_pack(mi->info.strings); +#else g_free (mi->info.uid); - mi->info.uid = g_strdup_printf("%p:%s", f, info->uid); + mi->info.uid = uid; +#endif mi->folder = f; g_ptr_array_add(vf->messages, mi); - g_hash_table_insert(vf->messages_uid, mi->info.uid, mi); + uid = (char *)camel_message_info_uid(mi); + g_hash_table_insert(vf->messages_uid, uid, mi); - printf("adding match %s\n", mi->info.uid); + printf("adding match %s\n", uid); - camel_folder_change_info_add_uid(vf->changes, mi->info.uid); + camel_folder_change_info_add_uid(vf->changes, uid); return mi; } #endif @@ -244,7 +258,7 @@ vfolder_change_match(CamelVeeFolder *vf, CamelVeeMessageInfo *vinfo, const Camel CamelFlag *flag; CamelTag *tag; - printf("changing match %s\n", vinfo->info.uid); + printf("changing match %s\n", camel_message_info_uid(vinfo)); vinfo->info.flags = info->flags; camel_flag_list_free(&vinfo->info.user_flags); @@ -259,7 +273,7 @@ vfolder_change_match(CamelVeeFolder *vf, CamelVeeMessageInfo *vinfo, const Camel camel_tag_set(&vinfo->info.user_tags, tag->name, tag->value); tag = tag->next; } - camel_folder_change_info_change_uid(vf->changes, vinfo->info.uid); + camel_folder_change_info_change_uid(vf->changes, camel_message_info_uid(vinfo)); } static void @@ -462,7 +476,7 @@ get_real_message(CamelFolder *folder, const char *uid, CamelFolder **out_folder, g_return_val_if_fail(mi != NULL, FALSE); *out_folder = mi->folder; - *out_uid = strchr(mi->info.uid, ':')+1; + *out_uid = strchr(camel_message_info_uid(mi), ':')+1; return TRUE; } @@ -505,7 +519,7 @@ static GPtrArray *vee_get_uids (CamelFolder *folder) g_ptr_array_set_size (result, vf->messages->len); for (i=0;i<vf->messages->len;i++) { CamelMessageInfo *mi = g_ptr_array_index(vf->messages, i); - result->pdata[i] = g_strdup(mi->uid); + result->pdata[i] = g_strdup(camel_message_info_uid(mi)); } return result; @@ -574,8 +588,7 @@ vee_get_message_user_flag(CamelFolder *folder, const char *uid, const char *name } static void -vee_set_message_user_flag(CamelFolder *folder, const char *uid, - const char *name, gboolean value) +vee_set_message_user_flag(CamelFolder *folder, const char *uid, const char *name, gboolean value) { const char *real_uid; CamelFolder *real_folder; @@ -627,13 +640,21 @@ vee_folder_build(CamelVeeFolder *vf, CamelException *ex) for (i = 0; i < matches->len; i++) { info = camel_folder_get_message_info(f, matches->pdata[i]); if (info) { + char *uid; + mi = g_malloc0(sizeof(*mi)); camel_message_info_dup_to(info, (CamelMessageInfo *)mi); - g_free (mi->info.uid); - mi->info.uid = g_strdup_printf("%p:%s", f, info->uid); + uid = g_strdup_printf("%p:%s", f, camel_message_info_uid(info)); +#ifdef DOESTRV + mi->info.strings = e_strv_set_ref_free(mi->info.strings, CAMEL_MESSAGE_INFO_UID, uid); + mi->info.strings = e_strv_pack(mi->info.strings); +#else + g_free(mi->info.uid); + mi->info.uid = uid; +#endif mi->folder = f; g_ptr_array_add(messages, mi); - g_hash_table_insert(messages_uid, mi->info.uid, mi); + g_hash_table_insert(messages_uid, (char *)camel_message_info_uid(mi), mi); } } camel_folder_search_free(f, matches); @@ -658,8 +679,9 @@ vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException for (i=0;i<vf->messages->len;i++) { CamelVeeMessageInfo *mi = g_ptr_array_index(vf->messages, i); if (mi->folder == source) { - camel_folder_change_info_add_source(vf->changes, mi->info.uid); - g_hash_table_remove(vf->messages_uid, mi->info.uid); + const char *uid = camel_message_info_uid(mi); + camel_folder_change_info_add_source(vf->changes, uid); + g_hash_table_remove(vf->messages_uid, uid); g_ptr_array_remove_index_fast(vf->messages, i); camel_message_info_free((CamelMessageInfo *)mi); @@ -674,15 +696,23 @@ vee_folder_build_folder(CamelVeeFolder *vf, CamelFolder *source, CamelException for (i = 0; i < matches->len; i++) { info = camel_folder_get_message_info(f, matches->pdata[i]); if (info) { + char *uid; + mi = g_malloc0(sizeof(*mi)); camel_message_info_dup_to(info, (CamelMessageInfo*)mi); + uid = g_strdup_printf("%p:%s", f, camel_message_info_uid(info)); +#ifdef DOESTRV + mi->info.strings = e_strv_set_ref_free(mi->info.strings, CAMEL_MESSAGE_INFO_UID, uid); + mi->info.strings = e_strv_pack(mi->info.strings); +#else g_free (mi->info.uid); - mi->info.uid = g_strdup_printf("%p:%s", f, info->uid); + mi->info.uid = uid; +#endif mi->folder = f; g_ptr_array_add(messages, mi); - g_hash_table_insert(messages_uid, mi->info.uid, mi); - - camel_folder_change_info_add_update(vf->changes, mi->info.uid); + uid = (char *)camel_message_info_uid(mi); + g_hash_table_insert(messages_uid, uid, mi); + camel_folder_change_info_add_update(vf->changes, uid); } } camel_folder_search_free(f, matches); |