// Copyright 2000-2005 the Contributors, as shown in the revision logs. // Licensed under the Apache Public Source License 2.0 ("the License"). // You may not use this file except in compliance with the License. package org.ibex.mail; import static org.ibex.mail.MailException.*; import org.ibex.crypto.*; import org.ibex.util.*; import org.ibex.mail.protocol.*; import org.ibex.io.*; import org.ibex.js.*; import java.util.*; import java.net.*; import java.io.*; // multipart/mixed -- default // multipart/parallel -- order of components does not matter // multipart/alternative -- same data, different versions // multipart/digest -- default content-type of components is message/rfc822 // message/rfc822 -- FIXME // message/partial -- not supported; see RFC 2046, section 5.2.2 // message/external-body -- not supported; see RFC 2046, section 5.2.3 // FIXME charsets US-ASCII, ISO-8559-X, public class ContentType extends org.ibex.js.JSReflection { public final String type; public final String subtype; public final String description; public final String id; public final String transferEncoding; public final String charset; public final boolean composite; public final boolean alternative; public final Hash parameters = new Hash(); public ContentType(String header, String description, String id, String transferEncoding) { this.id = id; this.description = description; this.transferEncoding = transferEncoding; if (header == null) { type="text"; subtype="plain"; charset="us-ascii"; alternative=false; composite=false; return; } header = header.trim(); if (header.indexOf('/') == -1) { Log.warn(this, "content-type lacks a forward slash: \""+header+"\""); header = "text/plain"; } type = header.substring(0, header.indexOf('/')).toLowerCase(); header = header.substring(header.indexOf('/') + 1); subtype = (header.indexOf(';') == -1) ? header.toLowerCase() : header.substring(0, header.indexOf(';')).toLowerCase(); composite = type != null && (type.equals("message") || type.equals("multipart")); alternative = composite && subtype.equals("alternative"); charset = parameters.get("charset") == null ? "us-ascii" : parameters.get("charset").toString(); if (header.indexOf(';') == -1) return; StringTokenizer st = new StringTokenizer(header.substring(header.indexOf(';') + 1), ";"); while(st.hasMoreTokens()) { String key = st.nextToken().trim(); if (key.indexOf('=') == -1) throw new Malformed("content-type parameter lacks an equals sign: \""+key+"\""); String val = key.substring(key.indexOf('=')+1).trim(); if (val.startsWith("\"") && val.endsWith("\"")) val = val.substring(1, val.length() - 2); key = key.substring(0, key.indexOf('=')+1).toLowerCase(); parameters.put(key, val); } } }