//
package net.sf.zipme;
import java.io.ByteArrayInputStream;
import java.io.EOFException;
import java.io.UnsupportedEncodingException;
public final class ZipArchive_PartialInputStream extends ByteArrayInputStream {
private int dummyByteCount;
public ZipArchive_PartialInputStream( byte[] buffer, int offset, int length){
super(buffer,offset,length);
}
synchronized void setLength( int length){
count=pos + length;
if (count > buf.length) count=buf.length;
}
public synchronized int read(){
if (dummyByteCount > 0 && pos == count) {
dummyByteCount=0;
pos++;
return 0;
}
return super.read();
}
public synchronized int read( byte[] buffer, int offset, int length){
int numBytes=super.read(buffer,offset,length);
if (dummyByteCount > 0 && numBytes < length) {
dummyByteCount=0;
if (pos < count) buffer[offset + numBytes++]=buf[pos++];
else if (pos == count) {
if (numBytes == -1) numBytes=0;
buffer[offset + numBytes++]=0;
pos++;
}
}
return numBytes;
}
void seek( int newpos){
pos=newpos;
}
void readFully( byte[] buf) throws EOFException {
if (read(buf,0,buf.length) != buf.length) throw new EOFException();
}
void readFully( byte[] buf, int off, int len) throws EOFException {
if (read(buf,off,len) != len) throw new EOFException();
}
synchronized int readLeShort() throws EOFException {
int b0=read();
int b1=read();
if (b1 == -1) throw new EOFException();
return (b0 & 0xff) | (b1 & 0xff) << 8;
}
synchronized int readLeInt() throws EOFException {
int b0=read();
int b1=read();
int b2=read();
int b3=read();
if (b3 == -1) throw new EOFException();
return ((b0 & 0xff) | (b1 & 0xff) << 8) | ((b2 & 0xff) | (b3 & 0xff) << 8) << 16;
}
synchronized String readString( int length) throws EOFException {
if (length > count - pos) throw new EOFException();
try {
byte[] b=new byte[length];
readFully(b);
return new String(b,0,length,"UTF-8");
}
catch ( UnsupportedEncodingException uee) {
throw new Error(uee.toString());
}
}
public void addDummyByte(){
dummyByteCount=1;
}
}