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