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"));