decode method
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;
}
}