decode method

void decode(
  1. Uint8List data
)

Decodes DAAP server response to DAAP object.

Gets object code, type and value. Throws DmapDecodeException in case of broken data.

Implementation

void decode(Uint8List data) {
  if (data.lengthInBytes < 8) {
    // broken data, must contain at least 8 bytes
    throw DmapDecodeException("Code name length must be at least 8 bytes");
  }

  code = getCode(data);
  _dataLength = getDataLength(data);
  rawData = data.sublist(
      8, 8 + getDataLength(data)); // skip (code + data length) offset

  switch (code.type) {
    case byte:
      _value__byte = ByteData.view(rawData.buffer).getInt8(0);
      break;
    case unsignedByte:
      _value__unsignedByte = ByteData.view(rawData.buffer).getUint8(0);
      break;
    case short:
      _value__short = ByteData.view(rawData.buffer).getInt16(0);
      break;
    case unsignedShort:
      _value__unsignedShort = ByteData.view(rawData.buffer).getUint16(0);
      break;
    case integer:
      _value__integer = ByteData.view(rawData.buffer).getInt32(0);
      break;
    case unsignedInteger:
      _value__unsignedInteger = ByteData.view(rawData.buffer).getUint32(0);
      break;
    case long:
      _value__long = ByteData.view(rawData.buffer).getInt64(0);
      break;
    case unsignedLong:
      _value__unsignedLong = ByteData.view(rawData.buffer).getUint64(0);
      break;
    case string:
      _value__string = utf8.decode(rawData);
      break;
    case timestamp:
      _value__timestamp = getTimestamp(rawData);
      break;
    case version:
      _value__version = getVersion(rawData);
      break;
    case container:
      var chunkStart = 0;
      while (chunkStart + 8 < _dataLength) {
        // including (code + data length) offset
        var obj = DaapObject(rawData.sublist(chunkStart));
        chunkStart = chunkStart +
            obj.rawData.lengthInBytes +
            8; // including (code + data length) offset
        _value__container.add(obj);
      }
      break;
  }
}