xref: /aosp_15_r20/external/grpc-grpc/src/ruby/ext/grpc/rb_byte_buffer.c (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include <ruby/ruby.h>
20 
21 #include "rb_byte_buffer.h"
22 
23 #include "rb_grpc.h"
24 #include "rb_grpc_imports.generated.h"
25 
26 #include <grpc/byte_buffer_reader.h>
27 #include <grpc/grpc.h>
28 #include <grpc/slice.h>
29 
grpc_rb_s_to_byte_buffer(char * string,size_t length)30 grpc_byte_buffer* grpc_rb_s_to_byte_buffer(char* string, size_t length) {
31   grpc_slice slice = grpc_slice_from_copied_buffer(string, length);
32   grpc_byte_buffer* buffer = grpc_raw_byte_buffer_create(&slice, 1);
33   grpc_slice_unref(slice);
34   return buffer;
35 }
36 
grpc_rb_byte_buffer_to_s(grpc_byte_buffer * buffer)37 VALUE grpc_rb_byte_buffer_to_s(grpc_byte_buffer* buffer) {
38   VALUE rb_string;
39   grpc_byte_buffer_reader reader;
40   grpc_slice next;
41   if (buffer == NULL) {
42     return Qnil;
43   }
44   rb_string = rb_str_buf_new(grpc_byte_buffer_length(buffer));
45   if (!grpc_byte_buffer_reader_init(&reader, buffer)) {
46     rb_raise(rb_eRuntimeError, "Error initializing byte buffer reader.");
47     return Qnil;
48   }
49   while (grpc_byte_buffer_reader_next(&reader, &next) != 0) {
50     rb_str_cat(rb_string, (const char*)GRPC_SLICE_START_PTR(next),
51                GRPC_SLICE_LENGTH(next));
52     grpc_slice_unref(next);
53   }
54   grpc_byte_buffer_reader_destroy(&reader);
55   return rb_string;
56 }
57 
grpc_rb_slice_to_ruby_string(grpc_slice slice)58 VALUE grpc_rb_slice_to_ruby_string(grpc_slice slice) {
59   if (GRPC_SLICE_START_PTR(slice) == NULL) {
60     rb_raise(rb_eRuntimeError,
61              "attempt to convert uninitialized grpc_slice to ruby string");
62   }
63   return rb_str_new((char*)GRPC_SLICE_START_PTR(slice),
64                     GRPC_SLICE_LENGTH(slice));
65 }
66