2004-11-23 [colin] 0.9.12cvs165
authorColin Leroy <colin@colino.net>
Tue, 23 Nov 2004 14:00:34 +0000 (14:00 +0000)
committerColin Leroy <colin@colino.net>
Tue, 23 Nov 2004 14:00:34 +0000 (14:00 +0000)
* src/procmime.c
Fix mime headers wrapping

ChangeLog.claws
PATCHSETS
configure.ac
src/procmime.c

index cd65d8a..1ff2eae 100644 (file)
@@ -1,3 +1,8 @@
+2004-11-23 [colin]     0.9.12cvs165
+
+       * src/procmime.c
+               Fix mime headers wrapping
+
 2004-11-23 [christoph] 0.9.12cvs164
 
        * src/common/Makefile.am
index 7092883..a8f361f 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.27 -r 1.28 src/msgcache.c; ) > 0.9.12cvs162.patchset
 ( cvs diff -u -r 1.148 -r 1.149 src/main.c; ) > 0.9.12cvs163.patchset
 ( cvs diff -u -r 1.188 -r 1.189 src/Makefile.am; cvs diff -u -r 1.73 -r 1.74 src/codeconv.c; cvs diff -u -r 1.457 -r 1.458 src/compose.c; cvs diff -u -r 1.251 -r 1.252 src/folderview.c; cvs diff -u -r 1.149 -r 1.150 src/main.c; cvs diff -u -r 0 -r 1 src/partial_download.c; cvs diff -u -r 0 -r 1 src/partial_download.h; cvs diff -u -r 1.121 -r 1.122 src/prefs_account.c; cvs diff -u -r 1.56 -r 1.57 src/prefs_account.h; cvs diff -u -r 1.12 -r 1.13 src/privacy.c; cvs diff -u -r 1.11 -r 1.12 src/privacy.h; cvs diff -u -r 1.28 -r 1.29 src/common/Makefile.am; cvs diff -u -r 1.1 -r 1.2 src/common/base64.h; cvs diff -u -r -1.5 -r -1.6 src/common/partial_download.c; cvs diff -u -r -1.2 -r -1.3 src/common/partial_download.h; cvs diff -u -r 1.15 -r 1.16 src/gtk/prefswindow.c; cvs diff -u -r 1.8 -r 1.9 src/gtk/prefswindow.h; cvs diff -u -r 1.11 -r 1.12 src/plugins/pgpmime/pgpmime.c; cvs diff -u -r 1.2 -r 1.3 src/plugins/pgpmime/prefs_gpg.c; cvs diff -u -r 1.1 -r 1.2 src/plugins/pgpmime/prefs_gpg.glade; cvs diff -u -r 1.2 -r 1.3 src/plugins/pgpmime/prefs_gpg.h; cvs diff -u -r 1.5 -r 1.6 src/plugins/pgpmime/sgpgme.c; cvs diff -u -r 1.3 -r 1.4 src/plugins/pgpmime/sgpgme.h; ) > 0.9.12cvs164.patchset
+( cvs diff -u -r 1.93 -r 1.94 src/procmime.c; ) > 0.9.12cvs165.patchset
index 32147f9..15e4883 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=12
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=164
+EXTRA_VERSION=165
 EXTRA_RELEASE=
 
 if test \( $EXTRA_VERSION -eq 0 \) -o \( "x$EXTRA_RELEASE" != "x" \); then
index e630e6c..5511a54 100644 (file)
@@ -45,7 +45,6 @@
 #include "codeconv.h"
 #include "utils.h"
 #include "prefs_common.h"
-
 #include "prefs_gtk.h"
 
 static GHashTable *procmime_get_mime_type_table        (void);
@@ -1657,11 +1656,18 @@ typedef enum {
     ENC_AS_EXTENDED,
 } EncodeAs;
 
