includes pb.h.
============================ ================================================
-__BIG_ENDIAN__ Set this if your platform stores integers and
- floats in big-endian format. Mixed-endian
- systems (different layout for ints and floats)
- are currently not supported.
-NANOPB_INTERNALS Set this to expose the field encoder functions
- that are hidden since nanopb-0.1.3.
+PB_NO_PACKED_STRUCTS Disable packed structs. Increases RAM usage but
+ is necessary on some platforms that do not
+ support unaligned memory access.
+PB_ENABLE_MALLOC Set this to enable dynamic allocation support
+ in the decoder.
PB_MAX_REQUIRED_FIELDS Maximum number of required fields to check for
presence. Default value is 64. Increases stack
usage 1 byte per every 8 fields. Compiler
PB_OLD_CALLBACK_STYLE Use the old function signature (void\* instead
of void\*\*) for callback fields. This was the
default until nanopb-0.2.1.
+PB_SYSTEM_HEADER Replace the standard header files with a single
+ header file. It should define all the required
+ functions and typedefs listed on the
+ `overview page`_. Value must include quotes,
+ for example *#define PB_SYSTEM_HEADER "foo.h"*.
============================ ================================================
The PB_MAX_REQUIRED_FIELDS, PB_FIELD_16BIT and PB_FIELD_32BIT settings allow
automatically by C-preprocessor #if-directives in the generated .pb.h files.
The default setting is to use the smallest datatypes (least resources used).
-
+.. _`overview page`: index.html#compiler-requirements
Proto file options
max_size Allocated size for *bytes* and *string* fields.
max_count Allocated number of entries in arrays
(*repeated* fields).
+int_size Override the integer type of a field.
+ (To use e.g. uint8_t to save RAM.)
type Type of the generated field. Default value
is *FT_DEFAULT*, which selects automatically.
- You can use *FT_CALLBACK*, *FT_STATIC* or
- *FT_IGNORE* to force a callback field, a static
+ You can use *FT_CALLBACK*, *FT_POINTER*,
+ *FT_STATIC* or *FT_IGNORE* to force a callback
+ field, a dynamically allocated field, a static
field or to completely ignore the field.
long_names Prefix the enum name to the enum value in
definitions, i.e. *EnumName_EnumValue*. Enabled
packed_struct Make the generated structures packed.
NOTE: This cannot be used on CPUs that break
on unaligned accesses to variables.
+skip_message Skip the whole message from generation.
+no_unions Generate 'oneof' fields as optional fields
+ instead of C unions.
+msgid Specifies a unique id for this message type.
+ Can be used by user code as an identifier.
+anonymous_oneof Generate 'oneof' fields as anonymous unions.
============================ ================================================
These options can be defined for the .proto files before they are converted
pb.h
====
+pb_byte_t
+---------
+Type used for storing byte-sized data, such as raw binary input and bytes-type fields. ::
+
+ typedef uint_least8_t pb_byte_t;
+
+For most platforms this is equivalent to `uint8_t`. Some platforms however do not support
+8-bit variables, and on those platforms 16 or 32 bits need to be used for each byte.
+
pb_type_t
---------
-Defines the encoder/decoder behaviour that should be used for a field. ::
+Type used to store the type of each field, to control the encoder/decoder behaviour. ::
- typedef uint8_t pb_type_t;
+ typedef uint_least8_t pb_type_t;
The low-order nibble of the enumeration values defines the function that can be used for encoding and decoding the field data:
----------
Describes a single structure field with memory position in relation to others. The descriptions are usually autogenerated. ::
- typedef struct _pb_field_t pb_field_t;
- struct _pb_field_t {
- uint8_t tag;
+ typedef struct pb_field_s pb_field_t;
+ struct pb_field_s {
+ pb_size_t tag;
pb_type_t type;
- uint8_t data_offset;
- int8_t size_offset;
- uint8_t data_size;
- uint8_t array_size;
+ pb_size_t data_offset;
+ pb_ssize_t size_offset;
+ pb_size_t data_size;
+ pb_size_t array_size;
const void *ptr;
} pb_packed;
An byte array with a field for storing the length::
typedef struct {
- size_t size;
- uint8_t bytes[1];
+ pb_size_t size;
+ pb_byte_t bytes[1];
} pb_bytes_array_t;
In an actual array, the length of *bytes* may be different.
PB_WT_32BIT = 5
} pb_wire_type_t;
+pb_extension_type_t
+-------------------
+Defines the handler functions and auxiliary data for a field that extends
+another message. Usually autogenerated by *nanopb_generator.py*::
+
+ typedef struct {
+ bool (*decode)(pb_istream_t *stream, pb_extension_t *extension,
+ uint32_t tag, pb_wire_type_t wire_type);
+ bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension);
+ const void *arg;
+ } pb_extension_type_t;
+
+In the normal case, the function pointers are *NULL* and the decoder and
+encoder use their internal implementations. The internal implementations
+assume that *arg* points to a *pb_field_t* that describes the field in question.
+
+To implement custom processing of unknown fields, you can provide pointers
+to your own functions. Their functionality is mostly the same as for normal
+callback fields, except that they get called for any unknown field when decoding.
+
+pb_extension_t
+--------------
+Ties together the extension field type and the storage for the field value::
+
+ typedef struct {
+ const pb_extension_type_t *type;
+ void *dest;
+ pb_extension_t *next;
+ bool found;
+ } pb_extension_t;
+
+:type: Pointer to the structure that defines the callback functions.
+:dest: Pointer to the variable that stores the field value
+ (as used by the default extension callback functions.)
+:next: Pointer to the next extension handler, or *NULL*.
+:found: Decoder sets this to true if the extension was found.
+
PB_GET_ERROR
------------
Get the current error message from a stream, or a placeholder string if
----------------------
Constructs an output stream for writing into a memory buffer. This is just a helper function, it doesn't do anything you couldn't do yourself in a callback function. It uses an internal callback that stores the pointer in stream *state* field. ::
- pb_ostream_t pb_ostream_from_buffer(uint8_t *buf, size_t bufsize);
+ pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize);
:buf: Memory buffer to write into.
:bufsize: Maximum number of bytes to write.
--------
Writes data to an output stream. Always use this function, instead of trying to call stream callback manually. ::
- bool pb_write(pb_ostream_t *stream, const uint8_t *buf, size_t count);
+ bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count);
:stream: Output stream to write to.
:buf: Pointer to buffer with the data to be written.
Normally pb_encode simply walks through the fields description array and serializes each field in turn. However, submessages must be serialized twice: first to calculate their size and then to actually write them to output. This causes some constraints for callback fields, which must return the same data on every call.
+pb_encode_delimited
+-------------------
+Calculates the length of the message, encodes it as varint and then encodes the message. ::
+
+ bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct);
+
+(parameters are the same as for `pb_encode`_.)
+
+A common way to indicate the message length in Protocol Buffers is to prefix it with a varint.
+This function does this, and it is compatible with *parseDelimitedFrom* in Google's protobuf library.
+
.. sidebar:: Encoding fields manually
The functions with names *pb_encode_\** are used when dealing with callback fields. The typical reason for using callbacks is to have an array of unlimited size. In that case, `pb_encode`_ will call your callback function, which in turn will call *pb_encode_\** functions repeatedly to write out values.
Writing packed arrays is a little bit more involved: you need to use `pb_encode_tag` and specify `PB_WT_STRING` as the wire type. Then you need to know exactly how much data you are going to write, and use `pb_encode_varint`_ to write out the number of bytes before writing the actual data. Substreams can be used to determine the number of bytes beforehand; see `pb_encode_submessage`_ source code for an example.
+pb_get_encoded_size
+-------------------
+Calculates the length of the encoded message. ::
+
+ bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct);
+
+:size: Calculated size of the encoded message.
+:fields: A field description array, usually autogenerated.
+:src_struct: Pointer to the data that will be serialized.
+:returns: True on success, false on detectable errors in field description or if a field encoder returns false.
+
pb_encode_tag
-------------
Starts a field in the Protocol Buffers binary format: encodes the field number and the wire type of the data. ::
- bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, int field_number);
+ bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number);
:stream: Output stream to write to. 1-5 bytes will be written.
:wiretype: PB_WT_VARINT, PB_WT_64BIT, PB_WT_STRING or PB_WT_32BIT
----------------
Writes the length of a string as varint and then contents of the string. Works for fields of type `bytes` and `string`::
- bool pb_encode_string(pb_ostream_t *stream, const uint8_t *buffer, size_t size);
+ bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size);
:stream: Output stream to write to.
:buffer: Pointer to string data.
----------------------
Helper function for creating an input stream that reads data from a memory buffer. ::
- pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize);
+ pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t bufsize);
:buf: Pointer to byte array to read from.
:bufsize: Size of the byte array.
-------
Read data from input stream. Always use this function, don't try to call the stream callback directly. ::
- bool pb_read(pb_istream_t *stream, uint8_t *buf, size_t count);
+ bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count);
:stream: Input stream to read from.
:buf: Buffer to store the data to, or NULL to just read data without storing it anywhere.
For optional fields, this function applies the default value and sets *has_<field>* to false if the field is not present.
+If *PB_ENABLE_MALLOC* is defined, this function may allocate storage for any pointer type fields.
+In this case, you have to call `pb_release`_ to release the memory after you are done with the message.
+On error return `pb_decode` will release the memory itself.
+
pb_decode_noinit
----------------
Same as `pb_decode`_, except does not apply the default values to fields. ::
The destination structure should be filled with zeros before calling this function. Doing a *memset* manually can be slightly faster than using `pb_decode`_ if you don't need any default values.
-pb_skip_varint
---------------
-Skip a varint_ encoded integer without decoding it. ::
+In addition to decoding a single message, this function can be used to merge two messages, so that
+values from previous message will remain if the new message does not contain a field.
- bool pb_skip_varint(pb_istream_t *stream);
+This function *will not* release the message even on error return. If you use *PB_ENABLE_MALLOC*,
+you will need to call `pb_release`_ yourself.
-:stream: Input stream to read from. Will read 1 byte at a time until the MSB is clear.
-:returns: True on success, false on IO error.
+pb_decode_delimited
+-------------------
+Same as `pb_decode`_, except that it first reads a varint with the length of the message. ::
-pb_skip_string
---------------
-Skip a varint-length-prefixed string. This means skipping a value with wire type PB_WT_STRING. ::
+ bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct);
- bool pb_skip_string(pb_istream_t *stream);
+(parameters are the same as for `pb_decode`_.)
-:stream: Input stream to read from.
-:returns: True on success, false on IO error or length exceeding uint32_t.
+A common method to indicate message size in Protocol Buffers is to prefix it with a varint.
+This function is compatible with *writeDelimitedTo* in the Google's Protocol Buffers library.
+
+pb_release
+----------
+Releases any dynamically allocated fields::
+
+ void pb_release(const pb_field_t fields[], void *dest_struct);
+
+:fields: A field description array. Usually autogenerated.
+:dest_struct: Pointer to structure where data is stored. If NULL, function does nothing.
+
+This function is only available if *PB_ENABLE_MALLOC* is defined. It will release any
+pointer type fields in the structure and set the pointers to NULL.
pb_decode_tag
-------------
Decode the tag that comes before field in the protobuf encoding::
- bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, int *tag, bool *eof);
+ bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof);
:stream: Input stream to read from.
:wire_type: Pointer to variable where to store the wire type of the field.
-----------------
Decode a *fixed64*, *sfixed64* or *double* value. ::
- bool pb_dec_fixed(pb_istream_t *stream, const pb_field_t *field, void *dest);
+ bool pb_decode_fixed64(pb_istream_t *stream, void *dest);
:stream: Input stream to read from. 8 bytes will be read.
-:field: Not used.
:dest: Pointer to destination *int64_t*, *uint64_t* or *double*.
:returns: True on success, false on IO errors.