mirror of
https://gitlab.com/2009scape/rt4-client.git
synced 2025-12-19 21:10:19 -07:00
291 lines
11 KiB
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;
|
|
}
|
|
}
|