aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-vee-store.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2002-07-03 11:11:03 +0800
committerMichael Zucci <zucchi@src.gnome.org>2002-07-03 11:11:03 +0800
commit5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4 (patch)
tree5c612a2e6c6a01b41688e522235ae2009a50c774 /camel/camel-vee-store.c
parentd49a387afc10d7e43f582eda2d14cda03ae2bfe5 (diff)
downloadgsoc2013-evolution-5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4.tar
gsoc2013-evolution-5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4.tar.gz
gsoc2013-evolution-5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4.tar.bz2
gsoc2013-evolution-5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4.tar.lz
gsoc2013-evolution-5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4.tar.xz
gsoc2013-evolution-5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4.tar.zst
gsoc2013-evolution-5c2ce7a4cb22a4358a8b509888e68222bc7a3bd4.zip
If we get an exception from the child sync, update the exception string so
2002-07-03 Not Zed <NotZed@Ximian.com> * camel-vee-folder.c (vee_sync): If we get an exception from the child sync, update the exception string so we know where it really was. * camel-vee-store.c (change_folder): Util to emit created/deleted events. (vee_get_folder): If the folder has path elements, and its parents dont exist, create dummy no-select nodes. This is for bug #4246. (vee_delete_folder): Use change_folder() to save code. * providers/local/camel-mbox-folder.c (mbox_set_message_flags): Only set xevchange if we're storing status headers in pine format, so we dont do a full sync every time any flag changes. svn path=/trunk/; revision=17360
Diffstat (limited to 'camel/camel-vee-store.c')
-rw-r--r--camel/camel-vee-store.c78
1 files changed, 50 insertions, 28 deletions
diff --git a/camel/camel-vee-store.c b/camel/camel-vee-store.c
index e8fa1054e1..4834ade7e1 100644
--- a/camel/camel-vee-store.c
+++ b/camel/camel-vee-store.c
@@ -121,27 +121,61 @@ camel_vee_store_new (void)
return new;
}
+/* flags
+ 1 = delete (0 = add)
+ 2 = noselect
+*/
+#define CHANGE_ADD (0)
+#define CHANGE_DELETE (1)
+#define CHANGE_NOSELECT (2)
+
+static void
+change_folder(CamelStore *store, const char *name, guint32 flags, int count)
+{
+ CamelFolderInfo *fi;
+ const char *tmp;
+
+ fi = g_malloc0(sizeof(*fi));
+ fi->full_name = g_strdup(name);
+ tmp = strrchr(name, '/');
+ if (tmp == NULL)
+ tmp = name;
+ else
+ tmp++;
+ fi->name = g_strdup(tmp);
+ fi->url = g_strdup_printf("vfolder:%s%s#%s", ((CamelService *)store)->url->path, (flags&CHANGE_NOSELECT)?";noselect=yes":"", name);
+ fi->unread_message_count = count;
+ camel_folder_info_build_path(fi, '/');
+ camel_object_trigger_event(CAMEL_OBJECT(store), (flags&CHANGE_DELETE)?"folder_deleted":"folder_created", fi);
+ camel_folder_info_free(fi);
+}
+
static CamelFolder *
vee_get_folder (CamelStore *store, const char *folder_name, guint32 flags, CamelException *ex)
{
- CamelFolderInfo *fi;
CamelVeeFolder *vf;
- char *name;
+ char *name, *p;
+ int add;
vf = (CamelVeeFolder *)camel_vee_folder_new(store, folder_name, flags);
if ((vf->flags & CAMEL_STORE_FOLDER_PRIVATE) == 0) {
- fi = g_malloc0(sizeof(*fi));
- fi->full_name = g_strdup(vf->vname);
- name = strrchr(vf->vname, '/');
- if (name == NULL)
- name = vf->vname;
- fi->name = g_strdup(name);
- fi->url = g_strdup_printf("vfolder:%s#%s", ((CamelService *)store)->url->path,
- ((CamelFolder *)vf)->full_name);
- fi->unread_message_count = camel_folder_get_message_count((CamelFolder *)vf);
- camel_folder_info_build_path(fi, '/');
- camel_object_trigger_event(CAMEL_OBJECT(store), "folder_created", fi);
- camel_folder_info_free(fi);
+ /* Check that parents exist, if not, create dummy ones */
+ name = alloca(strlen(vf->vname)+1);
+ strcpy(name, vf->vname);
+ p = name;
+ while ( (p = strchr(p, '/'))) {
+ *p = 0;
+
+ CAMEL_STORE_LOCK(store, cache_lock);
+ add = g_hash_table_lookup (store->folders, name) == NULL;
+ CAMEL_STORE_UNLOCK(store, cache_lock);
+
+ if (add)
+ change_folder(store, name, CHANGE_ADD|CHANGE_NOSELECT, -1);
+ *p++='/';
+ }
+
+ change_folder(store, vf->vname, CHANGE_ADD, camel_folder_get_message_count((CamelFolder *)vf));
}
return (CamelFolder *)vf;
@@ -274,20 +308,8 @@ vee_delete_folder(CamelStore *store, const char *folder_name, CamelException *ex
camel_vee_folder_remove_folder((CamelVeeFolder *)store->vtrash, folder);
if (update) {
- CamelFolderInfo *fi = g_malloc0(sizeof(*fi));
-
- fi->full_name = g_strdup(key);
- fi->name = strrchr(key, '/');
- if (fi->name == NULL)
- fi->name = g_strdup(key);
- else
- fi->name = g_strdup(fi->name);
- fi->url = g_strdup_printf("vfolder:%s#%s", ((CamelService *)store)->url->path, key);
- fi->unread_message_count = -1;
- camel_folder_info_build_path(fi, '/');
-
- camel_object_trigger_event(CAMEL_OBJECT(store), "folder_deleted", fi);
- camel_folder_info_free(fi);
+ /* what about now-empty parents? ignore? */
+ change_folder(store, key, CHANGE_DELETE, -1);
}
g_free(key);
} else {