Class CompoundDocument

java.lang.Object
com.twelvemonkeys.io.ole2.CompoundDocument
All Implemented Interfaces:
AutoCloseable

public final class CompoundDocument extends Object implements AutoCloseable
Represents a read-only OLE2 compound document.

NOTE: This class is not synchronized. Accessing the document or its entries from different threads, will need synchronization on the document instance.

Version:
$Id: //depot/branches/personal/haraldk/twelvemonkeys/release-2/twelvemonkeys-core/src/main/java/com/twelvemonkeys/io/ole2/CompoundDocument.java#4 $
  • Field Details

    • MAGIC

      static final byte[] MAGIC
    • FREE_SID

      private static final int FREE_SID
      See Also:
    • END_OF_CHAIN_SID

      private static final int END_OF_CHAIN_SID
      See Also:
    • SAT_SECTOR_SID

      private static final int SAT_SECTOR_SID
      See Also:
    • MSAT_SECTOR_SID

      private static final int MSAT_SECTOR_SID
      See Also:
    • HEADER_SIZE

      public static final int HEADER_SIZE
      See Also:
    • EPOCH_OFFSET

      public static final long EPOCH_OFFSET
      The epoch offset of CompoundDocument time stamps
      See Also:
    • input

      private final DataInput input
    • uUID

      private UUID uUID
    • sectorSize

      private int sectorSize
    • shortSectorSize

      private int shortSectorSize
    • directorySId

      private int directorySId
    • minStreamSize

      private int minStreamSize
    • shortSATSId

      private int shortSATSId
    • shortSATSize

      private int shortSATSize
    • masterSAT

      private int[] masterSAT
    • SAT

      private int[] SAT
    • shortSAT

      private int[] shortSAT
    • rootEntry

      private Entry rootEntry
    • shortStreamSIdChain

      private SIdChain shortStreamSIdChain
    • directorySIdChain

      private SIdChain directorySIdChain
  • Constructor Details

    • CompoundDocument

      public CompoundDocument(File file) throws IOException
      Creates a (for now) read only CompoundDocument.

      Warning! You must invoke close() on the compound document created from this constructor when done, to avoid leaking file descriptors.

      Parameters:
      file - the file to read from
      Throws:
      IOException - if an I/O exception occurs while reading the header
    • CompoundDocument

      public CompoundDocument(InputStream pInput) throws IOException
      Creates a read only CompoundDocument.
      Parameters:
      pInput - the input to read from.
      Throws:
      IOException - if an I/O exception occurs while reading the header
    • CompoundDocument

      CompoundDocument(SeekableInputStream stream) throws IOException
      Throws:
      IOException
    • CompoundDocument

      public CompoundDocument(ImageInputStream input) throws IOException
      Creates a read only CompoundDocument.
      Parameters:
      input - the input to read from
      Throws:
      IOException - if an I/O exception occurs while reading the header
  • Method Details

    • close

      public void close() throws IOException
      This method will close the underlying RandomAccessFile if any, but will leave any stream created outside the document open.
      Specified by:
      close in interface AutoCloseable
      Throws:
      IOException - if an I/O error occurs.
      See Also:
    • canRead

      public static boolean canRead(DataInput pInput)
    • canRead

      private static boolean canRead(DataInput pInput, boolean pReset)
    • readHeader

      private void readHeader() throws IOException
      Throws:
      IOException
    • skipBytesFully

      private int skipBytesFully(int n) throws IOException
      Throws:
      IOException
    • readSAT

      private void readSAT() throws IOException
      Throws:
      IOException
    • getSIdChain

      private SIdChain getSIdChain(int pSId, long pStreamSize) throws IOException
      Gets the SIdChain for the given stream Id
      Parameters:
      pSId - the stream Id
      pStreamSize - the size of the stream, or -1 for system control streams
      Returns:
      the SIdChain for the given stream Id
      Throws:
      IOException - if an I/O exception occurs
    • isShortStream

      private boolean isShortStream(long pStreamSize)
    • seekToSId

      private void seekToSId(int pSId, long pStreamSize) throws IOException
      Seeks to the start pos for the given stream Id
      Parameters:
      pSId - the stream Id
      pStreamSize - the size of the stream, or -1 for system control streams
      Throws:
      IOException - if an I/O exception occurs
    • seekToDId

      private void seekToDId(int pDId) throws IOException
      Throws:
      IOException
    • getInputStreamForSId

      SeekableInputStream getInputStreamForSId(int pStreamId, int pStreamSize) throws IOException
      Throws:
      IOException
    • getDirectoryStreamForDId

      private InputStream getDirectoryStreamForDId(int pDirectoryId) throws IOException
      Throws:
      IOException
    • getEntry

      Entry getEntry(int pDirectoryId, Entry pParent) throws IOException
      Throws:
      IOException
    • getEntries

      SortedSet<Entry> getEntries(int pDirectoryId, Entry pParent) throws IOException
      Throws:
      IOException
    • getEntriesRecursive

      private SortedSet<Entry> getEntriesRecursive(int pDirectoryId, Entry pParent, SortedSet<Entry> pEntries) throws IOException
      Throws:
      IOException
    • getEntry

      Entry getEntry(String pPath) throws IOException
      Throws:
      IOException
    • getRootEntry

      public Entry getRootEntry() throws IOException
      Throws:
      IOException
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • toJavaTimeInMillis

      public static long toJavaTimeInMillis(long pMSTime)
      Converts the given time stamp to standard Java time representation, milliseconds since January 1, 1970. The time stamp parameter is assumed to be in units of 100 nano seconds since January 1, 1601.

      If the timestamp is 0L (meaning not specified), no conversion is done, to behave like java.io.File.

      Parameters:
      pMSTime - an unsigned long value representing the time stamp (in units of 100 nano seconds since January 1, 1601).
      Returns:
      the time stamp converted to Java time stamp in milliseconds, or 0L if pMSTime == 0L