package peergos.server.storage; import peergos.shared.user.fs.*; import java.io.*; import java.util.concurrent.*; public class ResetableFileInputStream implements AsyncReader { private final RandomAccessFile raf; public ResetableFileInputStream(RandomAccessFile raf) { this.raf = raf; } public ResetableFileInputStream(File f) throws IOException { this(new RandomAccessFile(f, "r")); } @Override public CompletableFuture<AsyncReader> seek(int high32, int low32) { try { raf.seek(low32 + (high32 & 0xFFFFFFFFL) << 32); return CompletableFuture.completedFuture(this); } catch (IOException e) { CompletableFuture<AsyncReader> err = new CompletableFuture<>(); err.completeExceptionally(e); return err; } } @Override public CompletableFuture<Integer> readIntoArray(byte[] res, int offset, int length) { try { int read = raf.read(res, offset, length); return CompletableFuture.completedFuture(read); } catch (IOException e) { CompletableFuture<Integer> err = new CompletableFuture<>(); err.completeExceptionally(e); return err; } } @Override public synchronized CompletableFuture<AsyncReader> reset() { try { raf.seek(0); return CompletableFuture.completedFuture(this); } catch (IOException e) { CompletableFuture<AsyncReader> err = new CompletableFuture<>(); err.completeExceptionally(e); return err; } } @Override public void close() { try { raf.close(); } catch (IOException e) { throw new RuntimeException(e); } } }