parseStructureArray static method

AsyncBag<Structure?> parseStructureArray(
  1. DC data,
  2. int offset,
  3. int length,
  4. DistributedConnection connection,
)
Parse an array of structures Bytes array Zero-indexed offset Number of bytes to parse DistributedConnection is required in case a structure in the array holds items at the other end

Implementation

static AsyncBag<Structure?> parseStructureArray(
    DC data, int offset, int length, DistributedConnection connection) {
  var reply = new AsyncBag<Structure?>();
  if (length == 0) {
    reply.seal();
    return reply;
  }

  var end = offset + length;

  var result = data[offset++];

  AsyncReply<Structure?>? previous = null;
  // string[] previousKeys = null;
  // DataType[] previousTypes = null;

  StructureMetadata metadata = new StructureMetadata();

  if (result == StructureComparisonResult.Null)
    previous = new AsyncReply<Structure?>.ready(null);
  else if (result == StructureComparisonResult.Structure) {
    int cs = data.getUint32(offset);
    offset += 4;
    previous = parseStructure(data, offset, cs, connection, metadata);
    offset += cs;
  }

  reply.add(previous as AsyncReply<Structure?>);

  while (offset < end) {
    result = data[offset++];

    if (result == StructureComparisonResult.Null)
      previous = new AsyncReply<Structure?>.ready(null);
    else if (result == StructureComparisonResult.Structure) {
      int cs = data.getUint32(offset);
      offset += 4;
      previous = parseStructure(data, offset, cs, connection,
          metadata); // out previousKeys, out previousTypes);
      offset += cs;
    } else if (result == StructureComparisonResult.StructureSameKeys) {
      int cs = data.getUint32(offset);
      offset += 4;
      previous = parseStructure(
          data, offset, cs, connection, metadata, metadata.keys);
      offset += cs;
    } else if (result == StructureComparisonResult.StructureSameTypes) {
      int cs = data.getUint32(offset);
      offset += 4;
      previous = parseStructure(data, offset, cs, connection, metadata,
          metadata.keys, metadata.types);
      offset += cs;
    }

    reply.add(previous as AsyncReply<Structure?>);
  }

  reply.seal();
  return reply;
}