parse method
Implementation
Future<void> parse(Uint8List data) async {
_Command? command;
for (_Command cmd in cmdMap.keys) {
Uint8List buf = Uint8List.fromList(cmdMap[cmd]!);
bool isExist = true;
if (data.length >= buf.length) {
for (int i = 0; i < buf.length; i++) {
if (buf[i] != data[i]) {
isExist = false;
break;
}
}
command = cmd;
if (isExist) break;
}
}
switch (command ?? '') {
case _Command.PING:
_statusCallback(Status.PING_TIMER, null);
send(cmdMap[_Command.PONG]);
break;
case _Command.PONG:
_statusCallback(Status.PONG_TIMER, null);
if (!_pongCompleter.isCompleted) {
_pongCompleter.complete();
}
break;
case _Command.OK:
_statusCallback(Status.OK_MSG, null);
send(cmdMap[_Command.OK]);
break;
case _Command.ERROR:
final error = utf8.decode(data.sublist(cmdMap[_Command.ERROR]!.length, data.length - 2));
_statusCallback(Status.ERROR, error);
break;
case _Command.MSG:
case _Command.HMSG:
String? subject;
int? sid;
int totalBytes = 0;
int i, start = cmdMap[command]!.length;
for (i = start; i < data.length; i++) {
if (data[i] == 32) {
subject = utf8.decode(data.sublist(start, i));
break;
}
}
start = i + 1;
for (i = start; i < data.length; i++) {
if (data[i] == 32) {
sid = protoParseInt(data.sublist(start, i));
break;
}
}
start = i + 1;
for (i = start; i < data.length; i++) {
if (data[i] == 13 && data[i + 1] == 10) {
totalBytes = protoParseInt(data.sublist(start, i));
break;
}
}
start = i + 2;
if (subs[sid] != null) {
Subscription s = subs[sid]!;
if (totalBytes > 0 && s.callback is SubCallback) {
if (start + totalBytes < data.length) {
s.callback!(SubscriptionResult(data.sublist(start, start + totalBytes), s, subject));
} else {
_openSubscription = OpenSubscription(s, subject, totalBytes);
if (data.length > start) {
_openSubscription!.buffer.addAll(data.sublist(start));
}
}
}
}
break;
}
}