in sdk/src/model/SelectObjectRequest.cc [67:125]
int selectObjectDepackFrame(const char *ptr, int len, int *frame_type, int *payload_len, char **payload_buf, SelectObjectFrame *frame)
{
int remain = len;
//Version | Frame - Type | Payload Length | Header Checksum | Payload | Payload Checksum
//<1 byte> <--3 bytes--> <-- 4 bytes --> <------4 bytes--> <variable><----4bytes------>
//Payload
//<offset | data>
//<8 types><variable>
// header
if (frame->header_len < FRAME_HEADER_LEN) {
int copy = FRAME_HEADER_LEN - frame->header_len;
copy = ((remain > copy) ? copy : remain);
memcpy(frame->header + frame->header_len, ptr, copy);
frame->header_len += copy;
ptr += copy;
remain -= copy;
// if deal with header done
if (frame->header_len == FRAME_HEADER_LEN) {
uint32_t payload_length;
// calculation payload length
payload_length = frame->header[4];
payload_length = (payload_length << 8) | frame->header[5];
payload_length = (payload_length << 8) | frame->header[6];
payload_length = (payload_length << 8) | frame->header[7];
frame->payload_remains = payload_length - 8;
frame->payload_crc32 = CRC32::CalcCRC(frame->init_crc32, frame->header + 12, 8);
}
}
// payload
if (frame->payload_remains > 0) {
int copy = (frame->payload_remains > remain) ? remain : frame->payload_remains;
uint32_t type;
type = frame->header[1];
type = (type << 8) | frame->header[2];
type = (type << 8) | frame->header[3];
*frame_type = type;
*payload_len = copy;
*payload_buf = (char *)ptr;
remain -= copy;
frame->payload_remains -= copy;
frame->payload_crc32 = CRC32::CalcCRC(frame->payload_crc32, ptr, copy);
return len - remain;
}
// tail
if (frame->tail_len < 4) {
int copy = 4 - frame->tail_len;
copy = (copy > remain ? remain : copy);
memcpy(frame->tail + frame->tail_len, ptr, copy);
frame->tail_len += copy;
remain -= copy;
*frame_type = 0;
}
return len - remain;
}