2011-02-11 [mones] 3.7.8cvs53
[claws.git] / src / imap.c
index 9b90557338238130ee1956c27b4d593ce8afd8b7..5088c1a65c0bafe1ebaa75ad708f6dba549389c0 100644 (file)
@@ -212,7 +212,7 @@ static gint         imap_add_msg            (Folder         *folder,
 static gint    imap_add_msgs           (Folder         *folder, 
                                         FolderItem     *dest,
                                         GSList         *file_list,
-                                        GRelation      *relation);
+                                        GHashTable     *relation);
 
 static gint    imap_copy_msg           (Folder         *folder,
                                         FolderItem     *dest, 
@@ -220,7 +220,7 @@ static gint         imap_copy_msg           (Folder         *folder,
 static gint    imap_copy_msgs          (Folder         *folder, 
                                         FolderItem     *dest, 
                                         MsgInfoList    *msglist, 
-                                        GRelation      *relation);
+                                        GHashTable     *relation);
 
 static gint    imap_remove_msg         (Folder         *folder, 
                                         FolderItem     *item, 
@@ -228,7 +228,7 @@ static gint         imap_remove_msg         (Folder         *folder,
 static gint    imap_remove_msgs        (Folder         *folder, 
                                         FolderItem     *dest, 
                                         MsgInfoList    *msglist, 
-                                        GRelation      *relation);
+                                        GHashTable     *relation);
 static gint    imap_expunge            (Folder         *folder, 
                                         FolderItem     *dest);
 static gint    imap_remove_all_msg     (Folder         *folder, 
@@ -278,7 +278,7 @@ static FolderItem *imap_create_special_folder
 static gint imap_do_copy_msgs          (Folder         *folder,
                                         FolderItem     *dest,
                                         MsgInfoList    *msglist,
-                                        GRelation      *relation);
+                                        GHashTable     *relation);
 
 static void imap_delete_all_cached_messages    (FolderItem     *item);
 static void imap_set_batch             (Folder         *folder,
@@ -375,7 +375,6 @@ static gint imap_cmd_append (IMAPSession    *session,
 static gint imap_cmd_copy       (IMAPSession *session,
                                 struct mailimap_set * set,
                                 const gchar *destfolder,
-                                GRelation *uid_mapping,
                                 struct mailimap_set ** source,
                                 struct mailimap_set ** dest);
 static gint imap_cmd_store     (IMAPSession    *session,
@@ -410,7 +409,7 @@ static void imap_change_flags                       (Folder         *folder,
 static gint imap_get_flags                     (Folder         *folder,
                                                 FolderItem     *item,
                                                 MsgInfoList    *msglist,
-                                                GRelation      *msgflags);
+                                                GHashTable     *msgflags);
 static gchar *imap_folder_get_path             (Folder         *folder);
 static gchar *imap_item_get_path               (Folder         *folder,
                                                 FolderItem     *item);
@@ -561,9 +560,15 @@ static gboolean is_fatal(int libetpan_errcode)
        }
 }
 
-static void imap_handle_error(Session *session, int libetpan_errcode)
+static void imap_handle_error(Session *session, const gchar *server, int libetpan_errcode)
 {
-       const gchar *session_server = (session ? session->server:"(null)");
+       const gchar *session_server = (session ? session->server : NULL);
+
+       if (session_server == NULL)
+               session_server = server;
+       if (session_server == NULL)
+               session_server = "(null)";
+
        switch(libetpan_errcode) {
        case MAILIMAP_NO_ERROR:
                return;
@@ -830,7 +835,7 @@ static gint imap_auth(IMAPSession *session, const gchar *user, const gchar *pass
        int r;
        gchar *server = NULL;
        if ((r = imap_get_capabilities(session)) != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return r;
        }
        server = g_strdup(SESSION(session)->server);
@@ -1100,7 +1105,7 @@ static IMAPSession *imap_session_new(Folder * folder,
                        log_error(LOG_PROTOCOL, _("SSL handshake failed\n"));
                else
 #endif
-                       imap_handle_error(NULL, r);
+                       imap_handle_error(NULL, account->recv_server, r);
 
                if(!prefs_common.no_recv_err_panel) {
                        alertpanel_error_log(_("Can't connect to IMAP4 server: %s:%d"),
@@ -1572,7 +1577,7 @@ static gint imap_add_msg(Folder *folder, FolderItem *dest,
 }
 
 static gint imap_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
-                  GRelation *relation)
+                  GHashTable *relation)
 {
        gchar *destdir;
        IMAPSession *session;
@@ -1667,7 +1672,7 @@ static gint imap_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
                }
 
                if (relation != NULL)
-                       g_relation_insert(relation, fileinfo->msginfo != NULL ? 
+                       g_hash_table_insert(relation, fileinfo->msginfo != NULL ? 
                                          (gpointer) fileinfo->msginfo : (gpointer) fileinfo,
                                          GINT_TO_POINTER(new_uid));
                if (last_uid < new_uid) {
@@ -1727,7 +1732,7 @@ static GSList *flatten_mailimap_set(struct mailimap_set * set)
        return result;
 }
 static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest, 
-                             MsgInfoList *msglist, GRelation *relation)
+                             MsgInfoList *msglist, GHashTable *relation)
 {
        FolderItem *src;
        gchar *destdir;
@@ -1735,7 +1740,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
        MsgInfo *msginfo;
        IMAPSession *session;
        gint ok = MAILIMAP_NO_ERROR;
-       GRelation *uid_mapping;
+       GHashTable *uid_hash;
        gint last_num = 0;
        gboolean single = FALSE;
 
@@ -1796,8 +1801,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
                return ok;
 
        seq_list = imap_get_lep_set_from_msglist(IMAP_FOLDER(folder), msglist);
-       uid_mapping = g_relation_new(2);
-       g_relation_index(uid_mapping, 0, g_direct_hash, g_direct_equal);
+       uid_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
        
        statusbar_print_all(_("Copying messages..."));
        for (cur = seq_list; cur != NULL; cur = g_slist_next(cur)) {
@@ -1810,7 +1814,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
                            src->path, destdir);
 
                lock_session(session); /* unlocked later in the function */
-               ok = imap_cmd_copy(session, seq_set, destdir, uid_mapping,
+               ok = imap_cmd_copy(session, seq_set, destdir,
                        &source, &dest);
                
                if (is_fatal(ok)) {
@@ -1828,7 +1832,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
                                        for (s_cur = s_list, d_cur = d_list; 
                                             s_cur && d_cur; 
                                             s_cur = s_cur->next, d_cur = d_cur->next) {
-                                               g_relation_insert(uid_mapping, s_cur->data, d_cur->data);
+                                               g_hash_table_insert(uid_hash, s_cur->data, d_cur->data);
                                        }
 
                                } else {
@@ -1846,7 +1850,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
                        mailimap_set_free(dest);
 
                if (ok != MAILIMAP_NO_ERROR) {
-                       g_relation_destroy(uid_mapping);
+                       g_hash_table_destroy(uid_hash);
                        imap_lep_set_free(seq_list);
                        statusbar_pop_all();
                        return -1;
@@ -1855,14 +1859,13 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
 
        for (cur = msglist; cur != NULL; cur = g_slist_next(cur)) {
                MsgInfo *msginfo = (MsgInfo *)cur->data;
-               GTuples *tuples;
-
-               tuples = g_relation_select(uid_mapping, 
-                                          GINT_TO_POINTER(msginfo->msgnum),
-                                          0);
-               if (tuples->len > 0) {
-                       gint num = GPOINTER_TO_INT(g_tuples_index(tuples, 0, 1));
-                       g_relation_insert(relation, msginfo,
+               gpointer hashval;
+
+               hashval = g_hash_table_lookup(uid_hash, GINT_TO_POINTER(msginfo->msgnum));
+               
+               if (hashval != NULL) {
+                       gint num = GPOINTER_TO_INT(hashval);
+                       g_hash_table_insert(relation, msginfo,
                                          GINT_TO_POINTER(num));
                        if (num > last_num)
                                last_num = num;
@@ -1891,13 +1894,12 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
                                g_free(cache_path);
                        }
                } else
-                       g_relation_insert(relation, msginfo,
+                       g_hash_table_insert(relation, msginfo,
                                          GINT_TO_POINTER(0));
-               g_tuples_destroy(tuples);
        }
        statusbar_pop_all();
 
-       g_relation_destroy(uid_mapping);
+       g_hash_table_destroy(uid_hash);
        imap_lep_set_free(seq_list);
 
        g_free(destdir);
@@ -1927,7 +1929,7 @@ static gint imap_copy_msg(Folder *folder, FolderItem *dest, MsgInfo *msginfo)
 }
 
 static gint imap_copy_msgs(Folder *folder, FolderItem *dest, 
-                   MsgInfoList *msglist, GRelation *relation)
+                   MsgInfoList *msglist, GHashTable *relation)
 {
        MsgInfo *msginfo;
        gint ret;
@@ -1945,14 +1947,13 @@ static gint imap_copy_msgs(Folder *folder, FolderItem *dest,
 
 
 static gint imap_do_remove_msgs(Folder *folder, FolderItem *dest, 
-                               MsgInfoList *msglist, GRelation *relation)
+                               MsgInfoList *msglist, GHashTable *relation)
 {
        gchar *destdir, *dir;
        GSList *numlist = NULL, *cur;
        MsgInfo *msginfo;
        IMAPSession *session;
        gint ok = MAILIMAP_NO_ERROR;
-       GRelation *uid_mapping;
        
        g_return_val_if_fail(folder != NULL, -1);
        g_return_val_if_fail(dest != NULL, -1);
@@ -1986,9 +1987,6 @@ static gint imap_do_remove_msgs(Folder *folder, FolderItem *dest,
        }
        numlist = g_slist_reverse(numlist);
 
-       uid_mapping = g_relation_new(2);
-       g_relation_index(uid_mapping, 0, g_direct_hash, g_direct_equal);
-
        if (numlist != NULL) {
                ok = imap_set_message_flags
                        (session, IMAP_FOLDER_ITEM(msginfo->folder), numlist, IMAP_FLAG_DELETED, NULL, TRUE);
@@ -2017,7 +2015,6 @@ static gint imap_do_remove_msgs(Folder *folder, FolderItem *dest,
        }
        g_free(dir);
 
-       g_relation_destroy(uid_mapping);
        g_slist_free(numlist);
 
        imap_scan_required(folder, dest);
@@ -2030,7 +2027,7 @@ static gint imap_do_remove_msgs(Folder *folder, FolderItem *dest,
 }
 
 static gint imap_remove_msgs(Folder *folder, FolderItem *dest, 
-                   MsgInfoList *msglist, GRelation *relation)
+                   MsgInfoList *msglist, GHashTable *relation)
 {
        MsgInfo *msginfo;
 
@@ -2112,7 +2109,7 @@ static gint imap_scan_tree_real(Folder *folder, gboolean subs_only)
                                       &lep_list);
 
                if (r != MAILIMAP_NO_ERROR)
-                       imap_handle_error(SESSION(session), r);
+                       imap_handle_error(SESSION(session), NULL, r);
 
                if ((r != MAILIMAP_NO_ERROR) || (clist_count(lep_list) == 0)) {
                        if (!folder->node) {
@@ -2211,7 +2208,7 @@ static gint imap_scan_tree_recursive(IMAPSession *session, FolderItem *item, gbo
                r = imap_threaded_list(folder, "", wildcard_path, &lep_list);
 
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                item_list = NULL;
                g_free(real_path);
                return r;
@@ -2650,7 +2647,7 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
                argbuf = g_ptr_array_new();
                r = imap_threaded_list(folder, "", imap_path, &lep_list);
                if (r != MAILIMAP_NO_ERROR) {
-                       imap_handle_error(SESSION(session), r);
+                       imap_handle_error(SESSION(session), NULL, r);
                        log_warning(LOG_PROTOCOL, _("can't create mailbox: LIST failed\n"));
                        g_free(imap_path);
                        g_free(dirpath);
@@ -2683,7 +2680,7 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
                                } 
                                mailimap_list_result_free(lep_list);
                        } else {
-                               imap_handle_error(SESSION(session), r);
+                               imap_handle_error(SESSION(session), NULL, r);
                        }
                }
                imap_threaded_subscribe(folder, imap_path, TRUE);
@@ -2703,7 +2700,7 @@ static FolderItem *imap_create_folder(Folder *folder, FolderItem *parent,
                        } 
                        mailimap_list_result_free(lep_list);
                } else {
-                       imap_handle_error(SESSION(session), r);
+                       imap_handle_error(SESSION(session), NULL, r);
                }
        }
 
@@ -2988,7 +2985,7 @@ static void *imap_get_uncached_messages_thread(void *data)
                r = imap_threaded_fetch_env(session->folder,
                                            imapset, &env_list);
                if (r != MAILIMAP_NO_ERROR) {
-                       imap_handle_error(SESSION(session), r);
+                       imap_handle_error(SESSION(session), NULL, r);
                        if (is_fatal(r)) {
                                stuff->ok = r;
                                return NULL;
@@ -3196,7 +3193,7 @@ static gchar imap_refresh_path_separator(IMAPSession *session, IMAPFolder *folde
        r = imap_threaded_list((Folder *)folder, "", subfolder, &lep_list);
        
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                log_warning(LOG_PROTOCOL, _("LIST failed\n"));
                *ok = r;
                return '\0';
@@ -3456,7 +3453,7 @@ static gint imap_status(IMAPSession *session, IMAPFolder *folder,
 
        g_free(real_path);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("status err %d\n", r);
                return r;
        }
@@ -3545,7 +3542,7 @@ static gint imap_cmd_login(IMAPSession *session,
                                /* refresh capas */
                                imap_free_capabilities(session);
                                if ((r = imap_get_capabilities(session)) != MAILIMAP_NO_ERROR) {
-                                       imap_handle_error(SESSION(session), r);
+                                       imap_handle_error(SESSION(session), NULL, r);
                                        log_warning(LOG_PROTOCOL, _("Can't refresh capabilities.\n"));
                                        return r;
                                }
@@ -3570,7 +3567,7 @@ static gint imap_cmd_login(IMAPSession *session,
                        type);
        r = imap_threaded_login(session->folder, user, pass, type);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                log_print(LOG_PROTOCOL, "IMAP4< Error logging in to %s\n",
                                SESSION(session)->server);
                ok = r;
@@ -3589,7 +3586,7 @@ static gint imap_cmd_noop(IMAPSession *session)
        
        r = imap_threaded_noop(session->folder, &exists, &recent, &expunge, &unseen, &uidnext, &uidval);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("noop err %d\n", r);
                return r;
        }
@@ -3629,7 +3626,7 @@ static gint imap_cmd_starttls(IMAPSession *session)
        r = imap_threaded_starttls(session->folder, 
                SESSION(session)->server, SESSION(session)->port);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("starttls err %d\n", r);
                return r;
        }
@@ -3647,7 +3644,7 @@ static gint imap_cmd_select(IMAPSession *session, const gchar *folder,
        r = imap_threaded_select(session->folder, folder,
                                 exists, recent, unseen, uid_validity, can_create_flags, ok_flags);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("select err %d\n", r);
                return r;
        }
@@ -3660,7 +3657,7 @@ static gint imap_cmd_close(IMAPSession *session)
 
        r = imap_threaded_close(session->folder);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("close err %d\n", r);
                return r;
        }
@@ -3681,7 +3678,7 @@ static gint imap_cmd_examine(IMAPSession *session, const gchar *folder,
        r = imap_threaded_examine(session->folder, folder,
                                  exists, recent, unseen, uid_validity);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("examine err %d\n", r);
                
                return r;
@@ -3695,7 +3692,7 @@ static gint imap_cmd_create(IMAPSession *session, const gchar *folder)
 
        r = imap_threaded_create(session->folder, folder);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return r;
        }
 
@@ -3710,7 +3707,7 @@ static gint imap_cmd_rename(IMAPSession *session, const gchar *old_folder,
        r = imap_threaded_rename(session->folder, old_folder,
                                 new_folder);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return r;
        }
 
@@ -3724,7 +3721,7 @@ static gint imap_cmd_delete(IMAPSession *session, const gchar *folder)
 
        r = imap_threaded_delete(session->folder, folder);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return r;
        }
 
@@ -3757,7 +3754,7 @@ static void *imap_cmd_fetch_thread(void *data)
                                                uid, 0, filename);
        }
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("fetch err %d\n", r);
                return GINT_TO_POINTER(r);
        }
@@ -3810,7 +3807,7 @@ static gint imap_cmd_append(IMAPSession *session,
        mailimap_flag_list_free(flag_list);
 
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                debug_print("append err %d\n", r);
                return r;
        }
@@ -3821,7 +3818,7 @@ static gint imap_cmd_append(IMAPSession *session,
 }
 
 static gint imap_cmd_copy(IMAPSession *session, struct mailimap_set * set,
-                         const gchar *destfolder, GRelation *uid_mapping,
+                         const gchar *destfolder,
                          struct mailimap_set **source, struct mailimap_set **dest)
 {
        int r;
@@ -3832,7 +3829,7 @@ static gint imap_cmd_copy(IMAPSession *session, struct mailimap_set * set,
 
        r = imap_threaded_copy(session->folder, set, destfolder, source, dest);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return r;
        }
 
@@ -3860,7 +3857,7 @@ static gint imap_cmd_store(IMAPSession *session,
        r = imap_threaded_store(session->folder, set, store_att_flags);
        mailimap_store_att_flags_free(store_att_flags);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return r;
        }
        
@@ -3883,7 +3880,7 @@ static gint imap_cmd_expunge(IMAPSession *session, gboolean do_expunge)
 
        r = imap_threaded_expunge(session->folder);
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return r;
        }
 
@@ -3992,7 +3989,7 @@ static gint get_list_of_uids(IMAPSession *session, Folder *folder, IMAPFolderIte
        } else {
                carray * lep_uidtab;
                if (r != -1) { /* inited */
-                       imap_handle_error(SESSION(session), r);
+                       imap_handle_error(SESSION(session), NULL, r);
                        if (is_fatal(r))
                                return -1;
                }
@@ -4007,7 +4004,7 @@ static gint get_list_of_uids(IMAPSession *session, Folder *folder, IMAPFolderIte
        }
        
        if (r != MAILIMAP_NO_ERROR) {
-               imap_handle_error(SESSION(session), r);
+               imap_handle_error(SESSION(session), NULL, r);
                return -1;
        }
 
@@ -4549,7 +4546,7 @@ typedef struct _get_flags_data {
        Folder *folder;
        FolderItem *item;
        MsgInfoList *msginfo_list;
-       GRelation *msgflags;
+       GHashTable *msgflags;
        gboolean full_search;
        gboolean done;
 } get_flags_data;
@@ -4560,7 +4557,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
        Folder *folder = stuff->folder;
        FolderItem *fitem = (FolderItem *) stuff->item;
        MsgInfoList *msginfo_list = stuff->msginfo_list;
-       GRelation *msgflags = stuff->msgflags;
+       GHashTable *msgflags = stuff->msgflags;
        GSList *elem;
        carray * lep_uidtab;
        IMAPSession *session;
@@ -4636,7 +4633,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
 
                                unseen = g_slist_concat(unseen, uidlist);
                        } else {
-                               imap_handle_error(SESSION(session), r);
+                               imap_handle_error(SESSION(session), NULL, r);
                                goto bail;
                        }
 
@@ -4650,7 +4647,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
 
                                flagged = g_slist_concat(flagged, uidlist);
                        } else {
-                               imap_handle_error(SESSION(session), r);
+                               imap_handle_error(SESSION(session), NULL, r);
                                goto bail;
                        }
 
@@ -4665,7 +4662,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
 
                                        answered = g_slist_concat(answered, uidlist);
                                } else {
-                                       imap_handle_error(SESSION(session), r);
+                                       imap_handle_error(SESSION(session), NULL, r);
                                        goto bail;
                                }
 
@@ -4680,7 +4677,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
 
                                                forwarded = g_slist_concat(forwarded, uidlist);
                                        } else {
-                                               imap_handle_error(SESSION(session), r);
+                                               imap_handle_error(SESSION(session), NULL, r);
                                                goto bail;
                                        }
                                }
@@ -4696,7 +4693,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
 
                                                spam = g_slist_concat(spam, uidlist);
                                        } else {
-                                               imap_handle_error(SESSION(session), r);
+                                               imap_handle_error(SESSION(session), NULL, r);
                                                goto bail;
                                        }
                                }
@@ -4711,7 +4708,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
 
                                        deleted = g_slist_concat(deleted, uidlist);
                                } else {
-                                       imap_handle_error(SESSION(session), r);
+                                       imap_handle_error(SESSION(session), NULL, r);
                                        goto bail;
                                }
                        }
