From fa956cf5aada723688ad169dcb357e5a0e8abc20 Mon Sep 17 00:00:00 2001 From: Josh Larson Date: Sun, 9 Dec 2018 14:21:20 -0600 Subject: [PATCH] Added flexibility to NetBuffer and the NetworkProtocol --- build.gradle | 3 +- .../projectswg/common/network/NetBuffer.java | 28 ++++++-- .../common/network/NetworkProtocol.java | 24 ++++++- src/main/java/module-info.java | 69 +++++++++++++++++++ 4 files changed, 118 insertions(+), 6 deletions(-) create mode 100644 src/main/java/module-info.java diff --git a/build.gradle b/build.gradle index 40d581a..a856da9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id "org.javamodularity.moduleplugin" } sourceCompatibility = 11 @@ -10,7 +11,7 @@ repositories { } dependencies { - compile group: 'me.joshlarson', name: 'jlcommon', version: '1.7.14' + compile group: 'me.joshlarson', name: 'jlcommon', version: '1.8.4' compile group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.59' testCompile 'junit:junit:4.12' } diff --git a/src/main/java/com/projectswg/common/network/NetBuffer.java b/src/main/java/com/projectswg/common/network/NetBuffer.java index 56150be..4d8b6b8 100644 --- a/src/main/java/com/projectswg/common/network/NetBuffer.java +++ b/src/main/java/com/projectswg/common/network/NetBuffer.java @@ -49,18 +49,22 @@ public class NetBuffer { private NetBuffer(ByteBuffer data) { this.data = data; - this.size = data.array().length; + this.size = data.capacity(); } - public static final NetBuffer allocate(int size) { + public static NetBuffer allocate(int size) { return new NetBuffer(ByteBuffer.allocate(size)); } - public static final NetBuffer wrap(byte [] data) { + public static NetBuffer allocateDirect(int size) { + return new NetBuffer(ByteBuffer.allocateDirect(size)); + } + + public static NetBuffer wrap(byte [] data) { return new NetBuffer(ByteBuffer.wrap(data)); } - public static final NetBuffer wrap(ByteBuffer data) { + public static NetBuffer wrap(ByteBuffer data) { return new NetBuffer(data); } @@ -92,10 +96,26 @@ public class NetBuffer { data.position(data.position()+relative); } + public void clear() { + data.clear(); + } + public void flip() { data.flip(); } + public void mark() { + data.mark(); + } + + public void rewind() { + data.rewind(); + } + + public void compact() { + data.compact(); + } + public ByteBuffer getBuffer() { return data; } diff --git a/src/main/java/com/projectswg/common/network/NetworkProtocol.java b/src/main/java/com/projectswg/common/network/NetworkProtocol.java index 7a37319..63f6b29 100644 --- a/src/main/java/com/projectswg/common/network/NetworkProtocol.java +++ b/src/main/java/com/projectswg/common/network/NetworkProtocol.java @@ -51,6 +51,18 @@ public class NetworkProtocol { return data; } + public static boolean canDecode(NetBuffer buffer) throws IOException { + if (buffer.remaining() < 4) + return false; + + int length = buffer.getInt(); + buffer.seek(-4); + + if (length < 0) + throw new IOException("Stream corrupted"); + return length <= buffer.remaining(); + } + public static boolean canDecode(NetBufferStream buffer) throws IOException { if (buffer.remaining() < 4) return false; @@ -63,11 +75,21 @@ public class NetworkProtocol { return length <= buffer.remaining(); } + public static SWGPacket decode(NetBuffer buffer) throws IOException { + if (!canDecode(buffer)) + return null; + + return decodePacket(NetBuffer.wrap(buffer.getArray(buffer.getInt()))); + } + public static SWGPacket decode(NetBufferStream buffer) throws IOException { if (!canDecode(buffer)) return null; - NetBuffer swg = NetBuffer.wrap(buffer.getArray(buffer.getInt())); + return decodePacket(NetBuffer.wrap(buffer.getArray(buffer.getInt()))); + } + + private static SWGPacket decodePacket(NetBuffer swg) { if (swg.remaining() < 6) return null; diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..0f16f67 --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,69 @@ +module pswgcommon { + requires org.jetbrains.annotations; + requires bcprov.jdk15on; + requires me.joshlarson.jlcommon; + requires java.sql; + requires java.desktop; + + exports com.projectswg.common.data; + exports com.projectswg.common.data.combat; + exports com.projectswg.common.data.customization; + exports com.projectswg.common.data.encodables.chat; + exports com.projectswg.common.data.encodables.galaxy; + exports com.projectswg.common.data.encodables.map; + exports com.projectswg.common.data.encodables.oob; + exports com.projectswg.common.data.encodables.oob.waypoint; + exports com.projectswg.common.data.encodables.player; + exports com.projectswg.common.data.encodables.tangible; + exports com.projectswg.common.data.info; + exports com.projectswg.common.data.location; + exports com.projectswg.common.data.math; + exports com.projectswg.common.data.math.extents; + exports com.projectswg.common.data.objects; + exports com.projectswg.common.data.radial; + exports com.projectswg.common.data.schematic; + exports com.projectswg.common.data.sui; + exports com.projectswg.common.data.swgfile; + exports com.projectswg.common.data.swgfile.visitors; + exports com.projectswg.common.data.swgfile.visitors.appearance; + exports com.projectswg.common.data.swgfile.visitors.appearance.render; + exports com.projectswg.common.data.swgfile.visitors.shader; + exports com.projectswg.common.data.swgiff; + exports com.projectswg.common.data.swgiff.parsers; + exports com.projectswg.common.data.swgiff.parsers.appearance; + exports com.projectswg.common.data.swgiff.parsers.appearance.extents; + exports com.projectswg.common.data.swgiff.parsers.footprint; + exports com.projectswg.common.data.swgiff.parsers.math; + exports com.projectswg.common.data.swgiff.parsers.misc; + exports com.projectswg.common.data.swgiff.parsers.terrain; + exports com.projectswg.common.encoding; + exports com.projectswg.common.network; + exports com.projectswg.common.network.packets; + exports com.projectswg.common.network.packets.swg; + exports com.projectswg.common.network.packets.swg.admin; + exports com.projectswg.common.network.packets.swg.holo; + exports com.projectswg.common.network.packets.swg.holo.login; + exports com.projectswg.common.network.packets.swg.login; + exports com.projectswg.common.network.packets.swg.login.creation; + exports com.projectswg.common.network.packets.swg.zone; + exports com.projectswg.common.network.packets.swg.zone.auction; + exports com.projectswg.common.network.packets.swg.zone.baselines; + exports com.projectswg.common.network.packets.swg.zone.building; + exports com.projectswg.common.network.packets.swg.zone.chat; + exports com.projectswg.common.network.packets.swg.zone.combat; + exports com.projectswg.common.network.packets.swg.zone.crafting.resources; + exports com.projectswg.common.network.packets.swg.zone.crafting.surveying; + exports com.projectswg.common.network.packets.swg.zone.deltas; + exports com.projectswg.common.network.packets.swg.zone.harvesters; + exports com.projectswg.common.network.packets.swg.zone.insertion; + exports com.projectswg.common.network.packets.swg.zone.object_controller; + exports com.projectswg.common.network.packets.swg.zone.object_controller.combat; + exports com.projectswg.common.network.packets.swg.zone.object_controller.loot; + exports com.projectswg.common.network.packets.swg.zone.resource; + exports com.projectswg.common.network.packets.swg.zone.server_ui; + exports com.projectswg.common.network.packets.swg.zone.spatial; + exports com.projectswg.common.network.packets.swg.zone.trade; + exports com.projectswg.common.persistable; + exports com.projectswg.common.process; + exports com.projectswg.common.utilities; +}