Home | History | Annotate | Download | only in grpc
      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