diff --git a/pom.xml b/pom.xml index 63423a6..d9f459e 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,11 @@ junit-jupiter-params test + + io.netty + netty-buffer + 4.1.114.Final + diff --git a/src/main/java/com/mykola2312/retracker/bencode/BTree.java b/src/main/java/com/mykola2312/retracker/bencode/BTree.java index fc94722..7f46e69 100644 --- a/src/main/java/com/mykola2312/retracker/bencode/BTree.java +++ b/src/main/java/com/mykola2312/retracker/bencode/BTree.java @@ -1,6 +1,6 @@ package com.mykola2312.retracker.bencode; -import java.nio.ByteBuffer; +import static io.netty.buffer.Unpooled.buffer; import java.nio.charset.StandardCharsets; import java.util.Arrays; @@ -10,6 +10,8 @@ import com.mykola2312.retracker.bencode.error.BDecodeParseError; import com.mykola2312.retracker.bencode.error.BErrorNoRoot; import com.mykola2312.retracker.bencode.error.BErrorValueCast; +import io.netty.buffer.ByteBuf; + public class BTree { private BValue root = null; @@ -17,6 +19,12 @@ public class BTree { return root; } + @SuppressWarnings("unchecked") + public T setRoot(T root) { + this.root = root; + return (T)this.root; + } + private static final byte BE_INTEGER = (byte)'i'; private static final byte BE_LIST = (byte)'l'; private static final byte BE_DICT = (byte)'d'; @@ -143,7 +151,7 @@ public class BTree { } class BEncoder { - private ByteBuffer buffer = ByteBuffer.allocate(0); + private ByteBuf buffer = buffer(); private byte[] encodeInt(int value) { return Integer.toString(value).getBytes(StandardCharsets.UTF_8); @@ -156,39 +164,39 @@ public class BTree { public void encode(BValue node) { switch (node.getType()) { case INTEGER: - buffer.put(BE_INTEGER); - buffer.put(encodeLong(((BInteger)node).get())); - buffer.put(BE_END); + buffer.writeByte(BE_INTEGER); + buffer.writeBytes(encodeLong(((BInteger)node).get())); + buffer.writeByte(BE_END); break; case LIST: - buffer.put(BE_LIST); + buffer.writeByte(BE_LIST); for (BValue item : node) { encode(item); } - buffer.put(BE_END); + buffer.writeByte(BE_END); break; case DICT: - buffer.put(BE_DICT); + buffer.writeByte(BE_DICT); for (BValue key : node) { encode(key); encode(key.getChild()); } - buffer.put(BE_END); + buffer.writeByte(BE_END); break; case STRING: byte[] bytes = ((BString)node).get(); - buffer.put(encodeInt(bytes.length)); - buffer.put(BE_STRING_SEP); - buffer.put(bytes); + buffer.writeBytes(encodeInt(bytes.length)); + buffer.writeByte(BE_STRING_SEP); + buffer.writeBytes(bytes); break; } } public byte[] get() { - int length = buffer.position(); + int length = buffer.writerIndex(); byte[] out = new byte[length]; - buffer.get(out, 0, length); + buffer.getBytes(0, out); return out; } } diff --git a/src/test/java/com/mykola2312/retracker/bencode/BTreeTest.java b/src/test/java/com/mykola2312/retracker/bencode/BTreeTest.java index 910d05b..fea0e54 100644 --- a/src/test/java/com/mykola2312/retracker/bencode/BTreeTest.java +++ b/src/test/java/com/mykola2312/retracker/bencode/BTreeTest.java @@ -1,5 +1,6 @@ package com.mykola2312.retracker.bencode; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -140,6 +141,16 @@ public class BTreeTest { }); } + @Test + public void testEncode() { + assertDoesNotThrow(() -> { + BTree tree = new BTree(); + + tree.setRoot(new BInteger(1)); + assertArrayEquals("i1e".getBytes(), tree.encode()); + }); + } + @Test public void testTorrentFile() throws BError, IOException { final byte[] data = Files.readAllBytes(Path.of("test", "test.torrent"));