parse static method

AsyncReply parse(
  1. DC data,
  2. int offset,
  3. DistributedConnection connection, [
  4. SizeObject? sizeObject,
  5. int dataType = DataType.Unspecified,
])
Parse a value Bytes array Zero-indexed offset. Output the number of bytes parsed DistributedConnection is required in case a structure in the array holds items at the other end. DataType, in case the data is not prepended with DataType

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);
}