123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #ifndef FLATBUFFERS_GRPC_H_
- #define FLATBUFFERS_GRPC_H_
- #include "grpc++/support/byte_buffer.h"
- #include "grpc/byte_buffer_reader.h"
- namespace grpc {
- template <class T>
- class SerializationTraits<T, typename std::enable_if<std::is_base_of<
- flatbuffers::BufferRefBase, T>::value>::type> {
- public:
-
-
- static grpc::Status Serialize(const T& msg,
- grpc_byte_buffer **buffer,
- bool *own_buffer) {
-
- auto slice = gpr_slice_from_copied_buffer(
- reinterpret_cast<const char *>(msg.buf), msg.len);
- *buffer = grpc_raw_byte_buffer_create(&slice, 1);
- *own_buffer = true;
- return grpc::Status();
- }
-
-
- static grpc::Status Deserialize(grpc_byte_buffer *buffer,
- T *msg,
- int max_message_size) {
-
- auto len = grpc_byte_buffer_length(buffer);
- msg->buf = reinterpret_cast<uint8_t *>(malloc(len));
- msg->len = static_cast<flatbuffers::uoffset_t>(len);
- msg->must_free = true;
- uint8_t *current = msg->buf;
- grpc_byte_buffer_reader reader;
- grpc_byte_buffer_reader_init(&reader, buffer);
- gpr_slice slice;
- while (grpc_byte_buffer_reader_next(&reader, &slice)) {
- memcpy(current, GPR_SLICE_START_PTR(slice), GPR_SLICE_LENGTH(slice));
- current += GPR_SLICE_LENGTH(slice);
- gpr_slice_unref(slice);
- }
- GPR_ASSERT(current == msg->buf + msg->len);
- grpc_byte_buffer_reader_destroy(&reader);
- grpc_byte_buffer_destroy(buffer);
- return grpc::Status();
- }
- };
- }
- #endif
|