blob: f6cff454bdba59d2b94e452b60bb4edb33e72503 [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
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700532GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_unary(
533 grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer,
534 size_t send_buffer_len, uint32_t write_flags,
535 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800536 /* TODO: don't use magic number */
537 grpc_op ops[6];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700538 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800539 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700540 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
541 initial_metadata);
542 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
543 ops[0].data.send_initial_metadata.metadata =
544 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100545 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700546 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800547
548 ops[1].op = GRPC_OP_SEND_MESSAGE;
549 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800550 ops[1].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700551 ops[1].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700552 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800553
554 ops[2].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700555 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700556 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800557
558 ops[3].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800559 ops[3].data.recv_initial_metadata.recv_initial_metadata =
560 &(ctx->recv_initial_metadata);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700561 ops[3].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700562 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800563
564 ops[4].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800565 ops[4].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700566 ops[4].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700567 ops[4].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800568
569 ops[5].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
Jan Tattermuschfa216732015-02-18 11:06:44 -0800570 ops[5].data.recv_status_on_client.trailing_metadata =
571 &(ctx->recv_status_on_client.trailing_metadata);
572 ops[5].data.recv_status_on_client.status =
573 &(ctx->recv_status_on_client.status);
Jan Tattermuschfa216732015-02-18 11:06:44 -0800574 ops[5].data.recv_status_on_client.status_details =
575 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700576 ops[5].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700577 ops[5].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800578
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200579 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
580 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800581}
582
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700583GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_client_streaming(
584 grpc_call *call, grpcsharp_batch_context *ctx,
585 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800586 /* TODO: don't use magic number */
587 grpc_op ops[4];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700588 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800589 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700590 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
591 initial_metadata);
592 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
593 ops[0].data.send_initial_metadata.metadata =
594 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100595 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700596 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800597
598 ops[1].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800599 ops[1].data.recv_initial_metadata.recv_initial_metadata =
600 &(ctx->recv_initial_metadata);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700601 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700602 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800603
604 ops[2].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800605 ops[2].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700606 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700607 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800608
609 ops[3].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
Jan Tattermuschfa216732015-02-18 11:06:44 -0800610 ops[3].data.recv_status_on_client.trailing_metadata =
611 &(ctx->recv_status_on_client.trailing_metadata);
612 ops[3].data.recv_status_on_client.status =
613 &(ctx->recv_status_on_client.status);
Jan Tattermuschfa216732015-02-18 11:06:44 -0800614 ops[3].data.recv_status_on_client.status_details =
615 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700616 ops[3].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700617 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800618
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200619 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
620 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800621}
622
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700623GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_server_streaming(
Jan Tattermuschd3677482015-06-01 19:27:40 -0700624 grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer,
Jan Tattermusch43416da2016-11-22 17:28:22 +0100625 size_t send_buffer_len, uint32_t write_flags,
626 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800627 /* TODO: don't use magic number */
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700628 grpc_op ops[4];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700629 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800630 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700631 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
632 initial_metadata);
633 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
634 ops[0].data.send_initial_metadata.metadata =
635 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100636 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700637 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800638
639 ops[1].op = GRPC_OP_SEND_MESSAGE;
640 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800641 ops[1].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700642 ops[1].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700643 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800644
645 ops[2].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700646 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700647 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800648
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700649 ops[3].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
650 ops[3].data.recv_status_on_client.trailing_metadata =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800651 &(ctx->recv_status_on_client.trailing_metadata);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700652 ops[3].data.recv_status_on_client.status =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800653 &(ctx->recv_status_on_client.status);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700654 ops[3].data.recv_status_on_client.status_details =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800655 &(ctx->recv_status_on_client.status_details);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700656 ops[3].flags = 0;
657 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800658
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200659 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
660 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800661}
662
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700663GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_duplex_streaming(
664 grpc_call *call, grpcsharp_batch_context *ctx,
665 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800666 /* TODO: don't use magic number */
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700667 grpc_op ops[2];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700668 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800669 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700670 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
671 initial_metadata);
672 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
673 ops[0].data.send_initial_metadata.metadata =
674 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100675 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700676 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800677
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700678 ops[1].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
679 ops[1].data.recv_status_on_client.trailing_metadata =
680 &(ctx->recv_status_on_client.trailing_metadata);
681 ops[1].data.recv_status_on_client.status =
682 &(ctx->recv_status_on_client.status);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700683 ops[1].data.recv_status_on_client.status_details =
684 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700685 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700686 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800687
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200688 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
689 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800690}
691
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700692GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_recv_initial_metadata(
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700693 grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch706a0102015-09-24 18:34:39 -0700694 /* TODO: don't use magic number */
695 grpc_op ops[1];
696 ops[0].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800697 ops[0].data.recv_initial_metadata.recv_initial_metadata =
698 &(ctx->recv_initial_metadata);
Jan Tattermusch706a0102015-09-24 18:34:39 -0700699 ops[0].flags = 0;
700 ops[0].reserved = NULL;
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700701
Jan Tattermusch706a0102015-09-24 18:34:39 -0700702 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700703 NULL);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700704}
705
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700706GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_message(
707 grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer,
708 size_t send_buffer_len, uint32_t write_flags,
709 int32_t send_empty_initial_metadata) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800710 /* TODO: don't use magic number */
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700711 grpc_op ops[2];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700712 memset(ops, 0, sizeof(ops));
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700713 size_t nops = send_empty_initial_metadata ? 2 : 1;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800714 ops[0].op = GRPC_OP_SEND_MESSAGE;
715 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800716 ops[0].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700717 ops[0].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700718 ops[0].reserved = NULL;
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700719 ops[1].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700720 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700721 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800722
Nicolas "Pixel" Nobleb457cd82015-08-12 01:14:17 +0200723 return grpc_call_start_batch(call, ops, nops, ctx, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800724}
725
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700726GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_close_from_client(
727 grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800728 /* TODO: don't use magic number */
729 grpc_op ops[1];
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800730 ops[0].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700731 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700732 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800733
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200734 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
735 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800736}
737
Craig Tillerb256faa2015-07-23 11:28:16 -0700738GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_status_from_server(
739 grpc_call *call, grpcsharp_batch_context *ctx, grpc_status_code status_code,
Jan Tattermusch60324922017-01-18 21:15:12 +0100740 const char *status_details, size_t status_details_len,
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700741 grpc_metadata_array *trailing_metadata, int32_t send_empty_initial_metadata,
742 const char *optional_send_buffer, size_t optional_send_buffer_len,
743 uint32_t write_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800744 /* TODO: don't use magic number */
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700745 grpc_op ops[3];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700746 memset(ops, 0, sizeof(ops));
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700747 size_t nops = 1;
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700748 grpc_slice status_details_slice =
749 grpc_slice_from_copied_buffer(status_details, status_details_len);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800750 ops[0].op = GRPC_OP_SEND_STATUS_FROM_SERVER;
751 ops[0].data.send_status_from_server.status = status_code;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800752 ops[0].data.send_status_from_server.status_details = &status_details_slice;
Craig Tillerb256faa2015-07-23 11:28:16 -0700753 grpcsharp_metadata_array_move(
754 &(ctx->send_status_from_server.trailing_metadata), trailing_metadata);
Jan Tattermuscha0bb0652015-07-20 22:34:19 -0700755 ops[0].data.send_status_from_server.trailing_metadata_count =
756 ctx->send_status_from_server.trailing_metadata.count;
757 ops[0].data.send_status_from_server.trailing_metadata =
758 ctx->send_status_from_server.trailing_metadata.metadata;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700759 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700760 ops[0].reserved = NULL;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700761 if (optional_send_buffer) {
762 ops[nops].op = GRPC_OP_SEND_MESSAGE;
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700763 ctx->send_message =
764 string_to_byte_buffer(optional_send_buffer, optional_send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800765 ops[nops].data.send_message.send_message = ctx->send_message;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700766 ops[nops].flags = write_flags;
767 ops[nops].reserved = NULL;
Carl Mastrangelo5f3a1432017-02-07 08:14:29 -0800768 nops++;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700769 }
770 if (send_empty_initial_metadata) {
771 ops[nops].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700772 ops[nops].flags = 0;
773 ops[nops].reserved = NULL;
774 nops++;
775 }
Nicolas "Pixel" Nobleb457cd82015-08-12 01:14:17 +0200776 return grpc_call_start_batch(call, ops, nops, ctx, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800777}
778
Jan Tattermuschfa216732015-02-18 11:06:44 -0800779GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700780grpcsharp_call_recv_message(grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800781 /* TODO: don't use magic number */
782 grpc_op ops[1];
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800783 ops[0].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800784 ops[0].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700785 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700786 ops[0].reserved = NULL;
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200787 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
788 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800789}
790
Jan Tattermuschfa216732015-02-18 11:06:44 -0800791GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700792grpcsharp_call_start_serverside(grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800793 /* TODO: don't use magic number */
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700794 grpc_op ops[1];
795 ops[0].op = GRPC_OP_RECV_CLOSE_ON_SERVER;
796 ops[0].data.recv_close_on_server.cancelled =
797 (&ctx->recv_close_on_server_cancelled);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700798 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700799 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800800
Nicolas "Pixel" Noble720903a2015-08-12 20:07:54 +0200801 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
802 NULL);
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700803}
804
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700805GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_initial_metadata(
806 grpc_call *call, grpcsharp_batch_context *ctx,
807 grpc_metadata_array *initial_metadata) {
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700808 /* TODO: don't use magic number */
809 grpc_op ops[1];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700810 memset(ops, 0, sizeof(ops));
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700811 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
812 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
813 initial_metadata);
814 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
815 ops[0].data.send_initial_metadata.metadata =
816 ctx->send_initial_metadata.metadata;
Jan Tattermusch5321d492015-08-07 23:21:27 -0700817 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700818 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800819
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200820 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
821 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800822}
823
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700824GPR_EXPORT grpc_call_error GPR_CALLTYPE
825grpcsharp_call_set_credentials(grpc_call *call, grpc_call_credentials *creds) {
Jan Tattermusch08dea322015-10-26 17:34:10 -0700826 return grpc_call_set_credentials(call, creds);
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700827}
828
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800829/* Server */
830
831GPR_EXPORT grpc_server *GPR_CALLTYPE
Jan Tattermusch5ee8e772016-05-24 16:17:10 -0400832grpcsharp_server_create(const grpc_channel_args *args) {
833 return grpc_server_create(args, NULL);
834}
835
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700836GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_register_completion_queue(
837 grpc_server *server, grpc_completion_queue *cq) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200838 grpc_server_register_completion_queue(server, cq, NULL);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800839}
840
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700841GPR_EXPORT int32_t GPR_CALLTYPE grpcsharp_server_add_insecure_http2_port(
842 grpc_server *server, const char *addr) {
Craig Tillerc5ae3eb2015-08-03 10:42:22 -0700843 return grpc_server_add_insecure_http2_port(server, addr);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800844}
845
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800846GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_start(grpc_server *server) {
847 grpc_server_start(server);
848}
849
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700850GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_shutdown_and_notify_callback(
851 grpc_server *server, grpc_completion_queue *cq,
852 grpcsharp_batch_context *ctx) {
Jan Tattermuschc4e81ad2015-05-29 17:39:07 -0700853 grpc_server_shutdown_and_notify(server, cq, ctx);
854}
855
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700856GPR_EXPORT void GPR_CALLTYPE
857grpcsharp_server_cancel_all_calls(grpc_server *server) {
Jan Tattermuschc4e81ad2015-05-29 17:39:07 -0700858 grpc_server_cancel_all_calls(server);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800859}
860
861GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_destroy(grpc_server *server) {
862 grpc_server_destroy(server);
863}
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800864
Jan Tattermuschfa216732015-02-18 11:06:44 -0800865GPR_EXPORT grpc_call_error GPR_CALLTYPE
866grpcsharp_server_request_call(grpc_server *server, grpc_completion_queue *cq,
Jan Tattermusch6e901712016-10-21 00:42:37 +0200867 grpcsharp_request_call_context *ctx) {
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700868 return grpc_server_request_call(server, &(ctx->call), &(ctx->call_details),
869 &(ctx->request_metadata), cq, cq, ctx);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800870}
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800871
Jan Tattermusch15329232015-03-02 15:32:47 -0800872/* Security */
873
Jan Tattermusch660c15b2016-02-02 06:39:10 -0800874static char *default_pem_root_certs = NULL;
875
876static grpc_ssl_roots_override_result override_ssl_roots_handler(
877 char **pem_root_certs) {
878 if (!default_pem_root_certs) {
879 *pem_root_certs = NULL;
880 return GRPC_SSL_ROOTS_OVERRIDE_FAIL_PERMANENTLY;
881 }
882 *pem_root_certs = gpr_strdup(default_pem_root_certs);
883 return GRPC_SSL_ROOTS_OVERRIDE_OK;
884}
885
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700886GPR_EXPORT void GPR_CALLTYPE
887grpcsharp_override_default_ssl_roots(const char *pem_root_certs) {
Jan Tattermusch660c15b2016-02-02 06:39:10 -0800888 /*
889 * This currently wastes ~300kB of memory by keeping a copy of roots
890 * in a static variable, but for desktop/server use, the overhead
891 * is negligible. In the future, we might want to change the behavior
892 * for mobile (e.g. Xamarin).
893 */
894 default_pem_root_certs = gpr_strdup(pem_root_certs);
895 grpc_set_ssl_roots_override_callback(override_ssl_roots_handler);
896}
897
Jan Tattermusch08dea322015-10-26 17:34:10 -0700898GPR_EXPORT grpc_channel_credentials *GPR_CALLTYPE
Jan Tattermusch15329232015-03-02 15:32:47 -0800899grpcsharp_ssl_credentials_create(const char *pem_root_certs,
900 const char *key_cert_pair_cert_chain,
901 const char *key_cert_pair_private_key) {
902 grpc_ssl_pem_key_cert_pair key_cert_pair;
903 if (key_cert_pair_cert_chain || key_cert_pair_private_key) {
904 key_cert_pair.cert_chain = key_cert_pair_cert_chain;
905 key_cert_pair.private_key = key_cert_pair_private_key;
Julien Boeufc5b570f2015-08-25 17:47:55 -0700906 return grpc_ssl_credentials_create(pem_root_certs, &key_cert_pair, NULL);
Jan Tattermusch15329232015-03-02 15:32:47 -0800907 } else {
908 GPR_ASSERT(!key_cert_pair_cert_chain);
909 GPR_ASSERT(!key_cert_pair_private_key);
Julien Boeufc5b570f2015-08-25 17:47:55 -0700910 return grpc_ssl_credentials_create(pem_root_certs, NULL, NULL);
Jan Tattermusch15329232015-03-02 15:32:47 -0800911 }
912}
913
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700914GPR_EXPORT void GPR_CALLTYPE
915grpcsharp_channel_credentials_release(grpc_channel_credentials *creds) {
Jan Tattermusch08dea322015-10-26 17:34:10 -0700916 grpc_channel_credentials_release(creds);
917}
918
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700919GPR_EXPORT void GPR_CALLTYPE
920grpcsharp_call_credentials_release(grpc_call_credentials *creds) {
Jan Tattermusch08dea322015-10-26 17:34:10 -0700921 grpc_call_credentials_release(creds);
Jan Tattermusch15329232015-03-02 15:32:47 -0800922}
923
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700924GPR_EXPORT grpc_channel *GPR_CALLTYPE grpcsharp_secure_channel_create(
925 grpc_channel_credentials *creds, const char *target,
926 const grpc_channel_args *args) {
Julien Boeufc5b570f2015-08-25 17:47:55 -0700927 return grpc_secure_channel_create(creds, target, args, NULL);
Jan Tattermusch15329232015-03-02 15:32:47 -0800928}
929
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800930GPR_EXPORT grpc_server_credentials *GPR_CALLTYPE
931grpcsharp_ssl_server_credentials_create(
932 const char *pem_root_certs, const char **key_cert_pair_cert_chain_array,
Jan Tattermuschd27dfa72015-08-04 18:10:54 -0700933 const char **key_cert_pair_private_key_array, size_t num_key_cert_pairs,
934 int force_client_auth) {
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800935 size_t i;
936 grpc_server_credentials *creds;
937 grpc_ssl_pem_key_cert_pair *key_cert_pairs =
938 gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair) * num_key_cert_pairs);
939 memset(key_cert_pairs, 0,
940 sizeof(grpc_ssl_pem_key_cert_pair) * num_key_cert_pairs);
941
942 for (i = 0; i < num_key_cert_pairs; i++) {
943 if (key_cert_pair_cert_chain_array[i] ||
944 key_cert_pair_private_key_array[i]) {
945 key_cert_pairs[i].cert_chain = key_cert_pair_cert_chain_array[i];
946 key_cert_pairs[i].private_key = key_cert_pair_private_key_array[i];
947 }
948 }
Deepak Lukosedba4c5f2016-03-25 12:54:25 -0700949 creds = grpc_ssl_server_credentials_create_ex(
950 pem_root_certs, key_cert_pairs, num_key_cert_pairs,
951 force_client_auth
952 ? GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
953 : GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
954 NULL);
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800955 gpr_free(key_cert_pairs);
956 return creds;
957}
958
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700959GPR_EXPORT void GPR_CALLTYPE
960grpcsharp_server_credentials_release(grpc_server_credentials *creds) {
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800961 grpc_server_credentials_release(creds);
962}
963
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700964GPR_EXPORT int32_t GPR_CALLTYPE grpcsharp_server_add_secure_http2_port(
965 grpc_server *server, const char *addr, grpc_server_credentials *creds) {
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800966 return grpc_server_add_secure_http2_port(server, addr, creds);
967}
968
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700969GPR_EXPORT grpc_channel_credentials *GPR_CALLTYPE
970grpcsharp_composite_channel_credentials_create(
971 grpc_channel_credentials *channel_creds,
972 grpc_call_credentials *call_creds) {
973 return grpc_composite_channel_credentials_create(channel_creds, call_creds,
974 NULL);
Jan Tattermusch08dea322015-10-26 17:34:10 -0700975}
976
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700977GPR_EXPORT grpc_call_credentials *GPR_CALLTYPE
978grpcsharp_composite_call_credentials_create(grpc_call_credentials *creds1,
979 grpc_call_credentials *creds2) {
Jan Tattermusch08dea322015-10-26 17:34:10 -0700980 return grpc_composite_call_credentials_create(creds1, creds2, NULL);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -0700981}
982
983/* Metadata credentials plugin */
984
985GPR_EXPORT void GPR_CALLTYPE grpcsharp_metadata_credentials_notify_from_plugin(
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700986 grpc_credentials_plugin_metadata_cb cb, void *user_data,
987 grpc_metadata_array *metadata, grpc_status_code status,
988 const char *error_details) {
Jan Tattermuschae4ab4f2016-11-09 22:52:38 +0100989 if (metadata) {
990 cb(user_data, metadata->metadata, metadata->count, status, error_details);
991 } else {
992 cb(user_data, NULL, 0, status, error_details);
993 }
Jan Tattermusch5bd75d72015-09-08 10:55:20 -0700994}
995
996typedef void(GPR_CALLTYPE *grpcsharp_metadata_interceptor_func)(
Craig Tiller5b1c5f22017-04-19 09:52:18 -0700997 void *state, const char *service_url, const char *method_name,
998 grpc_credentials_plugin_metadata_cb cb, void *user_data,
999 int32_t is_destroy);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001000
Julien Boeuf3c957e62015-11-18 21:33:58 -08001001static void grpcsharp_get_metadata_handler(
1002 void *state, grpc_auth_metadata_context context,
1003 grpc_credentials_plugin_metadata_cb cb, void *user_data) {
Jan Tattermusch706a0102015-09-24 18:34:39 -07001004 grpcsharp_metadata_interceptor_func interceptor =
Craig Tiller7536af02015-12-22 13:49:30 -08001005 (grpcsharp_metadata_interceptor_func)(intptr_t)state;
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001006 interceptor(state, context.service_url, context.method_name, cb, user_data,
1007 0);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001008}
1009
1010static void grpcsharp_metadata_credentials_destroy_handler(void *state) {
Jan Tattermusch706a0102015-09-24 18:34:39 -07001011 grpcsharp_metadata_interceptor_func interceptor =
Craig Tiller7536af02015-12-22 13:49:30 -08001012 (grpcsharp_metadata_interceptor_func)(intptr_t)state;
Jan Tattermusch189fcf82015-12-02 13:41:12 -08001013 interceptor(state, NULL, NULL, NULL, NULL, 1);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001014}
1015
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001016GPR_EXPORT grpc_call_credentials *GPR_CALLTYPE
1017grpcsharp_metadata_credentials_create_from_plugin(
1018 grpcsharp_metadata_interceptor_func metadata_interceptor) {
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001019 grpc_metadata_credentials_plugin plugin;
1020 plugin.get_metadata = grpcsharp_get_metadata_handler;
1021 plugin.destroy = grpcsharp_metadata_credentials_destroy_handler;
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001022 plugin.state = (void *)(intptr_t)metadata_interceptor;
Julien Boeufcaf99352015-11-19 22:00:30 -08001023 plugin.type = "";
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001024 return grpc_metadata_credentials_create_from_plugin(plugin, NULL);
1025}
1026
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001027/* Auth context */
1028
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001029GPR_EXPORT grpc_auth_context *GPR_CALLTYPE
1030grpcsharp_call_auth_context(grpc_call *call) {
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001031 return grpc_call_auth_context(call);
1032}
1033
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001034GPR_EXPORT const char *GPR_CALLTYPE
1035grpcsharp_auth_context_peer_identity_property_name(
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001036 const grpc_auth_context *ctx) {
1037 return grpc_auth_context_peer_identity_property_name(ctx);
1038}
1039
1040GPR_EXPORT grpc_auth_property_iterator GPR_CALLTYPE
1041grpcsharp_auth_context_property_iterator(const grpc_auth_context *ctx) {
1042 return grpc_auth_context_property_iterator(ctx);
1043}
1044
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001045GPR_EXPORT const grpc_auth_property *GPR_CALLTYPE
1046grpcsharp_auth_property_iterator_next(grpc_auth_property_iterator *it) {
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001047 return grpc_auth_property_iterator_next(it);
1048}
1049
Craig Tiller5b1c5f22017-04-19 09:52:18 -07001050GPR_EXPORT void GPR_CALLTYPE
1051grpcsharp_auth_context_release(grpc_auth_context *ctx) {
Jan Tattermuschc9b03fe2017-02-06 08:45:00 -08001052 grpc_auth_context_release(ctx);
1053}
1054
Jan Tattermusch53398142015-02-24 08:21:57 -08001055/* Logging */
1056
Craig Tiller7536af02015-12-22 13:49:30 -08001057typedef void(GPR_CALLTYPE *grpcsharp_log_func)(const char *file, int32_t line,
1058 uint64_t thd_id,
Jan Tattermusch44553b52015-02-25 09:52:18 -08001059 const char *severity_string,
1060 const char *msg);
Jan Tattermusch53398142015-02-24 08:21:57 -08001061static grpcsharp_log_func log_func = NULL;
1062
1063/* Redirects gpr_log to log_func callback */
1064static void grpcsharp_log_handler(gpr_log_func_args *args) {
Jan Tattermusch44553b52015-02-25 09:52:18 -08001065 log_func(args->file, args->line, gpr_thd_currentid(),
1066 gpr_log_severity_string(args->severity), args->message);
Jan Tattermusch53398142015-02-24 08:21:57 -08001067}
1068
Jan Tattermusch44553b52015-02-25 09:52:18 -08001069GPR_EXPORT void GPR_CALLTYPE grpcsharp_redirect_log(grpcsharp_log_func func) {
1070 GPR_ASSERT(func);
1071 log_func = func;
1072 gpr_set_log_function(grpcsharp_log_handler);
Jan Tattermusch53398142015-02-24 08:21:57 -08001073}
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001074
Craig Tiller7536af02015-12-22 13:49:30 -08001075typedef void(GPR_CALLTYPE *test_callback_funcptr)(int32_t success);
Jan Tattermuscheb741d12015-06-11 19:09:15 -07001076
Jan Tattermuschc5a6aca2015-08-09 23:41:17 -07001077/* Version info */
Jan Tattermusch03ad9512015-08-10 11:06:58 -07001078GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_version_string() {
Jan Tattermuschc5a6aca2015-08-09 23:41:17 -07001079 return grpc_version_string();
1080}
1081
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001082/* For testing */
1083GPR_EXPORT void GPR_CALLTYPE
Jan Tattermuscheb741d12015-06-11 19:09:15 -07001084grpcsharp_test_callback(test_callback_funcptr callback) {
1085 callback(1);
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001086}
1087
1088/* For testing */
Jan Tattermusch44553b52015-02-25 09:52:18 -08001089GPR_EXPORT void *GPR_CALLTYPE grpcsharp_test_nop(void *ptr) { return ptr; }
Jan Tattermuschd3677482015-06-01 19:27:40 -07001090
1091/* For testing */
Craig Tiller7536af02015-12-22 13:49:30 -08001092GPR_EXPORT int32_t GPR_CALLTYPE grpcsharp_sizeof_grpc_event(void) {
Jan Tattermuschd3677482015-06-01 19:27:40 -07001093 return sizeof(grpc_event);
1094}