*/
int pidcheck (int);
CT parse_mime (char *);
+
+/*
+ * Translate a composition file into a MIME data structure. Arguments are:
+ *
+ * infile - Name of input filename
+ * directives - A flag to control whether or not build directives are
+ * processed by default.
+ * encoding - The default encoding to use when doing RFC 2047 header
+ * encoding. Must be one of CE_UNKNOWN, CE_BASE64, or
+ * CE_QUOTED;
+ *
+ * Returns a CT structure describing the resulting MIME message.
+ */
+CT build_mime (char *infile, int directives, int encoding);
+
int add_header (CT, char *, char *);
int get_ctinfo (char *, CT, int);
int params_external (CT, int);
.RB [ \-contentid " | " \-nocontentid ]
.RB [ \-verbose " | " \-noverbose ]
.RB [ \-check " | " \-nocheck ]
+.RB [ \-headerencoding
+.IR encoding\-algorithm
+.RB " | " \-autoheaderencoding ]
.RB [ \-version ]
.RB [ \-help ]
.ad
.PP
.B mhbuild
creates multi-media messages as specified in RFC 2045
-to RFC 2049. Currently
-.B mhbuild
-only supports encodings in
-message bodies, and does not support the encoding of message headers as
-specified in RFC 2047.
+to RFC 2049. This includes the encoding of message headers as specified
+by RFC 2047.
.PP
If you specify the name of the composition file as \*(lq-\*(rq,
then
is present, then the listing will show any \*(lqextra\*(rq information
that is present in the message, such as comments in the
\*(lqContent-Type\*(rq header.
+.PP
+The
+.B \-headerencoding
+switch will indicate which algorithm to use when encoding any message headers
+that contain 8\-bit characters. The valid arguments are
+.I base64
+for based\-64 encoding and
+.I quoted
+for quoted\-printable encoding. The
+.B \-autoheaderencoding
+switch will instruct
+.B mhbuild
+to automatically pick the encoding algorithm based on the frequency of
+8\-bit characters.
.SS "Translating the Composition File"
.B mhbuild
is essentially a filter to aid in the composition of MIME
.RB ` \-contentid '
.RB ` \-nocheck '
.RB ` \-noverbose '
+.RB ` \-autoheaderencoding '
.fi
X("wcache policy", 0, WCACHESW) \
X("contentid", 0, CONTENTIDSW) \
X("nocontentid", 0, NCONTENTIDSW) \
+ X("headerencoding", 0, HEADERENCSW) \
+ X("autoheaderencoding", 0, AUTOHEADERENCSW) \
X("version", 0, VERSIONSW) \
X("help", 0, HELPSW) \
X("debug", -5, DEBUGSW) \
DEFINE_SWITCH_ARRAY(MHBUILD, switches);
#undef X
+#define MIMEENCODING_SWITCHES \
+ X("base64", 0, BASE64SW) \
+ X("quoted-printable", 0, QUOTEDPRINTSW) \
+
+#define X(sw, minchars, id) id,
+DEFINE_SWITCH_ENUM(MIMEENCODING);
+#undef X
+
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(MIMEENCODING, encodingswitches);
+#undef X
/* mhbuildsbr.c */
extern char *tmp; /* directory to place temp files */
static void unlink_done (int) NORETURN;
/* mhbuildsbr.c */
-CT build_mime (char *, int);
int output_message (CT, char *);
int output_message_fp (CT, FILE *, char*);
CT ct, cts[2];
FILE *fp = NULL;
FILE *fp_out = NULL;
+ int header_encoding = CE_UNKNOWN;
done=unlink_done;
contentidsw = 0;
continue;
+ case HEADERENCSW: {
+ int encoding;
+
+ if (!(cp = *argp++) || *cp == '-')
+ adios (NULL, "missing argument to %s", argp[-2]);
+ switch (encoding = smatch (cp, encodingswitches)) {
+ case AMBIGSW:
+ ambigsw (cp, encodingswitches);
+ done (1);
+ case UNKWNSW:
+ adios (NULL, "%s unknown encoding algorithm", cp);
+ case BASE64SW:
+ header_encoding = CE_BASE64;
+ break;
+ case QUOTEDPRINTSW:
+ header_encoding = CE_QUOTED;
+ break;
+ default:
+ adios (NULL, "Internal error: algorithm %s", cp);
+ }
+ }
+
+ case AUTOHEADERENCSW:
+ header_encoding = CE_UNKNOWN;
+ continue;
+
case VERBSW:
verbosw++;
continue;
unlink_infile = 1;
/* build the content structures for MIME message */
- ct = build_mime (infile, directives);
+ ct = build_mime (infile, directives, header_encoding);
cts[0] = ct;
cts[1] = NULL;
*/
/* build the content structures for MIME message */
- ct = build_mime (compfile, directives);
+ ct = build_mime (compfile, directives, header_encoding);
cts[0] = ct;
cts[1] = NULL;
void free_ctinfo (CT);
void free_encoding (CT, int);
-/*
- * prototypes
- */
-CT build_mime (char *, int);
-
/*
* static prototypes
*/
*/
CT
-build_mime (char *infile, int directives)
+build_mime (char *infile, int directives, int header_encoding)
{
int compnum, state;
char buf[BUFSIZ], name[NAMESZ];
*/
for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) {
- if (encode_rfc2047(hp->name, &hp->value, CE_UNKNOWN, NULL)) {
+ if (encode_rfc2047(hp->name, &hp->value, header_encoding, NULL)) {
adios(NULL, "Unable to encode header \"%s\"", hp->name);
}
}