/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
*
* MailTo URL parser
*
* This class parses a mailto scheme URL and then can be queried for
* the parsed parameters. This implements RFC 2368.
*
*/
public class MailTo {
static public final String MAILTO_SCHEME = "mailto:";
// All the parsed content is added to the headers.
private HashMap<String, String> mHeaders;
// Well known headers
static private final String TO = "to";
static private final String BODY = "body";
static private final String CC = "cc";
static private final String SUBJECT = "subject";
/**
* Test to see if the given string is a mailto URL
* @param url string to be tested
* @return true if the string is a mailto URL
*/
public static boolean isMailTo(String url) {
if (url != null && url.startsWith(MAILTO_SCHEME)) {
return true;
}
return false;
}
/**
* Parse and decode a mailto scheme string. This parser implements
* RFC 2368. The returned object can be queried for the parsed parameters.
* @param url String containing a mailto URL
* @return MailTo object
* @exception ParseException if the scheme is not a mailto URL
*/
public static MailTo parse(String url) throws ParseException {
if (url == null) {
throw new NullPointerException();
}
if (!isMailTo(url)) {
throw new ParseException("Not a mailto scheme");
}
// Strip the scheme as the Uri parser can't cope with it.
String noScheme = url.substring(MAILTO_SCHEME.length());
Uri email = Uri.parse(noScheme);
MailTo m = new MailTo();
// Parse out the query parameters
String query = email.getQuery();
if (query != null ) {
String[] queries = query.split("&");
for (String q : queries) {
String[] nameval = q.split("=");
if (nameval.length == 0) {
continue;
}
// insert the headers with the name in lowercase so that
// we can easily find common headers
m.mHeaders.put(Uri.decode(nameval[0]).toLowerCase(Locale.ROOT),
nameval.length > 1 ? Uri.decode(nameval[1]) : null);
}
}
// Address can be specified in both the headers and just after the
// mailto line. Join the two together.
String address = email.getPath();
if (address != null) {
String addr = m.getTo();
if (addr != null) {
address += ", " + addr;
}
m.mHeaders.put(TO, address);
}
return m;
}
/**
* Retrieve the To address line from the parsed mailto URL. This could be
* several email address that are comma-space delimited.
* If no To line was specified, then null is return
* @return comma delimited email addresses or null
*/
public String getTo() {
return mHeaders.get(TO);
}
/**
* Retrieve the CC address line from the parsed mailto URL. This could be
* several email address that are comma-space delimited.
* If no CC line was specified, then null is return
* @return comma delimited email addresses or null
*/
public String getCc() {
return mHeaders.get(CC);
}
/**
* Retrieve the subject line from the parsed mailto URL.
* If no subject line was specified, then null is return
* @return subject or null
*/
public String getSubject() {
return mHeaders.get(SUBJECT);
}
/**
* Retrieve the body line from the parsed mailto URL.
* If no body line was specified, then null is return
* @return body or null
*/
public String getBody() {
return mHeaders.get(BODY);
}
/**
* Retrieve all the parsed email headers from the mailto URL
* @return map containing all parsed values
*/
public Map<String, String> getHeaders() {
return mHeaders;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(MAILTO_SCHEME);
sb.append('?');
for (Map.Entry<String,String> header : mHeaders.entrySet()) {
sb.append(Uri.encode(header.getKey()));
sb.append('=');
sb.append(Uri.encode(header.getValue()));
sb.append('&');
}
return sb.toString();
}
/**
* Private constructor. The only way to build a Mailto object is through
* the parse() method.
*/
private MailTo() {
mHeaders = new HashMap<String, String>();
}
}