emsApplication/3rdPartner/libhv/http/grpcdef.h

90 lines
2.4 KiB
C

#ifndef HV_GRPC_DEF_H_
#define HV_GRPC_DEF_H_
#ifdef __cplusplus
extern "C" {
#endif
// Length-Prefixed-Message
// flags:1byte + length:4bytes = 5bytes
#define GRPC_MESSAGE_HDLEN 5
typedef struct {
unsigned char flags;
unsigned int length;
} grpc_message_hd;
typedef struct {
unsigned char flags;
unsigned int length;
unsigned char* message;
} grpc_message;
static inline void grpc_message_hd_pack(const grpc_message_hd* hd, unsigned char* buf) {
unsigned char* p = buf;
// flags
*p++ = hd->flags;
// hton length
unsigned int length = hd->length;
*p++ = (length >> 24) & 0xFF;
*p++ = (length >> 16) & 0xFF;
*p++ = (length >> 8) & 0xFF;
*p++ = length & 0xFF;
}
static inline void grpc_message_hd_unpack(grpc_message_hd* hd, const unsigned char* buf) {
const unsigned char* p = buf;
// flags
hd->flags = *p++;
// ntoh length
hd->length = ((unsigned int)*p++) << 24;
hd->length |= ((unsigned int)*p++) << 16;
hd->length |= ((unsigned int)*p++) << 8;
hd->length |= *p++;
}
// protobuf
// tag = field_num << 3 | wire_type
// varint(tag) [+ varint(length_delimited)] + value;
typedef enum {
WIRE_TYPE_VARINT = 0,
WIRE_TYPE_FIXED64 = 1,
WIRE_TYPE_LENGTH_DELIMITED = 2,
WIRE_TYPE_START_GROUP = 3,
WIRE_TYPE_END_GROUP = 4,
WIRE_TYPE_FIXED32 = 5,
} wire_type;
typedef enum {
FIELD_TYPE_DOUBLE = 1,
FIELD_TYPE_FLOAT = 2,
FIELD_TYPE_INT64 = 3,
FIELD_TYPE_UINT64 = 4,
FIELD_TYPE_INT32 = 5,
FIELD_TYPE_FIXED64 = 6,
FIELD_TYPE_FIXED32 = 7,
FIELD_TYPE_BOOL = 8,
FIELD_TYPE_STRING = 9,
FIELD_TYPE_GROUP = 10,
FIELD_TYPE_MESSAGE = 11,
FIELD_TYPE_BYTES = 12,
FIELD_TYPE_UINT32 = 13,
FIELD_TYPE_ENUM = 14,
FIELD_TYPE_SFIXED32 = 15,
FIELD_TYPE_SFIXED64 = 16,
FIELD_TYPE_SINT32 = 17,
FIELD_TYPE_SINT64 = 18,
MAX_FIELD_TYPE = 18,
} field_type;
#define PROTOBUF_MAKE_TAG(field_number, wire_type) ((field_number) << 3 | (wire_type))
#define PROTOBUF_FILED_NUMBER(tag) ((tag) >> 3)
#define PROTOBUF_WIRE_TYPE(tag) ((tag) & 0x07)
#ifdef __cplusplus
}
#endif
#endif // HV_GRPC_DEF_H_