On Wed, 2004-08-11 at 11:06 +0800, Not Zed wrote:
>
> Don't like this, it just duplicates a bunch of code. See attached
> (totally untested but i think the logic is right).
>
> I don't really like it as a ctext decoder anyway, it isn't actually
> decoding to the rfc, it is just a simplistic scanner which will
> 'probably work in most cases'. e.g. it doesn't handle \ properly in
> comments. Then again, this is hardly a major issue.
>
> The other problem is that it is necessarily a one-way conversion (you
> will have to lose the comment structure), perhaps it should be called
> _format rather than _decode, to match the rest of the api (i put this
> in the patch).
>
yea, I apparently overlooked 'quoted-pair', but I'm thinking we should
handle it before committing a fix. if we're gonna do it, might as well
do it right, etc.
I do agree that _format() might be a better name and as I mentioned in
my original patch mail, I figured we should merge it into
header_decode_text() as well.
I'll send an updated patch when I finish it.
Jeff
>
> Plain text document attachment (62771.b.diff)
> Index: camel/camel-mime-utils.c
> ===================================================================
> RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.c,v
> retrieving revision 1.212
> diff -u -3 -r1.212 camel-mime-utils.c
> --- camel/camel-mime-utils.c 30 Jul 2004 15:30:38 -0000 1.212
> +++ camel/camel-mime-utils.c 11 Aug 2004 03:03:33 -0000
> @@ -57,6 +57,9 @@
> #include "broken-date-parser.h"
> #endif
>
> +/* syntactic helper for more direct table lookups */
> +#define cm_is_mask(x, m) ((camel_mime_special_table[(unsigned char)(x)] & (m)) == 0)
> +
> #if 0
> int strdup_count = 0;
> int malloc_count = 0;
> @@ -1119,13 +1122,15 @@
> }
>
> /* decodes a simple text, rfc822 + rfc2047 */
> +/* If ctext is set, look for rfc2047 encoded words not separated by whitespace */
> static char *
> -header_decode_text (const char *in, size_t inlen, const char *default_charset)
> +header_decode_text (const char *in, size_t inlen, const char *default_charset, int ctext)
> {
> GString *out;
> const char *inptr, *inend, *start, *chunk, *locale_charset;
> char *dword = NULL;
> -
> + int mask;
> +
> locale_charset = e_iconv_locale_charset ();
>
> out = g_string_new ("");
> @@ -1133,9 +1138,14 @@
> inend = inptr + inlen;
> chunk = NULL;
>
> + if (ctext)
> + mask = (CAMEL_MIME_IS_SPECIAL|CAMEL_MIME_IS_SPACE|CAMEL_MIME_IS_CTRL);
> + else
> + mask = (CAMEL_MIME_IS_LWSP);
> +
> while (inptr < inend) {
> start = inptr;
> - while (inptr < inend && camel_mime_is_lwsp(*inptr))
> + while (inptr < inend && !cm_is_mask(*inptr, mask))
> inptr++;
>
> if (inptr == inend) {
> @@ -1148,7 +1158,7 @@
> }
>
> start = inptr;
> - while (inptr < inend && !camel_mime_is_lwsp(*inptr))
> + while (inptr < inend && cm_is_mask(*inptr, mask))
> inptr++;
>
> dword = rfc2047_decode_word(start, inptr-start);
> @@ -1178,7 +1188,15 @@
> {
> if (in == NULL)
> return NULL;
> - return header_decode_text (in, strlen (in), default_charset);
> + return header_decode_text (in, strlen (in), default_charset, FALSE);
> +}
> +
> +char *
> +camel_header_format_ctext(const char *in, const char *default_charset)
> +{
> + if (in == NULL)
> + return NULL;
> + return header_decode_text (in, strlen (in), default_charset, TRUE);
> }
>
> /* how long a sequence of pre-encoded words should be less than, to attempt to
> @@ -2830,7 +2848,7 @@
> node->next = NULL;
> node->name = name;
> if (strncmp(value, "=?", 2) == 0
> - && (node->value = header_decode_text(value, strlen(value), NULL))) {
> + && (node->value = header_decode_text(value, strlen(value), NULL, FALSE))) {
> g_free(value);
> } else if (!g_utf8_validate(value, -1, NULL)) {
> const char * charset = e_iconv_locale_charset();
> Index: camel/camel-mime-utils.h
> ===================================================================
> RCS file: /cvs/gnome/evolution/camel/camel-mime-utils.h,v
> retrieving revision 1.56
> diff -u -3 -r1.56 camel-mime-utils.h
> --- camel/camel-mime-utils.h 18 Jun 2004 20:07:09 -0000 1.56
> +++ camel/camel-mime-utils.h 11 Aug 2004 03:03:33 -0000
> @@ -193,6 +193,8 @@
> /* decode/encode a string type, like a subject line */
> char *camel_header_decode_string (const char *in, const char *default_charset);
> char *camel_header_encode_string (const unsigned char *in);
> +/* decode ( text | comment ), this is a one-way op */
> +char *camel_header_format_ctext(const char *in, const char *default_charset);
>
> /* encode a phrase, like the real name of an address */
> char *camel_header_encode_phrase (const unsigned char *in);
--
Jeffrey Stedfast
Evolution Hacker - Novell, Inc.
fejj ximian com - www.novell.com
Attachment:
smime.p7s
Description: S/MIME cryptographic signature