bool UserTypeFieldIterator::next() {
  if (next_ == end_) {
    return false;
  }
  current_ = next_++;
  position_ = decode_field(position_);
  return true;
}
/* Default handler for extension fields. Expects a pb_field_t structure
 * in extension->type->arg. */
static bool checkreturn default_extension_decoder(pb_istream_t *stream,
    pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type)
{
    const pb_field_t *field = (const pb_field_t*)extension->type->arg;
    pb_field_iterator_t iter;
    bool dummy;
    
    if (field->tag != tag)
        return true;
    
    iter.start = field;
    iter.pos = field;
    iter.field_index = 0;
    iter.required_field_index = 0;
    iter.dest_struct = extension->dest;
    iter.pData = extension->dest;
    iter.pSize = &dummy;
    
    return decode_field(stream, wire_type, &iter);
}
Esempio n. 3
0
bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct)
{
    uint8_t fields_seen[(PB_MAX_REQUIRED_FIELDS + 7) / 8] = {0}; /* Used to check for required fields */
    pb_field_iterator_t iter;

    pb_field_init(&iter, fields, dest_struct);

    while (stream->bytes_left)
    {
        uint32_t tag;
        pb_wire_type_t wire_type;
        bool eof;

        if (!pb_decode_tag(stream, &wire_type, &tag, &eof))
        {
            if (eof)
                break;
            else
                return false;
        }

        if (!pb_field_find(&iter, tag))
        {
            /* No match found, skip data */
            if (!pb_skip_field(stream, wire_type))
                return false;
            continue;
        }

        if (PB_HTYPE(iter.current->type) == PB_HTYPE_REQUIRED
                && iter.required_field_index < PB_MAX_REQUIRED_FIELDS)
        {
            fields_seen[iter.required_field_index >> 3] |= (uint8_t)(1 << (iter.required_field_index & 7));
        }

        if (!decode_field(stream, wire_type, &iter))
            return false;
    }
Esempio n. 4
0
bool perf_object_t::decode(const xml_element_t& xml_val)
{
    do
    {
        if (!decode_field(xml_val, "bool_val", bool_val, __xml_has_bool_val)) break;
        if (!decode_field(xml_val, "int8_val", int8_val, __xml_has_int8_val)) break;
        if (!decode_field(xml_val, "uint8_val", uint8_val, __xml_has_uint8_val)) break;
        if (!decode_field(xml_val, "int16_val", int16_val, __xml_has_int16_val)) break;
        if (!decode_field(xml_val, "uint16_val", uint16_val, __xml_has_uint16_val)) break;
        if (!decode_field(xml_val, "int32_val", int32_val, __xml_has_int32_val)) break;
        if (!decode_field(xml_val, "uint32_val", uint32_val, __xml_has_uint32_val)) break;
        if (!decode_field(xml_val, "int64_val", int64_val, __xml_has_int64_val)) break;
        if (!decode_field(xml_val, "uint64_val", uint64_val, __xml_has_uint64_val)) break;
        if (!decode_field(xml_val, "float_val", float_val, __xml_has_float_val)) break;
        if (!decode_field(xml_val, "double_val", double_val, __xml_has_double_val)) break;
        if (!decode_field(xml_val, "str_val", str_val, __xml_has_str_val)) break;
        if (!decode_field(xml_val, "vec_val", vec_val, __xml_has_vec_val)) break;
        if (!decode_field(xml_val, "dict_val", dict_val, __xml_has_dict_val)) break;

        return true;
    } while (0);

    return false;
}
Esempio n. 5
0
bool sample_struct_t::decode(const xml_element_t& xml_val)
{
    do
    {
        if (!decode_field(xml_val, "bool_val", bool_val, __xml_has_bool_val)) break;
        if (!decode_field(xml_val, "str_val", str_val, __xml_has_str_val)) break;
        if (!decode_field(xml_val, "int_val", int_val, __xml_has_int_val)) break;
        if (!decode_field(xml_val, "uint_val", uint_val, __xml_has_uint_val)) break;
        if (!decode_field(xml_val, "double_val", double_val, __xml_has_double_val)) break;
        if (!decode_field(xml_val, "char_val", char_val, __xml_has_char_val)) break;
        if (!decode_field(xml_val, "uchar_val", uchar_val, __xml_has_uchar_val)) break;
        if (!decode_field(xml_val, "short_val", short_val, __xml_has_short_val)) break;
        if (!decode_field(xml_val, "ushort_val", ushort_val, __xml_has_ushort_val)) break;
        if (!decode_field(xml_val, "int64_val", int64_val, __xml_has_int64_val)) break;
        if (!decode_field(xml_val, "uint64_val", uint64_val, __xml_has_uint64_val)) break;
        if (!decode_field(xml_val, "float_val", float_val, __xml_has_float_val)) break;
        if (!decode_field(xml_val, "vec_val", vec_val, __xml_has_vec_val)) break;
        if (!decode_field(xml_val, "str_map_val", str_map_val, __xml_has_str_map_val)) break;

        return true;
    } while (0);

    return false;
}
bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct)
{
    uint8_t fields_seen[(PB_MAX_REQUIRED_FIELDS + 7) / 8] = {0}; /* Used to check for required fields */
    uint32_t extension_range_start = 0;
    pb_field_iterator_t iter;
    
    pb_field_init(&iter, fields, dest_struct);
    
    while (stream->bytes_left)
    {
        uint32_t tag;
        pb_wire_type_t wire_type;
        bool eof;
        
        if (!pb_decode_tag(stream, &wire_type, &tag, &eof))
        {
            if (eof)
                break;
            else
                return false;
        }
        
        if (!pb_field_find(&iter, tag))
        {
            /* No match found, check if it matches an extension. */
            if (tag >= extension_range_start)
            {
                if (!find_extension_field(&iter))
                    extension_range_start = (uint32_t)-1;
                else
                    extension_range_start = iter.pos->tag;
                
                if (tag >= extension_range_start)
                {
                    size_t pos = stream->bytes_left;
                
                    if (!decode_extension(stream, tag, wire_type, &iter))
                        return false;
                    
                    if (pos != stream->bytes_left)
                    {
                        /* The field was handled */
                        continue;                    
                    }
                }
            }
        
            /* No match found, skip data */
            if (!pb_skip_field(stream, wire_type))
                return false;
            continue;
        }
        
        if (PB_HTYPE(iter.pos->type) == PB_HTYPE_REQUIRED
            && iter.required_field_index < PB_MAX_REQUIRED_FIELDS)
        {
            fields_seen[iter.required_field_index >> 3] |= (uint8_t)(1 << (iter.required_field_index & 7));
        }
            
        if (!decode_field(stream, wire_type, &iter))
            return false;
    }