parseRecordArray static method

AsyncBag<IRecord?> parseRecordArray(
  1. DC data,
  2. int offset,
  3. int length,
  4. DistributedConnection connection,
)

Implementation

static AsyncBag<IRecord?> parseRecordArray(
    DC data, int offset, int length, DistributedConnection connection) {
  var reply = new AsyncBag<IRecord?>();

  if (length == 0) {
    reply.seal();
    return reply;
  }

  var end = offset + length;

  var isTyped = (data[offset] & 0x10) == 0x10;

  var result = (data[offset++] & 0xF);

  if (isTyped) {
    var classId = data.getGuid(offset);
    offset += 16;

    var template =
        Warehouse.getTemplateByClassId(classId, TemplateType.Record);

    reply.arrayType = template?.definedType;

    AsyncReply<IRecord?>? previous = null;

    if (result == RecordComparisonResult.Empty) {
      reply.seal();
      return reply;
    } else if (result == RecordComparisonResult.Null) {
      previous = AsyncReply<IRecord?>.ready(null);
    } else if (result == RecordComparisonResult.Record ||
        result == RecordComparisonResult.RecordSameType) {
      var cs = data.getUint32(offset);
      var recordLength = cs;
      offset += 4;
      previous = parseRecord(data, offset, recordLength, connection, classId);
      offset += recordLength;
    }

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

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

      if (result == RecordComparisonResult.Null)
        previous = new AsyncReply<IRecord?>.ready(null);
      else if (result == RecordComparisonResult.Record ||
          result == RecordComparisonResult.RecordSameType) {
        var cs = data.getUint32(offset);
        offset += 4;
        previous = parseRecord(data, offset, cs, connection, classId);
        offset += cs;
      } else if (result == RecordComparisonResult.Same) {
        // do nothing
      }

      reply.add(previous as AsyncReply<IRecord?>);
    }
  } else {
    AsyncReply<IRecord?>? previous = null;
    Guid? classId = null;
    if (result == RecordComparisonResult.Empty) {
      reply.seal();
      return reply;
    } else if (result == RecordComparisonResult.Null)
      previous = new AsyncReply<IRecord?>.ready(null);
    else if (result == RecordComparisonResult.Record) {
      var cs = data.getUint32(offset);
      var recordLength = cs - 16;
      offset += 4;
      classId = data.getGuid(offset);
      offset += 16;
      previous = parseRecord(data, offset, recordLength, connection, classId);
      offset += recordLength;
    }

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

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

      if (result == RecordComparisonResult.Null)
        previous = new AsyncReply<IRecord?>.ready(null);
      else if (result == RecordComparisonResult.Record) {
        var cs = data.getUint32(offset);
        var recordLength = cs - 16;
        offset += 4;
        classId = data.getGuid(offset);
        offset += 16;
        previous =
            parseRecord(data, offset, recordLength, connection, classId);
        offset += recordLength;
      } else if (result == RecordComparisonResult.RecordSameType) {
        var cs = data.getUint32(offset);
        offset += 4;
        previous = parseRecord(data, offset, cs, connection, classId);
        offset += cs;
      } else if (result == RecordComparisonResult.Same) {
        // do nothing
      }

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

  reply.seal();
  return reply;

  // var reply = new AsyncBag();
  // if (length == 0) {
  //   reply.seal();
  //   return reply;
  // }

  // var end = offset + length;

  // var result = data[offset++];

  // AsyncReply<IRecord> previous = null;
  // Guid classId = null;

  // if (result == RecordComparisonResult.Null)
  //   previous = new AsyncReply<IRecord>.ready(null);
  // else if (result == RecordComparisonResult.Record) {
  //   int cs = data.getUint32(offset);
  //   int recordLength = cs - 16;
  //   offset += 4;
  //   classId = data.getGuid(offset);
  //   offset += 16;
  //   previous = parseRecord(data, offset, recordLength, connection, classId);
  //   offset += recordLength;
  // }

  // reply.add(previous);

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

  //   if (result == RecordComparisonResult.Null)
  //     previous = new AsyncReply<IRecord>.ready(null);
  //   else if (result == RecordComparisonResult.Record) {
  //     int cs = data.getUint32(offset);
  //     int recordLength = cs - 16;
  //     offset += 4;
  //     classId = data.getGuid(offset);
  //     offset += 16;
  //     previous = parseRecord(data, offset, recordLength, connection, classId);
  //     offset += recordLength;
  //   } else if (result == RecordComparisonResult.RecordSameType) {
  //     int cs = data.getUint32(offset);
  //     offset += 4;
  //     previous = parseRecord(data, offset, cs, connection, classId);
  //     offset += cs;
  //   } else if (result == RecordComparisonResult.Same) {
  //     // do nothing
  //   }

  //   reply.add(previous);
  // }

  // reply.seal();
  // return reply;
}