aboutsummaryrefslogtreecommitdiffstats
path: root/camel/camel-store.c
diff options
context:
space:
mode:
Diffstat (limited to 'camel/camel-store.c')
-rw-r--r--camel/camel-store.c38
1 files changed, 29 insertions, 9 deletions
diff --git a/camel/camel-store.c b/camel/camel-store.c
index 43528a8353..d76af40e60 100644
--- a/camel/camel-store.c
+++ b/camel/camel-store.c
@@ -843,6 +843,12 @@ folder_info_cmp (const void *ap, const void *bp)
return strcmp (a->full_name, b->full_name);
}
+static void
+free_name(void *key, void *data, void *user)
+{
+ g_free(key);
+}
+
/**
* camel_folder_info_build:
* @folders: an array of CamelFolderInfo
@@ -873,25 +879,36 @@ camel_folder_info_build (GPtrArray *folders, const char *namespace,
if (!namespace)
namespace = "";
nlen = strlen (namespace);
-
+
qsort (folders->pdata, folders->len, sizeof (folders->pdata[0]), folder_info_cmp);
/* Hash the folders. */
hash = g_hash_table_new (g_str_hash, g_str_equal);
for (i = 0; i < folders->len; i++) {
fi = folders->pdata[i];
- g_hash_table_insert (hash, fi->full_name, fi);
+ if (!strncmp (namespace, fi->full_name, nlen))
+ name = fi->full_name + nlen;
+ else
+ name = fi->full_name;
+ if (*name == separator)
+ name++;
+ g_hash_table_insert (hash, g_strdup(name), fi);
}
/* Now find parents. */
for (i = 0; i < folders->len; i++) {
fi = folders->pdata[i];
- name = fi->full_name;
-
+ if (!strncmp (namespace, fi->full_name, nlen))
+ name = fi->full_name + nlen;
+ else
+ name = fi->full_name;
+ if (*name == separator)
+ name++;
+
/* set the path if it isn't already set */
if (!fi->path)
camel_folder_info_build_path (fi, separator);
-
+
p = strrchr (name, separator);
if (p) {
pname = g_strndup (name, p - name);
@@ -903,9 +920,8 @@ camel_folder_info_build (GPtrArray *folders, const char *namespace,
create a fake folder node */
CamelURL *url;
char *sep;
-
+
pfi = g_new0 (CamelFolderInfo, 1);
- pfi->full_name = pname;
if (short_names) {
pfi->name = strrchr (pname, separator);
if (pfi->name)
@@ -914,7 +930,8 @@ camel_folder_info_build (GPtrArray *folders, const char *namespace,
pfi->name = g_strdup (pname);
} else
pfi->name = g_strdup (pname);
-
+
+ /* FIXME: url's with fragments should have the fragment truncated, not path */
url = camel_url_new (fi->url, NULL);
sep = strrchr (url->path, separator);
if (sep)
@@ -922,11 +939,13 @@ camel_folder_info_build (GPtrArray *folders, const char *namespace,
else
d(g_warning ("huh, no \"%c\" in \"%s\"?", separator, fi->url));
+ pfi->full_name = g_strdup(url->path+1);
+
/* since this is a "fake" folder node, it is not selectable */
camel_url_set_param (url, "noselect", "yes");
pfi->url = camel_url_to_string (url, 0);
camel_url_free (url);
-
+
g_hash_table_insert (hash, pname, pfi);
g_ptr_array_add (folders, pfi);
}
@@ -936,6 +955,7 @@ camel_folder_info_build (GPtrArray *folders, const char *namespace,
} else if (!top)
top = fi;
}
+ g_hash_table_foreach(hash, free_name, NULL);
g_hash_table_destroy (hash);
/* Link together the top-level folders */