summaryrefslogtreecommitdiffstats
path: root/rfc2047.c
diff options
context:
space:
mode:
authorThomas Roessler <roessler@does-not-exist.org>1999-02-02 15:47:44 +0000
committerThomas Roessler <roessler@does-not-exist.org>1999-02-02 15:47:44 +0000
commitbe3b539741a3293ea5369c6817b2fbad28628c51 (patch)
tree6f80a6e005d49de6328e9258bb5cd1bb8248eb9b /rfc2047.c
parent7403d5e81d9463c16c7f3ce19009460ef8816353 (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.c34
1 files changed, 26 insertions, 8 deletions
diff --git a/rfc2047.c b/rfc2047.c
index 225c7af3..872ebd5a 100644
--- a/rfc2047.c
+++ b/rfc2047.c
@@ -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)