diff --git a/pom.xml b/pom.xml index ba13d261..ab2beefe 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ UTF-8 - 1.7 + 1.8 diff --git a/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetInput.java b/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetInput.java index 197f913a..d96bf9f7 100644 --- a/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetInput.java +++ b/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetInput.java @@ -3,23 +3,23 @@ package com.github.steveice10.packetlib.io.stream; import com.github.steveice10.packetlib.io.NetInput; import java.io.EOFException; +import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.UUID; /** * A NetInput implementation using an InputStream as a backend. */ -public class StreamNetInput implements NetInput { - private InputStream in; - +public class StreamNetInput extends FilterInputStream implements NetInput { /** * Creates a new StreamNetInput instance. * * @param in InputStream to read from. */ public StreamNetInput(InputStream in) { - this.in = in; + super(in); } @Override @@ -34,7 +34,7 @@ public class StreamNetInput implements NetInput { @Override public int readUnsignedByte() throws IOException { - int b = this.in.read(); + int b = this.read(); if(b < 0) { throw new EOFException(); } @@ -125,7 +125,7 @@ public class StreamNetInput implements NetInput { byte b[] = new byte[length]; int n = 0; while(n < length) { - int count = this.in.read(b, n, length - n); + int count = this.read(b, n, length - n); if(count < 0) { throw new EOFException(); } @@ -138,12 +138,12 @@ public class StreamNetInput implements NetInput { @Override public int readBytes(byte[] b) throws IOException { - return this.in.read(b); + return this.read(b); } @Override public int readBytes(byte[] b, int offset, int length) throws IOException { - return this.in.read(b, offset, length); + return this.read(b, offset, length); } @Override @@ -249,16 +249,11 @@ public class StreamNetInput implements NetInput { public String readString() throws IOException { int length = this.readVarInt(); byte bytes[] = this.readBytes(length); - return new String(bytes, "UTF-8"); + return new String(bytes, StandardCharsets.UTF_8); } @Override public UUID readUUID() throws IOException { return new UUID(this.readLong(), this.readLong()); } - - @Override - public int available() throws IOException { - return this.in.available(); - } } diff --git a/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetOutput.java b/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetOutput.java index bd6ae79a..78562929 100644 --- a/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetOutput.java +++ b/src/main/java/com/github/steveice10/packetlib/io/stream/StreamNetOutput.java @@ -2,23 +2,23 @@ package com.github.steveice10.packetlib.io.stream; import com.github.steveice10.packetlib.io.NetOutput; +import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.StandardCharsets; import java.util.UUID; /** * A NetOutput implementation using an OutputStream as a backend. */ -public class StreamNetOutput implements NetOutput { - private OutputStream out; - +public class StreamNetOutput extends FilterOutputStream implements NetOutput { /** * Creates a new StreamNetOutput instance. * * @param out OutputStream to write to. */ public StreamNetOutput(OutputStream out) { - this.out = out; + super(out); } @Override @@ -28,7 +28,7 @@ public class StreamNetOutput implements NetOutput { @Override public void writeByte(int b) throws IOException { - this.out.write(b); + this.write(b); } @Override @@ -100,7 +100,7 @@ public class StreamNetOutput implements NetOutput { @Override public void writeBytes(byte b[], int length) throws IOException { - this.out.write(b, 0, length); + this.write(b, 0, length); } @Override @@ -145,7 +145,7 @@ public class StreamNetOutput implements NetOutput { throw new IllegalArgumentException("String cannot be null!"); } - byte[] bytes = s.getBytes("UTF-8"); + byte[] bytes = s.getBytes(StandardCharsets.UTF_8); if(bytes.length > 32767) { throw new IOException("String too big (was " + s.length() + " bytes encoded, max " + 32767 + ")"); } else { @@ -159,9 +159,4 @@ public class StreamNetOutput implements NetOutput { this.writeLong(uuid.getMostSignificantBits()); this.writeLong(uuid.getLeastSignificantBits()); } - - @Override - public void flush() throws IOException { - this.out.flush(); - } } diff --git a/src/main/java/com/github/steveice10/packetlib/packet/PacketProtocol.java b/src/main/java/com/github/steveice10/packetlib/packet/PacketProtocol.java index 15b6586d..11556482 100644 --- a/src/main/java/com/github/steveice10/packetlib/packet/PacketProtocol.java +++ b/src/main/java/com/github/steveice10/packetlib/packet/PacketProtocol.java @@ -14,8 +14,10 @@ import java.util.Map; * All implementations must have a no-params constructor for server protocol creation. */ public abstract class PacketProtocol { - private final Map> incoming = new HashMap>(); - private final Map, Integer> outgoing = new HashMap, Integer>(); + private final Map> incoming = new HashMap<>(); + private final Map, Integer> outgoing = new HashMap<>(); + + private final Map> outgoingClasses = new HashMap<>(); /** * Gets the prefix used when locating SRV records for this protocol. @@ -60,6 +62,7 @@ public abstract class PacketProtocol { public final void clearPackets() { this.incoming.clear(); this.outgoing.clear(); + this.outgoingClasses.clear(); } /** @@ -99,6 +102,7 @@ public abstract class PacketProtocol { */ public final void registerOutgoing(int id, Class packet) { this.outgoing.put(packet, id); + this.outgoingClasses.put(id, packet); } /** @@ -106,15 +110,15 @@ public abstract class PacketProtocol { * * @param id Id of the packet to create. * @return The created packet. - * @throws IllegalArgumentException If the packet ID is invalid. + * @throws IllegalArgumentException If the packet ID is not registered. * @throws IllegalStateException If the packet does not have a no-params constructor or cannot be instantiated. */ public final Packet createIncomingPacket(int id) { - if(id < 0 || !this.incoming.containsKey(id) || this.incoming.get(id) == null) { + Class packet = this.incoming.get(id); + if (packet == null) { throw new IllegalArgumentException("Invalid packet id: " + id); } - Class packet = this.incoming.get(id); try { Constructor constructor = packet.getDeclaredConstructor(); if(!constructor.isAccessible()) { @@ -159,4 +163,19 @@ public abstract class PacketProtocol { return getOutgoingId(packet.getClass()); } + + /** + * Gets the packet class for a packet id. + * @param id The packet id. + * @return The registered packet's class + * @throws IllegalArgumentException If the packet ID is not registered. + */ + public final Class getOutgoingClass(int id) { + Class packet = this.outgoingClasses.get(id); + if(packet == null) { + throw new IllegalArgumentException("Invalid packet id: " + id); + } + + return packet; + } }