fixed local account
[claws.git] / src / procmsg.c
index 746349234af12fc137f1d065654894871bb30196..b9881cfdf053d2d6f7596b4bbdc5c58d2428874e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2001 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2002 Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,6 +34,9 @@
 #include "folder.h"
 #include "prefs_common.h"
 #include "account.h"
+#if USE_GPGME
+#  include "rfc2015.h"
+#endif
 
 typedef struct _FlagInfo       FlagInfo;
 
@@ -396,30 +399,43 @@ struct MarkSum {
        gint *new;
        gint *unread;
        gint *total;
+       gint *min;
+       gint *max;
+       gint first;
 };
 
 static void mark_sum_func(gpointer key, gpointer value, gpointer data)
 {
        MsgFlags *flags = value;
+       gint num = GPOINTER_TO_INT(key);
        struct MarkSum *marksum = data;
 
-       if (MSG_IS_NEW(*flags) && !MSG_IS_IGNORE_THREAD(*flags)) (*marksum->new)++;
-       if (MSG_IS_UNREAD(*flags) && !MSG_IS_IGNORE_THREAD(*flags)) (*marksum->unread)++;
-       (*marksum->total)++;
+       if (marksum->first <= num) {
+               if (MSG_IS_NEW(*flags) && !MSG_IS_IGNORE_THREAD(*flags)) (*marksum->new)++;
+               if (MSG_IS_UNREAD(*flags) && !MSG_IS_IGNORE_THREAD(*flags)) (*marksum->unread)++;
+               if (num > *marksum->max) *marksum->max = num;
+               if (num < *marksum->min || *marksum->min == 0) *marksum->min = num;
+               (*marksum->total)++;
+       }
 
        g_free(flags);
 }
 
 void procmsg_get_mark_sum(const gchar *folder,
-                         gint *new, gint *unread, gint *total)
+                         gint *new, gint *unread, gint *total,
+                         gint *min, gint *max,
+                         gint first)
 {
        GHashTable *mark_table;
        struct MarkSum marksum;
 
-       *new = *unread = *total = 0;
+       *new = *unread = *total = *min = *max = 0;
        marksum.new    = new;
        marksum.unread = unread;
        marksum.total  = total;
+       marksum.min    = min;
+       marksum.max    = max;
+       marksum.first  = first;
 
        mark_table = procmsg_read_mark_file(folder);
 
@@ -445,7 +461,7 @@ static GHashTable *procmsg_read_mark_file(const gchar *folder)
        mark_table = g_hash_table_new(NULL, g_direct_equal);
 
        while (fread(&num, sizeof(num), 1, fp) == 1) {
-               if (fread(&perm_flags, sizeof(flags), 1, fp) != 1) break;
+               if (fread(&perm_flags, sizeof(perm_flags), 1, fp) != 1) break;
 
                flags = g_new0(MsgFlags, 1);
                flags->perm_flags = perm_flags;
@@ -710,6 +726,12 @@ FILE *procmsg_open_message(MsgInfo *msginfo)
        file = procmsg_get_message_file_path(msginfo);
        g_return_val_if_fail(file != NULL, NULL);
 
+       if (!is_file_exist(file)) {
+               g_free(file);
+               file = procmsg_get_message_file(msginfo);
+               g_return_val_if_fail(file != NULL, NULL);
+       }
+
        if ((fp = fopen(file, "r")) == NULL) {
                FILE_OP_ERROR(file, "fopen");
                g_free(file);
@@ -728,6 +750,52 @@ FILE *procmsg_open_message(MsgInfo *msginfo)
        return fp;
 }
 
+#if USE_GPGME
+FILE *procmsg_open_message_decrypted(MsgInfo *msginfo, MimeInfo **mimeinfo)
+{
+       FILE *fp;
+       MimeInfo *mimeinfo_;
+
+       g_return_val_if_fail(msginfo != NULL, NULL);
+
+       if (mimeinfo) *mimeinfo = NULL;
+
+       if ((fp = procmsg_open_message(msginfo)) == NULL) return NULL;
+
+       mimeinfo_ = procmime_scan_mime_header(fp);
+       if (!mimeinfo_) {
+               fclose(fp);
+               return NULL;
+       }
+
+       if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
+           rfc2015_is_encrypted(mimeinfo_)) {
+               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_ENCRYPTED);
+       }
+
+       if (MSG_IS_ENCRYPTED(msginfo->flags) &&
+           !msginfo->plaintext_file &&
+           !msginfo->decryption_failed) {
+               rfc2015_decrypt_message(msginfo, mimeinfo_, fp);
+               if (msginfo->plaintext_file &&
+                   !msginfo->decryption_failed) {
+                       fclose(fp);
+                       procmime_mimeinfo_free_all(mimeinfo_);
+                       if ((fp = procmsg_open_message(msginfo)) == NULL)
+                               return NULL;
+                       mimeinfo_ = procmime_scan_mime_header(fp);
+                       if (!mimeinfo_) {
+                               fclose(fp);
+                               return NULL;
+                       }
+               }
+       }
+
+       if (mimeinfo) *mimeinfo = mimeinfo_;
+       return fp;
+}
+#endif
+
 gboolean procmsg_msg_exist(MsgInfo *msginfo)
 {
        gchar *path;
@@ -1046,6 +1114,9 @@ gint procmsg_send_message_queue(const gchar *file)
                if(!from) {
                        g_warning(_("Queued message header is broken.\n"));
                        mailval = -1;
+               } else if (mailac && mailac->use_mail_command &&
+                          mailac->mail_command && (* mailac->mail_command)) {
+                       mailval = send_message_local(mailac->mail_command, fp);
                } else if (prefs_common.use_extsend && prefs_common.extsend_cmd) {
                        mailval = send_message_local(prefs_common.extsend_cmd, fp);
                } else {
@@ -1072,23 +1143,24 @@ gint procmsg_send_message_queue(const gchar *file)
                                mailval = send_message_smtp(&tmp_ac, to_list, fp);
                        }
                }
+               if (mailval < 0) {
+                       alertpanel_error(_("Error occurred while sending the message to %s ."),
+                                 mailac ? mailac->smtp_server : smtpserver);
+               }
        }
 
-       if(newsgroup_list) {
+       if(newsgroup_list && (newsval == 0)) {
                Folder *folder;
 
                debug_print(_("Sending message by news\n"));
 
                folder = FOLDER(newsac->folder);
 
-               if(newsval == 0) {
-                       newsval = news_post(folder, tmp);
-                       if (newsval < 0) {
-                               alertpanel_error(_("Error occurred while posting the message to %s ."),
-                                         newsac->nntp_server);
-                       }
-               }
-
+               newsval = news_post(folder, tmp);
+               if (newsval < 0) {
+                       alertpanel_error(_("Error occurred while posting the message to %s ."),
+                                 newsac->nntp_server);
+               }
        }
 
        /* save message to outbox */