From: Colin Leroy Date: Tue, 23 Nov 2004 14:00:34 +0000 (+0000) Subject: 2004-11-23 [colin] 0.9.12cvs165 X-Git-Tag: rel_0_9_13~26 X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=commitdiff_plain;h=a9aeca622e69dabea4c5212a1f7515ecc895c3d3 2004-11-23 [colin] 0.9.12cvs165 * src/procmime.c Fix mime headers wrapping --- diff --git a/ChangeLog.claws b/ChangeLog.claws index cd65d8acf..1ff2eae93 100644 --- a/ChangeLog.claws +++ b/ChangeLog.claws @@ -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 diff --git a/PATCHSETS b/PATCHSETS index 7092883b1..a8f361f27 100644 --- a/PATCHSETS +++ b/PATCHSETS @@ -147,3 +147,4 @@ ( 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 diff --git a/configure.ac b/configure.ac index 32147f956..15e488367 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/src/procmime.c b/src/procmime.c index e630e6cf1..5511a5492 100644 --- a/src/procmime.c +++ b/src/procmime.c @@ -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"); }