package com.sun.pdfview.action; import java.io.IOException; import com.sun.pdfview.PDFObject; import com.sun.pdfview.PDFParseException; /***************************************************************************** * Action for launching an application, mostly used to open a file. * * @author Katja Sondermann * @since 08.07.2009 ****************************************************************************/ public class LaunchAction extends PDFAction { // file separator according to PDF spec public final static String SOLIDUS = "/"; /** the file/application to be opened (optional)*/ private FileSpec file; /** should a new window be opened (optional)*/ private boolean newWindow = false; private PDFObject unixParam; private PDFObject macParam; private WinLaunchParam winParam; /** * Creates a new instance of LaunchAction from an object * * @param obj - the PDFObject with the action information * @param root - the root object */ public LaunchAction(PDFObject obj, PDFObject root) throws IOException { super("Launch"); // find the file/application and parse it PDFObject fileObj = obj.getDictRef("F"); this.file = parseFileSpecification(fileObj); // find the new window flag and parse it PDFObject newWinObj = obj.getDictRef("NewWindow"); if (newWinObj != null) { this.newWindow = newWinObj.getBooleanValue(); } // parse the OS specific launch parameters: this.winParam = parseWinDict(obj.getDictRef("Win")); // unix and mac dictionaries are not further specified, so can not be parsed yet. this.unixParam = obj.getDictRef("Unix"); this.macParam = obj.getDictRef("Mac"); // check if at least the file or one of the OS specific launch parameters is set: if ((this.file == null) && (this.winParam == null) && (this.unixParam == null) && (this.macParam == null)) { throw new PDFParseException("Could not parse launch action (file or OS " + "specific launch parameters are missing): " + obj.toString()); } } /************************************************************************* * Is the file name absolute (if not, it is relative to the path of the * currently opened PDF file). * If the file name starts with a "/", it is considered to be absolute. * * @return boolean ************************************************************************/ public static boolean isAbsolute(String fileName) { return fileName.startsWith(SOLIDUS); } /************************************************************************* * Parse the file specification object * @param fileObj * @return FileSpec - might be <code>null</code> in case the passed object is null * @throws IOException * @throws PDFParseException ************************************************************************/ private FileSpec parseFileSpecification(PDFObject fileObj) throws PDFParseException, IOException { FileSpec file = null; if (fileObj != null) { file = new FileSpec(); if(fileObj.getType() == PDFObject.DICTIONARY){ file.setFileSystem(PdfObjectParseUtil.parseStringFromDict("FS", fileObj, false)); file.setFileName(PdfObjectParseUtil.parseStringFromDict("F", fileObj, false)); file.setUnicode(PdfObjectParseUtil.parseStringFromDict("UF", fileObj, false)); file.setDosFileName(PdfObjectParseUtil.parseStringFromDict("DOS", fileObj, false)); file.setMacFileName(PdfObjectParseUtil.parseStringFromDict("Mac", fileObj, false)); file.setUnixFileName(PdfObjectParseUtil.parseStringFromDict("Unix", fileObj, false)); file.setVolatileFile(PdfObjectParseUtil.parseBooleanFromDict("V", fileObj, false)); file.setDescription(PdfObjectParseUtil.parseStringFromDict("Desc", fileObj, false)); file.setId(fileObj.getDictRef("ID")); file.setEmbeddedFile(fileObj.getDictRef("EF")); file.setRelatedFile(fileObj.getDictRef("RF")); file.setCollectionItem(fileObj.getDictRef("CI")); }else if(fileObj.getType() == PDFObject.STRING){ file.setFileName(fileObj.getStringValue()); }else{ throw new PDFParseException("File specification could not be parsed " + "(should be of type 'Dictionary' or 'String'): " + fileObj.toString()); } } return file; } /************************************************************************* * Parse the windows specific launch parameters * @param winDict * @throws IOException - in case of a problem during parsing content ************************************************************************/ private WinLaunchParam parseWinDict(PDFObject winDict) throws IOException { if (winDict == null) { return null; } WinLaunchParam param = new WinLaunchParam(); // find and parse the file/application name param.setFileName(PdfObjectParseUtil.parseStringFromDict("F", winDict, true)); // find and parse the directory param.setDirectory(PdfObjectParseUtil.parseStringFromDict("D", winDict, false)); // find and parse the operation to be performed param.setOperation(PdfObjectParseUtil.parseStringFromDict("O", winDict, false)); // find and parse the parameter to be passed to the application param.setParameter(PdfObjectParseUtil.parseStringFromDict("P", winDict, false)); return param; } /************************************************************************* * The file / application to be opened * @return FileSpec ************************************************************************/ public FileSpec getFileSpecification() { return this.file; } /************************************************************************* * Should a new window be opened for the file/application? * @return boolean ************************************************************************/ public boolean isNewWindow() { return this.newWindow; } /************************************************************************* * Get the unix specific launch parameters. * Note: The dictionary is not specified yet in the PDF spec., so the PdfObject * which is returned here is not parsed. * @return PDFObject ************************************************************************/ public PDFObject getUnixParam() { return this.unixParam; } /************************************************************************* * Get the mac specific launch parameters. * Note: The dictionary is not specified yet in the PDF spec., so the PdfObject * which is returned here is not parsed. * @return PDFObject ************************************************************************/ public PDFObject getMacParam() { return this.macParam; } /************************************************************************* * Get the windows specific launch parameters. * @return WinLaunchParam ************************************************************************/ public WinLaunchParam getWinParam() { return this.winParam; } /***************************************************************************** * Internal class for the windows specific launch parameters * * @version $Id: LaunchAction.java,v 1.1 2009-07-10 12:47:31 xond Exp $ * @author xond * @since 08.07.2009 ****************************************************************************/ public class WinLaunchParam { private String fileName; private String directory; private String operation = "open"; private String parameter; /************************************************************************* * The file/application name to be opened * @return String ************************************************************************/ public String getFileName() { return this.fileName; } /************************************************************************* * The file/application name to be opened * @param fileName ************************************************************************/ public void setFileName(String fileName) { this.fileName = fileName; } /************************************************************************* * The directory in standard DOS syntax * @return String ************************************************************************/ public String getDirectory() { return this.directory; } /************************************************************************* * The directory in standard DOS syntax * @param directory ************************************************************************/ public void setDirectory(String directory) { this.directory = directory; } /************************************************************************* * The operation to be performed (open or print). Ignored * in case the "F" parameter describes a file to be opened. * Default is "open". * @return String ************************************************************************/ public String getOperation() { return this.operation; } /************************************************************************* * The operation to be performed ("open" or "print").Ignored * in case the "F" parameter describes a file to be opened. * Default is "open". * @param operation ************************************************************************/ public void setOperation(String operation) { this.operation = operation; } /************************************************************************* * A parameter which shall be passed to the application. Ignored * in case the "F" parameter describes a file to be opened. * @return String ************************************************************************/ public String getParameter() { return this.parameter; } /************************************************************************* * A parameter which shall be passed to the application. Ignored * in case the "F" parameter describes a file to be opened. * @param parameter ************************************************************************/ public void setParameter(String parameter) { this.parameter = parameter; } } /***************************************************************************** * Inner class for storing a file specification * * @version $Id: LaunchAction.java,v 1.1 2009-07-10 12:47:31 xond Exp $ * @author xond * @since 08.07.2009 ****************************************************************************/ public static class FileSpec{ private String fileSystem; private String fileName; private String dosFileName; private String unixFileName; private String macFileName; private String unicode; private PDFObject id; private boolean volatileFile; private PDFObject embeddedFile; private PDFObject relatedFile; private String description; private PDFObject collectionItem; /************************************************************************* * The name of the file system that should be used to interpret this entry. * @return String ************************************************************************/ public String getFileSystem() { return this.fileSystem; } /************************************************************************* * The name of the file system that should be used to interpret this entry. * @param fileSystem ************************************************************************/ public void setFileSystem(String fileSystem) { this.fileSystem = fileSystem; } /************************************************************************* * Get the filename: * first try to get the file name for the used OS, if it's not available * return the common file name. * @return String ************************************************************************/ public String getFileName() { String system = System.getProperty("os.name"); if(system.startsWith("Windows")){ if(this.dosFileName != null){ return this.dosFileName; } }else if(system.startsWith("mac os x")){ if(this.macFileName != null){ return this.macFileName; } }else { if(this.unixFileName != null){ return this.unixFileName; } } return this.fileName; } /************************************************************************* * The file name. * @param fileName ************************************************************************/ public void setFileName(String fileName) { this.fileName = fileName; } /************************************************************************* * A file specification string representing a DOS file name. * @return String ************************************************************************/ public String getDosFileName() { return this.dosFileName; } /************************************************************************* * A file specification string representing a DOS file name. * @param dosFileName ************************************************************************/ public void setDosFileName(String dosFileName) { this.dosFileName = dosFileName; } /************************************************************************* * A file specification string representing a unix file name. * @return String ************************************************************************/ public String getUnixFileName() { return this.unixFileName; } /************************************************************************* * A file specification string representing a unix file name. * @param unixFileName ************************************************************************/ public void setUnixFileName(String unixFileName) { this.unixFileName = unixFileName; } /************************************************************************* * A file specification string representing a mac file name. * @return String ************************************************************************/ public String getMacFileName() { return this.macFileName; } /************************************************************************* * A file specification string representing a mac file name. * @param macFileName ************************************************************************/ public void setMacFileName(String macFileName) { this.macFileName = macFileName; } /************************************************************************* * Unicode file name * @return String ************************************************************************/ public String getUnicode() { return this.unicode; } /************************************************************************* * Unicode file name * @param unicode ************************************************************************/ public void setUnicode(String unicode) { this.unicode = unicode; } /************************************************************************* * ID - array of two byte strings constituting a file identifier, which * should be included in the referenced file. * * @return PDFObject ************************************************************************/ public PDFObject getId() { return this.id; } /************************************************************************* * ID - array of two byte strings constituting a file identifier, which * should be included in the referenced file. * * @param id ************************************************************************/ public void setId(PDFObject id) { this.id = id; } /************************************************************************* * Is the file volatile? * @return boolean ************************************************************************/ public boolean isVolatileFile() { return this.volatileFile; } /************************************************************************* * Is the file volatile? * @param volatileFile ************************************************************************/ public void setVolatileFile(boolean volatileFile) { this.volatileFile = volatileFile; } /************************************************************************* * Dictionary of embedded file streams * @return PDFObject ************************************************************************/ public PDFObject getEmbeddedFile() { return this.embeddedFile; } /************************************************************************* * Dictionary of embedded file streams * @param embeddedFile ************************************************************************/ public void setEmbeddedFile(PDFObject embeddedFile) { this.embeddedFile = embeddedFile; } /************************************************************************* * Dictionary of related files. * @return PDFObject ************************************************************************/ public PDFObject getRelatedFile() { return this.relatedFile; } /************************************************************************* * Dictionary of related files. * @param relatedFile ************************************************************************/ public void setRelatedFile(PDFObject relatedFile) { this.relatedFile = relatedFile; } /************************************************************************* * File specification description * @return String ************************************************************************/ public String getDescription() { return this.description; } /************************************************************************* * File specification description * @param description ************************************************************************/ public void setDescription(String description) { this.description = description; } /************************************************************************* * Collection item dictionary * @return PDFObject ************************************************************************/ public PDFObject getCollectionItem() { return this.collectionItem; } /************************************************************************* * Collection item dictionary * @param collectionItem ************************************************************************/ public void setCollectionItem(PDFObject collectionItem) { this.collectionItem = collectionItem; } } }