in sdk/Domain/SelectObjectStream.cs [55:162]
public void DepackFrameHeaderIfNesseary()
{
var buff = new byte[128];
int readCnt = 0;
//Version | Frame - Type | Payload Length | Header Checksum | Payload | Payload Checksum
//<1 bytes> <--3 bytes--> <-- 4 bytes --> <------4 bytes--> <variable><----4bytes------>
//Payload
//<offset | data>
//<8 bytes><variable>
if (_payloadRemain > 0)
return;
if (_lastFrameType == 0x800001)
{
//Payload Checksum
readCnt = TryRead(buff, 0, 4);
ensureReadSize(4, readCnt);
uint serverCrc32 = OssUtils.ConvertBytesToUint(buff, 0, 4);
//Payload Crc32 check
if (serverCrc32 != 0 && serverCrc32 != _payloadcrc32)
{
throw new ClientException(string.Format("Payload checksum check fail server CRC {0}, client CRC {1}",
serverCrc32, _payloadcrc32));
}
}
_lastFrameType = 0;
_payloadRemain = 0;
readCnt = TryRead(buff, 0, 12);
if (_gotEndofStream)
return;
ensureReadSize(12, readCnt);
//version
//Frame - Type
int frameType = OssUtils.ConvertBytesToInt(buff, 1, 3);
_lastFrameType = frameType;
//Payload Length
int payloadLength = OssUtils.ConvertBytesToInt(buff, 4, 4);
//Payload Length
int headerCheckSum = OssUtils.ConvertBytesToInt(buff, 8, 4);
switch (frameType)
{
case 0x800001: //data frame
//offset
readCnt = TryRead(buff, 0, 8);
ensureReadSize(8, readCnt);
_payloadcrc32 = CRC32.GetCRC32Byte(buff, 8, 0);
//skip offset bytes
_payloadRemain = payloadLength - 8;
break;
case 0x800005: //Select object End Frame
//offset | total scanned bytes
readCnt = TryRead(buff, 0, 16);
ensureReadSize(16, readCnt);
//http status
readCnt = TryRead(buff, 0, 4);
ensureReadSize(4, readCnt);
StatusCode = OssUtils.ConvertBytesToInt(buff, 0, 4);
//error message
payloadLength = payloadLength - 20;
if (payloadLength > 0)
{
int len = Math.Min(buff.Length, payloadLength);
readCnt = TryRead(buff, 0, len);
ensureReadSize(len, readCnt);
ErrorMessage = System.Text.Encoding.Default.GetString(buff, 0, readCnt);
payloadLength -= len;
if (payloadLength > 0)
{
readCnt = TrySkip(payloadLength);
ensureReadSize(payloadLength, readCnt);
}
}
//skip payload Checksum
readCnt = TryRead(buff, 0, 4);
ensureReadSize(4, readCnt);
_gotEndFrame = true;
break;
case 0x800004: //Continuous Frame
default:
//skip playload
readCnt = TrySkip(payloadLength);
ensureReadSize(payloadLength, readCnt);
//skip payload Checksum
readCnt = TryRead(buff, 0, 4);
ensureReadSize(4, readCnt);
break;
}
}