int selectObjectDepackFrame()

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