diff options
Diffstat (limited to 'pb_encode.h')
-rw-r--r-- | pb_encode.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/pb_encode.h b/pb_encode.h new file mode 100644 index 00000000..95f3483a --- /dev/null +++ b/pb_encode.h @@ -0,0 +1,69 @@ +#ifndef _PB_ENCODE_H_ +#define _PB_ENCODE_H_ + +/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c. + * The main function is pb_encode. You also need an output stream, structures + * and their field descriptions (just like with pb_decode). + */ + +#include <stdbool.h> +#include "pb.h" + +/* Lightweight output stream. + * You can provide callback for writing or use pb_ostream_from_buffer. + * + * Alternatively, callback can be NULL in which case the stream will just + * count the number of bytes that would have been written. In this case + * max_size is not checked. + * + * Rules for callback: + * 1) Return false on IO errors. This will cause decoding to abort. + * + * 2) You can use state to store your own data (e.g. buffer pointer). + * + * 3) pb_write will update bytes_written before your callback runs. + * + * 4) Your callback will be always used with the same pb_ostream_t. + * There are no substreams when encoding. + */ +struct _pb_ostream_t +{ + bool (*callback)(pb_ostream_t *stream, const uint8_t *buf, size_t count); + void *state; /* Free field for use by callback implementation */ + size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ + size_t bytes_written; +}; + +pb_ostream_t pb_ostream_from_buffer(uint8_t *buf, size_t bufsize); +bool pb_write(pb_ostream_t *stream, const uint8_t *buf, size_t count); + +/* Encode struct to given output stream. + * Returns true on success, false on any failure. + * The actual struct pointed to by src_struct must match the description in fields. + * All required fields in the struct are assumed to have been filled in. + */ +bool pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +/* --- Helper functions --- + * You may want to use these from your caller or callbacks. + */ + +bool pb_encode_varint(pb_ostream_t *stream, uint64_t value); +bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, int field_number); +bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field); +bool pb_encode_string(pb_ostream_t *stream, uint8_t *buffer, size_t size); + +/* --- Field encoders --- + * Each encoder writes the content for the field. + * The tag/wire type has been written already. + */ + +bool pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +bool pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +bool pb_enc_fixed(pb_ostream_t *stream, const pb_field_t *field, const void *src); + +bool pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src); +bool pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src); +bool pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src); + +#endif
\ No newline at end of file |