package net.didion.loopy.iso9660; import net.didion.loopy.AccessStream; import net.didion.loopy.FileEntry; import net.didion.loopy.LoopyException; import net.didion.loopy.impl.AbstractBlockFileSystem; import net.didion.loopy.impl.VolumeDescriptor; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.util.Enumeration; public class ISO9660FileSystem extends AbstractBlockFileSystem implements Constants { public ISO9660FileSystem(File file, boolean readOnly) throws LoopyException { super(file, readOnly, BLOCK_SIZE, RESERVED_BYTES); } public ISO9660FileSystem(AccessStream as) throws LoopyException { super(as, BLOCK_SIZE, RESERVED_BYTES); } public InputStream getInputStream(FileEntry entry) { ensureOpen(); return new EntryInputStream((ISO9660FileEntry) entry, this); } protected Enumeration enumerate(FileEntry rootEntry) { return new EntryEnumeration(this, (ISO9660FileEntry) rootEntry); } protected VolumeDescriptor createVolumeDescriptor() { return new ISO9660VolumeDescriptor(this); } byte[] readData(ISO9660FileEntry entry) throws IOException { long size = entry.getSize(); if (size > Integer.MAX_VALUE) throw new IOException("Size of entryy "+size+" exceeds system limitation for this operation"); int bufSize = (int)size; byte[] buf = new byte[bufSize]; readData(entry, 0, buf, 0, bufSize); return buf; } int readData( ISO9660FileEntry entry, long entryOffset, byte[] buffer, int bufferOffset, int len) throws IOException { long startPos = (entry.getStartBlock() * BLOCK_SIZE) + entryOffset; return readData(startPos, buffer, bufferOffset, len); } }