* src/procmsg.c
[claws.git] / src / procmsg.c
index b1ceec61f5cfb6cc2f0db2e55494ec3a5847ad6a..d7f5e89643c05b260a32fefe6bde3debb0d35c9b 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;
 
@@ -201,7 +204,7 @@ GSList *procmsg_read_cache(FolderItem *item, gboolean scan_file)
                g_free(path);
        }
        cache_file = folder_item_get_cache_file(item);
-       if ((fp = fopen(cache_file, "r")) == NULL) {
+       if ((fp = fopen(cache_file, "rb")) == NULL) {
                debug_print(_("\tNo cache file\n"));
                g_free(cache_file);
                return NULL;
@@ -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);
 
@@ -465,7 +481,7 @@ FILE *procmsg_open_mark_file(const gchar *folder, gboolean append)
 
        markfile = g_strconcat(folder, G_DIR_SEPARATOR_S, MARK_FILE, NULL);
 
-       if ((fp = fopen(markfile, "r")) == NULL)
+       if ((fp = fopen(markfile, "rb")) == NULL)
                debug_print(_("Mark file not found.\n"));
        else if (fread(&ver, sizeof(ver), 1, fp) != 1 || MARK_VERSION != ver) {
                debug_print(_("Mark version is different (%d != %d). "
@@ -483,12 +499,12 @@ FILE *procmsg_open_mark_file(const gchar *folder, gboolean append)
        if (fp) {
                /* reopen with append mode */
                fclose(fp);
-               if ((fp = fopen(markfile, "a")) == NULL)
+               if ((fp = fopen(markfile, "ab")) == NULL)
                        g_warning(_("Can't open mark file with append mode.\n"));
        } else {
                /* open with overwrite mode if mark file doesn't exist or
                   version is different */
-               if ((fp = fopen(markfile, "w")) == NULL)
+               if ((fp = fopen(markfile, "wb")) == NULL)
                        g_warning(_("Can't open mark file with write mode.\n"));
                else {
                        ver = MARK_VERSION;
@@ -716,7 +732,7 @@ FILE *procmsg_open_message(MsgInfo *msginfo)
                g_return_val_if_fail(file != NULL, NULL);
        }
 
-       if ((fp = fopen(file, "r")) == NULL) {
+       if ((fp = fopen(file, "rb")) == NULL) {
                FILE_OP_ERROR(file, "fopen");
                g_free(file);
                return NULL;
@@ -734,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;
@@ -809,7 +871,7 @@ void procmsg_print_message(MsgInfo *msginfo, const gchar *cmdline)
        prtmp = g_strdup_printf("%s%cprinttmp.%08x",
                                get_mime_tmp_dir(), G_DIR_SEPARATOR, id++);
 
-       if ((prfp = fopen(prtmp, "w")) == NULL) {
+       if ((prfp = fopen(prtmp, "wb")) == NULL) {
                FILE_OP_ERROR(prtmp, "fopen");
                g_free(prtmp);
                fclose(tmpfp);
@@ -983,10 +1045,11 @@ gint procmsg_send_message_queue(const gchar *file)
        gint hnum;
        PrefsAccount *mailac = NULL, *newsac = NULL;
        gchar *tmp = NULL;
+       int local = 0;
 
        g_return_val_if_fail(file != NULL, -1);
 
-       if ((fp = fopen(file, "r")) == NULL) {
+       if ((fp = fopen(file, "rb")) == NULL) {
                FILE_OP_ERROR(file, "fopen");
                return -1;
        }
@@ -1017,7 +1080,6 @@ gint procmsg_send_message_queue(const gchar *file)
                case Q_SAVE_COPY_FOLDER:
                        if (!savecopyfolder) savecopyfolder = g_strdup(p);
                        break;
-               default:
                }
        }
        filepos = ftell(fp);
@@ -1028,7 +1090,7 @@ gint procmsg_send_message_queue(const gchar *file)
                /* write to temporary file */
                tmp = g_strdup_printf("%s%ctmp%d", g_get_tmp_dir(),
                            G_DIR_SEPARATOR, (gint)file);
-               if ((tmpfp = fopen(tmp, "w")) == NULL) {
+               if ((tmpfp = fopen(tmp, "wb")) == NULL) {
                        FILE_OP_ERROR(tmp, "fopen");
                        newsval = -1;
                }
@@ -1052,8 +1114,13 @@ 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);
+                       local = 1;
                } else if (prefs_common.use_extsend && prefs_common.extsend_cmd) {
                        mailval = send_message_local(prefs_common.extsend_cmd, fp);
+                       local = 1;
                } else {
                        if (!mailac) {
                                mailac = account_find_from_smtp_server(from, smtpserver);
@@ -1079,8 +1146,16 @@ gint procmsg_send_message_queue(const gchar *file)
                        }
                }
                if (mailval < 0) {
-                       alertpanel_error(_("Error occurred while sending the message to %s ."),
-                                 mailac ? mailac->smtp_server : smtpserver);
+                       if (!local)
+                               alertpanel_error(
+                                       _("Error occurred while sending the message to `%s'."),
+                                       mailac ? mailac->smtp_server : smtpserver);
+                       else
+                               alertpanel_error(
+                                       _("Error occurred while sending the message with command `%s'."),
+                                       (mailac && mailac->use_mail_command && 
+                                        mailac->mail_command && (*mailac->mail_command)) ? 
+                                               mailac->mail_command : prefs_common.extsend_cmd);
                }
        }