mirror of
https://github.com/tiennm99/zfoo.git
synced 2026-08-05 20:23:57 +00:00
feat[dart]: compatible protocol
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'IByteBuffer.dart';
|
||||
import 'ProtocolManager.dart';
|
||||
|
||||
@@ -8,6 +9,30 @@ class ByteBuffer implements IByteBuffer {
|
||||
int writeOffset = 0;
|
||||
int readOffset = 0;
|
||||
|
||||
@override
|
||||
void adjustPadding(int predictionLength, int beforeWriteIndex) {
|
||||
var currentWriteIndex = getWriteOffset();
|
||||
var predictionCount = writeIntCount(predictionLength);
|
||||
var length = currentWriteIndex - beforeWriteIndex - predictionCount;
|
||||
var lengthCount = writeIntCount(length);
|
||||
var padding = lengthCount - predictionCount;
|
||||
if (padding == 0) {
|
||||
setWriteOffset(beforeWriteIndex);
|
||||
writeInt(length);
|
||||
setWriteOffset(currentWriteIndex);
|
||||
} else {
|
||||
var retainedByteBuf = buffer.sublist(currentWriteIndex - length, currentWriteIndex);
|
||||
setWriteOffset(beforeWriteIndex);
|
||||
writeInt(length);
|
||||
writeBytes(retainedByteBuf);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
bool compatibleRead(int beforeReadIndex, int length) {
|
||||
return length != -1 && getReadOffset() < length + beforeReadIndex;
|
||||
}
|
||||
|
||||
@override
|
||||
Int8List getBuffer() {
|
||||
return buffer;
|
||||
@@ -129,6 +154,29 @@ class ByteBuffer implements IByteBuffer {
|
||||
return value;
|
||||
}
|
||||
|
||||
@override
|
||||
int writeIntCount(int value) {
|
||||
value = (value << 1) ^ (value >> 31);
|
||||
|
||||
if (value >>> 7 == 0) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (value >>> 14 == 0) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (value >>> 21 == 0) {
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (value >>> 28 == 0) {
|
||||
return 4;
|
||||
}
|
||||
|
||||
return 5;
|
||||
}
|
||||
|
||||
@override
|
||||
void writeInt(int value) {
|
||||
writeLong(value);
|
||||
@@ -323,4 +371,3 @@ class ByteBuffer implements IByteBuffer {
|
||||
return protocol.read(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
import 'dart:typed_data';
|
||||
|
||||
abstract class IByteBuffer {
|
||||
void adjustPadding(int predictionLength, int beforeWriteIndex);
|
||||
|
||||
bool compatibleRead(int beforeReadIndex, int length);
|
||||
|
||||
Int8List getBuffer();
|
||||
|
||||
int getWriteOffset();
|
||||
@@ -33,6 +37,8 @@ abstract class IByteBuffer {
|
||||
|
||||
int readShort();
|
||||
|
||||
int writeIntCount(int value);
|
||||
|
||||
void writeRawInt(int value);
|
||||
|
||||
int readRawInt();
|
||||
|
||||
Reference in New Issue
Block a user