package org.jnode.fs.hfsplus.compression; import java.io.IOException; import java.nio.ByteBuffer; import org.jnode.fs.hfsplus.HfsPlusFile; import org.jnode.fs.hfsplus.HfsPlusFileSystem; import org.jnode.fs.hfsplus.attributes.AttributeData; /** * Attribute stored 'compressed' data 'Type 1'. Type 1 is no-compression, i.e. data is just stored. * * @author Luke Quinane */ public class AttributeType1Compression implements HfsPlusCompression { /** * The attribute data to read in. */ private final AttributeData attributeData; /** * The uncompressed copy of the data. */ private ByteBuffer uncompressed; /** * Creates a new instance. * * @param attributeData the attribute data to read from. */ public AttributeType1Compression(AttributeData attributeData) { this.attributeData = attributeData; } @Override public void read(HfsPlusFileSystem fs, long fileOffset, ByteBuffer dest) throws IOException { if (uncompressed == null) { // 'Type1' is no compression, just copy the data out uncompressed = ByteBuffer.allocate((int) attributeData.getSize() - DecmpfsDiskHeader.LENGTH); attributeData.read(fs, DecmpfsDiskHeader.LENGTH, uncompressed); } uncompressed.position((int) fileOffset); uncompressed.limit(Math.min(uncompressed.capacity(), uncompressed.position() + dest.remaining())); dest.put(uncompressed); } /** * The factory for this compression type. */ public static class Factory implements HfsPlusCompressionFactory { @Override public HfsPlusCompression createDecompressor(HfsPlusFile file, AttributeData attributeData, DecmpfsDiskHeader decmpfsDiskHeader) { return new AttributeType1Compression(attributeData); } } }