2005-10-03 [colin] 1.9.15cvs1
[claws.git] / src / imap.c
index 3e33680fc3519cdd76a3bbce49ca02f7d3ab9c8c..9a59040844c456db6101d1bd24ce6f1a117e7fea 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -29,6 +29,7 @@
 #include <string.h>
 #include "imap.h"
 #include "imap_gtk.h"
+#include "inc.h"
 
 #ifdef HAVE_LIBETPAN
 
@@ -606,8 +607,15 @@ static gint imap_auth(IMAPSession *session, const gchar *user, const gchar *pass
                }
                
                if (time(NULL) - last_login_err > 10) {
-                       alertpanel_error(_("Connection to %s failed: login refused.%s"),
+                       if (!prefs_common.no_recv_err_panel) {
+                               alertpanel_error(_("Connection to %s failed: "
+                                       "login refused.%s"),
                                        SESSION(session)->server, ext_info);
+                       } else {
+                               log_error(_("Connection to %s failed: "
+                                       "login refused.%s\n"),
+                                       SESSION(session)->server, ext_info);
+                       }
                }
                last_login_err = time(NULL);
        }
@@ -655,7 +663,7 @@ static IMAPSession *imap_session_get(Folder *folder)
        g_return_val_if_fail(FOLDER_CLASS(folder) == &imap_class, NULL);
        g_return_val_if_fail(folder->account != NULL, NULL);
        
