clarify licensing
[nestedvm.git] / src / org / ibex / nestedvm / util / Seekable.java
index 98f2c8e..2bb195e 100644 (file)
@@ -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];
@@ -16,6 +31,18 @@ public abstract class Seekable {
         return n == -1 ? -1 : buf[0]&0xff;
     }
     
+    public int tryReadFully(byte[] buf, int off, int len) throws IOException {
+        int total = 0;
+        while(len > 0) {
+                int n = read(buf,off,len);
+                if(n == -1) break;
+                off += n;
+                len -= n;
+            total += n;
+        }
+        return total == 0 ? -1 : total;
+    }
+    
     public static class ByteArray extends Seekable {
         protected byte[] data;
         protected int pos;
@@ -51,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 {
@@ -116,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);
+        }
+    }
 }