void decode(thinger_message&  message, size_t size){
     size_t start_read = bytes_read();
     while(size-(bytes_read()-start_read)>0) {
         protoson::pb_wire_type wire_type;
         uint32_t field_number;
         pb_decode_tag(wire_type, field_number);
         switch (wire_type) {
             case protoson::length_delimited:{
                 uint32_t size = pb_decode_varint32();
                 pb_skip(size);
             }
                 break;
             case protoson::varint: {
                 switch (field_number) {
                     case thinger_message::SIGNAL_FLAG:
                         message.set_signal_flag((thinger_message::signal_flag)pb_decode_varint32());
                         break;
                     case thinger_message::STREAM_ID:
                         message.set_stream_id(pb_decode_varint32());
                         break;
                     default:
                         pb_skip_varint();
                         break;
                 }
                 break;
             }
             case protoson::pson_type:
                 switch(field_number){
                     case thinger_message::RESOURCE:
                         protoson::pson_decoder::decode(message.get_resources());
                         break;
                     case thinger_message::PSON_PAYLOAD:
                         protoson::pson_decoder::decode(((protoson::pson&) message));
                         break;
                     default:
                         break;
                 }
                 break;
             case protoson::fixed_32:
                 pb_skip(4);
                 break;
             case protoson::fixed_64:
                 pb_skip(8);
                 break;
             default:
                 break;
         }
     }
 }
Example #2
0
bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof)
{
    uint32_t temp;
    *eof = false;
    *wire_type = (pb_wire_type_t) 0;
    *tag = 0;

    if (!pb_decode_varint32(stream, &temp))
    {
        if (stream->bytes_left == 0)
            *eof = true;

        return false;
    }

    if (temp == 0)
    {
        *eof = true; /* Special feature: allow 0-terminated messages. */
        return false;
    }

    *tag = temp >> 3;
    *wire_type = (pb_wire_type_t)(temp & 7);
    return true;
}
Example #3
0
bool checkreturn pb_skip_string(pb_istream_t *stream)
{
    uint32_t length;
    if (!pb_decode_varint32(stream, &length))
        return false;

    return pb_read(stream, NULL, length);
}
Example #4
0
/* Decode string length from stream and return a substream with limited length.
 * Remember to close the substream using pb_close_string_substream().
 */
bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream)
{
    uint32_t size;
    if (!pb_decode_varint32(stream, &size))
        return false;

    *substream = *stream;
    if (substream->bytes_left < size)
        PB_RETURN_ERROR(stream, "parent stream too short");

    substream->bytes_left = size;
    stream->bytes_left -= size;
    return true;
}