aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog18
-rw-r--r--camel/camel-folder-summary.h1
-rw-r--r--camel/camel-vee-folder.c79
-rw-r--r--camel/providers/local/camel-mbox-store.c3
4 files changed, 99 insertions, 2 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index d43c588e6d..25346d437e 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,21 @@
+2004-05-04 Not Zed <NotZed@Ximian.com>
+
+ ** See #57979.
+
+ * camel-vee-folder.c (subfolder_renamed_update): when the
+ subfolder gets renamed, remove all the old uid's and add the new
+ ones (since the uid is based on the subordinate folder name).
+ (subfolder_renamed): listen to renamed folder events.
+
+ * providers/local/camel-mbox-store.c (get_folder_info): if we're
+ getting a single folder with no children, make sure we fill the
+ counts out. Fixes some rename strangeness.
+
+ * camel-vee-folder.c (camel_vee_folder_add_folder): hook onto the
+ folder renamed signal.
+ (camel_vee_folder_finalise): unhook folder_renamed signal.
+ (camel_vee_folder_remove_folder): same.
+
2004-05-03 Not Zed <NotZed@Ximian.com>
** See bug #57881.
diff --git a/camel/camel-folder-summary.h b/camel/camel-folder-summary.h
index 8f8c02e220..00506dec35 100644
--- a/camel/camel-folder-summary.h
+++ b/camel/camel-folder-summary.h
@@ -270,6 +270,7 @@ void camel_folder_summary_remove(CamelFolderSummary *s, CamelMessageInfo *info);
void camel_folder_summary_remove_uid(CamelFolderSummary *s, const char *uid);
void camel_folder_summary_remove_index(CamelFolderSummary *s, int);
void camel_folder_summary_remove_range(CamelFolderSummary *s, int start, int end);
+
/* remove all items */
void camel_folder_summary_clear(CamelFolderSummary *s);
diff --git a/camel/camel-vee-folder.c b/camel/camel-vee-folder.c
index 6ad9c949a9..cf4301df03 100644
--- a/camel/camel-vee-folder.c
+++ b/camel/camel-vee-folder.c
@@ -45,7 +45,7 @@
#include "e-util/e-memory.h"
#endif
-#define d(x)
+#define d(x)
#define dd(x) (camel_debug("vfolder")?(x):0)
#define _PRIVATE(o) (((CamelVeeFolder *)(o))->priv)
@@ -79,6 +79,7 @@ static void vee_folder_remove_folder(CamelVeeFolder *vf, CamelFolder *source, in
static void folder_changed(CamelFolder *sub, CamelFolderChangeInfo *changes, CamelVeeFolder *vf);
static void subfolder_deleted(CamelFolder *f, void *event_data, CamelVeeFolder *vf);
+static void subfolder_renamed(CamelFolder *f, void *event_data, CamelVeeFolder *vf);
static void folder_changed_remove_uid(CamelFolder *sub, const char *uid, const char hash[8], int keep, CamelVeeFolder *vf);
@@ -181,6 +182,7 @@ camel_vee_folder_finalise (CamelObject *obj)
if (vf != folder_unmatched) {
camel_object_unhook_event((CamelObject *)f, "folder_changed", (CamelObjectEventHookFunc) folder_changed, vf);
camel_object_unhook_event((CamelObject *)f, "deleted", (CamelObjectEventHookFunc) subfolder_deleted, vf);
+ camel_object_unhook_event((CamelObject *)f, "renamed", (CamelObjectEventHookFunc) subfolder_renamed, vf);
/* this updates the vfolder */
if ((vf->flags & CAMEL_STORE_FOLDER_PRIVATE) == 0)
vee_folder_remove_folder(vf, f, FALSE);
@@ -382,6 +384,7 @@ camel_vee_folder_add_folder(CamelVeeFolder *vf, CamelFolder *sub)
camel_object_hook_event((CamelObject *)sub, "folder_changed", (CamelObjectEventHookFunc)folder_changed, vf);
camel_object_hook_event((CamelObject *)sub, "deleted", (CamelObjectEventHookFunc)subfolder_deleted, vf);
+ camel_object_hook_event((CamelObject *)sub, "renamed", (CamelObjectEventHookFunc)subfolder_renamed, vf);
vee_folder_build_folder(vf, sub, NULL);
}
@@ -413,6 +416,7 @@ camel_vee_folder_remove_folder(CamelVeeFolder *vf, CamelFolder *sub)
camel_object_unhook_event((CamelObject *)sub, "folder_changed", (CamelObjectEventHookFunc) folder_changed, vf);
camel_object_unhook_event((CamelObject *)sub, "deleted", (CamelObjectEventHookFunc) subfolder_deleted, vf);
+ camel_object_unhook_event((CamelObject *)sub, "renamed", (CamelObjectEventHookFunc) subfolder_renamed, vf);
p->folders = g_list_remove(p->folders, sub);
@@ -1660,6 +1664,79 @@ subfolder_deleted(CamelFolder *f, void *event_data, CamelVeeFolder *vf)
}
static void
+subfolder_renamed_update(CamelVeeFolder *vf, CamelFolder *sub, char hash[8])
+{
+ int count, i;
+ CamelFolderChangeInfo *changes = NULL;
+
+ CAMEL_VEE_FOLDER_LOCK(vf, summary_lock);
+
+ count = camel_folder_summary_count(((CamelFolder *)vf)->summary);
+ for (i=0;i<count;i++) {
+ CamelVeeMessageInfo *mi = (CamelVeeMessageInfo *)camel_folder_summary_index(((CamelFolder *)vf)->summary, i);
+ CamelVeeMessageInfo *vinfo;
+
+ if (mi == NULL)
+ continue;
+
+ if (mi->folder == sub) {
+ char *uid = (char *)camel_message_info_uid(mi);
+ char *oldkey;
+ void *oldval;
+
+ camel_folder_change_info_remove_uid(vf->changes, uid);
+ camel_folder_summary_remove(((CamelFolder *)vf)->summary, (CamelMessageInfo *)mi);
+
+ /* works since we always append on the end */
+ i--;
+ count--;
+
+ vinfo = vee_folder_add_uid(vf, sub, uid+8, hash);
+ if (vinfo)
+ camel_folder_change_info_add_uid(vf->changes, camel_message_info_uid(vinfo));
+
+ /* check unmatched uid's table for any matches */
+ if (vf == folder_unmatched
+ && g_hash_table_lookup_extended(unmatched_uids, uid, (void **)&oldkey, &oldval)) {
+ g_hash_table_remove(unmatched_uids, oldkey);
+ g_hash_table_insert(unmatched_uids, g_strdup(camel_message_info_uid(vinfo)), oldval);
+ g_free(oldkey);
+ }
+ }
+
+ camel_folder_summary_info_free(((CamelFolder *)vf)->summary, (CamelMessageInfo *)mi);
+ }
+
+ if (camel_folder_change_info_changed(vf->changes)) {
+ changes = vf->changes;
+ vf->changes = camel_folder_change_info_new();
+ }
+
+ CAMEL_VEE_FOLDER_UNLOCK(vf, summary_lock);
+
+ if (changes) {
+ camel_object_trigger_event((CamelObject *)vf, "folder_changed", changes);
+ camel_folder_change_info_free(changes);
+ }
+}
+
+static void
+subfolder_renamed(CamelFolder *f, void *event_data, CamelVeeFolder *vf)
+{
+ char hash[8];
+
+ /* TODO: This could probably be done in another thread, tho it is pretty quick/memory bound */
+
+ /* Life just got that little bit harder, if the folder is renamed, it means it breaks all of our uid's.
+ We need to remove the old uid's, fix them up, then release the new uid's, for the uid's that match this folder */
+
+ camel_vee_folder_hash_folder(f, hash);
+
+ subfolder_renamed_update(vf, f, hash);
+ subfolder_renamed_update(folder_unmatched, f, hash);
+}
+
+static void
vee_freeze (CamelFolder *folder)
{
CamelVeeFolder *vfolder = (CamelVeeFolder *)folder;
diff --git a/camel/providers/local/camel-mbox-store.c b/camel/providers/local/camel-mbox-store.c
index b9d3a976d1..4893853689 100644
--- a/camel/providers/local/camel-mbox-store.c
+++ b/camel/providers/local/camel-mbox-store.c
@@ -823,7 +823,8 @@ get_folder_info(CamelStore *store, const char *top, guint32 flags, CamelExceptio
fi->child = scan_dir (store, url, visited, fi, subdir, top, flags, ex);
else
fill_fi(store, fi, flags);
- }
+ } else
+ fill_fi(store, fi, flags);
camel_url_free (url);