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 <php.h> 20 21 // The include file must place here under <php.h> for fixing compile error. 22 // See: https://github.com/grpc/grpc/pull/12360#issuecomment-326484589 23 #include "byte_buffer.h" 24 25 #include <grpc/byte_buffer_reader.h> 26 27 grpc_byte_buffer *string_to_byte_buffer(char *string, size_t length) { 28 grpc_slice slice = grpc_slice_from_copied_buffer(string, length); 29 grpc_byte_buffer *buffer = grpc_raw_byte_buffer_create(&slice, 1); 30 grpc_slice_unref(slice); 31 return buffer; 32 } 33 34 void byte_buffer_to_string(grpc_byte_buffer *buffer, char **out_string, 35 size_t *out_length) { 36 grpc_byte_buffer_reader reader; 37 if (buffer == NULL || !grpc_byte_buffer_reader_init(&reader, buffer)) { 38 /* TODO(dgq): distinguish between the error cases. */ 39 *out_string = NULL; 40 *out_length = 0; 41 return; 42 } 43 44 grpc_slice slice = grpc_byte_buffer_reader_readall(&reader); 45 size_t length = GRPC_SLICE_LENGTH(slice); 46 char *string = ecalloc(length + 1, sizeof(char)); 47 memcpy(string, GRPC_SLICE_START_PTR(slice), length); 48 grpc_slice_unref(slice); 49 50 *out_string = string; 51 *out_length = length; 52 } 53