* src/imap.c
[claws.git] / src / imap.c
index a193a3df93535d898a9b1e8b9bcecd68cd3fbbb8..ce77e618167af2f1777fe6d2145cf3eb0cb33bbe 100644 (file)
@@ -286,7 +286,7 @@ static gboolean imap_rename_folder_func             (GNode          *node,
 gint imap_get_num_list                         (Folder         *folder,
                                                 FolderItem     *item,
                                                 GSList        **list);
-MsgInfo *imap_fetch_msginfo                    (Folder         *folder,
+MsgInfo *imap_get_msginfo                      (Folder         *folder,
                                                 FolderItem     *item,
                                                 gint            num);
 gboolean imap_check_msgnum_validity            (Folder         *folder,
@@ -348,7 +348,7 @@ static void imap_folder_init(Folder *folder, const gchar *name,
        folder->check_msgnum_validity = imap_check_msgnum_validity;
 
        folder->get_num_list          = imap_get_num_list;
-       folder->fetch_msginfo         = imap_fetch_msginfo;
+       folder->get_msginfo           = imap_get_msginfo;
        
        ((IMAPFolder *)folder)->selected_folder = NULL;
 }
@@ -763,10 +763,10 @@ static gint imap_do_copy(Folder *folder, FolderItem *dest, MsgInfo *msginfo,
 {
        gchar *destdir;
        IMAPSession *session;
-       gint messages, recent, unseen;
+       gint messages, recent, unseen, exists;
        guint32 uid_next, uid_validity;
        gint ok;
-
+    
        g_return_val_if_fail(folder != NULL, -1);
        g_return_val_if_fail(folder->type == F_IMAP, -1);
        g_return_val_if_fail(dest != NULL, -1);
@@ -790,7 +790,17 @@ static gint imap_do_copy(Folder *folder, FolderItem *dest, MsgInfo *msginfo,
 
        destdir = imap_get_real_path(IMAP_FOLDER(folder), dest->path);
 
-       if (remove_source)
+    /* ensure source folder selected */
+    if (strcmp(((IMAPFolder *)folder)->selected_folder, 
+                    msginfo->folder->path) != 0) {
+           ok = imap_select(session, IMAP_FOLDER(folder), msginfo->folder->path,
+                            &exists, &recent, &unseen, &uid_validity);
+           statusbar_pop_all();
+           if (ok != IMAP_SUCCESS)
+                   return -1;
+    }
+        
+    if (remove_source)
                debug_print("Moving message %s%c%d to %s ...\n",
                            msginfo->folder->path, G_DIR_SEPARATOR,
                            msginfo->msgnum, destdir);
@@ -825,6 +835,8 @@ static gint imap_do_copy_msgs_with_dest(Folder *folder, FolderItem *dest,
        MsgInfo *msginfo;
        IMAPSession *session;
        gint ok = IMAP_SUCCESS;
+       gint exists, recent, unseen;
+       guint32 uid_validity;
 
        g_return_val_if_fail(folder != NULL, -1);
        g_return_val_if_fail(dest != NULL, -1);
@@ -843,6 +855,17 @@ static gint imap_do_copy_msgs_with_dest(Folder *folder, FolderItem *dest,
                        continue;
                }
 
+        /* ensure source folder selected */
+        if (strcmp(((IMAPFolder *)folder)->selected_folder, 
+                        msginfo->folder->path) != 0) {
+               ok = imap_select(session, IMAP_FOLDER(folder), 
+                    msginfo->folder->path, &exists, &recent, &unseen, 
+                    &uid_validity);
+               statusbar_pop_all();
+               if (ok != IMAP_SUCCESS)
+                       return -1;
+        }
+        
                if (remove_source)
                        debug_print("Moving message %s%c%d to %s ...\n",
                                    msginfo->folder->path, G_DIR_SEPARATOR,
@@ -3268,82 +3291,24 @@ gint imap_get_num_list(Folder *folder, FolderItem *_item, GSList **msgnum_list)
        return nummsgs;
 }
 
-MsgInfo *imap_fetch_msginfo(Folder *_folder, FolderItem *item, gint num)
+MsgInfo *imap_get_msginfo(Folder *folder, FolderItem *item, gint uid)
 {
-       IMAPFolder *folder = (IMAPFolder *)_folder;
-       gchar *tmp;
        IMAPSession *session;
-       GString *str;
-       MsgInfo *msginfo;
-       int same_folder;
-       
+       GSList *list;
+       MsgInfo *msginfo = NULL;
+
        g_return_val_if_fail(folder != NULL, NULL);
        g_return_val_if_fail(item != NULL, NULL);
-       g_return_val_if_fail(item->folder != NULL, NULL);
-       g_return_val_if_fail(item->folder->type == F_IMAP, NULL);
 
-       session = imap_session_get(_folder);
+       session = imap_session_get(folder);
        g_return_val_if_fail(session != NULL, NULL);
 
-       same_folder = FALSE;
-       if (folder->selected_folder != NULL)
-               if (strcmp(folder->selected_folder, item->path) == 0)
-                       same_folder = TRUE;
-       
-       if (!same_folder) {
-               gint ok, exists = 0, recent = 0, unseen = 0;
-               guint32 uid_validity = 0;
-
-               ok = imap_select(session, IMAP_FOLDER(folder), item->path,
-                                &exists, &recent, &unseen, &uid_validity);
-               if (ok != IMAP_SUCCESS)
-                       return NULL;
-       }
-       
-       if (imap_cmd_envelope(SESSION(session)->sock, num, num)
-           != IMAP_SUCCESS) {
-               log_warning(_("can't get envelope\n"));
-               return NULL;
-       }
-
-       str = g_string_new(NULL);
-
-       if ((tmp = sock_getline(SESSION(session)->sock)) == NULL) {
-               log_warning(_("error occurred while getting envelope.\n"));
-               g_string_free(str, TRUE);
-               return NULL;
-       }
-       strretchomp(tmp);
-       log_print("IMAP4< %s\n", tmp);
-       g_string_assign(str, tmp);
-       g_free(tmp);
-
-       /* if the server did not return a envelope */
-       if (str->str[0] != '*') {
-               g_string_free(str, TRUE);
-               return NULL;
-       }
-
-       msginfo = imap_parse_envelope(SESSION(session)->sock,
-                                     item, str);
-
-       /* Read all data on the socket until the server is read for a new command */
-       tmp = NULL;
-       do {
-               g_free(tmp);
-               tmp = sock_getline(SESSION(session)->sock);
-       } while (!(tmp == NULL || tmp[0] != '*' || tmp[1] != ' '));
-       g_free(tmp);
-
-       /* if message header could not be parsed */
-       if (!msginfo) {
-               log_warning(_("can't parse envelope: %s\n"), str->str);
-               return NULL;
+       list = imap_get_uncached_messages(session, item, uid, uid);
+       if (list) {
+               msginfo = (MsgInfo *)list->data;
+               list->data = NULL;
        }
-
-       g_string_free(str, TRUE);
-
-       msginfo->folder = item;
+       procmsg_msg_list_free(list);
 
        return msginfo;
 }