Package com.sun.pdfview.action

Source Code of com.sun.pdfview.action.LaunchAction

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;
    }
  }
}
TOP

Related Classes of com.sun.pdfview.action.LaunchAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.