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; } } }
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; }
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); }
/* 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; }