diff options
author | Thomas Roessler <roessler@does-not-exist.org> | 1999-02-02 15:47:44 +0000 |
---|---|---|
committer | Thomas Roessler <roessler@does-not-exist.org> | 1999-02-02 15:47:44 +0000 |
commit | be3b539741a3293ea5369c6817b2fbad28628c51 (patch) | |
tree | 6f80a6e005d49de6328e9258bb5cd1bb8248eb9b /rfc2047.c | |
parent | 7403d5e81d9463c16c7f3ce19009460ef8816353 (diff) |
Merging the external character set patch into unstable.
Additionally, this change introduces a M_CHARCONV state flag which
gives us some more control about when character set conversions are
actually done. Current versions of mutt would happily apply
character set conversions when, e.g., saving a text/plain attachment
to a file. (We had at least one corrupt russing translation file
due to this mis-feature.)
Additionally, we clean up some of the character set related code in
handler.c. Most of that is now done by the decoder functions in
charset.c.
Diffstat (limited to 'rfc2047.c')
-rw-r--r-- | rfc2047.c | 34 |
1 files changed, 26 insertions, 8 deletions
@@ -24,12 +24,15 @@ #include <ctype.h> #include <string.h> -typedef void encode_t (char *, size_t, const unsigned char *); +typedef void encode_t (char *, size_t, const unsigned char *, const char *); extern char MimeSpecials[]; extern char B64Chars[]; -static void q_encode_string (char *d, size_t dlen, const unsigned char *s) +static void q_encode_string (char *d, + size_t dlen, + const unsigned char *s, + const char *send_charset) { char charset[SHORT_STRING]; size_t cslen, wordlen; @@ -115,14 +118,16 @@ static void q_encode_string (char *d, size_t dlen, const unsigned char *s) strcpy (wptr, "?="); } -static void b_encode_string (char *d, size_t dlen, const unsigned char *s) +static void b_encode_string (char *d, size_t dlen, + const unsigned char *s, + const char *send_charset) { char charset[SHORT_STRING]; char *wptr = d; int cslen; int wordlen; - snprintf (charset, sizeof (charset), "=?%s?B?", NONULL(Charset)); + snprintf (charset, sizeof (charset), "=?%s?B?", NONULL(send_charset)); cslen = mutt_strlen (charset); strcpy (wptr, charset); wptr += cslen; @@ -182,7 +187,16 @@ void rfc2047_encode_string (char *d, size_t dlen, const unsigned char *s) int len; const unsigned char *p = s; encode_t *encoder; - + char send_charset[SHORT_STRING]; + unsigned char scratch[LONG_STRING]; + + /* attention: this function will fail for + * strings longer then LONG_STRING. But lots + * of code in mutt will anyway... + */ + + mutt_get_send_charset(send_charset, sizeof(send_charset), NULL, 0); + /* First check to see if there are any 8-bit characters */ for (; *p; p++) { @@ -200,8 +214,8 @@ void rfc2047_encode_string (char *d, size_t dlen, const unsigned char *s) return; } - if (mutt_strcasecmp("us-ascii", Charset) == 0 || - mutt_strncasecmp("iso-8859", Charset, 8) == 0) + if (mutt_strcasecmp("us-ascii", send_charset) == 0 || + mutt_strncasecmp("iso-8859", send_charset, 8) == 0) encoder = q_encode_string; else { @@ -230,7 +244,11 @@ void rfc2047_encode_string (char *d, size_t dlen, const unsigned char *s) s += 5; } - (*encoder) (d, dlen, s); + strfcpy((char *)scratch, (const char *) s, sizeof(scratch)); + if (*send_charset && mutt_strcasecmp("us-ascii", send_charset)) + mutt_display_string((char *)scratch, mutt_get_translation(Charset, send_charset)); + + (*encoder) (d, dlen, scratch, send_charset); } void rfc2047_encode_adrlist (ADDRESS *addr) |