]> diplodocus.org Git - nmh/blobdiff - uip/mhbuildsbr.c
Add a new get_param_value(); redo iconv() parameter conversion code.
[nmh] / uip / mhbuildsbr.c
index b013186d925559c8dbbf97f239b1b66376c32639..0d20a671f05484ed6071f477fb6e754f81f063e1 100644 (file)
@@ -78,7 +78,7 @@ static int user_content (FILE *, char *, CT *);
 static void set_id (CT, int);
 static int compose_content (CT);
 static int scan_content (CT, size_t);
-static int build_headers (CT);
+static int build_headers (CT, int);
 static char *calculate_digest (CT, int);
 
 
@@ -462,7 +462,7 @@ finish_field:
 
     /* Build the rest of the header field structures */
     if (! dist)
-       build_headers (ct);
+       build_headers (ct, header_encoding);
 
     return ct;
 }
@@ -1523,12 +1523,11 @@ scan_content (CT ct, size_t maxunencoded)
  */
 
 static int
-build_headers (CT ct)
+build_headers (CT ct, int header_encoding)
 {
     int        cc, mailbody, extbody, len;
     char *np, *vp, buffer[BUFSIZ];
     CI ci = &ct->c_ctinfo;
-    PM pm;
 
     /*
      * If message is type multipart, then add the multipart
@@ -1568,59 +1567,16 @@ build_headers (CT ct)
      * Append the attribute/value pairs to
      * the end of the Content-Type line.
      */
-    for (pm = ci->ci_first_pm; pm; pm = pm->pm_next) {
-       if (mailbody && !strcasecmp (pm->pm_name, "body"))
-           continue;
-
-       vp = add (";", vp);
-       len++;
-
-       /*
-        * According to RFC 2017, if we have a URL longer than 40 characters
-        * we have to break it across multiple lines
-        */
-
-       if (extbody && strcasecmp (pm->pm_name, "url") == 0) {
-           char *value = pm->pm_value;
-
-           /* 7 here refers to " url=\"\"" */
-           if (len + 1 + (cc = (min(MAXURLTOKEN, strlen(value)) + 7)) >=
-                                                               CPERLIN) {
-               vp = add ("\n\t", vp);
-               len = 8;
-           } else {
-               vp = add (" ", vp);
-               len++;
-           }
-
-           vp = add ("url=\"", vp);
-           len += 5;
 
-           while (strlen(value) > MAXURLTOKEN) {
-               strncpy(buffer, value, MAXURLTOKEN);
-               buffer[MAXURLTOKEN] = '\0';
-               vp = add (buffer, vp);
-               vp = add ("\n\t", vp);
-               value += MAXURLTOKEN;
-               len = 8;
-           }
+    if (ci->ci_first_pm) {
+       char *s = output_params(len, ci->ci_first_pm, &len, mailbody);
 
-           vp = add (value, vp);
-           vp = add ("\"", vp);
-           len += strlen(value) + 1;
-           continue;
-       }
+       if (!s)
+           adios(NULL, "Internal error: failed outputting Content-Type "
+                 "parameters");
 
-       snprintf (buffer, sizeof(buffer), "%s=\"%s\"", pm->pm_name, pm->pm_value);
-       if (len + 1 + (cc = strlen (buffer)) >= CPERLIN) {
-           vp = add ("\n\t", vp);
-           len = 8;
-       } else {
-           vp = add (" ", vp);
-           len++;
-       }
-       vp = add (buffer, vp);
-       len += cc;
+       vp = add (s, vp);
+       free(s);
     }
 
     /*
@@ -1656,6 +1612,8 @@ build_headers (CT ct)
     if (ct->c_descr) {
        np = add (DESCR_FIELD, NULL);
        vp = concat (" ", ct->c_descr, NULL);
+       if (encode_rfc2047(DESCR_FIELD, &vp, header_encoding, NULL))
+           adios(NULL, "Unable to encode %s header", DESCR_FIELD);
        add_header (ct, np, vp);
     }
 
@@ -1670,7 +1628,7 @@ build_headers (CT ct)
     } else if (ct->c_dispo_type) {
        vp = concat (" ", ct->c_dispo_type, NULL);
        len = strlen(DISPO_FIELD) + strlen(vp) + 1;
-       np = output_params(len, ct->c_dispo_first, NULL);
+       np = output_params(len, ct->c_dispo_first, NULL, 0);
        vp = add(np, vp);
        vp = add("\n", vp);
        if (np)
@@ -1759,7 +1717,7 @@ skip_headers:
            CT p;
 
            p = part->mp_part;
-           build_headers (p);
+           build_headers (p, header_encoding);
        }
     }
        break;
@@ -1769,7 +1727,7 @@ skip_headers:
            struct exbody *e;
 
            e = (struct exbody *) ct->c_ctparams;
-           build_headers (e->eb_content);
+           build_headers (e->eb_content, header_encoding);
        }
        break;
 
@@ -1964,11 +1922,10 @@ setup_attach_content(CT ct, char *filename)
 
     if (strcasecmp(ct->c_ctinfo.ci_type, "text") == 0 &&
        strcasecmp(ct->c_ctinfo.ci_subtype, "calendar") == 0) {
-       ct->c_dispo = getcpy("inline; filename=\"");
+       ct->c_dispo_type = getcpy("inline");
     } else {
-       ct->c_dispo = getcpy("attachment; filename=\"");
+       ct->c_dispo_type = getcpy("attachment");
     }
 
-    ct->c_dispo = add(simplename, ct->c_dispo);
-    ct->c_dispo = add("\"\n", ct->c_dispo);
+    add_param(&ct->c_dispo_first, &ct->c_dispo_last, "filename", simplename);
 }