X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2Futil%2FSeekable.java;h=2bb195e3e3ae64893b93d9562a74b854d988aba1;hp=cf8cca776eab2390421b127f679e47235bea5d78;hb=b11e7c6c29f2b5f7b0828bf93eb741c4a30ec411;hpb=897fa3c89674460aa4fad275f263cea2b341420d diff --git a/src/org/ibex/nestedvm/util/Seekable.java b/src/org/ibex/nestedvm/util/Seekable.java index cf8cca7..2bb195e 100644 --- a/src/org/ibex/nestedvm/util/Seekable.java +++ b/src/org/ibex/nestedvm/util/Seekable.java @@ -1,3 +1,7 @@ +// Copyright 2000-2005 the Contributors, as shown in the revision logs. +// Licensed under the Apache License 2.0 ("the License"). +// You may not use this file except in compliance with the License. + package org.ibex.nestedvm.util; import java.io.*; @@ -9,6 +13,17 @@ public abstract class Seekable { public abstract void seek(int pos) throws IOException; public abstract void close() throws IOException; public abstract int pos() throws IOException; + + public void sync() throws IOException { + throw new IOException("sync not implemented for " + getClass()); + } + public void resize(long length) throws IOException { + throw new IOException("resize not implemented for " + getClass()); + } + /** If pos == 0 and size == 0 lock covers whole file. */ + public Lock lock(long pos, long size, boolean shared) throws IOException { + throw new IOException("lock not implemented for " + getClass()); + } public int read() throws IOException { byte[] buf = new byte[1]; @@ -63,24 +78,35 @@ public abstract class Seekable { } public static class File extends Seekable { + private final java.io.File file; private final RandomAccessFile raf; public File(String fileName) throws IOException { this(fileName,false); } - public File(String fileName, boolean writable) throws IOException { this(new java.io.File(fileName),writable); } + public File(String fileName, boolean writable) throws IOException { this(new java.io.File(fileName),writable,false); } - public File(java.io.File file, boolean writable) throws IOException { - raf = new RandomAccessFile(file,writable ? "rw" : "r"); + public File(java.io.File file, boolean writable, boolean truncate) throws IOException { + this.file = file; + String mode = writable ? "rw" : "r"; + raf = new RandomAccessFile(file,mode); + if (truncate) Platform.setFileLength(raf, 0); } - // NOTE: RandomAccessFile.setLength() is a Java2 function - public void setLength(int n) throws IOException { raf.setLength(n); } - public int read(byte[] buf, int offset, int length) throws IOException { return raf.read(buf,offset,length); } public int write(byte[] buf, int offset, int length) throws IOException { raf.write(buf,offset,length); return length; } + public void sync() throws IOException { raf.getFD().sync(); } public void seek(int pos) throws IOException{ raf.seek(pos); } public int pos() throws IOException { return (int) raf.getFilePointer(); } public int length() throws IOException { return (int)raf.length(); } public void close() throws IOException { raf.close(); } + public void resize(long length) throws IOException { Platform.setFileLength(raf, (int)length); } + public boolean equals(Object o) { + return o != null && o instanceof File + && file.equals(((File)o).file); + } + public Lock lock(long pos, long size, boolean shared) + throws IOException { + return Platform.lockFile(this, raf, pos, size, shared); + } } public static class InputStream extends Seekable { @@ -128,4 +154,29 @@ public abstract class Seekable { public void close() throws IOException { is.close(); } } + public abstract static class Lock { + private Object owner = null; + + public abstract Seekable seekable(); + public abstract boolean isShared(); + public abstract boolean isValid(); + public abstract void release() throws IOException; + public abstract long position(); + public abstract long size(); + + public void setOwner(Object o) { owner = o; } + public Object getOwner() { return owner; } + + public final boolean contains(int start, int len) { + return start >= position() && position() + size() >= start + len; + } + + public final boolean contained(int start, int len) { + return start < position() && position() + size() < start + len; + } + + public final boolean overlaps(int start, int len) { + return contains(start, len) || contained(start, len); + } + } }