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);
/* Build the rest of the header field structures */
if (! dist)
- build_headers (ct);
+ build_headers (ct, header_encoding);
return ct;
}
*/
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
* 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);
}
/*
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);
}
} 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)
CT p;
p = part->mp_part;
- build_headers (p);
+ build_headers (p, header_encoding);
}
}
break;
struct exbody *e;
e = (struct exbody *) ct->c_ctparams;
- build_headers (e->eb_content);
+ build_headers (e->eb_content, header_encoding);
}
break;
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);
}