34 #ifndef GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H
35 #define GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H
37 #include <type_traits>
53 class GrpcBufferWriterPeer;
60 : block_size_(block_size), byte_count_(0), have_backup_(false) {
62 slice_buffer_ = &(*bp)->data.raw.slice_buffer;
71 bool Next(
void** data,
int* size)
override {
73 slice_ = backup_slice_;
88 if (count == block_size_) {
89 backup_slice_ = slice_;
99 have_backup_ = backup_slice_.
refcount != NULL;
100 byte_count_ -= count;
109 const int block_size_;
124 "Couldn't initialize byte buffer reader");
131 bool Next(
const void** data,
int* size)
override {
159 bool Skip(
int count)
override {
162 while (
Next(&data, &size)) {
186 template <
class BufferWriter,
class T>
190 std::is_base_of<protobuf::io::ZeroCopyOutputStream, BufferWriter>::value,
191 "BufferWriter must be a subclass of io::ZeroCopyOutputStream");
193 int byte_size = msg.ByteSize();
204 return msg.SerializeToZeroCopyStream(&writer)
210 template <
class BufferReader,
class T>
214 std::is_base_of<protobuf::io::ZeroCopyInputStream, BufferReader>::value,
215 "BufferReader must be a subclass of io::ZeroCopyInputStream");
216 if (buffer ==
nullptr) {
221 BufferReader reader(buffer);
222 if (!reader.status().ok()) {
223 return reader.status();
226 decoder.SetTotalBytesLimit(INT_MAX, INT_MAX);
227 if (!msg->ParseFromCodedStream(&decoder)) {
230 if (!decoder.ConsumedEntireMessage()) {
242 #ifdef GRPC_OPEN_SOURCE_PROTO
247 class SerializationTraits<T, typename std::enable_if<std::is_base_of<
248 grpc::protobuf::Message, T>::value>::type> {
252 return internal::GenericSerialize<internal::GrpcBufferWriter, T>(
253 msg, bp, own_buffer);
258 return internal::GenericDeserialize<internal::GrpcBufferReader, T>(buffer,
266 #endif // GRPCXX_IMPL_CODEGEN_PROTO_UTILS_H
Status GenericDeserialize(grpc_byte_buffer *buffer, grpc::protobuf::Message *msg)
Definition: proto_utils.h:211
virtual void grpc_slice_buffer_pop(grpc_slice_buffer *sb)=0
virtual grpc_slice grpc_slice_malloc(size_t length)=0
grpc_slice_buffer * SliceBuffer()
Definition: proto_utils.h:105
Definition: proto_utils.h:117
~GrpcBufferWriter() override
Definition: proto_utils.h:65
virtual void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader *reader)=0
Status status_
Definition: proto_utils.h:183
grpc::protobuf::int64 ByteCount() const override
Definition: proto_utils.h:174
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:137
const int kGrpcBufferWriterMaxBufferLength
Definition: proto_utils.h:55
Status GenericSerialize(const grpc::protobuf::Message &msg, grpc_byte_buffer **bp, bool *own_buffer)
Definition: proto_utils.h:187
A grpc_slice s, if initialized, represents the byte range s.bytes[0..s.length-1]. ...
Definition: slice.h:91
~GrpcBufferReader() override
Definition: proto_utils.h:127
int64_t byte_count_
Definition: proto_utils.h:179
bool Next(const void **data, int *size) override
Definition: proto_utils.h:131
Definition: grpc_types.h:56
#define GRPC_SLICE_START_PTR(slice)
Definition: slice.h:127
bool Skip(int count) override
Definition: proto_utils.h:159
Represents an expandable array of slices, to be interpreted as a single item.
Definition: slice.h:109
#define GRPC_SLICE_END_PTR(slice)
Definition: slice.h:136
void BackUp(int count) override
Definition: proto_utils.h:157
virtual void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)=0
::google::protobuf::io::ZeroCopyInputStream ZeroCopyInputStream
Definition: config_protobuf.h:103
struct grpc_slice_refcount * refcount
Definition: slice.h:92
void BackUp(int count) override
Definition: proto_utils.h:86
grpc_slice slice_
Definition: proto_utils.h:182
CoreCodegenInterface * g_core_codegen_interface
Definition: call.h:64
virtual grpc_byte_buffer * grpc_raw_byte_buffer_create(grpc_slice *slice, size_t nslices)=0
GrpcBufferWriter(grpc_byte_buffer **bp, int block_size)
Definition: proto_utils.h:59
Definition: proto_utils.h:57
friend class GrpcBufferWriterPeer
Definition: proto_utils.h:108
::google::protobuf::int64 int64
Definition: config_protobuf.h:88
virtual grpc_slice grpc_slice_split_tail(grpc_slice *s, size_t split)=0
grpc::protobuf::int64 ByteCount() const override
Definition: proto_utils.h:103
virtual void grpc_slice_unref(grpc_slice slice)=0
bool Next(void **data, int *size) override
Definition: proto_utils.h:71
virtual void grpc_slice_buffer_add(grpc_slice_buffer *sb, grpc_slice slice)=0
bool ok() const
Is the status OK?
Definition: status.h:76
Did it work? If it didn't, why?
Definition: status.h:45
int64_t backup_count_
Definition: proto_utils.h:180
virtual const Status & ok()=0
virtual int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader *reader, grpc_slice *slice)=0
::google::protobuf::io::ZeroCopyOutputStream ZeroCopyOutputStream
Definition: config_protobuf.h:102
#define GRPC_SLICE_LENGTH(slice)
Definition: slice.h:130
GrpcBufferReader(grpc_byte_buffer *buffer)
Definition: proto_utils.h:119
Definition: byte_buffer_reader.h:43
virtual int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader *reader, grpc_byte_buffer *buffer) GRPC_MUST_USE_RESULT=0
Internal errors.
Definition: status_code_enum.h:134
grpc_byte_buffer_reader reader_
Definition: proto_utils.h:181
Status status() const
Definition: proto_utils.h:155
::google::protobuf::Message Message
Definition: config_protobuf.h:87
::google::protobuf::io::CodedInputStream CodedInputStream
Definition: config_protobuf.h:104