Compare commits
4 Commits
dev_extens
...
nanopb-0.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
81cf30034b | ||
|
|
dd72698508 | ||
|
|
f15093e8bd | ||
|
|
b663909fb6 |
@@ -1,3 +1,12 @@
|
|||||||
|
nanopb-0.2.2
|
||||||
|
Add support for extension fields (issue 17)
|
||||||
|
Fix unknown fields in empty message (issue 78)
|
||||||
|
Include the field tags in the generated .pb.h file.
|
||||||
|
Add pb_decode_delimited and pb_encode_delimited wrapper functions (issue 74)
|
||||||
|
Add a section in top of pb.h for changing compilation settings (issue 76)
|
||||||
|
Documentation improvements (issues 12, 77 and others)
|
||||||
|
Improved tests
|
||||||
|
|
||||||
nanopb-0.2.1
|
nanopb-0.2.1
|
||||||
NOTE: The default callback function signature has changed.
|
NOTE: The default callback function signature has changed.
|
||||||
If you don't want to update your code, define PB_OLD_CALLBACK_STYLE.
|
If you don't want to update your code, define PB_OLD_CALLBACK_STYLE.
|
||||||
|
|||||||
@@ -256,6 +256,50 @@ generates this field description array for the structure *Person_PhoneNumber*::
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Extension fields
|
||||||
|
================
|
||||||
|
Protocol Buffers supports a concept of `extension fields`_, which are
|
||||||
|
additional fields to a message, but defined outside the actual message.
|
||||||
|
The definition can even be in a completely separate .proto file.
|
||||||
|
|
||||||
|
The base message is declared as extensible by keyword *extensions* in
|
||||||
|
the .proto file::
|
||||||
|
|
||||||
|
message MyMessage {
|
||||||
|
.. fields ..
|
||||||
|
extensions 100 to 199;
|
||||||
|
}
|
||||||
|
|
||||||
|
For each extensible message, *nanopb_generator.py* declares an additional
|
||||||
|
callback field called *extensions*. The field and associated datatype
|
||||||
|
*pb_extension_t* forms a linked list of handlers. When an unknown field is
|
||||||
|
encountered, the decoder calls each handler in turn until either one of them
|
||||||
|
handles the field, or the list is exhausted.
|
||||||
|
|
||||||
|
The actual extensions are declared using the *extend* keyword in the .proto,
|
||||||
|
and are in the global namespace::
|
||||||
|
|
||||||
|
extend MyMessage {
|
||||||
|
optional int32 myextension = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
For each extension, *nanopb_generator.py* creates a constant of type
|
||||||
|
*pb_extension_type_t*. To link together the base message and the extension,
|
||||||
|
you have to:
|
||||||
|
|
||||||
|
1. Allocate storage for your field, matching the datatype in the .proto.
|
||||||
|
For example, for a *int32* field, you need a *int32_t* variable to store
|
||||||
|
the value.
|
||||||
|
2. Create a *pb_extension_t* constant, with pointers to your variable and
|
||||||
|
to the generated *pb_extension_type_t*.
|
||||||
|
3. Set the *message.extensions* pointer to point to the *pb_extension_t*.
|
||||||
|
|
||||||
|
An example of this is available in *tests/test_encode_extensions.c* and
|
||||||
|
*tests/test_decode_extensions.c*.
|
||||||
|
|
||||||
|
.. _`extension fields`: https://developers.google.com/protocol-buffers/docs/proto#extensions
|
||||||
|
|
||||||
|
|
||||||
Return values and error handling
|
Return values and error handling
|
||||||
================================
|
================================
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Features and limitations
|
|||||||
#) Allows specifying maximum size for strings and arrays, so that they can be allocated statically.
|
#) Allows specifying maximum size for strings and arrays, so that they can be allocated statically.
|
||||||
#) No malloc needed: everything can be allocated statically or on the stack.
|
#) No malloc needed: everything can be allocated statically or on the stack.
|
||||||
#) You can use either encoder or decoder alone to cut the code size in half.
|
#) You can use either encoder or decoder alone to cut the code size in half.
|
||||||
#) Support for most protobuf features, including: all data types, nested submessages, default values, repeated and optional fields, packed arrays.
|
#) Support for most protobuf features, including: all data types, nested submessages, default values, repeated and optional fields, packed arrays, extension fields.
|
||||||
#) Callback mechanism for handling messages larger than can fit in available RAM.
|
#) Callback mechanism for handling messages larger than can fit in available RAM.
|
||||||
#) Extensive set of tests.
|
#) Extensive set of tests.
|
||||||
|
|
||||||
@@ -103,6 +103,8 @@ Nanopb should compile with most ansi-C compatible compilers. It however requires
|
|||||||
|
|
||||||
If these header files do not come with your compiler, you should be able to find suitable replacements online. Mostly the requirements are very simple, just a few basic functions and typedefs.
|
If these header files do not come with your compiler, you should be able to find suitable replacements online. Mostly the requirements are very simple, just a few basic functions and typedefs.
|
||||||
|
|
||||||
|
Alternatively, you can define *PB_SYSTEM_HEADER*, which should be the name of a single header file including all the necessary definitions.
|
||||||
|
|
||||||
Debugging and testing
|
Debugging and testing
|
||||||
=====================
|
=====================
|
||||||
Extensive unittests are included under the *tests* folder. Just type *make* there to run the tests.
|
Extensive unittests are included under the *tests* folder. Just type *make* there to run the tests.
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ PB_BUFFER_ONLY Disables the support for custom streams. Only
|
|||||||
PB_OLD_CALLBACK_STYLE Use the old function signature (void\* instead
|
PB_OLD_CALLBACK_STYLE Use the old function signature (void\* instead
|
||||||
of void\*\*) for callback fields. This was the
|
of void\*\*) for callback fields. This was the
|
||||||
default until nanopb-0.2.1.
|
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
|
The PB_MAX_REQUIRED_FIELDS, PB_FIELD_16BIT and PB_FIELD_32BIT settings allow
|
||||||
@@ -56,7 +61,7 @@ raising some datatype limits to suit larger messages. Their need is recognized
|
|||||||
automatically by C-preprocessor #if-directives in the generated .pb.h files.
|
automatically by C-preprocessor #if-directives in the generated .pb.h files.
|
||||||
The default setting is to use the smallest datatypes (least resources used).
|
The default setting is to use the smallest datatypes (least resources used).
|
||||||
|
|
||||||
|
.. _`overview page`: index.html#compiler-requirements
|
||||||
|
|
||||||
|
|
||||||
Proto file options
|
Proto file options
|
||||||
@@ -299,6 +304,41 @@ Protocol Buffers wire types. These are used with `pb_encode_tag`_. ::
|
|||||||
PB_WT_32BIT = 5
|
PB_WT_32BIT = 5
|
||||||
} pb_wire_type_t;
|
} 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;
|
||||||
|
} 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*.
|
||||||
|
|
||||||
PB_GET_ERROR
|
PB_GET_ERROR
|
||||||
------------
|
------------
|
||||||
Get the current error message from a stream, or a placeholder string if
|
Get the current error message from a stream, or a placeholder string if
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
'''Generate header file for nanopb from a ProtoBuf FileDescriptorSet.'''
|
'''Generate header file for nanopb from a ProtoBuf FileDescriptorSet.'''
|
||||||
nanopb_version = "nanopb-0.2.2-dev"
|
nanopb_version = "nanopb-0.2.2"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import google.protobuf.descriptor_pb2 as descriptor
|
import google.protobuf.descriptor_pb2 as descriptor
|
||||||
|
|||||||
2
pb.h
2
pb.h
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
/* Version of the nanopb library. Just in case you want to check it in
|
/* Version of the nanopb library. Just in case you want to check it in
|
||||||
* your own program. */
|
* your own program. */
|
||||||
#define NANOPB_VERSION nanopb-0.2.2-dev
|
#define NANOPB_VERSION nanopb-0.2.2
|
||||||
|
|
||||||
/* Include all the system headers needed by nanopb. You will need the
|
/* Include all the system headers needed by nanopb. You will need the
|
||||||
* definitions of the following:
|
* definitions of the following:
|
||||||
|
|||||||
Reference in New Issue
Block a user