Exemplo n.º 1
0
int pop( unsigned char *data, unsigned int &len )
{
    static int pack_num = 0;

    for ( ; s_cur < s_len - sizeof(protocal_sdk_uart_header); ++s_cur )
    {
        if ( 0xaa != s_data[s_cur] )
        {
            continue;
        }

        protocal_sdk_uart_header *header = (protocal_sdk_uart_header*)(s_data + s_cur);
        if ( is_header_valid( header ) )
        {
            if ( s_cur + header->m_length > s_len )
            {
                char buffer[1024] = {0};
                memcpy( buffer, s_data + s_cur, s_len - s_cur );
                memcpy( s_data, buffer, s_len - s_cur );
                s_len = s_len - s_cur;
                s_cur = 0;
                break;
            }
            else if( is_packet_valid( header ) )
            {
                len = header->m_length - sizeof(protocal_sdk_uart_header) - 4;
                memcpy( data, s_data + s_cur + sizeof(protocal_sdk_uart_header), len );
                s_cur = s_cur + header->m_length;
                static unsigned short seq_num = 0;
                if( seq_num + 1 == header->m_seq_num )
                {
                    seq_num = header->m_seq_num;
                }
                else if( 0 != seq_num )
                {
                    seq_num = header->m_seq_num;
                }
                pack_num++;
                return 1;
            }
            else
            {
                printf( "packet err!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" );
            }
        }
        else
        {
            printf( "header err!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" );
        }
    }

    return 0;
}
Exemplo n.º 2
0
bool is_valid(const ref_t<pi_ext_t>& ring_cmd) {
    if(ring_cmd->pi().type() != pi_t::_array) {
        return false;
    }

    if(!is_header_valid(ring_cmd)) {
        return false;
    }

    switch(type(ring_cmd)) {
      case type_t::BATCH:
        return batch::is_body_valid(ring_cmd);
      case type_t::PROMISE:
        // TODO(prime@) write validation code
        return false;
      case type_t::VOTE:
        return vote::is_body_valid(ring_cmd);
      default:
        return false;
    }
}