[client] update proto

This commit is contained in:
2018-02-28 22:06:00 +03:00
parent 336896b37e
commit 34e5ac2b9e
10 changed files with 249 additions and 343 deletions

View File

@@ -1,80 +1,75 @@
package ru.m.connect;
import ru.m.connect.IConnection.IPacketBuilder;
import protohx.Message;
import haxe.io.BytesInput;
import haxe.io.BytesBuffer;
import haxe.io.Bytes;
import haxe.io.BytesBuffer;
import haxe.io.BytesInput;
import protohx.Message;
class PacketQueue {
public static inline var HEADER_SIZE:Int = 4;
class PacketQueue<P:Message> {
private var builder:IPacketBuilder;
private var bytesBuff:Bytes;
private var msgs:List<Message>;
private var packetClass:Class<P>;
private var bytesBuff:Bytes;
private var msgs:List<P>;
public function new(builder:IPacketBuilder) {
this.builder = builder;
msgs = new List<Message>();
}
public inline function hasMsg():Bool {
return !msgs.isEmpty();
}
public inline function popMsg():Message {
return msgs.pop();
}
public inline function addMsg(msg:Message):Void {
msgs.add(msg);
}
public function addBytes(bytes:Bytes) {
if (bytes == null) {
return;
public function new(packetClass:Class<P>) {
this.packetClass = packetClass;
msgs = new List<P>();
}
if (bytesBuff == null) {
bytesBuff = bytes;
} else {
var buffer = new BytesBuffer();
buffer.add(bytesBuff);
buffer.add(bytes);
bytesBuff = buffer.getBytes();
public inline function hasMsg():Bool {
return !msgs.isEmpty();
}
if (bytesBuff == null || bytesBuff.length < HEADER_SIZE) {
return;
public inline function popMsg():P {
return msgs.pop();
}
var available = bytesBuff.length;
var bi = new BytesInput(bytesBuff);
bi.bigEndian = false;
while (available >= HEADER_SIZE) {
var family = bi.readByte();
var id = bi.readByte();
var packetSize = bi.readUInt16();
available -= HEADER_SIZE;
if (packetSize <= available) {
available -= packetSize;
var msgBytes = bi.read(packetSize);
var packet = builder.buildPacket({family:family, id:id});
packet.mergeFrom(msgBytes);
addMsg(packet);
} else {
available += HEADER_SIZE;
break;
}
public inline function addMsg(msg:P):Void {
msgs.add(msg);
}
if (available == 0) {
bytesBuff = null;
} else if (available > 0) {
if (bytesBuff.length != available) {
var pos = bytesBuff.length - available;
bytesBuff = bytesBuff.sub(pos, available);
}
} else {
throw "Wrong available: " + available;
public function addBytes(bytes:Bytes):Void {
if (bytes == null) {
return;
}
if (bytesBuff == null) {
bytesBuff = bytes;
} else {
var buffer = new BytesBuffer();
buffer.add(bytesBuff);
buffer.add(bytes);
bytesBuff = buffer.getBytes();
}
if (bytesBuff == null || bytesBuff.length < 1) {
return;
}
var available = bytesBuff.length;
var bi = new BytesInput(bytesBuff);
bi.bigEndian = false;
while (available > 0) {
var packetSize = bi.readUInt16();
available -= 1;
if (packetSize <= available) {
var msgBytes = bi.read(packetSize);
var packet:P = Type.createInstance(packetClass, []);
packet.mergeFrom(msgBytes);
addMsg(packet);
available -= packetSize;
} else {
break;
}
}
if (available == 0) {
bytesBuff = null;
} else if (available > 0) {
if (bytesBuff.length != available) {
var pos = bytesBuff.length - available;
bytesBuff = bytesBuff.sub(pos, available);
}
} else {
throw "Wrong available: " + available;
}
}
}
}