in sdk/src/model/SelectObjectRequest.cc [127:184]
int selectObjectTransferContent(SelectObjectFrame *frame, const char *ptr, int wanted) {
int remain = wanted;
char *payload_buf;
// the actual length of the write
int result = 0;
// deal with the whole buffer
while (remain > 0) {
int frame_type = 0, payload_len = 0;
int ret = selectObjectDepackFrame(ptr, remain, &frame_type, &payload_len, &payload_buf, frame);
switch (frame_type)
{
case 0x800001:
int temp;
temp = static_cast<int>(StreamBufProxy::xsputn(payload_buf, payload_len));
if (temp < 0) {
return temp;
}
result += temp;
break;
case 0x800004: //Continuous Frame
break;
case 0x800005: //Select object End Frame
{
int32_t copy = sizeof(frame->end_frame) - frame->end_frame_size;
copy = (copy > payload_len) ? payload_len : copy;
if (copy > 0) {
memcpy(frame->end_frame + frame->end_frame_size, ptr, copy);
frame->end_frame_size += copy;
}
}
break;
default:
// get payload checksum
if (frame->tail_len == 4) {
// compare check sum
uint32_t payload_crc32;
payload_crc32 = frame->tail[0];
payload_crc32 = (payload_crc32 << 8) | frame->tail[1];
payload_crc32 = (payload_crc32 << 8) | frame->tail[2];
payload_crc32 = (payload_crc32 << 8) | frame->tail[3];
if (payload_crc32 != 0 && payload_crc32 != frame->payload_crc32) {
// CRC32 Checksum failed
return -1;
}
// reset to get next frame
frame->header_len = 0;
frame->tail_len = 0;
frame->payload_remains = 0;
frame->end_frame_size = 0;
}
break;
}
ptr += ret;
remain -= ret;
}
return result;
}