int selectObjectTransferContent()

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