2012-07-17 07:00:18 +04:00
|
|
|
#ifndef PROTOBUF_H__
|
|
|
|
#define PROTOBUF_H__
|
|
|
|
|
|
|
|
#include "types.h"
|
|
|
|
#include "compiler.h"
|
|
|
|
#include "util.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* ATTENTION
|
|
|
|
*
|
|
|
|
* This typdefs represent "generic" prototypes for
|
|
|
|
* pack/unpack/getsize functions generated by PB
|
|
|
|
* engine, thus (!!!) if PB engine change arguments
|
|
|
|
* order or their number we may meet serious problems.
|
|
|
|
*
|
|
|
|
* FIXME
|
|
|
|
*
|
|
|
|
* Find a way to verify PB generated functions statemens
|
|
|
|
* to match this typedefs.
|
|
|
|
*/
|
|
|
|
|
2012-07-18 18:42:35 +04:00
|
|
|
typedef size_t (*pb_getpksize_t)(void *obj);
|
|
|
|
typedef size_t (*pb_pack_t)(void *obj, void *where);
|
|
|
|
typedef void *(*pb_unpack_t)(void *allocator, size_t size, void *from);
|
2012-07-18 19:09:51 +04:00
|
|
|
typedef void (*pb_free_t)(void *obj, void *allocator);
|
2012-07-17 07:00:18 +04:00
|
|
|
|
|
|
|
extern int pb_read_object_with_header(int fd, void **pobj,
|
2012-07-18 18:42:35 +04:00
|
|
|
pb_unpack_t unpack,
|
2012-07-17 07:00:18 +04:00
|
|
|
bool eof);
|
|
|
|
|
2012-07-18 18:57:33 +04:00
|
|
|
#define PB_UNPACK_TYPECHECK(__op, __fn) ({ if (0) *__op = __fn##__unpack(NULL, 0, NULL); (pb_unpack_t)&__fn##__unpack; })
|
|
|
|
#define PB_PACK_TYPECHECK(__o, __fn) ({ if (0) __fn##__pack(__o, NULL); (pb_pack_t)&__fn##__pack; })
|
|
|
|
#define PB_GPS_TYPECHECK(__o, __fn) ({ if (0) __fn##__get_packed_size(__o); (pb_getpksize_t)&__fn##__get_packed_size; })
|
2012-07-18 19:09:51 +04:00
|
|
|
#define PB_FREE_TYPECHECK(__o, __fn) ({ if (0) __fn##__free_unpacked(__o, NULL); (pb_free_t)&__fn##__free_unpacked; })
|
2012-07-17 08:36:29 +04:00
|
|
|
|
2012-07-17 07:00:18 +04:00
|
|
|
#define pb_read(__fd, __obj_pptr, __proto_message_name) \
|
|
|
|
pb_read_object_with_header(__fd, (void **)__obj_pptr, \
|
2012-07-18 18:57:33 +04:00
|
|
|
PB_UNPACK_TYPECHECK(__obj_pptr, __proto_message_name), false)
|
2012-07-17 07:00:18 +04:00
|
|
|
|
|
|
|
#define pb_read_eof(__fd, __obj_pptr, __proto_message_name) \
|
|
|
|
pb_read_object_with_header(__fd, (void **)__obj_pptr, \
|
2012-07-18 18:57:33 +04:00
|
|
|
PB_UNPACK_TYPECHECK(__obj_pptr, __proto_message_name), true)
|
2012-07-17 07:00:18 +04:00
|
|
|
|
|
|
|
extern int pb_write_object_with_header(int fd, void *obj,
|
2012-07-18 18:42:35 +04:00
|
|
|
pb_getpksize_t getpksize,
|
|
|
|
pb_pack_t pack);
|
2012-07-17 07:00:18 +04:00
|
|
|
|
|
|
|
#define pb_write(__fd, __obj, __proto_message_name) \
|
|
|
|
pb_write_object_with_header(__fd, __obj, \
|
2012-07-18 18:57:33 +04:00
|
|
|
PB_GPS_TYPECHECK(__obj, __proto_message_name), \
|
|
|
|
PB_PACK_TYPECHECK(__obj, __proto_message_name))
|
2012-07-17 07:00:18 +04:00
|
|
|
|
|
|
|
#define pb_pksize(__obj, __proto_message_name) \
|
|
|
|
(__proto_message_name ##__get_packed_size(__obj) + sizeof(u32))
|
|
|
|
|
|
|
|
#define pb_repeated_size(__obj, __member) \
|
|
|
|
(sizeof(*(__obj)->__member) * (__obj)->n_ ##__member)
|
|
|
|
|
2012-07-18 19:09:51 +04:00
|
|
|
#include <google/protobuf-c/protobuf-c.h>
|
|
|
|
|
|
|
|
extern void do_pb_show_plain(int fd, const ProtobufCMessageDescriptor *d,
|
2012-07-25 18:32:41 +04:00
|
|
|
pb_unpack_t unpack, pb_free_t free, int single_entry,
|
2012-07-26 12:43:00 +04:00
|
|
|
void (*payload_hadler)(int fd, void *obj, int flags),
|
|
|
|
int flags);
|
2012-07-18 19:09:51 +04:00
|
|
|
|
|
|
|
/* Don't have objects at hands to also do typechecking here */
|
2012-07-26 12:43:00 +04:00
|
|
|
#define pb_show_plain_payload(__fd, __proto_message_name, payload_hadler, flags) \
|
2012-07-18 19:09:51 +04:00
|
|
|
do_pb_show_plain(__fd, &__proto_message_name##__descriptor, \
|
|
|
|
(pb_unpack_t)__proto_message_name##__unpack, \
|
2012-07-25 18:32:41 +04:00
|
|
|
(pb_free_t)__proto_message_name##__free_unpacked, \
|
2012-07-26 12:43:00 +04:00
|
|
|
0, payload_hadler, flags)
|
2012-07-25 18:32:41 +04:00
|
|
|
|
|
|
|
#define pb_show_plain(__fd, __proto_message_name) \
|
2012-07-26 12:43:00 +04:00
|
|
|
pb_show_plain_payload(__fd, __proto_message_name, NULL, 0)
|
2012-07-25 18:28:14 +04:00
|
|
|
|
|
|
|
#define pb_show_vertical(__fd, __proto_message_name) \
|
|
|
|
do_pb_show_plain(__fd, &__proto_message_name##__descriptor, \
|
|
|
|
(pb_unpack_t)__proto_message_name##__unpack, \
|
2012-07-25 18:32:41 +04:00
|
|
|
(pb_free_t)__proto_message_name##__free_unpacked, \
|
2012-07-26 12:43:00 +04:00
|
|
|
1, NULL, 0)
|
2012-07-18 13:04:00 +04:00
|
|
|
|
2012-07-17 07:00:18 +04:00
|
|
|
#endif /* PROTOBUF_H__ */
|