aboutsummaryrefslogtreecommitdiffstats
path: root/camel/providers
diff options
context:
space:
mode:
Diffstat (limited to 'camel/providers')
-rw-r--r--camel/providers/imap/camel-imap-folder.c11
-rw-r--r--camel/providers/local/camel-local-folder.c2
-rw-r--r--camel/providers/local/camel-local-summary.c57
-rw-r--r--camel/providers/local/camel-local-summary.h1
-rw-r--r--camel/providers/local/camel-maildir-folder.c10
-rw-r--r--camel/providers/local/camel-maildir-summary.c171
-rw-r--r--camel/providers/local/camel-maildir-summary.h17
-rw-r--r--camel/providers/local/camel-mbox-folder.c7
-rw-r--r--camel/providers/local/camel-mbox-summary.c12
-rw-r--r--camel/providers/local/camel-mh-folder.c4
-rw-r--r--camel/providers/local/camel-mh-summary.c20
-rw-r--r--camel/providers/nntp/camel-nntp-folder.c2
-rw-r--r--camel/providers/nntp/camel-nntp-utils.c11
-rw-r--r--camel/providers/vee/camel-vee-folder.c74
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);