Use the new header_address_fold.

2001-06-27  Jeffrey Stedfast  <fejj@ximian.com>

	* camel-internet-address.c
	(camel_internet_address_encode_address): Use the new
	header_address_fold.

	* camel-mime-utils.c: Removed some old #if 0'd code of mine.
	(rfc2047_encode_word): If enclen is 0, don't write an encoded word
	token (=?iso-8859-7?Q??= would be an invalid token).
	(header_address_fold): New function to wrap address headers -
	header_fold() was force-wrapping rfc2047 encoded words which was
	making the test suite fail. The *real* solution, however, is to
	not create rfc2047 encoded words longer than 72 chars.

svn path=/trunk/; revision=10545
This commit is contained in:
Jeffrey Stedfast
2001-06-27 22:14:20 +00:00
committed by Jeffrey Stedfast
parent 4cbcd49a8b
commit 016826bc8a
4 changed files with 53 additions and 83 deletions

View File

@ -1,3 +1,17 @@
2001-06-27 Jeffrey Stedfast <fejj@ximian.com>
* camel-internet-address.c
(camel_internet_address_encode_address): Use the new
header_address_fold.
* camel-mime-utils.c: Removed some old #if 0'd code of mine.
(rfc2047_encode_word): If enclen is 0, don't write an encoded word
token (=?iso-8859-7?Q??= would be an invalid token).
(header_address_fold): New function to wrap address headers -
header_fold() was force-wrapping rfc2047 encoded words which was
making the test suite fail. The *real* solution, however, is to
not create rfc2047 encoded words longer than 72 chars.
2001-06-26 Jeffrey Stedfast <fejj@ximian.com>
* camel-filter-driver.c (open_folder): Since we want an error

View File

