aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--camel/ChangeLog12
-rw-r--r--camel/camel-store.c69
2 files changed, 78 insertions, 3 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog
index 3854e75f6f..08b35349e6 100644
--- a/camel/ChangeLog
+++ b/camel/ChangeLog
@@ -1,3 +1,15 @@
+2003-12-01 Radek Doulik <rodo@ximian.com>
+
+ * camel-store.c (add_special_info): set SUBSCRIBED and NOINFERIORS
+ flags to special folders, renamed method from
+ add_vtrash_or_vjunk_info
+ (camel_store_get_folder_info): call add_special_info directly
+
+2003-11-28 Radek Doulik <rodo@ximian.com>
+
+ * camel-store.c (camel_store_get_folder_info): use old code from
+ mail-ops to add vtrash/vjunk info
+
2003-11-28 David Woodhouse <dwmw2@redhat.com>
* providers/imap/camel-imap-provider.c: Enable GUI option for
diff --git a/camel/camel-store.c b/camel/camel-store.c
index ee51def91a..4bccf6fc0f 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -689,6 +689,62 @@ get_folder_info (CamelStore *store, const char *top,
return NULL;
}
+static void
+add_special_info (CamelStore *store, CamelFolderInfo *info, gchar *name, gchar *full_name, gchar *url_base, gboolean unread_count)
+{
+ CamelFolderInfo *fi, *vinfo, *parent;
+ char *uri, *path;
+ CamelURL *url;
+
+ g_return_if_fail (info != NULL);
+
+ parent = NULL;
+ for (fi = info; fi; fi = fi->sibling) {
+ if (!strcmp (fi->name, name))
+ break;
+ parent = fi;
+ }
+
+ /* create our vTrash/vJunk URL */
+ url = camel_url_new (info->url, NULL);
+ path = g_strdup_printf ("/%s", name);
+ if (url->fragment)
+ camel_url_set_fragment (url, path);
+ else
+ camel_url_set_path (url, path);
+ g_free (path);
+ uri = camel_url_to_string (url, CAMEL_URL_HIDE_ALL);
+ camel_url_free (url);
+
+ if (fi) {
+ /* We're going to replace the physical Trash/Junk folder with our vTrash/vJunk folder */
+ vinfo = fi;
+ g_free (vinfo->full_name);
+ g_free (vinfo->name);
+ g_free (vinfo->url);
+ } else {
+ /* There wasn't a Trash/Junk folder so create a new folder entry */
+ vinfo = g_new0 (CamelFolderInfo, 1);
+
+ g_assert(parent != NULL);
+
+ /* link it into the right spot */
+ vinfo->sibling = parent->sibling;
+ parent->sibling = vinfo;
+ }
+
+ vinfo->flags |= CAMEL_FOLDER_NOINFERIORS | CAMEL_FOLDER_SUBSCRIBED;
+
+ /* Fill in the new fields */
+ vinfo->full_name = g_strdup (full_name);
+ vinfo->name = g_strdup(vinfo->full_name);
+ vinfo->url = g_strdup_printf ("%s:%s", url_base, uri);
+ if (!unread_count)
+ vinfo->unread_message_count = -1;
+ vinfo->path = g_strdup_printf("/%s", vinfo->name);
+ g_free (uri);
+}
+
/**
* camel_store_get_folder_info:
* @store: a CamelStore
@@ -715,7 +771,7 @@ CamelFolderInfo *
camel_store_get_folder_info (CamelStore *store, const char *top,
guint32 flags, CamelException *ex)
{
- CamelFolderInfo *ret;
+ CamelFolderInfo *info;
g_return_val_if_fail (CAMEL_IS_STORE (store), NULL);
g_return_val_if_fail ((store->flags & CAMEL_STORE_SUBSCRIPTIONS) ||
@@ -723,10 +779,17 @@ camel_store_get_folder_info (CamelStore *store, const char *top,
NULL);
CAMEL_STORE_LOCK(store, folder_lock);
- ret = CS_CLASS (store)->get_folder_info (store, top, flags, ex);
+ info = CS_CLASS (store)->get_folder_info (store, top, flags, ex);
CAMEL_STORE_UNLOCK(store, folder_lock);
- return ret;
+ if (info) {
+ if (info->url && (store->flags & CAMEL_STORE_VTRASH))
+ add_special_info (store, info, CAMEL_VTRASH_NAME, _("Trash"), "vtrash", FALSE);
+ if (info->url && (store->flags & CAMEL_STORE_VJUNK))
+ add_special_info (store, info, CAMEL_VJUNK_NAME, _("Junk"), "vjunk", TRUE);
+ }
+
+ return info;
}