diff --git a/pom.xml b/pom.xml
index da15c52446..37d2b7d668 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,6 +19,12 @@
slf4j-api
1.7.12
+
+ org.apache.commons
+ commons-compress
+ 1.10
+
+
org.slf4j
slf4j-simple
@@ -32,6 +38,18 @@
test
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.16
+
+ true
+
+
+
+
1.7
1.7
diff --git a/src/main/java/net/runelite/cache/fs/DataFile.java b/src/main/java/net/runelite/cache/fs/DataFile.java
index 0ec7d75605..a9b0a7794a 100644
--- a/src/main/java/net/runelite/cache/fs/DataFile.java
+++ b/src/main/java/net/runelite/cache/fs/DataFile.java
@@ -1,16 +1,19 @@
package net.runelite.cache.fs;
+import java.io.ByteArrayOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
+import java.util.Arrays;
import java.util.Objects;
import net.runelite.cache.fs.io.InputStream;
import net.runelite.cache.fs.io.OutputStream;
-import net.runelite.cache.fs.util.BZip2Decompressor;
+import net.runelite.cache.fs.util.BZipDecompressor;
import net.runelite.cache.fs.util.GZip;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,7 +81,7 @@ public class DataFile implements Closeable
{
if (sector <= 0L || dat.length() / 520L < (long) sector)
{
- logger.warn("bad read, dat length {}", dat.length());
+ logger.warn("bad read, dat length {}, requested sector {}", dat.length(), sector);
return null;
}
@@ -90,6 +93,7 @@ public class DataFile implements Closeable
{
if (sector == 0)
{
+ logger.warn("sector == 0");
return null;
}
@@ -143,11 +147,16 @@ public class DataFile implements Closeable
if (archiveId != currentArchive || currentPart != part || indexId != currentIndex)
{
+ logger.warn("data mismatch {} != {}, {} != {}, {} != {}",
+ archiveId, currentArchive,
+ part, currentPart,
+ indexId, currentIndex);
return null;
}
if (nextSector < 0 || dat.length() / SECTOR_SIZE < (long) nextSector)
{
+ logger.warn("Invalid next sector");
return null;
}
@@ -164,14 +173,6 @@ public class DataFile implements Closeable
return this.decompress(buffer.array());
}
- /**
- *
- * @param indexId
- * @param archiveId archive to write to
- * @param data data to write
- * @return the sector the data starts at
- * @throws IOException
- */
public synchronized DataFileWriteResult write(int indexId, int archiveId, ByteBuffer data, int compression, int revision) throws IOException
{
int sector;
@@ -312,7 +313,7 @@ public class DataFile implements Closeable
return res;
}
- private byte[] compress(byte[] data, int compression, int revision)
+ private byte[] compress(byte[] data, int compression, int revision) throws IOException
{
OutputStream stream = new OutputStream();
stream.writeByte(compression);
@@ -324,10 +325,21 @@ public class DataFile implements Closeable
stream.writeInt(data.length);
break;
case 1:
- compressedData = (byte[]) null;
- break;
+ // bzip1?
+ throw new UnsupportedOperationException();
default:
- compressedData = GZip.compress(data);
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ try (GzipCompressorOutputStream out = new GzipCompressorOutputStream(bout))
+ {
+ out.write(data);
+ }
+ compressedData = bout.toByteArray();
+
+ // check it with the old compressor
+ byte[] data2 = new byte[data.length];
+ GZip.decompress(new InputStream(compressedData), data2);
+ assert Arrays.equals(data, data2);
+
stream.writeInt(compressedData.length);
stream.writeInt(data.length);
}
diff --git a/src/main/java/net/runelite/cache/fs/Store.java b/src/main/java/net/runelite/cache/fs/Store.java
index 6324d03ad5..0600c8efff 100644
--- a/src/main/java/net/runelite/cache/fs/Store.java
+++ b/src/main/java/net/runelite/cache/fs/Store.java
@@ -101,8 +101,9 @@ public class Store implements Closeable
for (Index i : indexes)
{
int id = i.getIndex().getIndexFileId();
- //if (id == 3 || id == 7) // XXXXXXXXXXXXX
- i.load();
+ if (id == 5)
+ break;
+ i.load();
}
}
diff --git a/src/main/java/net/runelite/cache/fs/util/GZip.java b/src/main/java/net/runelite/cache/fs/util/GZip.java
index 7759c63702..b4111bd957 100644
--- a/src/main/java/net/runelite/cache/fs/util/GZip.java
+++ b/src/main/java/net/runelite/cache/fs/util/GZip.java
@@ -9,24 +9,24 @@ import net.runelite.cache.fs.io.Stream;
public class GZip {
private static final Inflater inflaterInstance = new Inflater(true);
- public static final byte[] compress(byte[] data)
- {
- ByteArrayOutputStream compressedBytes = new ByteArrayOutputStream();
-
- try
- {
- GZIPOutputStream e = new GZIPOutputStream(compressedBytes);
- e.write(data);
- e.finish();
- e.close();
- return compressedBytes.toByteArray();
- }
- catch (IOException var3)
- {
- var3.printStackTrace();
- return null;
- }
- }
+// public static final byte[] compress(byte[] data)
+// {
+// ByteArrayOutputStream compressedBytes = new ByteArrayOutputStream();
+//
+// try
+// {
+// GZIPOutputStream e = new GZIPOutputStream(compressedBytes);
+// e.write(data);
+// e.finish();
+// e.close();
+// return compressedBytes.toByteArray();
+// }
+// catch (IOException var3)
+// {
+// var3.printStackTrace();
+// return null;
+// }
+// }
public static final void decompress(Stream stream, byte[] data)
{
diff --git a/src/test/java/net/runelite/cache/fs/DataFileTest.java b/src/test/java/net/runelite/cache/fs/DataFileTest.java
index 7b99953428..9e47705791 100644
--- a/src/test/java/net/runelite/cache/fs/DataFileTest.java
+++ b/src/test/java/net/runelite/cache/fs/DataFileTest.java
@@ -64,4 +64,18 @@ public class DataFileTest
Assert.assertEquals("test", str);
}
}
+
+// @Test
+// public void testBZip2Compression() throws IOException
+// {
+// try (Store store = new Store(folder.getRoot()))
+// {
+// DataFile df = new DataFile(store, folder.newFile());
+// DataFileWriteResult res = df.write(41, 4, ByteBuffer.wrap("test".getBytes()), 1, 0);
+// DataFileReadResult res2 = df.read(41, 4, res.sector, res.compressedLength);
+// byte[] buf = res2.data;
+// String str = new String(buf);
+// Assert.assertEquals("test", str);
+// }
+// }
}
diff --git a/src/test/java/net/runelite/cache/fs/StoreLoadTest.java b/src/test/java/net/runelite/cache/fs/StoreLoadTest.java
index 98ad26ad86..687a395f6e 100644
--- a/src/test/java/net/runelite/cache/fs/StoreLoadTest.java
+++ b/src/test/java/net/runelite/cache/fs/StoreLoadTest.java
@@ -5,7 +5,7 @@ import org.junit.Test;
public class StoreLoadTest
{
- //@Test
+ @Test
public void test() throws IOException
{
Store store = new Store(new java.io.File("d:/rs/07/cache"));//c:/rs/cache"));