+typedef struct _ParametersData {
+       FILE *fp;
+       guint len;
+} ParametersData;
+
 static void write_parameters(gpointer key, gpointer value, gpointer user_data)
 {
        gchar *param = key;
        gchar *val = value, *valpos;
-       FILE *fp = user_data;
+       ParametersData *pdata = (ParametersData *)user_data;
+       GString *buf = g_string_new("");
+
        EncodeAs encas = ENC_AS_TOKEN;
 
        for (valpos = val; *valpos != 0; valpos++) {
@@ -1701,43 +1707,60 @@ static void write_parameters(gpointer key, gpointer value, gpointer user_data)
 
        switch (encas) {
        case ENC_AS_TOKEN:
-               fprintf(fp, "; %s=", param);
-               fprintf(fp, "%s", val);
+               g_string_append_printf(buf, "%s=%s", param, val);
                break;
 
        case ENC_AS_QUOTED_STRING:
-               fprintf(fp, "; %s=", param);
-               fprintf(fp, "\"%s\"", val);
+               g_string_append_printf(buf, "%s=\"%s\"", param, val);
                break;
 
        case ENC_AS_EXTENDED:
-               fprintf(fp, "; %s*=", param);
-               fprintf(fp, "%s''", conv_get_current_charset_str());
+               g_string_append_printf(buf, "%s*=%s''", param,
+                       conv_get_current_charset_str());
                for (valpos = val; *valpos != '\0'; valpos++) {
-                       if (IS_ASCII(*valpos) && isalnum(*valpos))
-                               fprintf(fp, "%c", *valpos);
-                       else {
+                       if (IS_ASCII(*valpos) && isalnum(*valpos)) {
+                               g_string_append_printf(buf, "%c", *valpos);
+                       else {
                                gchar hexstr[3] = "XX";
                                get_hex_str(hexstr, *valpos);
-                               fprintf(fp, "%%%s", hexstr);
+                               g_string_append_printf(buf, "%%%s", hexstr);
                        }
                }
                break;
        }
+       
+       if (buf->str && strlen(buf->str)) {
+               if (pdata->len + strlen(buf->str) + 2 > 76) {
+                       fprintf(pdata->fp, ";\n %s", buf->str);
+                       pdata->len = strlen(buf->str) + 1;
+               } else {
+                       fprintf(pdata->fp, "; %s", buf->str);
+                       pdata->len += strlen(buf->str) + 2;
+               }
+       }
+       g_string_free(buf, TRUE);
 }
 
 void procmime_write_mime_header(MimeInfo *mimeinfo, FILE *fp)
 {
        struct TypeTable *type_table;
-
+       ParametersData *pdata = g_new0(ParametersData, 1);
        debug_print("procmime_write_mime_header\n");
+       
+       pdata->fp = fp;
 
        for (type_table = mime_type_table; type_table->str != NULL; type_table++)
                if (mimeinfo->type == type_table->type) {
-                       fprintf(fp, "Content-Type: %s/%s", type_table->str, mimeinfo->subtype);
+                       gchar *buf = g_strdup_printf(
+                               "Content-Type: %s/%s", type_table->str, mimeinfo->subtype);
+                       fprintf(fp, buf);
+                       pdata->len = strlen(buf);
+                       g_free(buf);
                        break;
                }
-       g_hash_table_foreach(mimeinfo->typeparameters, write_parameters, fp);
+       g_hash_table_foreach(mimeinfo->typeparameters, write_parameters, pdata);
+       g_free(pdata);
+
        fprintf(fp, "\n");
 
        if (mimeinfo->encoding_type != ENC_UNKNOWN)
@@ -1750,16 +1773,22 @@ void procmime_write_mime_header(MimeInfo *mimeinfo, FILE *fp)
                fprintf(fp, "Content-ID: %s\n", mimeinfo->id);
 
        if (mimeinfo->disposition != DISPOSITIONTYPE_UNKNOWN) {
-               fprintf(fp, "Content-Disposition: ");
+               ParametersData *pdata = g_new0(ParametersData, 1);
+               gchar *buf = NULL;
                if (mimeinfo->disposition == DISPOSITIONTYPE_INLINE)
-                       fprintf(fp, "inline");
+                       buf = g_strdup("Content-Disposition: inline");
                else if (mimeinfo->disposition == DISPOSITIONTYPE_ATTACHMENT)
-                       fprintf(fp, "attachment");
+                       buf = g_strdup("Content-Disposition: attachment");
                else
-                       fprintf(fp, "unknown");
+                       buf = g_strdup("Content-Disposition: unknown");
+
+               fprintf(fp, "%s", buf);
+               pdata->len = strlen(buf);
+               g_free(buf);
 
-               /* FIXME: linebreaks after too many parameters */
-               g_hash_table_foreach(mimeinfo->dispositionparameters, write_parameters, fp);
+               pdata->fp = fp;
+               g_hash_table_foreach(mimeinfo->dispositionparameters, write_parameters, pdata);
+               g_free(pdata);
                fprintf(fp, "\n");
        }