blob: 34f8b928ddf3d2854808a12f9ab9b8b7b5c6b5eb [file] [log] [blame]
Jan Tattermuscha7fff862015-02-13 11:08:08 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
Jan Tattermuscha7fff862015-02-13 11:08:08 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Craig Tiller9533d042016-03-25 17:11:06 -070034#include "src/core/lib/support/string.h"
Jan Tattermusch2f2afd22015-02-18 15:47:41 -080035
David Garcia Quintas30bd4eb2015-06-01 21:08:59 -070036#include <grpc/byte_buffer_reader.h>
Jan Tattermusch53398142015-02-24 08:21:57 -080037#include <grpc/grpc.h>
Jan Tattermusch15329232015-03-02 15:32:47 -080038#include <grpc/grpc_security.h>
Craig Tiller5b1c5f22017-04-19 09:52:18 -070039#include <grpc/slice.h>
40#include <grpc/support/alloc.h>
41#include <grpc/support/log.h>
42#include <grpc/support/port_platform.h>
43#include <grpc/support/string_util.h>
44#include <grpc/support/thd.h>
Jan Tattermusch94c36532015-01-21 10:36:12 -080045
46#include <string.h>
47
Yuchen Zeng12dfdc32016-04-26 22:05:41 -070048#ifdef GPR_WINDOWS
Jan Tattermusch35e42802015-02-12 10:09:05 -080049#define GPR_EXPORT __declspec(dllexport)
50#define GPR_CALLTYPE __stdcall
51#endif
52
53#ifndef GPR_EXPORT
54#define GPR_EXPORT
55#endif
56
57#ifndef GPR_CALLTYPE
58#define GPR_CALLTYPE
59#endif
60
Jan Tattermusch94c36532015-01-21 10:36:12 -080061grpc_byte_buffer *string_to_byte_buffer(const char *buffer, size_t len) {
Craig Tillerd41a4a72016-10-26 16:16:06 -070062 grpc_slice slice = grpc_slice_from_copied_buffer(buffer, len);
David Garcia Quintas59f905d2015-06-08 16:31:19 -070063 grpc_byte_buffer *bb = grpc_raw_byte_buffer_create(&slice, 1);
Craig Tillerd41a4a72016-10-26 16:16:06 -070064 grpc_slice_unref(slice);
Jan Tattermusch94c36532015-01-21 10:36:12 -080065 return bb;
66}
67
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080068/*
69 * Helper to maintain lifetime of batch op inputs and store batch op outputs.
70 */
Jan Tattermusch5bd75d72015-09-08 10:55:20 -070071typedef struct grpcsharp_batch_context {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080072 grpc_metadata_array send_initial_metadata;
73 grpc_byte_buffer *send_message;
74 struct {
75 grpc_metadata_array trailing_metadata;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080076 } send_status_from_server;
77 grpc_metadata_array recv_initial_metadata;
78 grpc_byte_buffer *recv_message;
79 struct {
80 grpc_metadata_array trailing_metadata;
81 grpc_status_code status;
Craig Tiller7c70b6c2017-01-23 07:48:42 -080082 grpc_slice status_details;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080083 } recv_status_on_client;
84 int recv_close_on_server_cancelled;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080085} grpcsharp_batch_context;
86
Craig Tiller5b1c5f22017-04-19 09:52:18 -070087GPR_EXPORT grpcsharp_batch_context *GPR_CALLTYPE
88grpcsharp_batch_context_create() {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080089 grpcsharp_batch_context *ctx = gpr_malloc(sizeof(grpcsharp_batch_context));
90 memset(ctx, 0, sizeof(grpcsharp_batch_context));
91 return ctx;
92}
93
Jan Tattermusch6e901712016-10-21 00:42:37 +020094typedef struct {
95 grpc_call *call;
96 grpc_call_details call_details;
97 grpc_metadata_array request_metadata;
98} grpcsharp_request_call_context;
99
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700100GPR_EXPORT grpcsharp_request_call_context *GPR_CALLTYPE
101grpcsharp_request_call_context_create() {
102 grpcsharp_request_call_context *ctx =
103 gpr_malloc(sizeof(grpcsharp_request_call_context));
Jan Tattermusch6e901712016-10-21 00:42:37 +0200104 memset(ctx, 0, sizeof(grpcsharp_request_call_context));
105 return ctx;
106}
107
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700108/*
109 * Destroys array->metadata.
110 * The array pointer itself is not freed.
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800111 */
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700112void grpcsharp_metadata_array_destroy_metadata_only(
113 grpc_metadata_array *array) {
114 gpr_free(array->metadata);
115}
116
117/*
118 * Destroys keys, values and array->metadata.
119 * The array pointer itself is not freed.
120 */
121void grpcsharp_metadata_array_destroy_metadata_including_entries(
122 grpc_metadata_array *array) {
123 size_t i;
124 if (array->metadata) {
125 for (i = 0; i < array->count; i++) {
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800126 grpc_slice_unref(array->metadata[i].key);
127 grpc_slice_unref(array->metadata[i].value);
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700128 }
129 }
130 gpr_free(array->metadata);
131}
132
133/*
134 * Fully destroys the metadata array.
135 */
136GPR_EXPORT void GPR_CALLTYPE
137grpcsharp_metadata_array_destroy_full(grpc_metadata_array *array) {
138 if (!array) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800139 return;
140 }
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700141 grpcsharp_metadata_array_destroy_metadata_including_entries(array);
142 gpr_free(array);
143}
144
145/*
146 * Creates an empty metadata array with given capacity.
147 * Array can later be destroyed by grpc_metadata_array_destroy_full.
148 */
149GPR_EXPORT grpc_metadata_array *GPR_CALLTYPE
150grpcsharp_metadata_array_create(size_t capacity) {
151 grpc_metadata_array *array =
152 (grpc_metadata_array *)gpr_malloc(sizeof(grpc_metadata_array));
153 grpc_metadata_array_init(array);
154 array->capacity = capacity;
155 array->count = 0;
156 if (capacity > 0) {
157 array->metadata =
158 (grpc_metadata *)gpr_malloc(sizeof(grpc_metadata) * capacity);
159 memset(array->metadata, 0, sizeof(grpc_metadata) * capacity);
160 } else {
161 array->metadata = NULL;
162 }
163 return array;
164}
165
166GPR_EXPORT void GPR_CALLTYPE
167grpcsharp_metadata_array_add(grpc_metadata_array *array, const char *key,
168 const char *value, size_t value_length) {
169 size_t i = array->count;
170 GPR_ASSERT(array->count < array->capacity);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800171 array->metadata[i].key = grpc_slice_from_copied_string(key);
172 array->metadata[i].value = grpc_slice_from_copied_buffer(value, value_length);
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700173 array->count++;
174}
175
Craig Tiller7536af02015-12-22 13:49:30 -0800176GPR_EXPORT intptr_t GPR_CALLTYPE
Jan Tattermuschec50f282015-07-20 19:44:29 -0700177grpcsharp_metadata_array_count(grpc_metadata_array *array) {
Craig Tiller7536af02015-12-22 13:49:30 -0800178 return (intptr_t)array->count;
Jan Tattermuschec50f282015-07-20 19:44:29 -0700179}
180
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700181GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_metadata_array_get_key(
182 grpc_metadata_array *array, size_t index, size_t *key_length) {
Jan Tattermuschec50f282015-07-20 19:44:29 -0700183 GPR_ASSERT(index < array->count);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800184 *key_length = GRPC_SLICE_LENGTH(array->metadata[index].key);
185 return (char *)GRPC_SLICE_START_PTR(array->metadata[index].key);
Jan Tattermusch77172022015-07-21 18:28:16 -0700186}
187
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700188GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_metadata_array_get_value(
189 grpc_metadata_array *array, size_t index, size_t *value_length) {
Jan Tattermusch77172022015-07-21 18:28:16 -0700190 GPR_ASSERT(index < array->count);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800191 *value_length = GRPC_SLICE_LENGTH(array->metadata[index].value);
192 return (char *)GRPC_SLICE_START_PTR(array->metadata[index].value);
Jan Tattermuschec50f282015-07-20 19:44:29 -0700193}
194
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700195/* Move contents of metadata array */
196void grpcsharp_metadata_array_move(grpc_metadata_array *dest,
197 grpc_metadata_array *src) {
198 if (!src) {
199 dest->capacity = 0;
200 dest->count = 0;
201 dest->metadata = NULL;
202 return;
203 }
204
205 dest->capacity = src->capacity;
206 dest->count = src->count;
207 dest->metadata = src->metadata;
208
209 src->capacity = 0;
210 src->count = 0;
211 src->metadata = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800212}
213
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700214GPR_EXPORT void GPR_CALLTYPE
215grpcsharp_batch_context_destroy(grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800216 if (!ctx) {
217 return;
218 }
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700219 grpcsharp_metadata_array_destroy_metadata_including_entries(
220 &(ctx->send_initial_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800221
222 grpc_byte_buffer_destroy(ctx->send_message);
223
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700224 grpcsharp_metadata_array_destroy_metadata_including_entries(
Jan Tattermuschfa216732015-02-18 11:06:44 -0800225 &(ctx->send_status_from_server.trailing_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800226
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700227 grpcsharp_metadata_array_destroy_metadata_only(&(ctx->recv_initial_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800228
229 grpc_byte_buffer_destroy(ctx->recv_message);
230
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700231 grpcsharp_metadata_array_destroy_metadata_only(
232 &(ctx->recv_status_on_client.trailing_metadata));
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800233 grpc_slice_unref(ctx->recv_status_on_client.status_details);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800234
Jan Tattermusch6e901712016-10-21 00:42:37 +0200235 gpr_free(ctx);
236}
237
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700238GPR_EXPORT void GPR_CALLTYPE
239grpcsharp_request_call_context_destroy(grpcsharp_request_call_context *ctx) {
Jan Tattermusch6e901712016-10-21 00:42:37 +0200240 if (!ctx) {
241 return;
242 }
Jan Tattermuschfa216732015-02-18 11:06:44 -0800243 /* NOTE: ctx->server_rpc_new.call is not destroyed because callback handler is
244 supposed
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800245 to take its ownership. */
246
Jan Tattermusch6e901712016-10-21 00:42:37 +0200247 grpc_call_details_destroy(&(ctx->call_details));
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700248 grpcsharp_metadata_array_destroy_metadata_only(&(ctx->request_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800249
250 gpr_free(ctx);
251}
252
Jan Tattermuschec50f282015-07-20 19:44:29 -0700253GPR_EXPORT const grpc_metadata_array *GPR_CALLTYPE
Jan Tattermusch77415b62015-07-20 20:18:26 -0700254grpcsharp_batch_context_recv_initial_metadata(
Jan Tattermuschec50f282015-07-20 19:44:29 -0700255 const grpcsharp_batch_context *ctx) {
256 return &(ctx->recv_initial_metadata);
257}
258
Craig Tiller7536af02015-12-22 13:49:30 -0800259GPR_EXPORT intptr_t GPR_CALLTYPE grpcsharp_batch_context_recv_message_length(
Jan Tattermuschfa216732015-02-18 11:06:44 -0800260 const grpcsharp_batch_context *ctx) {
Jan Tattermusch0d896ef2016-06-21 18:17:27 -0700261 grpc_byte_buffer_reader reader;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800262 if (!ctx->recv_message) {
Jan Tattermuschfa216732015-02-18 11:06:44 -0800263 return -1;
264 }
Alexander Polcyn22220472016-07-13 12:57:41 -0700265
266 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, ctx->recv_message));
Alexander Polcyn67656532016-09-01 18:50:13 -0700267 intptr_t result = (intptr_t)grpc_byte_buffer_length(reader.buffer_out);
268 grpc_byte_buffer_reader_destroy(&reader);
Alexander Polcyn22220472016-07-13 12:57:41 -0700269
Alexander Polcyn67656532016-09-01 18:50:13 -0700270 return result;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800271}
272
273/*
274 * Copies data from recv_message to a buffer. Fatal error occurs if
275 * buffer is too small.
276 */
Jan Tattermuschfa216732015-02-18 11:06:44 -0800277GPR_EXPORT void GPR_CALLTYPE grpcsharp_batch_context_recv_message_to_buffer(
278 const grpcsharp_batch_context *ctx, char *buffer, size_t buffer_len) {
David Garcia Quintas30bd4eb2015-06-01 21:08:59 -0700279 grpc_byte_buffer_reader reader;
Craig Tillerd41a4a72016-10-26 16:16:06 -0700280 grpc_slice slice;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800281 size_t offset = 0;
282
Alexander Polcyn22220472016-07-13 12:57:41 -0700283 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, ctx->recv_message));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800284
David Garcia Quintas30bd4eb2015-06-01 21:08:59 -0700285 while (grpc_byte_buffer_reader_next(&reader, &slice)) {
Craig Tiller618e67d2016-10-26 21:08:10 -0700286 size_t len = GRPC_SLICE_LENGTH(slice);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800287 GPR_ASSERT(offset + len <= buffer_len);
Craig Tiller618e67d2016-10-26 21:08:10 -0700288 memcpy(buffer + offset, GRPC_SLICE_START_PTR(slice),
289 GRPC_SLICE_LENGTH(slice));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800290 offset += len;
Craig Tillerd41a4a72016-10-26 16:16:06 -0700291 grpc_slice_unref(slice);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800292 }
Alexander Polcyn67656532016-09-01 18:50:13 -0700293
294 grpc_byte_buffer_reader_destroy(&reader);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800295}
296
297GPR_EXPORT grpc_status_code GPR_CALLTYPE
Jan Tattermuschfa216732015-02-18 11:06:44 -0800298grpcsharp_batch_context_recv_status_on_client_status(
299 const grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800300 return ctx->recv_status_on_client.status;
301}
302
303GPR_EXPORT const char *GPR_CALLTYPE
Jan Tattermuschfa216732015-02-18 11:06:44 -0800304grpcsharp_batch_context_recv_status_on_client_details(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800305 const grpcsharp_batch_context *ctx, size_t *details_length) {
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700306 *details_length =
307 GRPC_SLICE_LENGTH(ctx->recv_status_on_client.status_details);
308 return (char *)GRPC_SLICE_START_PTR(
309 ctx->recv_status_on_client.status_details);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800310}
311
Jan Tattermuschec50f282015-07-20 19:44:29 -0700312GPR_EXPORT const grpc_metadata_array *GPR_CALLTYPE
313grpcsharp_batch_context_recv_status_on_client_trailing_metadata(
314 const grpcsharp_batch_context *ctx) {
315 return &(ctx->recv_status_on_client.trailing_metadata);
316}
317
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700318GPR_EXPORT grpc_call *GPR_CALLTYPE
319grpcsharp_request_call_context_call(const grpcsharp_request_call_context *ctx) {
Jan Tattermusch6e901712016-10-21 00:42:37 +0200320 return ctx->call;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800321}
322
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700323GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_request_call_context_method(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800324 const grpcsharp_request_call_context *ctx, size_t *method_length) {
325 *method_length = GRPC_SLICE_LENGTH(ctx->call_details.method);
326 return (char *)GRPC_SLICE_START_PTR(ctx->call_details.method);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800327}
328
Jan Tattermusch6e901712016-10-21 00:42:37 +0200329GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_request_call_context_host(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800330 const grpcsharp_request_call_context *ctx, size_t *host_length) {
331 *host_length = GRPC_SLICE_LENGTH(ctx->call_details.host);
332 return (char *)GRPC_SLICE_START_PTR(ctx->call_details.host);
Jan Tattermusch77415b62015-07-20 20:18:26 -0700333}
334
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700335GPR_EXPORT gpr_timespec GPR_CALLTYPE grpcsharp_request_call_context_deadline(
Jan Tattermusch6e901712016-10-21 00:42:37 +0200336 const grpcsharp_request_call_context *ctx) {
337 return ctx->call_details.deadline;
Jan Tattermusch77415b62015-07-20 20:18:26 -0700338}
339
Jan Tattermuschec50f282015-07-20 19:44:29 -0700340GPR_EXPORT const grpc_metadata_array *GPR_CALLTYPE
Jan Tattermusch6e901712016-10-21 00:42:37 +0200341grpcsharp_request_call_context_request_metadata(
342 const grpcsharp_request_call_context *ctx) {
343 return &(ctx->request_metadata);
Jan Tattermuschec50f282015-07-20 19:44:29 -0700344}
345
Craig Tiller7536af02015-12-22 13:49:30 -0800346GPR_EXPORT int32_t GPR_CALLTYPE
Jan Tattermusch8c2dd9d2015-05-04 09:20:43 -0700347grpcsharp_batch_context_recv_close_on_server_cancelled(
348 const grpcsharp_batch_context *ctx) {
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700349 return (int32_t)ctx->recv_close_on_server_cancelled;
Jan Tattermusch8c2dd9d2015-05-04 09:20:43 -0700350}
351
Jan Tattermusch35e42802015-02-12 10:09:05 -0800352/* Init & shutdown */
353
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800354GPR_EXPORT void GPR_CALLTYPE grpcsharp_init(void) { grpc_init(); }
Jan Tattermusch94c36532015-01-21 10:36:12 -0800355
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800356GPR_EXPORT void GPR_CALLTYPE grpcsharp_shutdown(void) { grpc_shutdown(); }
Jan Tattermusch94c36532015-01-21 10:36:12 -0800357
Jan Tattermusch35e42802015-02-12 10:09:05 -0800358/* Completion queue */
359
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800360GPR_EXPORT grpc_completion_queue *GPR_CALLTYPE
Jan Tattermuschb7462942017-03-08 19:30:21 +0100361grpcsharp_completion_queue_create_async(void) {
Sree Kuchibhotla615e4682017-03-22 12:34:17 -0700362 return grpc_completion_queue_create_for_next(NULL);
Jan Tattermuschb7462942017-03-08 19:30:21 +0100363}
364
365GPR_EXPORT grpc_completion_queue *GPR_CALLTYPE
366grpcsharp_completion_queue_create_sync(void) {
Sree Kuchibhotla615e4682017-03-22 12:34:17 -0700367 return grpc_completion_queue_create_for_pluck(NULL);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800368}
369
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800370GPR_EXPORT void GPR_CALLTYPE
371grpcsharp_completion_queue_shutdown(grpc_completion_queue *cq) {
Jan Tattermusch35e42802015-02-12 10:09:05 -0800372 grpc_completion_queue_shutdown(cq);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800373}
374
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800375GPR_EXPORT void GPR_CALLTYPE
376grpcsharp_completion_queue_destroy(grpc_completion_queue *cq) {
Jan Tattermusch35e42802015-02-12 10:09:05 -0800377 grpc_completion_queue_destroy(cq);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800378}
379
Jan Tattermuschd3677482015-06-01 19:27:40 -0700380GPR_EXPORT grpc_event GPR_CALLTYPE
381grpcsharp_completion_queue_next(grpc_completion_queue *cq) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200382 return grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
383 NULL);
Jan Tattermuschd3677482015-06-01 19:27:40 -0700384}
Jan Tattermusch94c36532015-01-21 10:36:12 -0800385
Jan Tattermuschd3677482015-06-01 19:27:40 -0700386GPR_EXPORT grpc_event GPR_CALLTYPE
387grpcsharp_completion_queue_pluck(grpc_completion_queue *cq, void *tag) {
Craig Tiller143e7bf2015-07-13 08:41:49 -0700388 return grpc_completion_queue_pluck(cq, tag,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200389 gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800390}
Jan Tattermusch35e42802015-02-12 10:09:05 -0800391
392/* Channel */
393
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800394GPR_EXPORT grpc_channel *GPR_CALLTYPE
Craig Tillerd9aed1d2015-07-26 12:55:47 -0700395
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700396grpcsharp_insecure_channel_create(const char *target,
397 const grpc_channel_args *args) {
Nicolas "Pixel" Noble9d72b142015-08-08 01:45:38 +0200398 return grpc_insecure_channel_create(target, args, NULL);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800399}
400
401GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_destroy(grpc_channel *channel) {
402 grpc_channel_destroy(channel);
403}
404
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700405GPR_EXPORT grpc_call *GPR_CALLTYPE grpcsharp_channel_create_call(
406 grpc_channel *channel, grpc_call *parent_call, uint32_t propagation_mask,
407 grpc_completion_queue *cq, const char *method, const char *host,
408 gpr_timespec deadline) {
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800409 grpc_slice method_slice = grpc_slice_from_copied_string(method);
410 grpc_slice *host_slice_ptr = NULL;
411 grpc_slice host_slice;
412 if (host != NULL) {
413 host_slice = grpc_slice_from_copied_string(host);
414 host_slice_ptr = &host_slice;
415 }
Jan Tattermusch4038cbf2016-12-12 20:36:48 +0100416 return grpc_channel_create_call(channel, parent_call, propagation_mask, cq,
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800417 method_slice, host_slice_ptr, deadline, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800418}
419
Jan Tattermuschd8bbdea2015-07-22 12:51:06 -0700420GPR_EXPORT grpc_connectivity_state GPR_CALLTYPE
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700421grpcsharp_channel_check_connectivity_state(grpc_channel *channel,
422 int32_t try_to_connect) {
Jan Tattermuschd8bbdea2015-07-22 12:51:06 -0700423 return grpc_channel_check_connectivity_state(channel, try_to_connect);
424}
425
426GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_watch_connectivity_state(
427 grpc_channel *channel, grpc_connectivity_state last_observed_state,
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700428 gpr_timespec deadline, grpc_completion_queue *cq,
429 grpcsharp_batch_context *ctx) {
430 grpc_channel_watch_connectivity_state(channel, last_observed_state, deadline,
431 cq, ctx);
Jan Tattermuschd8bbdea2015-07-22 12:51:06 -0700432}
433
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700434GPR_EXPORT char *GPR_CALLTYPE
435grpcsharp_channel_get_target(grpc_channel *channel) {
Jan Tattermuschdead9052015-08-01 21:34:31 -0700436 return grpc_channel_get_target(channel);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800437}
438
Jan Tattermusch15329232015-03-02 15:32:47 -0800439/* Channel args */
440
441GPR_EXPORT grpc_channel_args *GPR_CALLTYPE
442grpcsharp_channel_args_create(size_t num_args) {
443 grpc_channel_args *args =
444 (grpc_channel_args *)gpr_malloc(sizeof(grpc_channel_args));
445 memset(args, 0, sizeof(grpc_channel_args));
446
447 args->num_args = num_args;
448 args->args = (grpc_arg *)gpr_malloc(sizeof(grpc_arg) * num_args);
449 memset(args->args, 0, sizeof(grpc_arg) * num_args);
450 return args;
451}
452
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700453GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_args_set_string(
454 grpc_channel_args *args, size_t index, const char *key, const char *value) {
Jan Tattermusch15329232015-03-02 15:32:47 -0800455 GPR_ASSERT(args);
456 GPR_ASSERT(index < args->num_args);
457 args->args[index].type = GRPC_ARG_STRING;
458 args->args[index].key = gpr_strdup(key);
459 args->args[index].value.string = gpr_strdup(value);
460}
461
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700462GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_args_set_integer(
463 grpc_channel_args *args, size_t index, const char *key, int value) {
Jan Tattermusch2ddb5a62015-06-08 17:51:36 -0700464 GPR_ASSERT(args);
465 GPR_ASSERT(index < args->num_args);
466 args->args[index].type = GRPC_ARG_INTEGER;
467 args->args[index].key = gpr_strdup(key);
468 args->args[index].value.integer = value;
469}
470
471GPR_EXPORT void GPR_CALLTYPE
Jan Tattermusch15329232015-03-02 15:32:47 -0800472grpcsharp_channel_args_destroy(grpc_channel_args *args) {
473 size_t i;
474 if (args) {
475 for (i = 0; i < args->num_args; i++) {
476 gpr_free(args->args[i].key);
477 if (args->args[i].type == GRPC_ARG_STRING) {
478 gpr_free(args->args[i].value.string);
479 }
480 }
481 gpr_free(args->args);
482 gpr_free(args);
483 }
484}
485
Jan Tattermusch35e42802015-02-12 10:09:05 -0800486/* Timespec */
487
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700488GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_now(gpr_clock_type clock_type) {
489 return gpr_now(clock_type);
490}
Jan Tattermusch35e42802015-02-12 10:09:05 -0800491
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700492GPR_EXPORT gpr_timespec GPR_CALLTYPE
493gprsharp_inf_future(gpr_clock_type clock_type) {
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700494 return gpr_inf_future(clock_type);
495}
496
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700497GPR_EXPORT gpr_timespec GPR_CALLTYPE
498gprsharp_inf_past(gpr_clock_type clock_type) {
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700499 return gpr_inf_past(clock_type);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800500}
501
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700502GPR_EXPORT gpr_timespec GPR_CALLTYPE
503gprsharp_convert_clock_type(gpr_timespec t, gpr_clock_type target_clock) {
Jan Tattermusch7a3ac622015-07-23 18:40:48 -0700504 return gpr_convert_clock_type(t, target_clock);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800505}
506
Craig Tiller7536af02015-12-22 13:49:30 -0800507GPR_EXPORT int32_t GPR_CALLTYPE gprsharp_sizeof_timespec(void) {
Jan Tattermusch35e42802015-02-12 10:09:05 -0800508 return sizeof(gpr_timespec);
509}
510
511/* Call */
512
Jan Tattermusch35e42802015-02-12 10:09:05 -0800513GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_cancel(grpc_call *call) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200514 return grpc_call_cancel(call, NULL);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800515}
516
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700517GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_cancel_with_status(
518 grpc_call *call, grpc_status_code status, const char *description) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200519 return grpc_call_cancel_with_status(call, status, description, NULL);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800520}
521
Jan Tattermusch062c3292015-07-23 20:28:42 -0700522GPR_EXPORT char *GPR_CALLTYPE grpcsharp_call_get_peer(grpc_call *call) {
523 return grpc_call_get_peer(call);
524}
525
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700526GPR_EXPORT void GPR_CALLTYPE gprsharp_free(void *p) { gpr_free(p); }
Jan Tattermusch062c3292015-07-23 20:28:42 -0700527
Jan Tattermusch35e42802015-02-12 10:09:05 -0800528GPR_EXPORT void GPR_CALLTYPE grpcsharp_call_destroy(grpc_call *call) {
Craig Tillerdd36b152017-03-31 08:27:28 -0700529 grpc_call_unref(call);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800530}
531
Jan Tattermusch645ae742017-05-22 08:46:26 -0700532typedef grpc_call_error (*grpcsharp_call_start_batch_func) (
533 grpc_call *call, const grpc_op *ops, size_t nops,
534 void *tag, void *reserved);
535
536/* Only for testing */
537static grpc_call_error grpcsharp_call_start_batch_nop(
538 grpc_call *call, const grpc_op *ops, size_t nops,
539 void *tag, void *reserved) {
540 return GRPC_CALL_OK;
541}
542
543static grpc_call_error grpcsharp_call_start_batch_default(
544 grpc_call *call, const grpc_op *ops, size_t nops,
545 void *tag, void *reserved) {
546 return grpc_call_start_batch(call, ops, nops, tag, reserved);
547}
548
549static grpcsharp_call_start_batch_func g_call_start_batch_func = grpcsharp_call_start_batch_default;
550
551static grpc_call_error grpcsharp_call_start_batch(
552 grpc_call *call, const grpc_op *ops, size_t nops,
553 void *tag, void *reserved) {
554 return g_call_start_batch_func(call, ops, nops, tag, reserved);
555}
556
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700557GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_unary(
558 grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer,
559 size_t send_buffer_len, uint32_t write_flags,
560 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800561 /* TODO: don't use magic number */
562 grpc_op ops[6];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700563 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800564 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700565 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
566 initial_metadata);
567 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
568 ops[0].data.send_initial_metadata.metadata =
569 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100570 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700571 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800572
573 ops[1].op = GRPC_OP_SEND_MESSAGE;
574 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800575 ops[1].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700576 ops[1].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700577 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800578
579 ops[2].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700580 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700581 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800582
583 ops[3].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800584 ops[3].data.recv_initial_metadata.recv_initial_metadata =
585 &(ctx->recv_initial_metadata);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700586 ops[3].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700587 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800588
589 ops[4].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800590 ops[4].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700591 ops[4].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700592 ops[4].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800593
594 ops[5].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
Jan Tattermuschfa216732015-02-18 11:06:44 -0800595 ops[5].data.recv_status_on_client.trailing_metadata =
596 &(ctx->recv_status_on_client.trailing_metadata);
597 ops[5].data.recv_status_on_client.status =
598 &(ctx->recv_status_on_client.status);
Jan Tattermuschfa216732015-02-18 11:06:44 -0800599 ops[5].data.recv_status_on_client.status_details =
600 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700601 ops[5].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700602 ops[5].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800603
Jan Tattermusch645ae742017-05-22 08:46:26 -0700604 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200605 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800606}
607
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700608GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_client_streaming(
609 grpc_call *call, grpcsharp_batch_context *ctx,
610 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800611 /* TODO: don't use magic number */
612 grpc_op ops[4];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700613 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800614 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700615 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
616 initial_metadata);
617 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
618 ops[0].data.send_initial_metadata.metadata =
619 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100620 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700621 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800622
623 ops[1].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800624 ops[1].data.recv_initial_metadata.recv_initial_metadata =
625 &(ctx->recv_initial_metadata);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700626 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700627 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800628
629 ops[2].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800630 ops[2].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700631 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700632 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800633
634 ops[3].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
Jan Tattermuschfa216732015-02-18 11:06:44 -0800635 ops[3].data.recv_status_on_client.trailing_metadata =
636 &(ctx->recv_status_on_client.trailing_metadata);
637 ops[3].data.recv_status_on_client.status =
638 &(ctx->recv_status_on_client.status);
Jan Tattermuschfa216732015-02-18 11:06:44 -0800639 ops[3].data.recv_status_on_client.status_details =
640 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700641 ops[3].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700642 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800643
Jan Tattermusch645ae742017-05-22 08:46:26 -0700644 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200645 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800646}
647
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700648GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_server_streaming(
Jan Tattermuschd3677482015-06-01 19:27:40 -0700649 grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer,
Jan Tattermusch43416da2016-11-22 17:28:22 +0100650 size_t send_buffer_len, uint32_t write_flags,
651 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800652 /* TODO: don't use magic number */
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700653 grpc_op ops[4];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700654 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800655 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700656 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
657 initial_metadata);
658 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
659 ops[0].data.send_initial_metadata.metadata =
660 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100661 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700662 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800663
664 ops[1].op = GRPC_OP_SEND_MESSAGE;
665 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800666 ops[1].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700667 ops[1].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700668 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800669
670 ops[2].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700671 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700672 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800673
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700674 ops[3].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
675 ops[3].data.recv_status_on_client.trailing_metadata =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800676 &(ctx->recv_status_on_client.trailing_metadata);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700677 ops[3].data.recv_status_on_client.status =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800678 &(ctx->recv_status_on_client.status);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700679 ops[3].data.recv_status_on_client.status_details =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800680 &(ctx->recv_status_on_client.status_details);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700681 ops[3].flags = 0;
682 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800683
Jan Tattermusch645ae742017-05-22 08:46:26 -0700684 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200685 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800686}
687
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700688GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_duplex_streaming(
689 grpc_call *call, grpcsharp_batch_context *ctx,
690 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800691 /* TODO: don't use magic number */
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700692 grpc_op ops[2];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700693 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800694 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700695 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
696 initial_metadata);
697 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
698 ops[0].data.send_initial_metadata.metadata =
699 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100700 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700701 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800702
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700703 ops[1].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
704 ops[1].data.recv_status_on_client.trailing_metadata =
705 &(ctx->recv_status_on_client.trailing_metadata);
706 ops[1].data.recv_status_on_client.status =
707 &(ctx->recv_status_on_client.status);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700708 ops[1].data.recv_status_on_client.status_details =
709 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700710 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700711 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800712
Jan Tattermusch645ae742017-05-22 08:46:26 -0700713 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200714 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800715}
716
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700717GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_recv_initial_metadata(
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700718 grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch706a0102015-09-24 18:34:39 -0700719 /* TODO: don't use magic number */
720 grpc_op ops[1];
721 ops[0].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800722 ops[0].data.recv_initial_metadata.recv_initial_metadata =
723 &(ctx->recv_initial_metadata);
Jan Tattermusch706a0102015-09-24 18:34:39 -0700724 ops[0].flags = 0;
725 ops[0].reserved = NULL;
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700726
Jan Tattermusch645ae742017-05-22 08:46:26 -0700727 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700728 NULL);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700729}
730
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700731GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_message(
732 grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer,
733 size_t send_buffer_len, uint32_t write_flags,
734 int32_t send_empty_initial_metadata) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800735 /* TODO: don't use magic number */
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700736 grpc_op ops[2];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700737 memset(ops, 0, sizeof(ops));
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700738 size_t nops = send_empty_initial_metadata ? 2 : 1;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800739 ops[0].op = GRPC_OP_SEND_MESSAGE;
740 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800741 ops[0].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700742 ops[0].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700743 ops[0].reserved = NULL;
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700744 ops[1].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700745 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700746 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800747
Jan Tattermusch645ae742017-05-22 08:46:26 -0700748 return grpcsharp_call_start_batch(call, ops, nops, ctx, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800749}
750
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700751GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_close_from_client(
752 grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800753 /* TODO: don't use magic number */
754 grpc_op ops[1];
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800755 ops[0].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700756 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700757 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800758
Jan Tattermusch645ae742017-05-22 08:46:26 -0700759 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200760 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800761}
762
Craig Tillerb256faa2015-07-23 11:28:16 -0700763GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_status_from_server(
764 grpc_call *call, grpcsharp_batch_context *ctx, grpc_status_code status_code,
Jan Tattermusch60324922017-01-18 21:15:12 +0100765 const char *status_details, size_t status_details_len,
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700766 grpc_metadata_array *trailing_metadata, int32_t send_empty_initial_metadata,
767 const char *optional_send_buffer, size_t optional_send_buffer_len,
768 uint32_t write_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800769 /* TODO: don't use magic number */
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700770 grpc_op ops[3];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700771 memset(ops, 0, sizeof(ops));
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700772 size_t nops = 1;
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700773 grpc_slice status_details_slice =
774 grpc_slice_from_copied_buffer(status_details, status_details_len);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800775 ops[0].op = GRPC_OP_SEND_STATUS_FROM_SERVER;
776 ops[0].data.send_status_from_server.status = status_code;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800777 ops[0].data.send_status_from_server.status_details = &status_details_slice;
Craig Tillerb256faa2015-07-23 11:28:16 -0700778 grpcsharp_metadata_array_move(
779 &(ctx->send_status_from_server.trailing_metadata), trailing_metadata);
Jan Tattermuscha0bb0652015-07-20 22:34:19 -0700780 ops[0].data.send_status_from_server.trailing_metadata_count =
781 ctx->send_status_from_server.trailing_metadata.count;
782 ops[0].data.send_status_from_server.trailing_metadata =
783 ctx->send_status_from_server.trailing_metadata.metadata;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700784 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700785 ops[0].reserved = NULL;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700786 if (optional_send_buffer) {
787 ops[nops].op = GRPC_OP_SEND_MESSAGE;
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700788 ctx->send_message =
789 string_to_byte_buffer(optional_send_buffer, optional_send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800790 ops[nops].data.send_message.send_message = ctx->send_message;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700791 ops[nops].flags = write_flags;
792 ops[nops].reserved = NULL;
Carl Mastrangelo5f3a1432017-02-07 08:14:29 -0800793 nops++;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700794 }
795 if (send_empty_initial_metadata) {
796 ops[nops].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700797 ops[nops].flags = 0;
798 ops[nops].reserved = NULL;
799 nops++;
800 }
Jan Tattermusch645ae742017-05-22 08:46:26 -0700801 return grpcsharp_call_start_batch(call, ops, nops, ctx, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800802}
803
Jan Tattermuschfa216732015-02-18 11:06:44 -0800804GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700805grpcsharp_call_recv_message(grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800806 /* TODO: don't use magic number */
807 grpc_op ops[1];
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800808 ops[0].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800809 ops[0].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700810 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700811 ops[0].reserved = NULL;
Jan Tattermusch645ae742017-05-22 08:46:26 -0700812 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200813 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800814}
815
Jan Tattermuschfa216732015-02-18 11:06:44 -0800816GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700817grpcsharp_call_start_serverside(grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800818 /* TODO: don't use magic number */
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700819 grpc_op ops[1];
820 ops[0].op = GRPC_OP_RECV_CLOSE_ON_SERVER;
821 ops[0].data.recv_close_on_server.cancelled =
822 (&ctx->recv_close_on_server_cancelled);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700823 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700824 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800825
Jan Tattermusch645ae742017-05-22 08:46:26 -0700826 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble720903a2015-08-12 20:07:54 +0200827 NULL);
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700828}
829
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700830GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_initial_metadata(
831 grpc_call *call, grpcsharp_batch_context *ctx,
832 grpc_metadata_array *initial_metadata) {
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700833 /* TODO: don't use magic number */
834 grpc_op ops[1];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700835 memset(ops, 0, sizeof(ops));
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700836 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
837 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
838 initial_metadata);
839 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
840 ops[0].data.send_initial_metadata.metadata =
841 ctx->send_initial_metadata.metadata;
Jan Tattermusch5321d492015-08-07 23:21:27 -0700842 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700843 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800844
Jan Tattermusch645ae742017-05-22 08:46:26 -0700845 return grpcsharp_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200846 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800847}
848
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700849GPR_EXPORT grpc_call_error GPR_CALLTYPE
850grpcsharp_call_set_credentials(grpc_call *call, grpc_call_credentials *creds) {
Jan Tattermusch08dea322015-10-26 17:34:10 -0700851 return grpc_call_set_credentials(call, creds);
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700852}
853
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800854/* Server */
855
856GPR_EXPORT grpc_server *GPR_CALLTYPE
Jan Tattermusch5ee8e772016-05-24 16:17:10 -0400857grpcsharp_server_create(const grpc_channel_args *args) {
858 return grpc_server_create(args, NULL);
859}
860
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700861GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_register_completion_queue(
862 grpc_server *server, grpc_completion_queue *cq) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200863 grpc_server_register_completion_queue(server, cq, NULL);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800864}
865
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700866GPR_EXPORT int32_t GPR_CALLTYPE grpcsharp_server_add_insecure_http2_port(
867 grpc_server *server, const char *addr) {
Craig Tillerc5ae3eb2015-08-03 10:42:22 -0700868 return grpc_server_add_insecure_http2_port(server, addr);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800869}
870
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800871GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_start(grpc_server *server) {
872 grpc_server_start(server);
873}
874
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700875GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_shutdown_and_notify_callback(
876 grpc_server *server, grpc_completion_queue *cq,
877 grpcsharp_batch_context *ctx) {
Jan Tattermuschc4e81ad2015-05-29 17:39:07 -0700878 grpc_server_shutdown_and_notify(server, cq, ctx);
879}
880
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700881GPR_EXPORT void GPR_CALLTYPE
882grpcsharp_server_cancel_all_calls(grpc_server *server) {
Jan Tattermuschc4e81ad2015-05-29 17:39:07 -0700883 grpc_server_cancel_all_calls(server);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800884}
885
886GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_destroy(grpc_server *server) {
887 grpc_server_destroy(server);
888}
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800889
Jan Tattermuschfa216732015-02-18 11:06:44 -0800890GPR_EXPORT grpc_call_error GPR_CALLTYPE
891grpcsharp_server_request_call(grpc_server *server, grpc_completion_queue *cq,
Jan Tattermusch6e901712016-10-21 00:42:37 +0200892 grpcsharp_request_call_context *ctx) {
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700893 return grpc_server_request_call(server, &(ctx->call), &(ctx->call_details),
894 &(ctx->request_metadata), cq, cq, ctx);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800895}
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800896
Jan Tattermusch15329232015-03-02 15:32:47 -0800897/* Security */
898
Jan Tattermusch660c15b2016-02-02 06:39:10 -0800899static char *default_pem_root_certs = NULL;
900
901static grpc_ssl_roots_override_result override_ssl_roots_handler(
902 char **pem_root_certs) {
903 if (!default_pem_root_certs) {
904 *pem_root_certs = NULL;
905 return GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY;
906 }
907 *pem_root_certs = gpr_strdup(default_pem_root_certs);
908 return GRPC_SSL_ROOTS_OVERRIDE_OK;
909}
910
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700911GPR_EXPORT void GPR_CALLTYPE
912grpcsharp_override_default_ssl_roots(const char *pem_root_certs) {
Jan Tattermusch660c15b2016-02-02 06:39:10 -0800913 /*
914 * This currently wastes ~300kB of memory by keeping a copy of roots
915 * in a static variable, but for desktop/server use, the overhead
916 * is negligible. In the future, we might want to change the behavior
917 * for mobile (e.g. Xamarin).
918 */
919 default_pem_root_certs = gpr_strdup(pem_root_certs);
920 grpc_set_ssl_roots_override_callback(override_ssl_roots_handler);
921}
922
Jan Tattermusch08dea322015-10-26 17:34:10 -0700923GPR_EXPORT grpc_channel_credentials *GPR_CALLTYPE
Jan Tattermusch15329232015-03-02 15:32:47 -0800924grpcsharp_ssl_credentials_create(const char *pem_root_certs,
925 const char *key_cert_pair_cert_chain,
926 const char *key_cert_pair_private_key) {
927 grpc_ssl_pem_key_cert_pair key_cert_pair;
928 if (key_cert_pair_cert_chain || key_cert_pair_private_key) {
929 key_cert_pair.cert_chain = key_cert_pair_cert_chain;
930 key_cert_pair.private_key = key_cert_pair_private_key;
Julien Boeufc5b570f2015-08-25 17:47:55 -0700931 return grpc_ssl_credentials_create(pem_root_certs, &key_cert_pair, NULL);
Jan Tattermusch15329232015-03-02 15:32:47 -0800932 } else {
933 GPR_ASSERT(!key_cert_pair_cert_chain);
934 GPR_ASSERT(!key_cert_pair_private_key);
Julien Boeufc5b570f2015-08-25 17:47:55 -0700935 return grpc_ssl_credentials_create(pem_root_certs, NULL, NULL);
Jan Tattermusch15329232015-03-02 15:32:47 -0800936 }
937}
938
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700939GPR_EXPORT void GPR_CALLTYPE
940grpcsharp_channel_credentials_release(grpc_channel_credentials *creds) {
Jan Tattermusch08dea322015-10-26 17:34:10 -0700941 grpc_channel_credentials_release(creds);
942}
943
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700944GPR_EXPORT void GPR_CALLTYPE
945grpcsharp_call_credentials_release(grpc_call_credentials *creds) {
Jan Tattermusch08dea322015-10-26 17:34:10 -0700946 grpc_call_credentials_release(creds);
Jan Tattermusch15329232015-03-02 15:32:47 -0800947}
948
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700949GPR_EXPORT grpc_channel *GPR_CALLTYPE grpcsharp_secure_channel_create(
950 grpc_channel_credentials *creds, const char *target,
951 const grpc_channel_args *args) {
Julien Boeufc5b570f2015-08-25 17:47:55 -0700952 return grpc_secure_channel_create(creds, target, args, NULL);
Jan Tattermusch15329232015-03-02 15:32:47 -0800953}
954
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800955GPR_EXPORT grpc_server_credentials *GPR_CALLTYPE
956grpcsharp_ssl_server_credentials_create(
957 const char *pem_root_certs, const char **key_cert_pair_cert_chain_array,
Jan Tattermuschd27dfa72015-08-04 18:10:54 -0700958 const char **key_cert_pair_private_key_array, size_t num_key_cert_pairs,
959 int force_client_auth) {
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800960 size_t i;
961 grpc_server_credentials *creds;
962 grpc_ssl_pem_key_cert_pair *key_cert_pairs =
963 gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair) * num_key_cert_pairs);
964 memset(key_cert_pairs, 0,
965 sizeof(grpc_ssl_pem_key_cert_pair) * num_key_cert_pairs);
966
967 for (i = 0; i < num_key_cert_pairs; i++) {
968 if (key_cert_pair_cert_chain_array[i] ||
969 key_cert_pair_private_key_array[i]) {
970 key_cert_pairs[i].cert_chain = key_cert_pair_cert_chain_array[i];
971 key_cert_pairs[i].private_key = key_cert_pair_private_key_array[i];
972 }
973 }
Deepak Lukosedba4c5f2016-03-25 12:54:25 -0700974 creds = grpc_ssl_server_credentials_create_ex(
975 pem_root_certs, key_cert_pairs, num_key_cert_pairs,
976 force_client_auth
977 ? GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
978 : GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
979 NULL);
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800980 gpr_free(key_cert_pairs);
981 return creds;
982}
983
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700984GPR_EXPORT void GPR_CALLTYPE
985grpcsharp_server_credentials_release(grpc_server_credentials *creds) {
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800986 grpc_server_credentials_release(creds);
987}
988
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700989GPR_EXPORT int32_t GPR_CALLTYPE grpcsharp_server_add_secure_http2_port(
990 grpc_server *server, const char *addr, grpc_server_credentials *creds) {
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800991 return grpc_server_add_secure_http2_port(server, addr, creds);
992}
993
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700994GPR_EXPORT grpc_channel_credentials *GPR_CALLTYPE
995grpcsharp_composite_channel_credentials_create(
996 grpc_channel_credentials *channel_creds,
997 grpc_call_credentials *call_creds) {
998 return grpc_composite_channel_credentials_create(channel_creds, call_creds,
999 NULL);
Jan Tattermusch08dea322015-10-26 17:34:10 -07001000}
1001
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001002GPR_EXPORT grpc_call_credentials *GPR_CALLTYPE
1003grpcsharp_composite_call_credentials_create(grpc_call_credentials *creds1,
1004 grpc_call_credentials *creds2) {
Jan Tattermusch08dea322015-10-26 17:34:10 -07001005 return grpc_composite_call_credentials_create(creds1, creds2, NULL);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001006}
1007
1008/* Metadata credentials plugin */
1009
1010GPR_EXPORT void GPR_CALLTYPE grpcsharp_metadata_credentials_notify_from_plugin(
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001011 grpc_credentials_plugin_metadata_cb cb, void *user_data,
1012 grpc_metadata_array *metadata, grpc_status_code status,
1013 const char *error_details) {
Jan Tattermuschae4ab4f2016-11-09 22:52:38 +01001014 if (metadata) {
1015 cb(user_data, metadata->metadata, metadata->count, status, error_details);
1016 } else {
1017 cb(user_data, NULL, 0, status, error_details);
1018 }
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001019}
1020
1021typedef void(GPR_CALLTYPE *grpcsharp_metadata_interceptor_func)(
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001022 void *state, const char *service_url, const char *method_name,
1023 grpc_credentials_plugin_metadata_cb cb, void *user_data,
1024 int32_t is_destroy);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001025
Julien Boeuf3c957e62015-11-18 21:33:58 -08001026static void grpcsharp_get_metadata_handler(
1027 void *state, grpc_auth_metadata_context context,
1028 grpc_credentials_plugin_metadata_cb cb, void *user_data) {
Jan Tattermusch706a0102015-09-24 18:34:39 -07001029 grpcsharp_metadata_interceptor_func interceptor =
Craig Tiller7536af02015-12-22 13:49:30 -08001030 (grpcsharp_metadata_interceptor_func)(intptr_t)state;
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001031 interceptor(state, context.service_url, context.method_name, cb, user_data,
1032 0);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001033}
1034
1035static void grpcsharp_metadata_credentials_destroy_handler(void *state) {
Jan Tattermusch706a0102015-09-24 18:34:39 -07001036 grpcsharp_metadata_interceptor_func interceptor =
Craig Tiller7536af02015-12-22 13:49:30 -08001037 (grpcsharp_metadata_interceptor_func)(intptr_t)state;
Jan Tattermusch189fcf82015-12-02 13:41:12 -08001038 interceptor(state, NULL, NULL, NULL, NULL, 1);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001039}
1040
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001041GPR_EXPORT grpc_call_credentials *GPR_CALLTYPE
1042grpcsharp_metadata_credentials_create_from_plugin(
1043 grpcsharp_metadata_interceptor_func metadata_interceptor) {
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001044 grpc_metadata_credentials_plugin plugin;
1045 plugin.get_metadata = grpcsharp_get_metadata_handler;
1046 plugin.destroy = grpcsharp_metadata_credentials_destroy_handler;
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001047 plugin.state = (void *)(intptr_t)metadata_interceptor;
Julien Boeufcaf99352015-11-19 22:00:30 -08001048 plugin.type = "";
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001049 return grpc_metadata_credentials_create_from_plugin(plugin, NULL);
1050}
1051
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001052/* Auth context */
1053
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001054GPR_EXPORT grpc_auth_context *GPR_CALLTYPE
1055grpcsharp_call_auth_context(grpc_call *call) {
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001056 return grpc_call_auth_context(call);
1057}
1058
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001059GPR_EXPORT const char *GPR_CALLTYPE
1060grpcsharp_auth_context_peer_identity_property_name(
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001061 const grpc_auth_context *ctx) {
1062 return grpc_auth_context_peer_identity_property_name(ctx);
1063}
1064
1065GPR_EXPORT grpc_auth_property_iterator GPR_CALLTYPE
1066grpcsharp_auth_context_property_iterator(const grpc_auth_context *ctx) {
1067 return grpc_auth_context_property_iterator(ctx);
1068}
1069
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001070GPR_EXPORT const grpc_auth_property *GPR_CALLTYPE
1071grpcsharp_auth_property_iterator_next(grpc_auth_property_iterator *it) {
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001072 return grpc_auth_property_iterator_next(it);
1073}
1074
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001075GPR_EXPORT void GPR_CALLTYPE
1076grpcsharp_auth_context_release(grpc_auth_context *ctx) {
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001077 grpc_auth_context_release(ctx);
1078}
1079
Jan Tattermusch53398142015-02-24 08:21:57 -08001080/* Logging */
1081
Craig Tiller7536af02015-12-22 13:49:30 -08001082typedef void(GPR_CALLTYPE *grpcsharp_log_func)(const char *file, int32_t line,
1083 uint64_t thd_id,
Jan Tattermusch44553b52015-02-25 09:52:18 -08001084 const char *severity_string,
1085 const char *msg);
Jan Tattermusch53398142015-02-24 08:21:57 -08001086static grpcsharp_log_func log_func = NULL;
1087
1088/* Redirects gpr_log to log_func callback */
1089static void grpcsharp_log_handler(gpr_log_func_args *args) {
Jan Tattermusch44553b52015-02-25 09:52:18 -08001090 log_func(args->file, args->line, gpr_thd_currentid(),
1091 gpr_log_severity_string(args->severity), args->message);
Jan Tattermusch53398142015-02-24 08:21:57 -08001092}
1093
Jan Tattermusch44553b52015-02-25 09:52:18 -08001094GPR_EXPORT void GPR_CALLTYPE grpcsharp_redirect_log(grpcsharp_log_func func) {
1095 GPR_ASSERT(func);
1096 log_func = func;
1097 gpr_set_log_function(grpcsharp_log_handler);
Jan Tattermusch53398142015-02-24 08:21:57 -08001098}
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001099
Craig Tiller7536af02015-12-22 13:49:30 -08001100typedef void(GPR_CALLTYPE *test_callback_funcptr)(int32_t success);
Jan Tattermuscheb741d12015-06-11 19:09:15 -07001101
Jan Tattermuschc5a6aca2015-08-09 23:41:17 -07001102/* Version info */
Jan Tattermusch03ad9512015-08-10 11:06:58 -07001103GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_version_string() {
Jan Tattermuschc5a6aca2015-08-09 23:41:17 -07001104 return grpc_version_string();
1105}
1106
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001107/* For testing */
1108GPR_EXPORT void GPR_CALLTYPE
Jan Tattermuscheb741d12015-06-11 19:09:15 -07001109grpcsharp_test_callback(test_callback_funcptr callback) {
1110 callback(1);
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001111}
1112
1113/* For testing */
Jan Tattermusch44553b52015-02-25 09:52:18 -08001114GPR_EXPORT void *GPR_CALLTYPE grpcsharp_test_nop(void *ptr) { return ptr; }
Jan Tattermuschd3677482015-06-01 19:27:40 -07001115
1116/* For testing */
Craig Tiller7536af02015-12-22 13:49:30 -08001117GPR_EXPORT int32_t GPR_CALLTYPE grpcsharp_sizeof_grpc_event(void) {
Jan Tattermuschd3677482015-06-01 19:27:40 -07001118 return sizeof(grpc_event);
1119}
Jan Tattermusch645ae742017-05-22 08:46:26 -07001120
1121/* Override a method for testing */
1122GPR_EXPORT void GPR_CALLTYPE grpcsharp_test_override_method(const char *method_name,
1123 const char *variant) {
1124 if (strcmp("grpcsharp_call_start_batch", method_name) == 0)
1125 {
1126 if (strcmp("nop", variant) == 0)
1127 {
1128 g_call_start_batch_func = grpcsharp_call_start_batch_nop;
1129 } else {
1130 GPR_ASSERT(0);
1131 }
1132 } else {
1133 GPR_ASSERT(0);
1134 }
1135}
1136
1137