diff options
Diffstat (limited to 'grpc/src/cpp/util/byte_buffer_cc.cc')
-rw-r--r-- | grpc/src/cpp/util/byte_buffer_cc.cc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/grpc/src/cpp/util/byte_buffer_cc.cc b/grpc/src/cpp/util/byte_buffer_cc.cc index fb705906..5c6f22bd 100644 --- a/grpc/src/cpp/util/byte_buffer_cc.cc +++ b/grpc/src/cpp/util/byte_buffer_cc.cc @@ -25,6 +25,37 @@ namespace grpc { static internal::GrpcLibraryInitializer g_gli_initializer; +Status ByteBuffer::TrySingleSlice(Slice* slice) const { + if (!buffer_) { + return Status(StatusCode::FAILED_PRECONDITION, "Buffer not initialized"); + } + if ((buffer_->type == GRPC_BB_RAW) && + (buffer_->data.raw.compression == GRPC_COMPRESS_NONE) && + (buffer_->data.raw.slice_buffer.count == 1)) { + grpc_slice internal_slice = buffer_->data.raw.slice_buffer.slices[0]; + *slice = Slice(internal_slice, Slice::ADD_REF); + return Status::OK; + } else { + return Status(StatusCode::FAILED_PRECONDITION, + "Buffer isn't made up of a single uncompressed slice."); + } +} + +Status ByteBuffer::DumpToSingleSlice(Slice* slice) const { + if (!buffer_) { + return Status(StatusCode::FAILED_PRECONDITION, "Buffer not initialized"); + } + grpc_byte_buffer_reader reader; + if (!grpc_byte_buffer_reader_init(&reader, buffer_)) { + return Status(StatusCode::INTERNAL, + "Couldn't initialize byte buffer reader"); + } + grpc_slice s = grpc_byte_buffer_reader_readall(&reader); + *slice = Slice(s, Slice::STEAL_REF); + grpc_byte_buffer_reader_destroy(&reader); + return Status::OK; +} + Status ByteBuffer::Dump(std::vector<Slice>* slices) const { slices->clear(); if (!buffer_) { |