diff options
author | Not Zed <NotZed@Ximian.com> | 2001-02-13 08:30:45 +0800 |
---|---|---|
committer | Michael Zucci <zucchi@src.gnome.org> | 2001-02-13 08:30:45 +0800 |
commit | 7fc592861825abf6bf91a324d636ef433f8100b8 (patch) | |
tree | 993cdda1899cdf2a8939a0436ad69e48fcd08d06 /camel | |
parent | f856d19202dc273ecbae3b9116d2d23fe4915d28 (diff) | |
download | gsoc2013-evolution-7fc592861825abf6bf91a324d636ef433f8100b8.tar gsoc2013-evolution-7fc592861825abf6bf91a324d636ef433f8100b8.tar.gz gsoc2013-evolution-7fc592861825abf6bf91a324d636ef433f8100b8.tar.bz2 gsoc2013-evolution-7fc592861825abf6bf91a324d636ef433f8100b8.tar.lz gsoc2013-evolution-7fc592861825abf6bf91a324d636ef433f8100b8.tar.xz gsoc2013-evolution-7fc592861825abf6bf91a324d636ef433f8100b8.tar.zst gsoc2013-evolution-7fc592861825abf6bf91a324d636ef433f8100b8.zip |
Add address headers to list that we dont fold when writing. The are
2001-02-12 Not Zed <NotZed@Ximian.com>
* camel-mime-part.c (init_header_name_table): Add address headers
to list that we dont fold when writing. The are properly
formatted as we build them.
(write_to_stream): DOH, lookup the header name in the formatted
hash table, not the value, that would never have worked.
* camel-internet-address.c
(camel_internet_address_encode_address): Changed to take a
parameter saying how much we've printed so far. We now fold the
header as we format it. We dont fold addresses, even if they are
too long, we simply put them on another line by themselves: this
should make the result more parsable by mailers that can't handle
split up addresses (which are legal).
(internet_encode): Fix for changes to above.
svn path=/trunk/; revision=8198
Diffstat (limited to 'camel')
-rw-r--r-- | camel/ChangeLog | 17 | ||||
-rw-r--r-- | camel/camel-internet-address.c | 56 | ||||
-rw-r--r-- | camel/camel-internet-address.h | 2 | ||||
-rw-r--r-- | camel/camel-mime-part.c | 6 |
4 files changed, 73 insertions, 8 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index bcdd652f38..5a0d7bfdaf 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,20 @@ +2001-02-12 Not Zed <NotZed@Ximian.com> + + * camel-mime-part.c (init_header_name_table): Add address headers + to list that we dont fold when writing. The are properly + formatted as we build them. + (write_to_stream): DOH, lookup the header name in the formatted + hash table, not the value, that would never have worked. + + * camel-internet-address.c + (camel_internet_address_encode_address): Changed to take a + parameter saying how much we've printed so far. We now fold the + header as we format it. We dont fold addresses, even if they are + too long, we simply put them on another line by themselves: this + should make the result more parsable by mailers that can't handle + split up addresses (which are legal). + (internet_encode): Fix for changes to above. + 2001-02-12 Jeffrey Stedfast <fejj@ximian.com> * providers/local/camel-local-provider.c: mbox, mh, and maildir diff --git a/camel/camel-internet-address.c b/camel/camel-internet-address.c index 94ce51261a..e97e9029eb 100644 --- a/camel/camel-internet-address.c +++ b/camel/camel-internet-address.c @@ -22,6 +22,7 @@ #include "camel-internet-address.h" #include <stdio.h> +#include <string.h> #define d(x) @@ -116,7 +117,8 @@ internet_encode (CamelAddress *a) int i; GString *out; char *ret; - + int len = 6; /* "From: ", assume longer of the address headers */ + if (a->addresses->len == 0) return NULL; @@ -129,7 +131,7 @@ internet_encode (CamelAddress *a) if (i != 0) g_string_append(out, ", "); - enc = camel_internet_address_encode_address(addr->name, addr->address); + enc = camel_internet_address_encode_address(&len, addr->name, addr->address); g_string_sprintfa(out, "%s", enc); g_free(enc); } @@ -398,27 +400,69 @@ camel_internet_address_find_address(CamelInternetAddress *a, const char *address /** * camel_internet_address_encode_address: + * @len: The encoded length so far, of this line * @name: * @addr: * - * Encode a single address ready for internet usage. + * Encode a single address ready for internet usage. Header folding + * as per rfc 822 is also performed, based on the length in len. * * Return value: The encoded address. **/ char * -camel_internet_address_encode_address(const char *real, const char *addr) +camel_internet_address_encode_address(int *inlen, const char *real, const char *addr) { char *name = header_encode_phrase(real); - char *ret = NULL; + char *ret = NULL, *addra = NULL; + int len = *inlen; + GString *out = g_string_new(""); g_assert(addr); + if (name && name[0]) { + if (strlen(name) + len > CAMEL_FOLD_SIZE) { + char *folded = header_fold(name, len); + char *last; + g_string_append(out, folded); + g_free(folded); + last = strrchr(out->str, '\n'); + if (last) + len = last-(out->str+out->len); + else + len = out->len; + } else { + g_string_append(out, name); + len += strlen(name); + } + addr = addra = g_strdup_printf("<%s>", addr); + } + + /* NOTE: Strictly speaking, we could and should split the + * internal address up if we need to, on atom or specials + * boundaries - however, to aid interoperability with mailers + * that will probably not handle this case, we will just move + * the whole address to its own line */ + if (strlen(addr) + len > CAMEL_FOLD_SIZE) { + g_string_append(out, "\n\t"); + g_string_append(out, addr); + len = strlen(addr)+1; + } else { + g_string_append(out, addr); + len += strlen(addr); + } + + *inlen = len; +#if 0 if (name && name[0]) ret = g_strdup_printf("%s <%s>", name, addr); else ret = g_strdup_printf("%s", addr); - +#endif g_free(name); + g_free(addra); + + ret = out->str; + g_string_free(out, FALSE); return ret; } diff --git a/camel/camel-internet-address.h b/camel/camel-internet-address.h index 879514c158..7afd74fad9 100644 --- a/camel/camel-internet-address.h +++ b/camel/camel-internet-address.h @@ -49,7 +49,7 @@ int camel_internet_address_find_name(CamelInternetAddress *, const char *, con int camel_internet_address_find_address(CamelInternetAddress *, const char *, const char **); /* utility functions, for network/display formatting */ -char * camel_internet_address_encode_address(const char *name, const char *addr); +char * camel_internet_address_encode_address(int *len, const char *name, const char *addr); char * camel_internet_address_format_address(const char *real, const char *addr); #endif /* ! _CAMEL_INTERNET_ADDRESS_H */ diff --git a/camel/camel-mime-part.c b/camel/camel-mime-part.c index a22b96240a..8145bc1675 100644 --- a/camel/camel-mime-part.c +++ b/camel/camel-mime-part.c @@ -99,6 +99,10 @@ init_header_name_table() header_formatted_table = g_hash_table_new(g_strcase_hash, g_strcase_equal); g_hash_table_insert(header_formatted_table, "Content-Type", (void *)1); g_hash_table_insert(header_formatted_table, "Content-Disposition", (void *)1); + g_hash_table_insert(header_formatted_table, "To", (void *)1); + g_hash_table_insert(header_formatted_table, "From", (void *)1); + g_hash_table_insert(header_formatted_table, "Cc", (void *)1); + g_hash_table_insert(header_formatted_table, "Bcc", (void *)1); } static void @@ -493,7 +497,7 @@ write_to_stream(CamelDataWrapper *data_wrapper, CamelStream *stream) if (val == NULL) { g_warning("h->value is NULL here for %s", h->name); count = 0; - } else if (g_hash_table_lookup(header_formatted_table, val) == NULL) { + } else if (g_hash_table_lookup(header_formatted_table, h->name) == NULL) { val = header_fold(val, strlen(h->name)); count = camel_stream_printf(stream, "%s%s%s\n", h->name, isspace(val[0]) ? ":" : ": ", val); g_free(val); |