rt4-client/client/src/main/java/rt4/BufferedFile.java

291 lines
11 KiB
Java

package rt4;
import java.io.EOFException;
import java.io.File;
import java.io.IOException;
import org.openrs2.deob.annotation.OriginalArg;
import org.openrs2.deob.annotation.OriginalClass;
import org.openrs2.deob.annotation.OriginalMember;
import org.openrs2.deob.annotation.Pc;
@OriginalClass("client!en")
public final class BufferedFile {
@OriginalMember(owner = "client!en", name = "m", descriptor = "J")
private long physicalPosition;
@OriginalMember(owner = "client!en", name = "v", descriptor = "I")
private int readLen;
@OriginalMember(owner = "client!en", name = "p", descriptor = "J")
private long writePosition = -1L;
@OriginalMember(owner = "client!en", name = "g", descriptor = "I")
private int writeLen = 0;
@OriginalMember(owner = "client!en", name = "w", descriptor = "J")
private long readPosition = -1L;
@OriginalMember(owner = "client!en", name = "s", descriptor = "Lsignlink!qm;")
private final FileOnDisk file;
@OriginalMember(owner = "client!en", name = "a", descriptor = "J")
private long physicalLength;
@OriginalMember(owner = "client!en", name = "j", descriptor = "J")
private long virtualLength;
@OriginalMember(owner = "client!en", name = "q", descriptor = "[B")
private final byte[] writeBuffer;
@OriginalMember(owner = "client!en", name = "b", descriptor = "[B")
private final byte[] readBuffer;
@OriginalMember(owner = "client!en", name = "k", descriptor = "J")
private long virtualPosition;
@OriginalMember(owner = "client!en", name = "<init>", descriptor = "(Lsignlink!qm;II)V")
public BufferedFile(@OriginalArg(0) FileOnDisk file, @OriginalArg(1) int readBufferSize, @OriginalArg(2) int writeBufferSize) throws IOException {
this.file = file;
this.virtualLength = this.physicalLength = file.length();
this.writeBuffer = new byte[writeBufferSize];
this.readBuffer = new byte[readBufferSize];
this.virtualPosition = 0L;
}
@OriginalMember(owner = "client!en", name = "a", descriptor = "(B)V")
private void flush() throws IOException {
if (this.writePosition == -1L) {
return;
}
if (this.writePosition != this.physicalPosition) {
this.file.seek(this.writePosition);
this.physicalPosition = this.writePosition;
}
this.file.write(this.writeBuffer, this.writeLen, 0);
@Pc(45) long start = -1L;
if (this.readPosition <= this.writePosition && this.readPosition + (long) this.readLen > this.writePosition) {
start = this.writePosition;
} else if (this.writePosition <= this.readPosition && this.readPosition < this.writePosition + (long) this.writeLen) {
start = this.readPosition;
}
this.physicalPosition += this.writeLen;
if (this.physicalLength < this.physicalPosition) {
this.physicalLength = this.physicalPosition;
}
@Pc(118) long end = -1L;
if (this.readPosition < this.writePosition + (long) this.writeLen && (long) this.readLen + this.readPosition >= (long) this.writeLen + this.writePosition) {
end = this.writePosition + (long) this.writeLen;
} else if (this.readPosition + (long) this.readLen > this.writePosition && (long) this.writeLen + this.writePosition >= (long) this.readLen + this.readPosition) {
end = (long) this.readLen + this.readPosition;
}
if (start > -1L && end > start) {
@Pc(208) int copyLen = (int) (end - start);
JagString.copy(this.writeBuffer, (int) (start - this.writePosition), this.readBuffer, (int) (start - this.readPosition), copyLen);
}
this.writeLen = 0;
this.writePosition = -1L;
}
@OriginalMember(owner = "client!en", name = "a", descriptor = "(I)J")
public final long length() {
return this.virtualLength;
}
@OriginalMember(owner = "client!en", name = "b", descriptor = "(I)Ljava/io/File;")
private File getFile() {
return this.file.getFile();
}
@OriginalMember(owner = "client!en", name = "a", descriptor = "(I[BII)V")
public final void read(@OriginalArg(0) int off, @OriginalArg(1) byte[] b, @OriginalArg(2) int len) throws IOException {
try {
if (len > b.length) {
throw new ArrayIndexOutOfBoundsException(len - b.length);
}
if (this.writePosition != -1L && this.virtualPosition >= this.writePosition && (long) this.writeLen + this.writePosition >= (long) len + this.virtualPosition) {
JagString.copy(this.writeBuffer, (int) (this.virtualPosition - this.writePosition), b, 0, len);
this.virtualPosition += len;
return;
}
@Pc(71) long originalPosition = this.virtualPosition;
@Pc(75) int originalLen = len;
@Pc(102) int n;
if (this.readPosition <= this.virtualPosition && this.readPosition + (long) this.readLen > this.virtualPosition) {
n = (int) ((long) this.readLen + this.readPosition - this.virtualPosition);
if (n > len) {
n = len;
}
JagString.copy(this.readBuffer, (int) (this.virtualPosition - this.readPosition), b, 0, n);
off = n;
len -= n;
this.virtualPosition += n;
}
if (this.readBuffer.length < len) {
this.file.seek(this.virtualPosition);
this.physicalPosition = this.virtualPosition;
while (len > 0) {
n = this.file.read(off, len, b);
if (n == -1) {
break;
}
this.physicalPosition += n;
len -= n;
off += n;
this.virtualPosition += n;
}
} else if (len > 0) {
this.fill();
n = len;
if (len > this.readLen) {
n = this.readLen;
}
JagString.copy(this.readBuffer, 0, b, off, n);
len -= n;
off += n;
this.virtualPosition += n;
}
if (this.writePosition != -1L) {
if (this.virtualPosition < this.writePosition && len > 0) {
n = (int) (this.writePosition - this.virtualPosition) + off;
if (off + len < n) {
n = off + len;
}
while (off < n) {
b[off++] = 0;
this.virtualPosition++;
len--;
}
}
@Pc(298) long end = -1L;
@Pc(300) long start = -1L;
if ((long) this.writeLen + this.writePosition > originalPosition && (long) originalLen + originalPosition >= (long) this.writeLen + this.writePosition) {
start = (long) this.writeLen + this.writePosition;
} else if (this.writePosition < (long) originalLen + originalPosition && (long) this.writeLen + this.writePosition >= (long) originalLen + originalPosition) {
start = (long) originalLen + originalPosition;
}
if (originalPosition <= this.writePosition && originalPosition + (long) originalLen > this.writePosition) {
end = this.writePosition;
} else if (originalPosition >= this.writePosition && originalPosition < (long) this.writeLen + this.writePosition) {
end = originalPosition;
}
if (end > -1L && start > end) {
@Pc(426) int copyLen = (int) (start - end);
JagString.copy(this.writeBuffer, (int) (end - this.writePosition), b, (int) (end - originalPosition), copyLen);
if (this.virtualPosition < start) {
len = (int) ((long) len + this.virtualPosition - start);
this.virtualPosition = start;
}
}
}
} catch (@Pc(464) IOException ex) {
this.physicalPosition = -1L;
throw ex;
}
if (len > 0) {
throw new EOFException();
}
}
@OriginalMember(owner = "client!en", name = "b", descriptor = "(Z)V")
public final void method1455() throws IOException {
this.flush();
this.file.close();
}
@OriginalMember(owner = "client!en", name = "c", descriptor = "(I)V")
private void fill() throws IOException {
this.readLen = 0;
if (this.physicalPosition != this.virtualPosition) {
this.file.seek(this.virtualPosition);
this.physicalPosition = this.virtualPosition;
}
this.readPosition = this.virtualPosition;
while (this.readBuffer.length > this.readLen) {
@Pc(49) int len = this.readBuffer.length - this.readLen;
if (len > 200000000) {
len = 200000000;
}
@Pc(66) int n = this.file.read(this.readLen, len, this.readBuffer);
if (n == -1) {
break;
}
this.physicalPosition += n;
this.readLen += n;
}
}
@OriginalMember(owner = "client!en", name = "a", descriptor = "(Z[B)V")
public final void read(@OriginalArg(1) byte[] b) throws IOException {
this.read(0, b, b.length);
}
@OriginalMember(owner = "client!en", name = "a", descriptor = "([BIII)V")
public final void write(@OriginalArg(0) byte[] b, @OriginalArg(1) int off, @OriginalArg(3) int len) throws IOException {
try {
if (this.virtualLength < (long) len + this.virtualPosition) {
this.virtualLength = (long) len + this.virtualPosition;
}
if (this.writePosition != -1L && (this.writePosition > this.virtualPosition || this.virtualPosition > (long) this.writeLen + this.writePosition)) {
this.flush();
}
if (this.writePosition != -1L && (long) this.writeBuffer.length + this.writePosition < (long) len + this.virtualPosition) {
@Pc(90) int n = (int) ((long) this.writeBuffer.length + this.writePosition - this.virtualPosition);
len -= n;
JagString.copy(b, off, this.writeBuffer, (int) (this.virtualPosition - this.writePosition), n);
this.virtualPosition += n;
this.writeLen = this.writeBuffer.length;
this.flush();
off += n;
}
if (this.writeBuffer.length < len) {
if (this.virtualPosition != this.physicalPosition) {
this.file.seek(this.virtualPosition);
this.physicalPosition = this.virtualPosition;
}
this.file.write(b, len, off);
@Pc(165) long start = -1L;
if (this.readPosition <= this.virtualPosition && (long) this.readLen + this.readPosition > this.virtualPosition) {
start = this.virtualPosition;
} else if (this.virtualPosition <= this.readPosition && (long) len + this.virtualPosition > this.readPosition) {
start = this.readPosition;
}
this.physicalPosition += len;
@Pc(226) long end = -1L;
if (this.physicalLength < this.physicalPosition) {
this.physicalLength = this.physicalPosition;
}
if (this.virtualPosition + (long) len > this.readPosition && this.virtualPosition + (long) len <= this.readPosition - -((long) this.readLen)) {
end = (long) len + this.virtualPosition;
} else if (this.readPosition + (long) this.readLen > this.virtualPosition && this.virtualPosition + (long) len >= (long) this.readLen + this.readPosition) {
end = (long) this.readLen + this.readPosition;
}
if (start > -1L && end > start) {
@Pc(324) int copyLen = (int) (end - start);
JagString.copy(b, (int) (start + (long) off - this.virtualPosition), this.readBuffer, (int) (start - this.readPosition), copyLen);
}
this.virtualPosition += len;
} else if (len > 0) {
if (this.writePosition == -1L) {
this.writePosition = this.virtualPosition;
}
JagString.copy(b, off, this.writeBuffer, (int) (this.virtualPosition - this.writePosition), len);
this.virtualPosition += len;
if ((long) this.writeLen < this.virtualPosition - this.writePosition) {
this.writeLen = (int) (this.virtualPosition - this.writePosition);
}
}
} catch (@Pc(414) IOException ex) {
this.physicalPosition = -1L;
throw ex;
}
}
@OriginalMember(owner = "client!en", name = "a", descriptor = "(IJ)V")
public final void seek(@OriginalArg(1) long offset) throws IOException {
if (offset < 0L) {
throw new IOException("Invalid seek to " + offset + " in file " + this.getFile());
}
this.virtualPosition = offset;
}
}