@@ -4725,7 +4722,7 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
                        imap_flags_hash_from_lep_uid_flags_tab(lep_uidtab, flags_hash, tags_hash);
                        imap_fetch_uid_flags_list_free(lep_uidtab);
                } else {
-                       imap_handle_error(SESSION(session), r);
+                       imap_handle_error(SESSION(session), NULL, r);
                        goto bail;
                }
        }
@@ -4824,7 +4821,7 @@ bail:
                        }
                }
 
-               g_relation_insert(msgflags, msginfo, GINT_TO_POINTER(flags));
+               g_hash_table_insert(msgflags, msginfo, GINT_TO_POINTER(flags));
        }
        
        if (got_alien_tags) {
@@ -4851,7 +4848,7 @@ bail:
 }
 
 static gint imap_get_flags(Folder *folder, FolderItem *item,
-                           MsgInfoList *msginfo_list, GRelation *msgflags)
+                           MsgInfoList *msginfo_list, GHashTable *msgflags)
 {
        gint result;
        get_flags_data *data = g_new0(get_flags_data, 1);
@@ -5407,7 +5404,7 @@ void imap_folder_ref(Folder *folder)
        ((IMAPFolder *)folder)->refcnt++;
 }
 
-void imap_disconnect_all(void)
+void imap_disconnect_all(gboolean have_connectivity)
 {
        GList *list;
        gboolean short_timeout;
@@ -5435,7 +5432,8 @@ void imap_disconnect_all(void)
                        RemoteFolder *folder = (RemoteFolder *)account->folder;
                        if (folder && folder->session) {
                                IMAPSession *session = (IMAPSession *)folder->session;
-                               imap_threaded_disconnect(FOLDER(folder));
+                               if (have_connectivity)
+                                       imap_threaded_disconnect(FOLDER(folder));
                                SESSION(session)->state = SESSION_DISCONNECTED;
                                SESSION(session)->sock = NULL;
                                session_destroy(SESSION(session));
@@ -5580,7 +5578,7 @@ FolderClass *imap_get_class(void)
        return &imap_class;
 }
 
-void imap_disconnect_all(void)
+void imap_disconnect_all(gboolean have_connectivity)
 {
 }
 
@@ -5698,7 +5696,7 @@ char* imap_modified_utf7_to_utf8(const char *mbox, gboolean change_spaces)
   unsigned long ucs4, utf16, bitbuf;
   unsigned char base64[256];
   const char *src;
-  char *dst, *res  = malloc(2*strlen(mbox)+1);
+  char *dst, *res  = g_malloc(2*strlen(mbox)+1);
 
   bitbuf = 0;
   dst = res;