parse static method
AsyncReply
parse(
- DC data,
- int offset,
- DistributedConnection connection, [
- SizeObject? sizeObject,
- int dataType = DataType.Unspecified,
Implementation
static AsyncReply parse(DC data, int offset, DistributedConnection connection,
[SizeObject? sizeObject, int dataType = DataType.Unspecified]) {
bool isArray;
int t;
if (dataType == DataType.Unspecified) {
sizeObject?.size = 1;
dataType = data[offset++];
} else
sizeObject?.size = 0;
t = dataType & 0x7F;
isArray = (dataType & 0x80) == 0x80;
var payloadSize = DataType.size(dataType);
int contentLength = 0;
// check if we have the enough data
if (payloadSize == -1) {
contentLength = data.getUint32(offset);
offset += 4;
sizeObject?.size += 4 + contentLength;
} else
sizeObject?.size += payloadSize;
if (isArray) {
switch (t) {
// VarArray ?
case DataType.Void:
return parseVarArray(data, offset, contentLength, connection);
case DataType.Bool:
return new AsyncReply<List<bool>>.ready(
data.getBooleanArray(offset, contentLength));
case DataType.UInt8:
return new AsyncReply<Uint8List>.ready(
data.getUint8Array(offset, contentLength));
case DataType.Int8:
return new AsyncReply<Int8List>.ready(
data.getInt8Array(offset, contentLength));
case DataType.Char:
return new AsyncReply<List<String>>.ready(
data.getCharArray(offset, contentLength));
case DataType.Int16:
return new AsyncReply<Int16List>.ready(
data.getInt16Array(offset, contentLength));
case DataType.UInt16:
return new AsyncReply<Uint16List>.ready(
data.getUint16Array(offset, contentLength));
case DataType.Int32:
return new AsyncReply<Int32List>.ready(
data.getInt32Array(offset, contentLength));
case DataType.UInt32:
return new AsyncReply<Uint32List>.ready(
data.getUint32Array(offset, contentLength));
case DataType.Int64:
return new AsyncReply<Int64List>.ready(
data.getInt64Array(offset, contentLength));
case DataType.UInt64:
return new AsyncReply<Uint64List>.ready(
data.getUint64Array(offset, contentLength));
case DataType.Float32:
return new AsyncReply<Float32List>.ready(
data.getFloat32Array(offset, contentLength));
case DataType.Float64:
return new AsyncReply<Float64List>.ready(
data.getFloat64Array(offset, contentLength));
case DataType.String:
return new AsyncReply<List<String>>.ready(
data.getStringArray(offset, contentLength));
case DataType.Resource:
case DataType.DistributedResource:
return parseResourceArray(data, offset, contentLength, connection);
case DataType.DateTime:
return new AsyncReply<List<DateTime>>.ready(
data.getDateTimeArray(offset, contentLength));
case DataType.Structure:
return parseStructureArray(data, offset, contentLength, connection);
case DataType.Record:
return parseRecordArray(data, offset, contentLength, connection);
}
} else {
switch (t) {
case DataType.NotModified:
return new AsyncReply<NotModified>.ready(new NotModified());
case DataType.Void:
return new AsyncReply<dynamic>.ready(null);
case DataType.Bool:
return new AsyncReply<bool>.ready(data.getBoolean(offset));
case DataType.UInt8:
return new AsyncReply<int>.ready(data[offset]);
case DataType.Int8:
return new AsyncReply<int>.ready(data[offset]);
case DataType.Char:
return new AsyncReply<String>.ready(data.getChar(offset));
case DataType.Int16:
return new AsyncReply<int>.ready(data.getInt16(offset));
case DataType.UInt16:
return new AsyncReply<int>.ready(data.getUint16(offset));
case DataType.Int32:
return new AsyncReply<int>.ready(data.getInt32(offset));
case DataType.UInt32:
return new AsyncReply<int>.ready(data.getUint32(offset));
case DataType.Int64:
return new AsyncReply<int>.ready(data.getInt64(offset));
case DataType.UInt64:
return new AsyncReply<int>.ready(data.getUint64(offset));
case DataType.Float32:
return new AsyncReply<double>.ready(data.getFloat32(offset));
case DataType.Float64:
return new AsyncReply<double>.ready(data.getFloat64(offset));
case DataType.String:
return new AsyncReply<String>.ready(
data.getString(offset, contentLength));
case DataType.Resource:
return parseResource(data, offset);
case DataType.DistributedResource:
return parseDistributedResource(data, offset, connection);
case DataType.DateTime:
return new AsyncReply<DateTime>.ready(data.getDateTime(offset));
case DataType.Structure:
return parseStructure(data, offset, contentLength, connection);
case DataType.Record:
return parseRecord(data, offset, contentLength, connection);
}
}
// @TODO: Throw exception
return AsyncReply.ready(null);
}