61 lines
1.6 KiB
Java
61 lines
1.6 KiB
Java
/*
|
|
* Copyright (C) 2018 BARBOTIN Nicolas
|
|
*/
|
|
|
|
package net.montoyo.wd.miniserv;
|
|
|
|
import net.montoyo.wd.utilities.Log;
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
public final class PacketReader {
|
|
|
|
private final byte[] sizeArray = new byte[4];
|
|
private byte[] packetData;
|
|
private int pos = 0;
|
|
private boolean needSize = true;
|
|
|
|
public final boolean readFrom(ByteBuffer buf) {
|
|
if(needSize) {
|
|
//Read packet size
|
|
if(readByteArray(sizeArray, buf)) {
|
|
int packetSize = ((sizeArray[0] & 0xFF) << 24) | ((sizeArray[1] & 0xFF) << 16) | ((sizeArray[2] & 0xFF) << 8) | (sizeArray[3] & 0xFF);
|
|
needSize = false;
|
|
pos = 0;
|
|
|
|
if(packetSize < 5 || packetSize > 70000) {
|
|
Log.warning("Got invalid packet of size %d, things won't go well...", packetSize);
|
|
return true; //Abort packet reading
|
|
}
|
|
|
|
packetSize -= 4;
|
|
packetData = new byte[packetSize];
|
|
} else
|
|
return false;
|
|
}
|
|
|
|
return readByteArray(packetData, buf);
|
|
}
|
|
|
|
private boolean readByteArray(byte[] dst, ByteBuffer src) {
|
|
int remaining = dst.length - pos;
|
|
int read = (src.remaining() >= remaining) ? remaining : src.remaining();
|
|
|
|
src.get(dst, pos, read);
|
|
pos += read;
|
|
|
|
return (pos >= dst.length);
|
|
}
|
|
|
|
public final byte[] getPacketData() {
|
|
return packetData;
|
|
}
|
|
|
|
public final void reset() {
|
|
packetData = null;
|
|
pos = 0;
|
|
needSize = true;
|
|
}
|
|
|
|
}
|