static char rcsid[] = "@(#)$Id: write_hdr.c,v 1.6 2006/05/22 19:17:14 hurtta Exp $"; /****************************************************************************** * The Elm (ME+) Mail System - $Revision: 1.6 $ $State: Exp $ * * Author: Kari Hurtta (was hurtta+elm@ozone.FMI.FI) *****************************************************************************/ #include "headers.h" DEBUG_VAR(Debug,__FILE__,"header"); void print_EOLN(mailer,top_encoding) out_state_t *mailer; int top_encoding; { /* Write canoniocal end of line of we are sending binary mail * Also SMTP requires \r\n */ if (top_encoding == ENCODING_BINARY || mailer->EOLN_is_CRLF) state_putc('\r',mailer); state_putc('\n',mailer); } void write_addr_header(mailer,hdr_name,addr,top_encoding,enmime,hdr_charset) out_state_t *mailer; char *hdr_name; struct addr_item * addr; int top_encoding; int enmime; charset_t hdr_charset; { struct addr_item *p; long POS = out_state_ftell(mailer); #define LEN (out_state_ftell(mailer)-POS) #define WRAP print_EOLN(mailer,top_encoding), \ (POS = out_state_ftell(mailer)), state_putc(' ',mailer) state_puts(hdr_name,mailer); state_puts(": ",mailer); DPRINT(Debug,9, (&Debug, "write_addr_header: (enmime=%d) %s:", enmime,hdr_name)); for (p = addr; p && p->fullname && p->addr && p->comment; p++) { CONST int al = strlen(p->addr); CONST int fn = string_len(p->fullname); CONST int cm = string_len(p->comment); DPRINT(Debug,9, (&Debug, "\n [%d] ",p-addr)); if (p != addr) { state_puts(", ",mailer); DPRINT(Debug,9, (&Debug, ", ")); } if (LEN > 70 || al + fn + cm + LEN > 76) { WRAP; DPRINT(Debug,9, (&Debug,"[WRAP]\n [%d] ",p-addr)); } if (fn || ! p->addr[0] || '@' == p->addr[0]) { if (fn) { char * buffer = string_to_hdr(HDR_PHRASE, p->fullname, hdr_charset, enmime, NULL); char * c; DPRINT(Debug,9, (&Debug,"{fullname quoted=%s}\n", buffer)); DPRINT(Debug,9, (&Debug, "\n [%d] ",p-addr)); for (c = buffer; *c != '\0'; c++) { if (*c == '\n' || (whitespace(*c) && (LEN > 120))) { WRAP; DPRINT(Debug,9, (&Debug, "[WRAP]\n [%d] ", p-addr)); } else { state_putc(*c,mailer); DPRINT(Debug,9, (&Debug, "%c",*c)); } } free(buffer); } if (LEN > 120 || (LEN > 70 && fn > 70)) { WRAP; DPRINT(Debug,9, (&Debug, "[WRAP]\n [%d] ",p-addr)); } else { state_putc(' ',mailer); DPRINT(Debug,9, (&Debug ," ")); } state_putc('<',mailer); state_puts(p->addr,mailer); state_putc('>',mailer); DPRINT(Debug,9, (&Debug, "<%s>",p->addr)); } else { state_puts(p->addr,mailer); DPRINT(Debug,9, (&Debug ,"%s",p->addr)); } if (cm) { char * buffer = string_to_hdr(HDR_COMMENT, p->comment, hdr_charset, enmime,NULL); char * c; DPRINT(Debug,9, (&Debug,"\n [%d] ",p-addr)); if (LEN > 85) { DPRINT(Debug,9, (&Debug, "[WRAP]\n [%d] ",p-addr)); WRAP; } else { state_putc(' ',mailer); DPRINT(Debug,9, (&Debug ," ")); } DPRINT(Debug,9, (&Debug, "\n {comment encoded=%s}",buffer)); DPRINT(Debug,9, (&Debug, "\n [%d] ",p-addr)); state_putc('(',mailer); DPRINT(Debug,9, (&Debug, "(")); for (c = buffer; *c != '\0'; c++) { if (*c == '\n' || (whitespace(*c) && (LEN > 100))) { WRAP; DPRINT(Debug,9, (&Debug, "[WRAP]\n [%d] ", p-addr)); } else { state_putc(*c,mailer); DPRINT(Debug,9, (&Debug, "%c",*c)); } } state_putc(')',mailer); DPRINT(Debug,9, (&Debug, ")")); free(buffer); } } print_EOLN(mailer,top_encoding); DPRINT(Debug,9, (&Debug, "[EOLN]\n")); } void write_text_header (mailer,hdr_name,text, top_encoding) out_state_t *mailer; CONST char *hdr_name; CONST char * text; int top_encoding; { long POS = out_state_ftell(mailer); CONST char *c; state_puts(hdr_name,mailer); state_puts(": ",mailer); DPRINT(Debug,9, (&Debug,"write_text_header: %s:",hdr_name)); for (c = text; *c != '\0'; c++) { if (*c == '\n' || (whitespace(*c) && (LEN > 75))) { WRAP; DPRINT(Debug,9, (&Debug,"[WRAP]\n ")); } else { state_putc(*c,mailer); DPRINT(Debug,9, (&Debug,"%c",*c)); } } print_EOLN(mailer,top_encoding); DPRINT(Debug,9, (&Debug,"[EOLN]\n")); } #undef LEN #undef WRAP /* * Local Variables: * mode:c * c-basic-offset:4 * buffer-file-coding-system: iso-8859-1 * End: */