337 lines · 9.0 KB · Java
RawDownload
/* * @(#)MimeEntry.java	1.18 96/12/21 *  * Copyright (c) 1994,1996 Sun Microsystems, Inc. All Rights Reserved. *  * Permission to use, copy, modify, and distribute this software and its * documentation for NON-COMMERCIAL purposes and without fee is hereby * granted provided that this copyright notice appears in all copies. Please * refer to the file "copyright.html" for further important copyright and * licensing information. *  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR * ITS DERIVATIVES. */ package sun.net.www;import java.net.URL;import java.io.*;import java.util.StringTokenizer; public class MimeEntry implements Cloneable {    public static final String defaultImagePath = "doc:/lib/images/ftp";     private String typeName;	// of the form: "type/subtype"    private String tempFileNameTemplate;     private int action;    private String command;    private String description;    private String imageFileName;    private String fileExtensions[];     boolean starred;     // Actions     public static final int		UNKNOWN			= 0;    public static final int		LOAD_INTO_BROWSER	= 1;    public static final int		SAVE_TO_FILE		= 2;    public static final int		LAUNCH_APPLICATION	= 3;     static final String[] actionKeywords = {	"unknown",	"browser",	"save",	"application",    };     /**     * Construct an empty entry of the given type and subtype.     */    public MimeEntry(String type) {	// Default action is UNKNOWN so clients can decide what the default	// should be, typically save to file or ask user.	this(type, UNKNOWN, null, null, null);    }     //    // The next two constructors are used only by the deprecated    // PlatformMimeTable classes or, in last case, is called by the public    // constructor.  They are kept here anticipating putting support for    // mailcap formatted config files back in (so BOTH the properties format    // and the mailcap formats are supported).    //    MimeEntry(String type, String imageFileName, String extensionString) {	typeName = type.toLowerCase();	action = UNKNOWN;	command = null;	this.imageFileName = imageFileName;	setExtensions(extensionString);	starred = isStarred(typeName);    }     // For use with MimeTable::parseMailCap    MimeEntry(String typeName, int action, String command,	      String tempFileNameTemplate) {	this.typeName = typeName.toLowerCase();	this.action = action;	this.command = command;	this.imageFileName = null;	this.fileExtensions = null; 	this.tempFileNameTemplate = tempFileNameTemplate;    }     // This is the one called by the public constructor.    MimeEntry(String typeName, int action, String command, 	      String imageFileName, String fileExtensions[]) { 	this.typeName = typeName.toLowerCase();	this.action = action;	this.command = command;	this.imageFileName = imageFileName;	this.fileExtensions = fileExtensions; 	starred = isStarred(typeName);     }     public synchronized String getType() {	return typeName;    }     public synchronized void setType(String type) {	typeName = type.toLowerCase();    }     public synchronized int getAction() {	return action;    }     public synchronized void setAction(int action, String command) {	this.action = action;	this.command = command;    }     public synchronized void setAction(int action) {	this.action = action;    }     public synchronized String getLaunchString() {	return command;    }     public synchronized void setCommand(String command) {	this.command = command;    }        public synchronized String getDescription() {	return (description != null ? description : typeName);    }     public synchronized void setDescription(String description) {	this.description = description;    }     // ??? what to return for the image -- the file name or should this return    // something more advanced like an image source or something?    // returning the name has the least policy associated with it.    // pro tempore, we'll use the name    public String getImageFileName() {	return imageFileName;    }     public synchronized void setImageFileName(String filename) {	File file = new File(filename);	if (file.getParent() == null) {	    imageFileName = MimeEntry.defaultImagePath +		File.separator +		filename;	}	else {	    imageFileName = filename;	} 	if (filename.lastIndexOf('.') < 0) {	    imageFileName = imageFileName + ".gif";	}    }     public String getTempFileTemplate() {	return tempFileNameTemplate;    }     public synchronized String[] getExtensions() {	return fileExtensions;    }     public synchronized String getExtensionsAsList() {	String extensionsAsString = "";	if (fileExtensions != null) {	    for (int i = 0; i < fileExtensions.length; i++) {		extensionsAsString += fileExtensions[i];		if (i < (fileExtensions.length - 1)) {		    extensionsAsString += ",";		}	    }	} 	return extensionsAsString;    }     public synchronized void setExtensions(String extensionString) {	StringTokenizer extTokens = new StringTokenizer(extensionString, ",");	int numExts = extTokens.countTokens();	String extensionStrings[] = new String[numExts]; 	for (int i = 0; i < numExts; i++) {	    String ext = (String)extTokens.nextElement();	    extensionStrings[i] = ext.trim();	}		fileExtensions = extensionStrings;    }     private boolean isStarred(String typeName) {	return (typeName != null)	    && (typeName.length() > 0)	    && (typeName.endsWith("/*"));    }     /**     * Invoke the MIME type specific behavior for this MIME type.     * Returned value can be one of several types:     * <ol>     * <li>A thread -- the caller can choose when to launch this thread.     * <li>A string -- the string is loaded into the browser directly.     * <li>An input stream -- the caller can read from this byte stream and     *     will typically store the results in a file.     * <li>A document (?) --     * </ol>     */    public Object launch(java.net.URLConnection urlc, InputStream is, MimeTable mt) throws ApplicationLaunchException {	switch (action) {	case SAVE_TO_FILE:	    // REMIND: is this really the right thing to do?	    try {		return is;	    } catch(Exception e) {		// I18N		return "Load to file failed:\n" + e;	    } 	case LOAD_INTO_BROWSER:	    // REMIND: invoke the content handler?	    // may be the right thing to do, may not be -- short term	    // where docs are not loaded asynch, loading and returning	    // the content is the right thing to do.	    try {		return urlc.getContent();	    } catch (Exception e) {		return null;	    } 	case LAUNCH_APPLICATION:	    {		String threadName = command;		int fst = threadName.indexOf(' ');		if (fst > 0) {		    threadName = threadName.substring(0, fst);		} 		return new MimeLauncher(this, urlc, is,					mt.getTempFileTemplate(), threadName);	    } 	case UNKNOWN:	    // REMIND: What do do here?	    return null;	} 	return null;    }     public boolean matches(String type) {	if (starred) {	  // REMIND: is this the right thing or not?	  return type.startsWith(typeName);	} else {	    return type.equals(typeName);	}    }     public Object clone() {	// return a shallow copy of this.	MimeEntry theClone = new MimeEntry(typeName);	theClone.action = action;	theClone.command = command;	theClone.description = description;	theClone.imageFileName = imageFileName;	theClone.tempFileNameTemplate = tempFileNameTemplate;	theClone.fileExtensions = fileExtensions; 	return theClone;    }     public synchronized String toProperty() {	StringBuffer buf = new StringBuffer(); 	String separator = "; ";	boolean needSeparator = false; 	int action = getAction();	if (action != MimeEntry.UNKNOWN) {	    buf.append("action=" + actionKeywords[action]);	    needSeparator = true;	} 	String command = getLaunchString();	if (command != null && command.length() > 0) {	    if (needSeparator) {		buf.append(separator);	    }	    buf.append("application=" + command);	    needSeparator = true;	} 	if (getImageFileName() != null) {	    if (needSeparator) {		buf.append(separator);	    }	    buf.append("icon=" + getImageFileName());	    needSeparator = true;	} 	String extensions = getExtensionsAsList();	if (extensions.length() > 0) {	    if (needSeparator) {		buf.append(separator);	    }	    buf.append("file_extensions=" + extensions);	    needSeparator = true;	} 	String description = getDescription();	if (description != null && !description.equals(getType())) {	    if (needSeparator) {		buf.append(separator);	    }	    buf.append("description=" + description);	} 	return buf.toString();    }     public String toString() {	return "MimeEntry[contentType=" + typeName	    + ", image=" + imageFileName	    + ", action=" + action	    + ", command=" + command	    + ", extensions=" + getExtensionsAsList()	    + "]";    }}