1
0

grpcdef.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef HV_GRPC_DEF_H_
  2. #define HV_GRPC_DEF_H_
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. // Length-Prefixed-Message
  7. // flags:1byte + length:4bytes = 5bytes
  8. #define GRPC_MESSAGE_HDLEN 5
  9. typedef struct {
  10. unsigned char flags;
  11. unsigned int length;
  12. } grpc_message_hd;
  13. typedef struct {
  14. unsigned char flags;
  15. unsigned int length;
  16. unsigned char* message;
  17. } grpc_message;
  18. static inline void grpc_message_hd_pack(const grpc_message_hd* hd, unsigned char* buf) {
  19. unsigned char* p = buf;
  20. // flags
  21. *p++ = hd->flags;
  22. // hton length
  23. unsigned int length = hd->length;
  24. *p++ = (length >> 24) & 0xFF;
  25. *p++ = (length >> 16) & 0xFF;
  26. *p++ = (length >> 8) & 0xFF;
  27. *p++ = length & 0xFF;
  28. }
  29. static inline void grpc_message_hd_unpack(grpc_message_hd* hd, const unsigned char* buf) {
  30. const unsigned char* p = buf;
  31. // flags
  32. hd->flags = *p++;
  33. // ntoh length
  34. hd->length = ((unsigned int)*p++) << 24;
  35. hd->length |= ((unsigned int)*p++) << 16;
  36. hd->length |= ((unsigned int)*p++) << 8;
  37. hd->length |= *p++;
  38. }
  39. // protobuf
  40. // tag = field_num << 3 | wire_type
  41. // varint(tag) [+ varint(length_delimited)] + value;
  42. typedef enum {
  43. WIRE_TYPE_VARINT = 0,
  44. WIRE_TYPE_FIXED64 = 1,
  45. WIRE_TYPE_LENGTH_DELIMITED = 2,
  46. WIRE_TYPE_START_GROUP = 3,
  47. WIRE_TYPE_END_GROUP = 4,
  48. WIRE_TYPE_FIXED32 = 5,
  49. } wire_type;
  50. typedef enum {
  51. FIELD_TYPE_DOUBLE = 1,
  52. FIELD_TYPE_FLOAT = 2,
  53. FIELD_TYPE_INT64 = 3,
  54. FIELD_TYPE_UINT64 = 4,
  55. FIELD_TYPE_INT32 = 5,
  56. FIELD_TYPE_FIXED64 = 6,
  57. FIELD_TYPE_FIXED32 = 7,
  58. FIELD_TYPE_BOOL = 8,
  59. FIELD_TYPE_STRING = 9,
  60. FIELD_TYPE_GROUP = 10,
  61. FIELD_TYPE_MESSAGE = 11,
  62. FIELD_TYPE_BYTES = 12,
  63. FIELD_TYPE_UINT32 = 13,
  64. FIELD_TYPE_ENUM = 14,
  65. FIELD_TYPE_SFIXED32 = 15,
  66. FIELD_TYPE_SFIXED64 = 16,
  67. FIELD_TYPE_SINT32 = 17,
  68. FIELD_TYPE_SINT64 = 18,
  69. MAX_FIELD_TYPE = 18,
  70. } field_type;
  71. #define PROTOBUF_MAKE_TAG(field_number, wire_type) ((field_number) << 3 | (wire_type))
  72. #define PROTOBUF_FILED_NUMBER(tag) ((tag) >> 3)
  73. #define PROTOBUF_WIRE_TYPE(tag) ((tag) & 0x07)
  74. #ifdef __cplusplus
  75. }
  76. #endif
  77. #endif // HV_GRPC_DEF_H_