@ -422,7 +422,7 @@ camel_internet_address_encode_address(int *inlen, const char *real, const char *
if (name && name[0]) {
if (strlen(name) + len > CAMEL_FOLD_SIZE) {
char *folded = header_fold(name, len);
char *folded = header_address_fold(name, len);
char *last;
g_string_append(out, folded);
g_free(folded);

View File

@ -1221,22 +1221,24 @@ rfc2047_encode_word(GString *outstring, const char *in, int len, const char *typ
}
inlen -= (inptr - p);
}
enclen = out-buffer;
/* create token */
out = ascii;
if (first)
first = 0;
else
*out++ = ' ';
out += sprintf(out, "=?%s?Q?", type);
out += quoted_encode(buffer, enclen, out, safemask);
sprintf(out, "?=");
d(printf("converted part = %s\n", ascii));
g_string_append(outstring, ascii);
if (enclen) {
/* create token */
out = ascii;
if (first)
first = 0;
else
*out++ = ' ';
out += sprintf (out, "=?%s?Q?", type);
out += quoted_encode (buffer, enclen, out, safemask);
sprintf (out, "?=");
d(printf("converted part = %s\n", ascii));
g_string_append (outstring, ascii);
}
}
if (ic != (iconv_t) -1) {
@ -1494,11 +1496,12 @@ header_encode_phrase_get_words (const unsigned char *in)
return words;
}
static void
static gboolean
header_encode_phrase_merge_words (GList **wordsp)
{
GList *wordl, *nextl, *words = *wordsp;
struct _phrase_word *word, *next;
gboolean merged = FALSE;
/* scan the list, checking for words of similar types that can be merged */
wordl = words;
@ -1518,6 +1521,8 @@ header_encode_phrase_merge_words (GList **wordsp)
words = g_list_remove_link (words, nextl);
g_free (next);
nextl = g_list_next (wordl);
merged = TRUE;
} else {
/* if it is going to be too long, make sure we include the
separating whitespace */
@ -1533,6 +1538,8 @@ header_encode_phrase_merge_words (GList **wordsp)
}
*wordsp = words;
return merged;
}
/* encodes a phrase sequence (different quoting/encoding rules to strings) */
@ -1551,7 +1558,7 @@ header_encode_phrase (const unsigned char *in)
if (!words)
return NULL;
header_encode_phrase_merge_words (&words);
while (header_encode_phrase_merge_words (&words));
out = g_string_new ("");
@ -3662,47 +3669,14 @@ header_address_list_format(struct _header_address *a)
return ret;
}
#if 0
static const char *
header_fold_next_space (const char *in)
{
register const char *inptr = in;
gboolean escaped = FALSE;
if (is_lwsp (*inptr))
return inptr;
do {
if (*inptr == '\\') {
escaped = TRUE;
} else if (*inptr == '"' && !escaped) {
/* find the end of this quoted section */
for (inptr++; *inptr; inptr++) {
if (*inptr == '"' && *(inptr-1) != '\\')
break;
}
} else {
escaped = FALSE;
}
inptr++;
} while (*inptr && !is_lwsp (*inptr));
if (*inptr)
return inptr;
else
return NULL;
}
/* I wonder if this might be better for folding headers? */
char *
header_fold (const char *in, int headerlen, gboolean force)
header_address_fold (const char *in, int headerlen)
{
const char *inptr = in, *space, *p, *n;
gboolean needunfold = FALSE;
int len, outlen, i;
const char *inptr = in, *space, *p, *n;
GString *out;
char *ret;
int needunfold = FALSE;
if (in == NULL)
return NULL;
@ -3712,19 +3686,19 @@ header_fold (const char *in, int headerlen, gboolean force)
p = in;
while (*p) {
n = strchr (p, '\n');
if (n == NULL)
n = p + strlen (p);
else
needunfold = TRUE;
if (n == NULL) {
len += strlen (p);
break;
}
len += n - p;
needunfold = TRUE;
len += n-p;
if (len >= CAMEL_FOLD_SIZE)
break;
len = 0;
p = n + 1;
}
if (len < CAMEL_FOLD_SIZE)
return g_strdup (in);
@ -3735,18 +3709,14 @@ header_fold (const char *in, int headerlen, gboolean force)
out = g_string_new ("");
outlen = headerlen + 2;
while (*inptr) {
if (force)
space = strchr (inptr, ' ');
else
space = header_fold_next_space (inptr);
space = strchr (inptr, ' ');
if (space) {
len = space - inptr + 1;
} else {
len = strlen (inptr);
}
d(printf ("next word '%.*s'\n", len, inptr));
d(printf("next word '%.*s'\n", len, inptr));
if (outlen + len > CAMEL_FOLD_SIZE) {
d(printf("outlen = %d wordlen = %d\n", outlen, len));
@ -3755,28 +3725,15 @@ header_fold (const char *in, int headerlen, gboolean force)
g_string_truncate (out, out->len-1);
g_string_append (out, "\n\t");
outlen = 1;
if (force) {
/* check for very long words, just cut them up */
while (outlen + len > CAMEL_FOLD_SIZE) {
for (i = 0; i < CAMEL_FOLD_SIZE - outlen; i++)
g_string_append_c (out, inptr[i]);
inptr += CAMEL_FOLD_SIZE - outlen;
len -= CAMEL_FOLD_SIZE - outlen;
g_string_append (out, "\n\t");
outlen = 1;
}
}
}
outlen += len;
for (i = 0; i < len; i++)
for (i = 0; i < len; i++) {
g_string_append_c (out, inptr[i]);
}
inptr += len;
}
ret = out->str;
g_string_free (out, FALSE);
@ -3785,8 +3742,6 @@ header_fold (const char *in, int headerlen, gboolean force)
return ret;
}
#endif
/* simple header folding */
/* will work even if the header is already folded */

View File

@ -145,6 +145,7 @@ void header_raw_clear(struct _header_raw **list);
char *header_raw_check_mailing_list(struct _header_raw **list);
/* fold a header */
char *header_address_fold(const char *in, int headerlen);
char *header_fold(const char *in, int headerlen);
char *header_unfold(const char *in);