forked from MagicBane/Server
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
4.8 KiB
207 lines
4.8 KiB
3 years ago
|
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||
|
// Magicbane Emulator Project © 2013 - 2022
|
||
|
// www.magicbane.com
|
||
|
|
||
|
|
||
|
package engine.net;
|
||
|
|
||
|
import engine.math.Vector3f;
|
||
|
import engine.math.Vector3fImmutable;
|
||
|
import engine.util.ByteBufferUtils;
|
||
|
import org.joda.time.DateTime;
|
||
|
|
||
|
import java.nio.ByteBuffer;
|
||
|
import java.time.LocalDateTime;
|
||
|
import java.util.UUID;
|
||
|
|
||
|
//TODO possibly pool this class? Maybe make them static?
|
||
|
//TODO need to extract the SB specific stuff from here into subclass.
|
||
|
|
||
|
public class ByteBufferWriter {
|
||
|
|
||
|
private final ByteBuffer bb;
|
||
|
|
||
|
public ByteBufferWriter(ByteBuffer bb) {
|
||
|
super();
|
||
|
this.bb = bb;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Putters
|
||
|
*/
|
||
|
|
||
|
public synchronized void put(byte x) {
|
||
|
|
||
|
this.bb.put(x);
|
||
|
}
|
||
|
|
||
|
public synchronized void putChar(char x) {
|
||
|
|
||
|
this.bb.putChar(x);
|
||
|
}
|
||
|
|
||
|
public synchronized void putShort(short x) {
|
||
|
|
||
|
this.bb.putShort(x);
|
||
|
}
|
||
|
|
||
|
public synchronized void putInt(int x) {
|
||
|
this.bb.putInt(x);
|
||
|
}
|
||
|
|
||
|
public synchronized void putLong(long x) {
|
||
|
this.bb.putLong(x);
|
||
|
}
|
||
|
|
||
|
public synchronized void putDateTime(DateTime dateTime){
|
||
|
this.put((byte)dateTime.getDayOfMonth());
|
||
|
this.put((byte) ((byte)dateTime.getMonthOfYear() -1));
|
||
|
this.putInt(dateTime.getYear()-1900);
|
||
|
this.put((byte)dateTime.getHourOfDay());
|
||
|
this.put((byte)dateTime.getMinuteOfHour());
|
||
|
this.put((byte)dateTime.getSecondOfDay());
|
||
|
}
|
||
|
|
||
|
public synchronized void putLocalDateTime(LocalDateTime dateTime){
|
||
|
this.put((byte)dateTime.getDayOfMonth());
|
||
|
this.put((byte) ((byte)dateTime.getMonth().getValue() -1));
|
||
|
this.putInt(dateTime.getYear() -1900);
|
||
|
this.put((byte)dateTime.getHour());
|
||
|
this.put((byte)dateTime.getMinute());
|
||
|
this.put((byte)dateTime.getSecond());
|
||
|
}
|
||
|
|
||
|
public synchronized void putFloat(float x) {
|
||
|
this.bb.putFloat(x);
|
||
|
}
|
||
|
|
||
|
public synchronized void putDouble(double x) {
|
||
|
this.bb.putDouble(x);
|
||
|
}
|
||
|
|
||
|
public synchronized void putString(String x) {
|
||
|
ByteBufferUtils.putString(this.bb, x, false, false);
|
||
|
}
|
||
|
|
||
|
public synchronized void putSmallString(String x) {
|
||
|
ByteBufferUtils.putString(this.bb, x, false, true);
|
||
|
}
|
||
|
|
||
|
public synchronized void putHexString(String x) {
|
||
|
ByteBufferUtils.putHexString(this.bb, x, false);
|
||
|
}
|
||
|
|
||
|
public synchronized void putHexStringWithoutSize(String data) {
|
||
|
int length = data.length() / 2;
|
||
|
|
||
|
for (int i = 0; i < length; i++) {
|
||
|
bb.put((byte) Integer.parseInt(data.substring(2 * i, 2 * i + 2), 16));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public synchronized void putUnicodeString(String x) {
|
||
|
ByteBufferUtils.putUnicodeString(this.bb, x, false);
|
||
|
}
|
||
|
|
||
|
public synchronized void putWriter(ByteBufferWriter writer) {
|
||
|
synchronized (writer) {
|
||
|
ByteBuffer bbin = writer.bb;
|
||
|
bbin.flip();
|
||
|
this.bb.put(bbin);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public synchronized void putBB(ByteBuffer bb) {
|
||
|
synchronized (bb) {
|
||
|
bb.flip();
|
||
|
this.bb.put(bb);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public synchronized void putIntAt(int value, int position) {
|
||
|
// mark end position
|
||
|
int endPosition = this.position();
|
||
|
|
||
|
// go back to the desired position
|
||
|
this.bb.position(position);
|
||
|
|
||
|
// Write in the value:
|
||
|
this.putInt(value);
|
||
|
|
||
|
// now go back to end:
|
||
|
this.bb.position(endPosition);
|
||
|
}
|
||
|
|
||
|
public synchronized void putVector3f(Vector3f x) {
|
||
|
this.bb.putFloat(x.x);
|
||
|
this.bb.putFloat(x.y);
|
||
|
this.bb.putFloat(x.z);
|
||
|
}
|
||
|
|
||
|
public synchronized void putVector3f(Vector3fImmutable x) {
|
||
|
this.bb.putFloat(x.x);
|
||
|
this.bb.putFloat(x.y);
|
||
|
this.bb.putFloat(x.z);
|
||
|
}
|
||
|
|
||
|
public synchronized void putUUID(final UUID uuid) {
|
||
|
final long msb = uuid.getMostSignificantBits();
|
||
|
final long lsb = uuid.getLeastSignificantBits();
|
||
|
final byte[] buffer = new byte[16];
|
||
|
|
||
|
for (int i = 0; i < 8; i++) {
|
||
|
buffer[i] = (byte) (msb >>> 8 * (7 - i));
|
||
|
}
|
||
|
|
||
|
for (int i = 8; i < 16; i++) {
|
||
|
buffer[i] = (byte) (lsb >>> 8 * (7 - i));
|
||
|
}
|
||
|
|
||
|
this.bb.put(buffer);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return
|
||
|
* @see java.nio.Buffer#hasRemaining()
|
||
|
*/
|
||
|
public final boolean hasRemaining() {
|
||
|
return bb.hasRemaining();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return
|
||
|
* @see java.nio.Buffer#limit()
|
||
|
*/
|
||
|
public final int limit() {
|
||
|
return bb.limit();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return
|
||
|
* @see java.nio.Buffer#position()
|
||
|
*/
|
||
|
public final int position() {
|
||
|
return bb.position();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return
|
||
|
* @see java.nio.Buffer#remaining()
|
||
|
*/
|
||
|
public final int remaining() {
|
||
|
return bb.remaining();
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Getters
|
||
|
*/
|
||
|
|
||
|
public synchronized ByteBuffer getBb() {
|
||
|
return this.bb;
|
||
|
}
|
||
|
}
|