summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Woodhouse <David.Woodhouse@intel.com>2010-06-24 00:17:58 +0100
committerDavid Woodhouse <David.Woodhouse@intel.com>2010-06-28 13:42:43 +0100
commitdad074d2c676646550800a52091c87ffa8be8081 (patch)
tree1d16ba072eb3ea5cc4bbeac089133dcb18e9d80e
parent2658733763adbd9cf03d6f9a279c7b646cf975af (diff)
downloadevolution-data-server-dad074d2c676646550800a52091c87ffa8be8081.tar.gz
Simplify relationship between full and path names for imapx
There seems to be no point in the %25-style escapes, which we were applying in full_to_path() only if dir_sep != '/', and then reversing in path_to_full() unconditionally. Instead, just swap dir_sep with '/'. Aside from simplifying the code, this also means that the path displayed to the user will be as close as possible to the real name -- it means that my "be nasty to imapx" test folder called fish"%sd is displayed properly, instead of as fish"%25sd. (cherry picked from commit d700a9fbffa73f3017cb0e49ba2c5a66a102e80a)
-rw-r--r--camel/providers/imapx/camel-imapx-store-summary.c71
1 files changed, 20 insertions, 51 deletions
diff --git a/camel/providers/imapx/camel-imapx-store-summary.c b/camel/providers/imapx/camel-imapx-store-summary.c
index 6ee84e798..df313c6e4 100644
--- a/camel/providers/imapx/camel-imapx-store-summary.c
+++ b/camel/providers/imapx/camel-imapx-store-summary.c
@@ -171,44 +171,26 @@ gchar *
camel_imapx_store_summary_full_to_path(CamelIMAPXStoreSummary *s, const gchar *full_name, gchar dir_sep)
{
gchar *path, *p;
- gint c;
- const gchar *f;
+
+ p = path = g_strdup(full_name);
if (dir_sep != '/') {
- p = path = alloca(strlen(full_name)*3+1);
- f = full_name;
- while ((c = *f++ & 0xff)) {
- if (c == dir_sep)
- *p++ = '/';
- else if (c == '/' || c == '%')
- p += sprintf(p, "%%%02X", c);
- else
- *p++ = c;
+ while (*p) {
+ if (*p == '/')
+ *p = dir_sep;
+ else if (*p == dir_sep)
+ *p = '/';
+ p++;
}
- *p = 0;
- } else
- path = (gchar *)full_name;
-
- return g_strdup(path);
-}
-
-static guint32 hexnib(guint32 c)
-{
- if (c >= '0' && c <= '9')
- return c-'0';
- else if (c>='A' && c <= 'Z')
- return c-'A'+10;
- else
- return 0;
+ }
+ return path;
}
gchar *
camel_imapx_store_summary_path_to_full(CamelIMAPXStoreSummary *s, const gchar *path, gchar dir_sep)
{
gchar *full, *f;
- guint32 c, v = 0;
const gchar *p;
- gint state=0;
gchar *subpath, *last = NULL;
CamelStoreInfo *si;
CamelIMAPXStoreNamespace *ns;
@@ -234,7 +216,6 @@ camel_imapx_store_summary_path_to_full(CamelIMAPXStoreSummary *s, const gchar *p
ns = camel_imapx_store_summary_namespace_find_path(s, path);
- f = full = alloca(strlen(path)*2+1);
if (si)
p = path + strlen(subpath);
else if (ns)
@@ -242,32 +223,20 @@ camel_imapx_store_summary_path_to_full(CamelIMAPXStoreSummary *s, const gchar *p
else
p = path;
- while ((c = camel_utf8_getc((const guchar **)&p))) {
- switch (state) {
- case 0:
- if (c == '%')
- state = 1;
- else {
- if (c == '/')
- c = dir_sep;
- camel_utf8_putc((guchar **) &f, c);
- }
- break;
- case 1:
- state = 2;
- v = hexnib(c)<<4;
- break;
- case 2:
- state = 0;
- v |= hexnib(c);
- camel_utf8_putc((guchar **) &f, v);
- break;
+ printf("p is '%s'\n", p);
+ f = full = g_strdup(p);
+ if (dir_sep != '/') {
+ while (*f) {
+ if (*f == '/')
+ *f = dir_sep;
+ else if (*f == dir_sep)
+ *f = '/';
+ f++;
}
}
- camel_utf8_putc((guchar **) &f, c);
/* merge old path part if required */
- f = g_strdup(full);
+ f = full;
if (si) {
full = g_strdup_printf("%s%s", camel_imapx_store_info_full_name(s, si), f);
g_free(f);