2011-02-11 [mones] 3.7.8cvs53
[claws.git] / src / imap.c
index 828133de353c6c87d6b2a77b4a358a9b49aa78b7..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,
@@ -409,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);
@@ -560,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;
@@ -829,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);
@@ -1099,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"),
@@ -1571,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;
@@ -1666,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) {
@@ -1726,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;
@@ -1859,7 +1865,7 @@ static gint imap_do_copy_msgs(Folder *folder, FolderItem *dest,
                
                if (hashval != NULL) {
                        gint num = GPOINTER_TO_INT(hashval);
-                       g_relation_insert(relation, msginfo,
+                       g_hash_table_insert(relation, msginfo,
                                          GINT_TO_POINTER(num));
                        if (num > last_num)
                                last_num = num;
@@ -1888,7 +1894,7 @@ 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));
        }
        statusbar_pop_all();
@@ -1923,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;
@@ -1941,7 +1947,7 @@ 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;
@@ -2021,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;
 
@@ -2103,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) {
@@ -2202,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;
@@ -2641,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);
@@ -2674,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);
@@ -2694,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);
                }
        }
 
@@ -2979,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;
@@ -3187,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';
@@ -3447,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;
        }
@@ -3536,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;
                                }
@@ -3561,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;
@@ -3580,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;
        }
@@ -3620,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;
        }
@@ -3638,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;
        }
@@ -3651,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;
        }
@@ -3672,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;
@@ -3686,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;
        }
 
@@ -3701,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;
        }
 
@@ -3715,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;
        }
 
@@ -3748,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);
        }
@@ -3801,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;
        }
@@ -3823,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;
        }
 
@@ -3851,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;
        }
        
@@ -3874,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;
        }
 
@@ -3983,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;
                }
@@ -3998,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;
        }
 
@@ -4540,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;
@@ -4551,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;
@@ -4627,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;
                        }
 
@@ -4641,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;
                        }
 
@@ -4656,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;
                                }
 
@@ -4671,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;
                                        }
                                }
@@ -4687,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;
                                        }
                                }
@@ -4702,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;
                                }
                        }
@@ -4716,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;
                }
        }
@@ -4815,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) {
@@ -4842,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);
@@ -5398,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;
@@ -5426,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));
@@ -5571,7 +5578,7 @@ FolderClass *imap_get_class(void)
        return &imap_class;
 }
 
-void imap_disconnect_all(void)
+void imap_disconnect_all(gboolean have_connectivity)
 {
 }
 
@@ -5689,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;