]> diplodocus.org Git - nmh/commitdiff
Support the -headerencoding switch to select the header encoding algorithm.
authorKen Hornstein <kenh@pobox.com>
Thu, 31 Oct 2013 15:37:52 +0000 (11:37 -0400)
committerKen Hornstein <kenh@pobox.com>
Thu, 31 Oct 2013 15:37:52 +0000 (11:37 -0400)
h/mhparse.h
man/mhbuild.man
uip/mhbuild.c
uip/mhbuildsbr.c

index b5a73627005c3d05b712a41bbd43e11963bfe5e4..1dfd7ed8df65abd47bc325a05ab5755b4fd50481 100644 (file)
@@ -285,6 +285,21 @@ extern struct str2init str2methods[];
  */
 int pidcheck (int);
 CT parse_mime (char *);
  */
 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);
 int add_header (CT, char *, char *);
 int get_ctinfo (char *, CT, int);
 int params_external (CT, int);
index ab757d3465dfff12089a562958e523aff01d202e..6f50006b4976238164fc5b93389b01021d0740c4 100644 (file)
@@ -17,6 +17,9 @@ mhbuild \- translate MIME composition draft
 .RB [ \-contentid " | " \-nocontentid ]
 .RB [ \-verbose " | " \-noverbose ]
 .RB [ \-check " | " \-nocheck ]
 .RB [ \-contentid " | " \-nocontentid ]
 .RB [ \-verbose " | " \-noverbose ]
 .RB [ \-check " | " \-nocheck ]
+.RB [ \-headerencoding 
+.IR encoding\-algorithm
+.RB " | " \-autoheaderencoding ]
 .RB [ \-version ]
 .RB [ \-help ]
 .ad
 .RB [ \-version ]
 .RB [ \-help ]
 .ad
@@ -28,11 +31,8 @@ a valid MIME message.
 .PP
 .B mhbuild
 creates multi-media messages as specified in RFC 2045
 .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
 .PP
 If you specify the name of the composition file as \*(lq-\*(rq,
 then
@@ -77,6 +77,20 @@ switch
 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.
 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
 .SS "Translating the Composition File"
 .B mhbuild
 is essentially a filter to aid in the composition of MIME
@@ -714,4 +728,5 @@ is checked.
 .RB ` \-contentid '
 .RB ` \-nocheck '
 .RB ` \-noverbose '
 .RB ` \-contentid '
 .RB ` \-nocheck '
 .RB ` \-noverbose '
+.RB ` \-autoheaderencoding '
 .fi
 .fi
index 91132ce3d732fab6ead55e0f52ee359305070655..1a3ce1dfbfcb694b26b640123bddc1bb7f688df6 100644 (file)
@@ -37,6 +37,8 @@
     X("wcache policy", 0, WCACHESW) \
     X("contentid", 0, CONTENTIDSW) \
     X("nocontentid", 0, NCONTENTIDSW) \
     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) \
     X("version", 0, VERSIONSW) \
     X("help", 0, HELPSW) \
     X("debug", -5, DEBUGSW) \
@@ -49,6 +51,17 @@ DEFINE_SWITCH_ENUM(MHBUILD);
 DEFINE_SWITCH_ARRAY(MHBUILD, switches);
 #undef X
 
 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 */
 
 /* mhbuildsbr.c */
 extern char *tmp;      /* directory to place temp files */
@@ -78,7 +91,6 @@ static int unlink_outfile = 0;
 static void unlink_done (int) NORETURN;
 
 /* mhbuildsbr.c */
 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*);
 
 int output_message (CT, char *);
 int output_message_fp (CT, FILE *, char*);
 
@@ -97,6 +109,7 @@ main (int argc, char **argv)
     CT ct, cts[2];
     FILE *fp = NULL;
     FILE *fp_out = NULL;
     CT ct, cts[2];
     FILE *fp = NULL;
     FILE *fp_out = NULL;
+    int header_encoding = CE_UNKNOWN;
 
     done=unlink_done;
 
 
     done=unlink_done;
 
@@ -205,6 +218,32 @@ main (int argc, char **argv)
                contentidsw = 0;
                continue;
 
                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;
            case VERBSW: 
                verbosw++;
                continue;
@@ -280,7 +319,7 @@ main (int argc, char **argv)
        unlink_infile = 1;
 
        /* build the content structures for MIME message */
        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;
 
        cts[0] = ct;
        cts[1] = NULL;
 
@@ -314,7 +353,7 @@ main (int argc, char **argv)
      */
 
     /* build the content structures for MIME message */
      */
 
     /* 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;
 
     cts[0] = ct;
     cts[1] = NULL;
 
index 79268399261973f681cb570a485d77c94244078d..e449917092e185d5934cf3579ddaa81373998ec4 100644 (file)
@@ -69,11 +69,6 @@ int find_cache (CT, int, int *, char *, char *, int);
 void free_ctinfo (CT);
 void free_encoding (CT, int);
 
 void free_ctinfo (CT);
 void free_encoding (CT, int);
 
-/*
- * prototypes
- */
-CT build_mime (char *, int);
-
 /*
  * static prototypes
  */
 /*
  * static prototypes
  */
@@ -128,7 +123,7 @@ static void directive_pop(void)
  */
 
 CT
  */
 
 CT
-build_mime (char *infile, int directives)
+build_mime (char *infile, int directives, int header_encoding)
 {
     int        compnum, state;
     char buf[BUFSIZ], name[NAMESZ];
 {
     int        compnum, state;
     char buf[BUFSIZ], name[NAMESZ];
@@ -234,7 +229,7 @@ finish_field:
      */
 
     for (hp = ct->c_first_hf; hp != NULL; hp = hp->next) {
      */
 
     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);
        }
     }
            adios(NULL, "Unable to encode header \"%s\"", hp->name);
        }
     }