-       if (prefs_common.work_offline && !imap_gtk_should_override()) {
+       if (prefs_common.work_offline && !inc_offline_should_override()) {
                return NULL;
        }
 
@@ -722,6 +730,20 @@ static IMAPSession *imap_session_new(Folder * folder,
                : account->ssl_imap == SSL_TUNNEL ? IMAPS_PORT : IMAP4_PORT;
        ssl_type = account->ssl_imap;   
 #else
+       if (account->ssl_imap != SSL_NONE) {
+               if (alertpanel_full(_("Insecure connection"),
+                       _("This connection is configured to be secured "
+                         "using SSL, but SSL is not available in this "
+                         "build of Sylpheed-Claws. \n\n"
+                         "Do you want to continue connecting to this "
+                         "server? The communication would not be "
+                         "secure."),
+                         _("Con_tinue connecting"), 
+                         GTK_STOCK_CANCEL, NULL,
+                         FALSE, NULL, ALERT_WARNING,
+                         G_ALERTALTERNATE) != G_ALERTDEFAULT)
+                       return NULL;
+       }
        port = account->set_imapport ? account->imapport
                : IMAP4_PORT;
 #endif
@@ -762,7 +784,7 @@ static IMAPSession *imap_session_new(Folder * folder,
                        alertpanel_error(_("Can't connect to IMAP4 server: %s:%d"),
                                         account->recv_server, port);
                } else {
-                       log_error(_("Can't connect to IMAP4 server: %s:%d"),
+                       log_error(_("Can't connect to IMAP4 server: %s:%d\n"),
                                         account->recv_server, port);
                } 
                
@@ -990,7 +1012,8 @@ static gint imap_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
        for (cur = file_list; cur != NULL; cur = cur->next) {
                IMAPFlags iflags = 0;
                guint32 new_uid = 0;
-
+               gchar *real_file = NULL;
+               gboolean file_is_tmp = FALSE;
                fileinfo = (MsgFileInfo *)cur->data;
 
                if (fileinfo->flags) {
@@ -1001,18 +1024,40 @@ static gint imap_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
                        if (!MSG_IS_UNREAD(*fileinfo->flags))
                                iflags |= IMAP_FLAG_SEEN;
                }
-
+               
+               if (fileinfo->flags) {
+                       if ((MSG_IS_QUEUED(*fileinfo->flags) 
+                            || MSG_IS_DRAFT(*fileinfo->flags))
+                       && !folder_has_parent_of_type(dest, F_QUEUE)
+                       && !folder_has_parent_of_type(dest, F_DRAFT)) {
+                               real_file = get_tmp_file();
+                               file_is_tmp = TRUE;
+                               if (procmsg_remove_special_headers(
+                                               fileinfo->file, 
+                                               real_file) !=0) {
+                                       g_free(real_file);
+                                       g_free(destdir);
+                                       return -1;
+                               }
+                       } 
+               }
+               if (real_file == NULL)
+                       real_file = g_strdup(fileinfo->file);
+               
                if (folder_has_parent_of_type(dest, F_QUEUE) ||
                    folder_has_parent_of_type(dest, F_OUTBOX) ||
                    folder_has_parent_of_type(dest, F_DRAFT) ||
                    folder_has_parent_of_type(dest, F_TRASH))
                        iflags |= IMAP_FLAG_SEEN;
 
-               ok = imap_cmd_append(session, destdir, fileinfo->file, iflags, 
+               ok = imap_cmd_append(session, destdir, real_file, iflags, 
                                     &new_uid);
 
                if (ok != IMAP_SUCCESS) {
-                       g_warning("can't append message %s\n", fileinfo->file);
+                       g_warning("can't append message %s\n", real_file);
+                       if (file_is_tmp)
+                               g_unlink(real_file);
+                       g_free(real_file);
                        g_free(destdir);
                        return -1;
                }
@@ -1023,6 +1068,8 @@ static gint imap_add_msgs(Folder *folder, FolderItem *dest, GSList *file_list,
                                          GINT_TO_POINTER(dest->last_num + 1));
                if (last_uid < new_uid)
                        last_uid = new_uid;
+               if (file_is_tmp)
+                       g_unlink(real_file);
        }
 
        g_free(destdir);
@@ -1147,7 +1194,9 @@ static gint imap_copy_msgs(Folder *folder, FolderItem *dest,
        msginfo = (MsgInfo *)msglist->data;
        g_return_val_if_fail(msginfo->folder != NULL, -1);
 
-       if (folder == msginfo->folder->folder) {
+       if (folder == msginfo->folder->folder &&
+           !folder_has_parent_of_type(msginfo->folder, F_DRAFT) &&
+           !folder_has_parent_of_type(msginfo->folder, F_QUEUE)) {
                ret = imap_do_copy_msgs(folder, dest, msglist, relation);
                return ret;
        }
@@ -1940,7 +1989,7 @@ static GSList *imap_get_uncached_messages(IMAPSession *session,
                data->numlist = newlist;
                data->cur += count;
                
-               if (prefs_common.work_offline && !imap_gtk_should_override()) {
+               if (prefs_common.work_offline && !inc_offline_should_override()) {
                        g_free(data);
                        return NULL;
                }
@@ -2445,7 +2494,7 @@ static gint imap_cmd_fetch(IMAPSession *session, guint32 uid,
        data->headers = headers;
        data->body = body;
 
-       if (prefs_common.work_offline && !imap_gtk_should_override()) {
+       if (prefs_common.work_offline && !inc_offline_should_override()) {
                g_free(data);
                return -1;
        }
@@ -2530,7 +2579,7 @@ static gint imap_cmd_expunge(IMAPSession *session)
 {
        int r;
        
-       if (prefs_common.work_offline && !imap_gtk_should_override()) {
+       if (prefs_common.work_offline && !inc_offline_should_override()) {
                return -1;
        }
 
@@ -2859,7 +2908,7 @@ static gint get_list_of_uids(Folder *folder, IMAPFolderItem *item, GSList **msgn
        data->item = item;
        data->msgnum_list = msgnum_list;
 
-       if (prefs_common.work_offline && !imap_gtk_should_override()) {
+       if (prefs_common.work_offline && !inc_offline_should_override()) {
                g_free(data);
                return -1;
        }
@@ -2880,8 +2929,6 @@ gint imap_get_num_list(Folder *folder, FolderItem *_item, GSList **msgnum_list,
        gboolean selected_folder;
        
        debug_print("get_num_list\n");
-       statusbar_print_all("Scanning %s...\n", FOLDER_ITEM(item)->path 
-                               ? FOLDER_ITEM(item)->path:"");
        
        g_return_val_if_fail(folder != NULL, -1);
        g_return_val_if_fail(item != NULL, -1);
@@ -2892,6 +2939,9 @@ gint imap_get_num_list(Folder *folder, FolderItem *_item, GSList **msgnum_list,
        session = imap_session_get(folder);
        g_return_val_if_fail(session != NULL, -1);
 
+       statusbar_print_all("Scanning %s...\n", FOLDER_ITEM(item)->path 
+                               ? FOLDER_ITEM(item)->path:"");
+
        selected_folder = (session->mbox != NULL) &&
                          (!strcmp(session->mbox, item->item.path));
        if (selected_folder) {
@@ -3194,7 +3244,12 @@ void imap_change_flags(Folder *folder, FolderItem *item, MsgInfo *msginfo, MsgPe
        if (!MSG_IS_REPLIED(msginfo->flags) &&  (newflags & MSG_REPLIED))
                flags_set |= IMAP_FLAG_ANSWERED;
        if ( MSG_IS_REPLIED(msginfo->flags) && !(newflags & MSG_REPLIED))
-               flags_set |= IMAP_FLAG_ANSWERED;
+               flags_unset |= IMAP_FLAG_ANSWERED;
+
+       if (!MSG_IS_DELETED(msginfo->flags) &&  (newflags & MSG_DELETED))
+               flags_set |= IMAP_FLAG_DELETED;
+       if ( MSG_IS_DELETED(msginfo->flags) && !(newflags & MSG_DELETED))
+               flags_unset |= IMAP_FLAG_DELETED;
 
        numlist.next = NULL;
        numlist.data = GINT_TO_POINTER(msginfo->msgnum);
@@ -3345,8 +3400,8 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
        GRelation *msgflags = stuff->msgflags;
        IMAPSession *session;
        GSList *sorted_list;
-       GSList *unseen = NULL, *answered = NULL, *flagged = NULL;
-       GSList *p_unseen, *p_answered, *p_flagged;
+       GSList *unseen = NULL, *answered = NULL, *flagged = NULL, *deleted = NULL;
+       GSList *p_unseen, *p_answered, *p_flagged, *p_deleted;
        GSList *elem;
        GSList *seq_list, *cur;
        gboolean reverse_seen = FALSE;
@@ -3443,11 +3498,23 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
                        
                        flagged = g_slist_concat(flagged, uidlist);
                }
+               
+               r = imap_threaded_search(folder, IMAP_SEARCH_TYPE_DELETED,
+                                        imapset, &lep_uidlist);
+               if (r == MAILIMAP_NO_ERROR) {
+                       GSList * uidlist;
+                       
+                       uidlist = imap_uid_list_from_lep(lep_uidlist);
+                       mailimap_search_result_free(lep_uidlist);
+                       
+                       deleted = g_slist_concat(deleted, uidlist);
+               }
        }
 
        p_unseen = unseen;
        p_answered = answered;
        p_flagged = flagged;
+       p_deleted = deleted;
 
        for (elem = sorted_list; elem != NULL; elem = g_slist_next(elem)) {
                MsgInfo *msginfo;
@@ -3469,13 +3536,22 @@ static /*gint*/ void *imap_get_flags_thread(void *data)
                }
                if (gslist_find_next_num(&p_answered, msginfo->msgnum) == msginfo->msgnum)
                        flags |= MSG_REPLIED;
+               else
+                       flags &= ~MSG_REPLIED;
                if (gslist_find_next_num(&p_flagged, msginfo->msgnum) == msginfo->msgnum)
                        flags |= MSG_MARKED;
+               else
+                       flags &= ~MSG_MARKED;
+               if (gslist_find_next_num(&p_deleted, msginfo->msgnum) == msginfo->msgnum)
+                       flags |= MSG_DELETED;
+               else
+                       flags &= ~MSG_DELETED;
                g_relation_insert(msgflags, msginfo, GINT_TO_POINTER(flags));
        }
 
        imap_lep_set_free(seq_list);
        g_slist_free(flagged);
+       g_slist_free(deleted);
        g_slist_free(answered);
        g_slist_free(unseen);
        g_slist_free(sorted_list);
@@ -3496,7 +3572,7 @@ static gint imap_get_flags(Folder *folder, FolderItem *item,
        data->msginfo_list = msginfo_list;
        data->msgflags = msgflags;
 
-       if (prefs_common.work_offline && !imap_gtk_should_override()) {
+       if (prefs_common.work_offline && !inc_offline_should_override()) {
                g_free(data);
                return -1;
        }