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.
206 lines
4.8 KiB
206 lines
4.8 KiB
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . |
|
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· |
|
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ |
|
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ |
|
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ |
|
// 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; |
|
} |
|
}
|
|
|