aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog9
-rw-r--r--camel/camel-vee-folder.c120
2 files changed, 94 insertions, 35 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 840cbe0895..fa9f43eaf3 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -12,6 +12,15 @@
operation, and also check to see if the subfolder is still there
before doing any fancy work (incase it got removed while we were
waiting to execute).
+ (folder_changed_change_uid): Use alloca for vuid, and not
+ sprintf(".lengths")
+ (vee_search_by_expression): Dont use sprintf for vuid.
+ (vee_search_by_uids): "
+ (vee_folder_add_info): "
+ (folder_changed_remove_uid): "
+ (folder_changed_change): "
+ (folder_changed_change_uid): Also check folder_unmatched for
+ changed uid's so we properly update/propagate unmatched changes.
2001-10-18 Jeffrey Stedfast <fejj@ximian.com>
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index 2946dffbb2..b74ede7484 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -614,8 +614,12 @@ vee_search_by_expression(CamelFolder *folder, const char *expression, CamelExcep
camel_vee_folder_hash_folder(f, hash);
matches = camel_folder_search_by_expression(f, expression, ex);
for (i = 0; i < matches->len; i++) {
- char *uid = matches->pdata[i];
- g_ptr_array_add(result, g_strdup_printf("%.8s%s", hash, uid));
+ char *uid = matches->pdata[i], *vuid;
+
+ vuid = g_malloc(strlen(uid)+9);
+ memcpy(vuid, hash, 8);
+ strcpy(vuid+8, uid);
+ g_ptr_array_add(result, vuid);
}
camel_folder_search_free(f, matches);
g_hash_table_insert(searched, f, f);
@@ -667,8 +671,12 @@ vee_search_by_uids(CamelFolder *folder, const char *expression, GPtrArray *uids,
matches = camel_folder_search_by_uids(f, expression, folder_uids, ex);
if (matches) {
for (i = 0; i < matches->len; i++) {
- char *uid = matches->pdata[i];
- g_ptr_array_add(result, g_strdup_printf("%.8s%s", hash, uid));
+ char *uid = matches->pdata[i], *vuid;
+
+ vuid = g_malloc(strlen(uid)+9);
+ memcpy(vuid, hash, 8);
+ strcpy(vuid+8, uid);
+ g_ptr_array_add(result, vuid);
}
camel_folder_search_free(f, matches);
} else {
@@ -749,31 +757,35 @@ static CamelVeeMessageInfo *
vee_folder_add_info(CamelVeeFolder *vf, CamelFolder *f, CamelMessageInfo *info, const char hash[8])
{
CamelVeeMessageInfo *mi;
- char *uid;
+ char *vuid;
+ const char *uid;
CamelFolder *folder = (CamelFolder *)vf;
CamelMessageInfo *dinfo;
- uid = g_strdup_printf("%.8s%s", hash, camel_message_info_uid(info));
- dinfo = camel_folder_summary_uid(folder->summary, uid);
+ uid = camel_message_info_uid(info);
+ vuid = alloca(strlen(uid)+9);
+ memcpy(vuid, hash, 8);
+ strcpy(vuid+8, uid);
+ dinfo = camel_folder_summary_uid(folder->summary, vuid);
if (dinfo) {
- d(printf("w:clash, we already have '%s' in summary\n", uid));
- g_free(uid);
+ d(printf("w:clash, we already have '%s' in summary\n", vuid));
+ g_free(vuid);
camel_folder_summary_info_free(folder->summary, dinfo);
return NULL;
}
- d(printf("adding uid %s to %s\n", uid, vf->vname));
+ d(printf("adding vuid %s to %s\n", vuid, vf->vname));
mi = (CamelVeeMessageInfo *)camel_folder_summary_info_new(folder->summary);
camel_message_info_dup_to(info, (CamelMessageInfo *)mi);
#ifdef DOEPOOLV
- mi->info.strings = e_poolv_set(mi->info.strings, CAMEL_MESSAGE_INFO_UID, uid, TRUE);
+ mi->info.strings = e_poolv_set(mi->info.strings, CAMEL_MESSAGE_INFO_UID, vuid, FALSE);
#elif defined (DOESTRV)
- mi->info.strings = e_strv_set_ref_free(mi->info.strings, CAMEL_MESSAGE_INFO_UID, uid);
+ mi->info.strings = e_strv_set_ref(mi->info.strings, CAMEL_MESSAGE_INFO_UID, vuid);
mi->info.strings = e_strv_pack(mi->info.strings);
#else
g_free(mi->info.uid);
- mi->info.uid = uid;
+ mi->info.uid = g_strdup(vuid);
#endif
mi->folder = f;
camel_folder_summary_add(folder->summary, (CamelMessageInfo *)mi);
@@ -910,7 +922,8 @@ unmatched_check_uid(char *uidin, void *value, struct _update_data *u)
int n;
uid = alloca(strlen(uidin)+9);
- sprintf(uid, "%.8s%s", u->hash, uidin);
+ memcpy(uid, u->hash, 8);
+ strcpy(uid+8, uidin);
n = (int)g_hash_table_lookup(unmatched_uids, uid);
if (n == 0) {
if (vee_folder_add_uid(folder_unmatched, u->source, uidin, u->hash))
@@ -1126,7 +1139,10 @@ folder_changed_remove_uid(CamelFolder *sub, const char *uid, const char hash[8],
int n;
CamelVeeMessageInfo *vinfo;
- vuid = g_strdup_printf("%.8s%s", hash, uid);
+ vuid = alloca(strlen(uid)+9);
+ memcpy(vuid, hash, 8);
+ strcpy(vuid+8, uid);
+
vinfo = (CamelVeeMessageInfo *)camel_folder_summary_uid(folder->summary, vuid);
if (vinfo) {
camel_folder_change_info_remove_uid(vf->changes, vuid);
@@ -1160,40 +1176,67 @@ folder_changed_remove_uid(CamelFolder *sub, const char *uid, const char hash[8],
}
}
}
- g_free(vuid);
}
static void
folder_changed_change_uid(CamelFolder *sub, const char *uid, const char hash[8], CamelVeeFolder *vf)
{
- CamelFolder *folder = (CamelFolder *)vf;
char *vuid;
- CamelVeeMessageInfo *vinfo;
+ CamelVeeMessageInfo *vinfo, *uinfo;
CamelMessageInfo *info;
+ CamelFolder *folder = (CamelFolder *)vf;
+
+ vuid = alloca(strlen(uid)+9);
+ memcpy(vuid, hash, 8);
+ strcpy(vuid+8, uid);
- vuid = g_strdup_printf("%.8s%s", hash, uid);
vinfo = (CamelVeeMessageInfo *)camel_folder_summary_uid(folder->summary, vuid);
- if (vinfo) {
+ uinfo = (CamelVeeMessageInfo *)camel_folder_summary_uid(((CamelFolder *)folder_unmatched)->summary, vuid);
+ if (vinfo || uinfo) {
info = camel_folder_get_message_info(sub, uid);
if (info) {
- int changed = FALSE;
+ if (vinfo) {
+ int changed = FALSE;
+
+ if (vinfo->info.flags != info->flags){
+ vinfo->info.flags = info->flags;
+ changed = TRUE;
+ }
+
+ changed |= camel_flag_list_copy(&vinfo->info.user_flags, &info->user_flags);
+ changed |= camel_tag_list_copy(&vinfo->info.user_tags, &info->user_tags);
+ if (changed)
+ camel_folder_change_info_change_uid(vf->changes, vuid);
- if (vinfo->info.flags != info->flags){
- vinfo->info.flags = info->flags;
- changed = TRUE;
+ camel_folder_summary_info_free(folder->summary, (CamelMessageInfo *)vinfo);
+ }
+
+ if (uinfo) {
+ int changed = FALSE;
+
+ if (uinfo->info.flags != info->flags){
+ uinfo->info.flags = info->flags;
+ changed = TRUE;
+ }
+
+ changed |= camel_flag_list_copy(&uinfo->info.user_flags, &info->user_flags);
+ changed |= camel_tag_list_copy(&uinfo->info.user_tags, &info->user_tags);
+ if (changed)
+ camel_folder_change_info_change_uid(folder_unmatched->changes, vuid);
+
+ camel_folder_summary_info_free(((CamelFolder *)folder_unmatched)->summary, (CamelMessageInfo *)uinfo);
}
- changed |= camel_flag_list_copy(&vinfo->info.user_flags, &info->user_flags);
- changed |= camel_tag_list_copy(&vinfo->info.user_tags, &info->user_tags);
- if (changed)
- camel_folder_change_info_change_uid(vf->changes, camel_message_info_uid(vinfo));
camel_folder_free_message_info(sub, info);
} else {
- folder_changed_remove_uid(sub, uid, hash, FALSE, vf);
+ if (vinfo) {
+ folder_changed_remove_uid(sub, uid, hash, FALSE, vf);
+ camel_folder_summary_info_free(folder->summary, (CamelMessageInfo *)vinfo);
+ }
+ if (uinfo)
+ camel_folder_summary_info_free(((CamelFolder *)folder_unmatched)->summary, (CamelMessageInfo *)uinfo);
}
- camel_folder_summary_info_free(folder->summary, (CamelMessageInfo *)vinfo);
}
- g_free(vuid);
}
struct _folder_changed_msg {
@@ -1213,9 +1256,10 @@ folder_changed_change(CamelSession *session, CamelSessionThreadMsg *msg)
CamelFolder *folder = (CamelFolder *)m->vf;
CamelVeeFolder *vf = m->vf;
CamelFolderChangeInfo *changes = m->changes;
- char *vuid, hash[8];
+ char *vuid = NULL, hash[8];
+ const char *uid;
CamelVeeMessageInfo *vinfo;
- int i;
+ int i, vuidlen = 0;
CamelFolderChangeInfo *vf_changes = NULL, *unmatched_changes = NULL;
GPtrArray *matches;
GHashTable *matches_hash;
@@ -1266,7 +1310,13 @@ folder_changed_change(CamelSession *session, CamelSessionThreadMsg *msg)
for (i=0;i<matches->len;i++)
g_hash_table_insert(matches_hash, matches->pdata[i], matches->pdata[i]);
for (i=0;i<changes->uid_changed->len;i++) {
- vuid = g_strdup_printf("%.8s%s", hash, (char *)changes->uid_changed->pdata[i]);
+ uid = changes->uid_changed->pdata[i];
+ if (stlren(uid)+9 > vuidlen) {
+ vuidlen = strlen(uid)+64;
+ vuid = g_realloc(vuid, vuidlen);
+ }
+ memcpy(vuid, hash, 8);
+ strcpy(vuid+8, uid);
vinfo = (CamelVeeMessageInfo *)camel_folder_summary_uid(folder->summary, vuid);
if (vinfo == NULL) {
/* A uid we dont have, but now it matches, add it */
@@ -1286,8 +1336,8 @@ folder_changed_change(CamelSession *session, CamelSessionThreadMsg *msg)
}
camel_folder_summary_info_free(folder->summary, (CamelMessageInfo *)vinfo);
}
- g_free(vuid);
}
+ g_free(vuid);
g_hash_table_destroy(matches_hash);
camel_folder_search_free(sub, matches);
}