2005-02-15 [colin] 1.0.1cvs7.1
[claws.git] / src / procmime.c
index c743c477c0ded7f387c40ba7730f68fba21fd8d1..3067893297628bb0508b6900028236494a10a0a2 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <stdio.h>
 #include <glib.h>
+#include <glib/gi18n.h>
 #include <stdio.h>
 #include <string.h>
 #include <locale.h>
@@ -33,7 +34,6 @@
 #include <sys/stat.h>
 #include <unistd.h>
 
-#include "intl.h"
 #include "procmime.h"
 #include "procheader.h"
 #include "base64.h"
@@ -229,9 +229,14 @@ MimeInfo *procmime_scan_message(MsgInfo *msginfo)
        gchar *filename;
        MimeInfo *mimeinfo;
 
-       filename = procmsg_get_message_file(msginfo);
-       if (!filename)
+       filename = procmsg_get_message_file_path(msginfo);
+       if (!filename || !is_file_exist(filename)) {
+               g_free(filename);
+               filename = procmsg_get_message_file(msginfo);
+       }
+       if (!filename || !is_file_exist(filename)) 
                return NULL;
+
        if (msginfo->folder->stype != F_QUEUE && 
            msginfo->folder->stype != F_DRAFT)
                mimeinfo = procmime_scan_file(filename);
@@ -424,17 +429,28 @@ gboolean procmime_encode_content(MimeInfo *mimeinfo, EncodingType encoding)
                gchar *tmp_file = NULL;
 
                if (mimeinfo->type == MIMETYPE_TEXT ||
-                   mimeinfo->type == MIMETYPE_MESSAGE) {
-                       tmp_file = get_tmp_file();
-                       if (canonicalize_file(mimeinfo->data.filename, tmp_file) < 0) {
-                               g_free(tmp_file);
-                               fclose(infp);
-                       }
-                       if ((tmp_fp = fopen(tmp_file, "rb")) == NULL) {
-                               FILE_OP_ERROR(tmp_file, "fopen");
-                               unlink(tmp_file);
-                               g_free(tmp_file);
+                    mimeinfo->type == MIMETYPE_MESSAGE) {
+                       if (mimeinfo->content == MIMECONTENT_FILE) {
+                               tmp_file = get_tmp_file();
+                               if (canonicalize_file(mimeinfo->data.filename, tmp_file) < 0) {
+                                       g_free(tmp_file);
+                                       fclose(infp);
+                                       return FALSE;
+                               }
+                               if ((tmp_fp = fopen(tmp_file, "rb")) == NULL) {
+                                       FILE_OP_ERROR(tmp_file, "fopen");
+                                       unlink(tmp_file);
+                                       g_free(tmp_file);
+                                       fclose(infp);
+                                       return FALSE;
+                               }
+                       } else {
+                               gchar *out = canonicalize_str(mimeinfo->data.mem);
                                fclose(infp);
+                               infp = str_open_as_stream(out);
+                               g_free(out);
+                               if (infp == NULL)
+                                       return FALSE;
                        }
                }
 
@@ -461,7 +477,16 @@ gboolean procmime_encode_content(MimeInfo *mimeinfo, EncodingType encoding)
 
                while (fgets(inbuf, sizeof(inbuf), infp) != NULL) {
                        qp_encode_line(outbuf, inbuf);
-                       fputs(outbuf, outfp);
+
+                       if (!strncmp("From ", outbuf, sizeof("From ")-1)) {
+                               gchar *tmpbuf = outbuf;
+                               
+                               tmpbuf += sizeof("From ")-1;
+                               
+                               fputs("=46rom ", outfp);
+                               fputs(tmpbuf, outfp);
+                       } else 
+                               fputs(outbuf, outfp);
                }
        } else {
                gchar buf[BUFFSIZE];
@@ -856,26 +881,24 @@ gchar *procmime_get_tmp_file_name(MimeInfo *mimeinfo)
        g_snprintf(f_prefix, sizeof(f_prefix), "%08x.", id++);
 
        if ((mimeinfo->type == MIMETYPE_TEXT) && !g_ascii_strcasecmp(mimeinfo->subtype, "html"))
-               base = "mimetmp.html";
+               base = g_strdup("mimetmp.html");
        else {
                const gchar *basetmp;
-               gchar *basename;
 
                basetmp = procmime_mimeinfo_get_parameter(mimeinfo, "filename");
                if (basetmp == NULL)
                        basetmp = procmime_mimeinfo_get_parameter(mimeinfo, "name");
                if (basetmp == NULL)
                        basetmp = "mimetmp";
-               basename = g_path_get_basename(basetmp);
-               if (*base == '\0') base = "mimetmp";
-               Xstrdup_a(base, basename, {g_free(basename); return NULL;});
+               base = g_path_get_basename(basetmp);
+               if (*base == '\0') base = g_strdup("mimetmp");
                subst_for_shellsafe_filename(base);
-               g_free(basename);
        }
 
        filename = g_strconcat(get_mime_tmp_dir(), G_DIR_SEPARATOR_S,
                               f_prefix, base, NULL);
 
+       g_free(base);
        return filename;
 }
 
@@ -1234,6 +1257,7 @@ void procmime_parse_message_rfc822(MimeInfo *mimeinfo)
                MimeInfo *subinfo;
 
                subinfo = procmime_mimeinfo_new();
+               subinfo->content = MIMECONTENT_FILE;
                subinfo->encoding_type = ENC_UNKNOWN;
                subinfo->type = MIMETYPE_TEXT;
                subinfo->subtype = g_strdup("plain");
@@ -1765,7 +1789,7 @@ static void write_parameters(gpointer key, gpointer value, gpointer user_data)
 
        case ENC_AS_EXTENDED:
                g_string_append_printf(buf, "%s*=%s''", param,
-                       conv_get_current_charset_str());
+                       conv_get_locale_charset_str());
                for (valpos = val; *valpos != '\0'; valpos++) {
                        if (IS_ASCII(*valpos) && isalnum(*valpos)) {
                                g_string_append_printf(buf, "%c", *valpos);