decode method

  • @override

T decode (Decoder decoder, int offset, int depth)

override

Implementation

@override
T decode(Decoder decoder, int offset, int depth) {
  // 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({});
  }

  // Offsets.
  int envelopeOffset = decoder.claimMemory(
      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);
}