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 #include "rb_grpc_imports.generated.h"
23
24 #include <grpc/byte_buffer_reader.h>
25 #include <grpc/grpc.h>
26 #include <grpc/slice.h>
27 #include "rb_grpc.h"
28
grpc_rb_s_to_byte_buffer(char * string,size_t length)29 grpc_byte_buffer* grpc_rb_s_to_byte_buffer(char* string, size_t length) {
30 grpc_slice slice = grpc_slice_from_copied_buffer(string, length);
31 grpc_byte_buffer* buffer = grpc_raw_byte_buffer_create(&slice, 1);
32 grpc_slice_unref(slice);
33 return buffer;
34 }
35
grpc_rb_byte_buffer_to_s(grpc_byte_buffer * buffer)36 VALUE grpc_rb_byte_buffer_to_s(grpc_byte_buffer* buffer) {
37 VALUE rb_string;
38 grpc_byte_buffer_reader reader;
39 grpc_slice next;
40 if (buffer == NULL) {
41 return Qnil;
42 }
43 rb_string = rb_str_buf_new(grpc_byte_buffer_length(buffer));
44 if (!grpc_byte_buffer_reader_init(&reader, buffer)) {
45 rb_raise(rb_eRuntimeError, "Error initializing byte buffer reader.");
46 return Qnil;
47 }
48 while (grpc_byte_buffer_reader_next(&reader, &next) != 0) {
49 rb_str_cat(rb_string, (const char*)GRPC_SLICE_START_PTR(next),
50 GRPC_SLICE_LENGTH(next));
51 grpc_slice_unref(next);
52 }
53 grpc_byte_buffer_reader_destroy(&reader);
54 return rb_string;
55 }
56
grpc_rb_slice_to_ruby_string(grpc_slice slice)57 VALUE grpc_rb_slice_to_ruby_string(grpc_slice slice) {
58 if (GRPC_SLICE_START_PTR(slice) == NULL) {
59 rb_raise(rb_eRuntimeError,
60 "attempt to convert uninitialized grpc_slice to ruby string");
61 }
62 return rb_str_new((char*)GRPC_SLICE_START_PTR(slice),
63 GRPC_SLICE_LENGTH(slice));
64 }
65