- @override
T decode (Decoder decoder, int offset, int depth)
override
Implementation
@override
T decode(Decoder decoder, int offset, int depth) {
assert(decoder.wireFormat == WireFormat.v2);
// Header.
final int maxOrdinal = decoder.decodeUint64(offset);
final int data = decoder.decodeUint64(offset + 8);
switch (data) {
case kAllocPresent:
break; // good
case kAllocAbsent:
throw FidlError('Unexpected null reference',
FidlErrorCode.fidlNonNullableTypeWithNullValue);
default:
throw FidlError('Bad reference encoding',
FidlErrorCode.fidlInvalidPresenceIndicator);
}
// Early exit on empty table.
if (maxOrdinal == 0) {
return ctor({});
}
// Size limit.
if (maxOrdinal < 0 || maxOrdinal > kMaxCount) {
throw FidlError('Size of table exceeds limit: $maxOrdinal',
FidlErrorCode.fidlCountExceedsLimit);
}
// Offsets.
int envelopeOffset = decoder.claimBytes(
maxOrdinal * envelopeSize(decoder.wireFormat), depth);
// Envelopes, and fields.
final Map<int, dynamic> argv = {};
Map<int, UnknownRawData> unknownData = {};
for (int ordinal = 1; ordinal <= maxOrdinal; ordinal++) {
FidlType? fieldType;
if (ordinal <= members.length) {
fieldType = members[ordinal - 1];
} else {
fieldType = null;
}
final header = _decodeEnvelopeHeader(decoder, envelopeOffset);
final field = _decodeEnvelopeContent(
decoder,
header,
envelopeOffset,
fieldType ??
UnknownRawDataType(
numBytes: header.numBytes, numHandles: header.numHandles),
depth + 1,
false);
if (field != null) {
if (fieldType != null) {
argv[ordinal] = field;
} else {
_maybeThrowOnUnknownHandles(resource, field);
unknownData[ordinal] = field;
}
}
envelopeOffset += envelopeSize(decoder.wireFormat);
}
return ctor(argv, unknownData);
}