sync with 0.7.5cvs14
[claws.git] / src / imap.c
index 93d24e8aae22ea49ae7cc1725e6654a18f5fdb41..4ff4d074ac9817219b286784a77bd3e885f28c37 100644 (file)
@@ -983,8 +983,8 @@ void imap_scan_tree(Folder *folder)
        session = imap_session_get(folder);
        if (!session) return;
 
-       if (imapfolder->namespace && imapfolder->namespace->data)
-               namespace = (IMAPNameSpace *)imapfolder->namespace->data;
+       if (imapfolder->ns_personal && imapfolder->ns_personal->data)
+               namespace = (IMAPNameSpace *)imapfolder->ns_personal->data;
 
        if (folder->account->imap_dir && *folder->account->imap_dir) {
                gchar *imap_dir;
@@ -1659,93 +1659,95 @@ static SockInfo *imap_init_sock(SockInfo *sock)
        return sock;
 }
 
-#define THROW goto catch
-
-static void imap_parse_namespace(IMAPSession *session, IMAPFolder *folder)
+static GList *imap_parse_namespace_str(gchar *str)
 {
-       gchar *ns_str;
+       gchar *p = str;
        gchar *name;
        gchar *separator;
-       gchar *p;
        IMAPNameSpace *namespace;
        GList *ns_list = NULL;
 
-       g_return_if_fail(session != NULL);
-       g_return_if_fail(folder != NULL);
-
-       if (folder->namespace != NULL) return;
-
-       if (imap_cmd_namespace(SESSION(session)->sock, &ns_str)
-           != IMAP_SUCCESS) {
-               log_warning(_("can't get namespace\n"));
-               return;
-       }
-
-       /* get the first element */
-       extract_one_parenthesis_with_skip_quote(ns_str, '"', '(', ')');
-       g_strstrip(ns_str);
-       p = ns_str;
-
        while (*p != '\0') {
                /* parse ("#foo" "/") */
 
                while (*p && *p != '(') p++;
-               if (*p == '\0') THROW;
+               if (*p == '\0') break;
                p++;
 
                while (*p && *p != '"') p++;
-               if (*p == '\0') THROW;
+               if (*p == '\0') break;
                p++;
                name = p;
 
                while (*p && *p != '"') p++;
-               if (*p == '\0') THROW;
+               if (*p == '\0') break;
                *p = '\0';
                p++;
 
                while (*p && isspace(*p)) p++;
-               if (*p == '\0') THROW;
+               if (*p == '\0') break;
                if (strncmp(p, "NIL", 3) == 0)
                        separator = NULL;
                else if (*p == '"') {
                        p++;
                        separator = p;
                        while (*p && *p != '"') p++;
-                       if (*p == '\0') THROW;
+                       if (*p == '\0') break;
                        *p = '\0';
                        p++;
-               } else THROW;
+               } else break;
 
                while (*p && *p != ')') p++;
-               if (*p == '\0') THROW;
+               if (*p == '\0') break;
                p++;
 
                namespace = g_new(IMAPNameSpace, 1);
                namespace->name = g_strdup(name);
                namespace->separator = separator ? separator[0] : '\0';
                ns_list = g_list_append(ns_list, namespace);
-               IMAP_FOLDER(folder)->namespace = ns_list;
        }
 
-catch:
-       g_free(ns_str);
-       return;
+       return ns_list;
 }
 
-#undef THROW
+static void imap_parse_namespace(IMAPSession *session, IMAPFolder *folder)
+{
+       gchar *ns_str;
+       gchar **str_array;
 
-static IMAPNameSpace *imap_find_namespace(IMAPFolder *folder,
-                                         const gchar *path)
+       g_return_if_fail(session != NULL);
+       g_return_if_fail(folder != NULL);
+
+       if (folder->ns_personal != NULL ||
+           folder->ns_others   != NULL ||
+           folder->ns_shared   != NULL)
+               return;
+
+       if (imap_cmd_namespace(SESSION(session)->sock, &ns_str)
+           != IMAP_SUCCESS) {
+               log_warning(_("can't get namespace\n"));
+               return;
+       }
+
+       str_array = strsplit_parenthesis(ns_str, '(', ')', 3);
+       if (str_array[0])
+               folder->ns_personal = imap_parse_namespace_str(str_array[0]);
+       if (str_array[0] && str_array[1])
+               folder->ns_others = imap_parse_namespace_str(str_array[1]);
+       if (str_array[0] && str_array[1] && str_array[2])
+               folder->ns_shared = imap_parse_namespace_str(str_array[2]);
+       g_strfreev(str_array);
+       return;
+}
+
+static IMAPNameSpace *imap_find_namespace_from_list(GList *ns_list,
+                                                   const gchar *path)
 {
        IMAPNameSpace *namespace = NULL;
-       GList *ns_list;
        gchar *name;
 
-       g_return_val_if_fail(folder != NULL, NULL);
        g_return_val_if_fail(path != NULL, NULL);
 
-       ns_list = folder->namespace;
-
        for (; ns_list != NULL; ns_list = ns_list->next) {
                IMAPNameSpace *tmp_ns = ns_list->data;
 
@@ -1759,6 +1761,21 @@ static IMAPNameSpace *imap_find_namespace(IMAPFolder *folder,
        return namespace;
 }
 
+static IMAPNameSpace *imap_find_namespace(IMAPFolder *folder,
+                                         const gchar *path)
+{
+       IMAPNameSpace *namespace;
+
+       namespace = imap_find_namespace_from_list(folder->ns_personal, path);
+       if (namespace) return namespace;
+       namespace = imap_find_namespace_from_list(folder->ns_others, path);
+       if (namespace) return namespace;
+       namespace = imap_find_namespace_from_list(folder->ns_shared, path);
+       if (namespace) return namespace;
+
+       return NULL;
+}
+
 static gchar *imap_get_real_path(IMAPFolder *folder, const gchar *path)
 {
        gchar *real_path;