package freenet.support.io; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import freenet.client.async.ClientContext; import freenet.crypt.MasterSecret; import freenet.support.api.LockableRandomAccessBuffer; public class ReadOnlyRandomAccessBuffer implements LockableRandomAccessBuffer { private final LockableRandomAccessBuffer underlying; public ReadOnlyRandomAccessBuffer(LockableRandomAccessBuffer underlying) { this.underlying = underlying; } public ReadOnlyRandomAccessBuffer(DataInputStream dis, FilenameGenerator fg, PersistentFileTracker persistentFileTracker, MasterSecret masterSecret) throws IOException, StorageFormatException, ResumeFailedException { // Caller has already read magic this.underlying = BucketTools.restoreRAFFrom(dis, fg, persistentFileTracker, masterSecret); } @Override public long size() { return underlying.size(); } @Override public void pread(long fileOffset, byte[] buf, int bufOffset, int length) throws IOException { underlying.pread(fileOffset, buf, bufOffset, length); } @Override public void pwrite(long fileOffset, byte[] buf, int bufOffset, int length) throws IOException { throw new IOException("Read only"); } @Override public void close() { underlying.close(); } @Override public void free() { underlying.free(); } @Override public RAFLock lockOpen() throws IOException { return underlying.lockOpen(); } @Override public void onResume(ClientContext context) throws ResumeFailedException { underlying.onResume(context); } final static int MAGIC = 0x648d24da; @Override public void storeTo(DataOutputStream dos) throws IOException { dos.writeInt(MAGIC); underlying.storeTo(dos); } @Override public int hashCode() { return underlying.hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } ReadOnlyRandomAccessBuffer other = (ReadOnlyRandomAccessBuffer) obj; return underlying.equals(other.underlying); } }