summaryrefslogtreecommitdiff
path: root/grpc/src/cpp/util/byte_buffer_cc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/cpp/util/byte_buffer_cc.cc')
-rw-r--r--grpc/src/cpp/util/byte_buffer_cc.cc31
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_) {