blob: 6a241190b274c0e957ecbd0c3b43c1e34ade1b91 [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 Tattermusch35e42802015-02-12 10:09:05 -080037#include <grpc/support/port_platform.h>
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080038#include <grpc/support/alloc.h>
Jan Tattermusch94c36532015-01-21 10:36:12 -080039#include <grpc/support/log.h>
Craig Tillerb37d53e2016-10-26 16:16:35 -070040#include <grpc/slice.h>
Masood Malekghassemi701af602015-06-03 15:01:17 -070041#include <grpc/support/string_util.h>
Jan Tattermusch53398142015-02-24 08:21:57 -080042#include <grpc/support/thd.h>
43#include <grpc/grpc.h>
Jan Tattermusch15329232015-03-02 15:32:47 -080044#include <grpc/grpc_security.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
Jan Tattermuschd3677482015-06-01 19:27:40 -070087GPR_EXPORT grpcsharp_batch_context *GPR_CALLTYPE grpcsharp_batch_context_create() {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -080088 grpcsharp_batch_context *ctx = gpr_malloc(sizeof(grpcsharp_batch_context));
89 memset(ctx, 0, sizeof(grpcsharp_batch_context));
90 return ctx;
91}
92
Jan Tattermusch6e901712016-10-21 00:42:37 +020093typedef struct {
94 grpc_call *call;
95 grpc_call_details call_details;
96 grpc_metadata_array request_metadata;
97} grpcsharp_request_call_context;
98
99GPR_EXPORT grpcsharp_request_call_context *GPR_CALLTYPE grpcsharp_request_call_context_create() {
100 grpcsharp_request_call_context *ctx = gpr_malloc(sizeof(grpcsharp_request_call_context));
101 memset(ctx, 0, sizeof(grpcsharp_request_call_context));
102 return ctx;
103}
104
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700105/*
106 * Destroys array->metadata.
107 * The array pointer itself is not freed.
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800108 */
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700109void grpcsharp_metadata_array_destroy_metadata_only(
110 grpc_metadata_array *array) {
111 gpr_free(array->metadata);
112}
113
114/*
115 * Destroys keys, values and array->metadata.
116 * The array pointer itself is not freed.
117 */
118void grpcsharp_metadata_array_destroy_metadata_including_entries(
119 grpc_metadata_array *array) {
120 size_t i;
121 if (array->metadata) {
122 for (i = 0; i < array->count; i++) {
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800123 grpc_slice_unref(array->metadata[i].key);
124 grpc_slice_unref(array->metadata[i].value);
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700125 }
126 }
127 gpr_free(array->metadata);
128}
129
130/*
131 * Fully destroys the metadata array.
132 */
133GPR_EXPORT void GPR_CALLTYPE
134grpcsharp_metadata_array_destroy_full(grpc_metadata_array *array) {
135 if (!array) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800136 return;
137 }
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700138 grpcsharp_metadata_array_destroy_metadata_including_entries(array);
139 gpr_free(array);
140}
141
142/*
143 * Creates an empty metadata array with given capacity.
144 * Array can later be destroyed by grpc_metadata_array_destroy_full.
145 */
146GPR_EXPORT grpc_metadata_array *GPR_CALLTYPE
147grpcsharp_metadata_array_create(size_t capacity) {
148 grpc_metadata_array *array =
149 (grpc_metadata_array *)gpr_malloc(sizeof(grpc_metadata_array));
150 grpc_metadata_array_init(array);
151 array->capacity = capacity;
152 array->count = 0;
153 if (capacity > 0) {
154 array->metadata =
155 (grpc_metadata *)gpr_malloc(sizeof(grpc_metadata) * capacity);
156 memset(array->metadata, 0, sizeof(grpc_metadata) * capacity);
157 } else {
158 array->metadata = NULL;
159 }
160 return array;
161}
162
163GPR_EXPORT void GPR_CALLTYPE
164grpcsharp_metadata_array_add(grpc_metadata_array *array, const char *key,
165 const char *value, size_t value_length) {
166 size_t i = array->count;
167 GPR_ASSERT(array->count < array->capacity);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800168 array->metadata[i].key = grpc_slice_from_copied_string(key);
169 array->metadata[i].value = grpc_slice_from_copied_buffer(value, value_length);
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700170 array->count++;
171}
172
Craig Tiller7536af02015-12-22 13:49:30 -0800173GPR_EXPORT intptr_t GPR_CALLTYPE
Jan Tattermuschec50f282015-07-20 19:44:29 -0700174grpcsharp_metadata_array_count(grpc_metadata_array *array) {
Craig Tiller7536af02015-12-22 13:49:30 -0800175 return (intptr_t)array->count;
Jan Tattermuschec50f282015-07-20 19:44:29 -0700176}
177
Jan Tattermusch77172022015-07-21 18:28:16 -0700178GPR_EXPORT const char *GPR_CALLTYPE
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800179grpcsharp_metadata_array_get_key(grpc_metadata_array *array, size_t index, size_t *key_length) {
Jan Tattermuschec50f282015-07-20 19:44:29 -0700180 GPR_ASSERT(index < array->count);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800181 *key_length = GRPC_SLICE_LENGTH(array->metadata[index].key);
182 return (char *)GRPC_SLICE_START_PTR(array->metadata[index].key);
Jan Tattermusch77172022015-07-21 18:28:16 -0700183}
184
185GPR_EXPORT const char *GPR_CALLTYPE
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800186grpcsharp_metadata_array_get_value(grpc_metadata_array *array, size_t index, size_t *value_length) {
Jan Tattermusch77172022015-07-21 18:28:16 -0700187 GPR_ASSERT(index < array->count);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800188 *value_length = GRPC_SLICE_LENGTH(array->metadata[index].value);
189 return (char *)GRPC_SLICE_START_PTR(array->metadata[index].value);
Jan Tattermuschec50f282015-07-20 19:44:29 -0700190}
191
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700192/* Move contents of metadata array */
193void grpcsharp_metadata_array_move(grpc_metadata_array *dest,
194 grpc_metadata_array *src) {
195 if (!src) {
196 dest->capacity = 0;
197 dest->count = 0;
198 dest->metadata = NULL;
199 return;
200 }
201
202 dest->capacity = src->capacity;
203 dest->count = src->count;
204 dest->metadata = src->metadata;
205
206 src->capacity = 0;
207 src->count = 0;
208 src->metadata = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800209}
210
Jan Tattermuschd3677482015-06-01 19:27:40 -0700211GPR_EXPORT void GPR_CALLTYPE grpcsharp_batch_context_destroy(grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800212 if (!ctx) {
213 return;
214 }
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700215 grpcsharp_metadata_array_destroy_metadata_including_entries(
216 &(ctx->send_initial_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800217
218 grpc_byte_buffer_destroy(ctx->send_message);
219
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700220 grpcsharp_metadata_array_destroy_metadata_including_entries(
Jan Tattermuschfa216732015-02-18 11:06:44 -0800221 &(ctx->send_status_from_server.trailing_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800222
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700223 grpcsharp_metadata_array_destroy_metadata_only(&(ctx->recv_initial_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800224
225 grpc_byte_buffer_destroy(ctx->recv_message);
226
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700227 grpcsharp_metadata_array_destroy_metadata_only(
228 &(ctx->recv_status_on_client.trailing_metadata));
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800229 grpc_slice_unref(ctx->recv_status_on_client.status_details);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800230
Jan Tattermusch6e901712016-10-21 00:42:37 +0200231 gpr_free(ctx);
232}
233
234GPR_EXPORT void GPR_CALLTYPE grpcsharp_request_call_context_destroy(grpcsharp_request_call_context *ctx) {
235 if (!ctx) {
236 return;
237 }
Jan Tattermuschfa216732015-02-18 11:06:44 -0800238 /* NOTE: ctx->server_rpc_new.call is not destroyed because callback handler is
239 supposed
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800240 to take its ownership. */
241
Jan Tattermusch6e901712016-10-21 00:42:37 +0200242 grpc_call_details_destroy(&(ctx->call_details));
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700243 grpcsharp_metadata_array_destroy_metadata_only(
Jan Tattermusch6e901712016-10-21 00:42:37 +0200244 &(ctx->request_metadata));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800245
246 gpr_free(ctx);
247}
248
Jan Tattermuschec50f282015-07-20 19:44:29 -0700249GPR_EXPORT const grpc_metadata_array *GPR_CALLTYPE
Jan Tattermusch77415b62015-07-20 20:18:26 -0700250grpcsharp_batch_context_recv_initial_metadata(
Jan Tattermuschec50f282015-07-20 19:44:29 -0700251 const grpcsharp_batch_context *ctx) {
252 return &(ctx->recv_initial_metadata);
253}
254
Craig Tiller7536af02015-12-22 13:49:30 -0800255GPR_EXPORT intptr_t GPR_CALLTYPE grpcsharp_batch_context_recv_message_length(
Jan Tattermuschfa216732015-02-18 11:06:44 -0800256 const grpcsharp_batch_context *ctx) {
Jan Tattermusch0d896ef2016-06-21 18:17:27 -0700257 grpc_byte_buffer_reader reader;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800258 if (!ctx->recv_message) {
Jan Tattermuschfa216732015-02-18 11:06:44 -0800259 return -1;
260 }
Alexander Polcyn22220472016-07-13 12:57:41 -0700261
262 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, ctx->recv_message));
Alexander Polcyn67656532016-09-01 18:50:13 -0700263 intptr_t result = (intptr_t)grpc_byte_buffer_length(reader.buffer_out);
264 grpc_byte_buffer_reader_destroy(&reader);
Alexander Polcyn22220472016-07-13 12:57:41 -0700265
Alexander Polcyn67656532016-09-01 18:50:13 -0700266 return result;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800267}
268
269/*
270 * Copies data from recv_message to a buffer. Fatal error occurs if
271 * buffer is too small.
272 */
Jan Tattermuschfa216732015-02-18 11:06:44 -0800273GPR_EXPORT void GPR_CALLTYPE grpcsharp_batch_context_recv_message_to_buffer(
274 const grpcsharp_batch_context *ctx, char *buffer, size_t buffer_len) {
David Garcia Quintas30bd4eb2015-06-01 21:08:59 -0700275 grpc_byte_buffer_reader reader;
Craig Tillerd41a4a72016-10-26 16:16:06 -0700276 grpc_slice slice;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800277 size_t offset = 0;
278
Alexander Polcyn22220472016-07-13 12:57:41 -0700279 GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, ctx->recv_message));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800280
David Garcia Quintas30bd4eb2015-06-01 21:08:59 -0700281 while (grpc_byte_buffer_reader_next(&reader, &slice)) {
Craig Tiller618e67d2016-10-26 21:08:10 -0700282 size_t len = GRPC_SLICE_LENGTH(slice);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800283 GPR_ASSERT(offset + len <= buffer_len);
Craig Tiller618e67d2016-10-26 21:08:10 -0700284 memcpy(buffer + offset, GRPC_SLICE_START_PTR(slice),
285 GRPC_SLICE_LENGTH(slice));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800286 offset += len;
Craig Tillerd41a4a72016-10-26 16:16:06 -0700287 grpc_slice_unref(slice);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800288 }
Alexander Polcyn67656532016-09-01 18:50:13 -0700289
290 grpc_byte_buffer_reader_destroy(&reader);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800291}
292
293GPR_EXPORT grpc_status_code GPR_CALLTYPE
Jan Tattermuschfa216732015-02-18 11:06:44 -0800294grpcsharp_batch_context_recv_status_on_client_status(
295 const grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800296 return ctx->recv_status_on_client.status;
297}
298
299GPR_EXPORT const char *GPR_CALLTYPE
Jan Tattermuschfa216732015-02-18 11:06:44 -0800300grpcsharp_batch_context_recv_status_on_client_details(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800301 const grpcsharp_batch_context *ctx, size_t *details_length) {
302 *details_length = GRPC_SLICE_LENGTH(ctx->recv_status_on_client.status_details);
303 return (char *)GRPC_SLICE_START_PTR(ctx->recv_status_on_client.status_details);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800304}
305
Jan Tattermuschec50f282015-07-20 19:44:29 -0700306GPR_EXPORT const grpc_metadata_array *GPR_CALLTYPE
307grpcsharp_batch_context_recv_status_on_client_trailing_metadata(
308 const grpcsharp_batch_context *ctx) {
309 return &(ctx->recv_status_on_client.trailing_metadata);
310}
311
Jan Tattermusch6e901712016-10-21 00:42:37 +0200312GPR_EXPORT grpc_call *GPR_CALLTYPE grpcsharp_request_call_context_call(
313 const grpcsharp_request_call_context *ctx) {
314 return ctx->call;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800315}
316
317GPR_EXPORT const char *GPR_CALLTYPE
Jan Tattermusch6e901712016-10-21 00:42:37 +0200318grpcsharp_request_call_context_method(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800319 const grpcsharp_request_call_context *ctx, size_t *method_length) {
320 *method_length = GRPC_SLICE_LENGTH(ctx->call_details.method);
321 return (char *)GRPC_SLICE_START_PTR(ctx->call_details.method);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800322}
323
Jan Tattermusch6e901712016-10-21 00:42:37 +0200324GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_request_call_context_host(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800325 const grpcsharp_request_call_context *ctx, size_t *host_length) {
326 *host_length = GRPC_SLICE_LENGTH(ctx->call_details.host);
327 return (char *)GRPC_SLICE_START_PTR(ctx->call_details.host);
Jan Tattermusch77415b62015-07-20 20:18:26 -0700328}
329
330GPR_EXPORT gpr_timespec GPR_CALLTYPE
Jan Tattermusch6e901712016-10-21 00:42:37 +0200331grpcsharp_request_call_context_deadline(
332 const grpcsharp_request_call_context *ctx) {
333 return ctx->call_details.deadline;
Jan Tattermusch77415b62015-07-20 20:18:26 -0700334}
335
Jan Tattermuschec50f282015-07-20 19:44:29 -0700336GPR_EXPORT const grpc_metadata_array *GPR_CALLTYPE
Jan Tattermusch6e901712016-10-21 00:42:37 +0200337grpcsharp_request_call_context_request_metadata(
338 const grpcsharp_request_call_context *ctx) {
339 return &(ctx->request_metadata);
Jan Tattermuschec50f282015-07-20 19:44:29 -0700340}
341
Craig Tiller7536af02015-12-22 13:49:30 -0800342GPR_EXPORT int32_t GPR_CALLTYPE
Jan Tattermusch8c2dd9d2015-05-04 09:20:43 -0700343grpcsharp_batch_context_recv_close_on_server_cancelled(
344 const grpcsharp_batch_context *ctx) {
Craig Tiller7536af02015-12-22 13:49:30 -0800345 return (int32_t) ctx->recv_close_on_server_cancelled;
Jan Tattermusch8c2dd9d2015-05-04 09:20:43 -0700346}
347
Jan Tattermusch35e42802015-02-12 10:09:05 -0800348/* Init & shutdown */
349
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800350GPR_EXPORT void GPR_CALLTYPE grpcsharp_init(void) { grpc_init(); }
Jan Tattermusch94c36532015-01-21 10:36:12 -0800351
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800352GPR_EXPORT void GPR_CALLTYPE grpcsharp_shutdown(void) { grpc_shutdown(); }
Jan Tattermusch94c36532015-01-21 10:36:12 -0800353
Jan Tattermusch35e42802015-02-12 10:09:05 -0800354/* Completion queue */
355
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800356GPR_EXPORT grpc_completion_queue *GPR_CALLTYPE
357grpcsharp_completion_queue_create(void) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200358 return grpc_completion_queue_create(NULL);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800359}
360
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800361GPR_EXPORT void GPR_CALLTYPE
362grpcsharp_completion_queue_shutdown(grpc_completion_queue *cq) {
Jan Tattermusch35e42802015-02-12 10:09:05 -0800363 grpc_completion_queue_shutdown(cq);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800364}
365
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800366GPR_EXPORT void GPR_CALLTYPE
367grpcsharp_completion_queue_destroy(grpc_completion_queue *cq) {
Jan Tattermusch35e42802015-02-12 10:09:05 -0800368 grpc_completion_queue_destroy(cq);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800369}
370
Jan Tattermuschd3677482015-06-01 19:27:40 -0700371GPR_EXPORT grpc_event GPR_CALLTYPE
372grpcsharp_completion_queue_next(grpc_completion_queue *cq) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200373 return grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
374 NULL);
Jan Tattermuschd3677482015-06-01 19:27:40 -0700375}
Jan Tattermusch94c36532015-01-21 10:36:12 -0800376
Jan Tattermuschd3677482015-06-01 19:27:40 -0700377GPR_EXPORT grpc_event GPR_CALLTYPE
378grpcsharp_completion_queue_pluck(grpc_completion_queue *cq, void *tag) {
Craig Tiller143e7bf2015-07-13 08:41:49 -0700379 return grpc_completion_queue_pluck(cq, tag,
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200380 gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
Jan Tattermusch94c36532015-01-21 10:36:12 -0800381}
Jan Tattermusch35e42802015-02-12 10:09:05 -0800382
383/* Channel */
384
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800385GPR_EXPORT grpc_channel *GPR_CALLTYPE
Craig Tillerd9aed1d2015-07-26 12:55:47 -0700386
Jan Tattermuscha96ac052015-07-24 14:49:30 -0700387grpcsharp_insecure_channel_create(const char *target, const grpc_channel_args *args) {
Nicolas "Pixel" Noble9d72b142015-08-08 01:45:38 +0200388 return grpc_insecure_channel_create(target, args, NULL);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800389}
390
391GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_destroy(grpc_channel *channel) {
392 grpc_channel_destroy(channel);
393}
394
Jan Tattermuschfa216732015-02-18 11:06:44 -0800395GPR_EXPORT grpc_call *GPR_CALLTYPE
Jan Tattermusch392fae22015-08-08 22:21:57 -0700396grpcsharp_channel_create_call(grpc_channel *channel, grpc_call *parent_call,
Craig Tiller7536af02015-12-22 13:49:30 -0800397 uint32_t propagation_mask,
Jan Tattermusch392fae22015-08-08 22:21:57 -0700398 grpc_completion_queue *cq,
Jan Tattermuschfa216732015-02-18 11:06:44 -0800399 const char *method, const char *host,
400 gpr_timespec deadline) {
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800401 grpc_slice method_slice = grpc_slice_from_copied_string(method);
402 grpc_slice *host_slice_ptr = NULL;
403 grpc_slice host_slice;
404 if (host != NULL) {
405 host_slice = grpc_slice_from_copied_string(host);
406 host_slice_ptr = &host_slice;
407 }
Jan Tattermusch4038cbf2016-12-12 20:36:48 +0100408 return grpc_channel_create_call(channel, parent_call, propagation_mask, cq,
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800409 method_slice, host_slice_ptr, deadline, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800410}
411
Jan Tattermuschd8bbdea2015-07-22 12:51:06 -0700412GPR_EXPORT grpc_connectivity_state GPR_CALLTYPE
Craig Tiller7536af02015-12-22 13:49:30 -0800413grpcsharp_channel_check_connectivity_state(grpc_channel *channel, int32_t try_to_connect) {
Jan Tattermuschd8bbdea2015-07-22 12:51:06 -0700414 return grpc_channel_check_connectivity_state(channel, try_to_connect);
415}
416
417GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_watch_connectivity_state(
418 grpc_channel *channel, grpc_connectivity_state last_observed_state,
419 gpr_timespec deadline, grpc_completion_queue *cq, grpcsharp_batch_context *ctx) {
Jan Tattermusch9fb1d202015-08-04 11:32:46 -0700420 grpc_channel_watch_connectivity_state(channel, last_observed_state,
Jan Tattermuschd8bbdea2015-07-22 12:51:06 -0700421 deadline, cq, ctx);
422}
423
Jan Tattermuschdead9052015-08-01 21:34:31 -0700424GPR_EXPORT char *GPR_CALLTYPE grpcsharp_channel_get_target(grpc_channel *channel) {
425 return grpc_channel_get_target(channel);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800426}
427
Jan Tattermusch15329232015-03-02 15:32:47 -0800428/* Channel args */
429
430GPR_EXPORT grpc_channel_args *GPR_CALLTYPE
431grpcsharp_channel_args_create(size_t num_args) {
432 grpc_channel_args *args =
433 (grpc_channel_args *)gpr_malloc(sizeof(grpc_channel_args));
434 memset(args, 0, sizeof(grpc_channel_args));
435
436 args->num_args = num_args;
437 args->args = (grpc_arg *)gpr_malloc(sizeof(grpc_arg) * num_args);
438 memset(args->args, 0, sizeof(grpc_arg) * num_args);
439 return args;
440}
441
442GPR_EXPORT void GPR_CALLTYPE
443grpcsharp_channel_args_set_string(grpc_channel_args *args, size_t index,
444 const char *key, const char *value) {
445 GPR_ASSERT(args);
446 GPR_ASSERT(index < args->num_args);
447 args->args[index].type = GRPC_ARG_STRING;
448 args->args[index].key = gpr_strdup(key);
449 args->args[index].value.string = gpr_strdup(value);
450}
451
452GPR_EXPORT void GPR_CALLTYPE
Jan Tattermusch2ddb5a62015-06-08 17:51:36 -0700453grpcsharp_channel_args_set_integer(grpc_channel_args *args, size_t index,
454 const char *key, int value) {
455 GPR_ASSERT(args);
456 GPR_ASSERT(index < args->num_args);
457 args->args[index].type = GRPC_ARG_INTEGER;
458 args->args[index].key = gpr_strdup(key);
459 args->args[index].value.integer = value;
460}
461
462GPR_EXPORT void GPR_CALLTYPE
Jan Tattermusch15329232015-03-02 15:32:47 -0800463grpcsharp_channel_args_destroy(grpc_channel_args *args) {
464 size_t i;
465 if (args) {
466 for (i = 0; i < args->num_args; i++) {
467 gpr_free(args->args[i].key);
468 if (args->args[i].type == GRPC_ARG_STRING) {
469 gpr_free(args->args[i].value.string);
470 }
471 }
472 gpr_free(args->args);
473 gpr_free(args);
474 }
475}
476
Jan Tattermusch35e42802015-02-12 10:09:05 -0800477/* Timespec */
478
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700479GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_now(gpr_clock_type clock_type) {
480 return gpr_now(clock_type);
481}
Jan Tattermusch35e42802015-02-12 10:09:05 -0800482
Jan Tattermuschf6410f52015-07-22 16:21:57 -0700483GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_inf_future(gpr_clock_type clock_type) {
484 return gpr_inf_future(clock_type);
485}
486
487GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_inf_past(gpr_clock_type clock_type) {
488 return gpr_inf_past(clock_type);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800489}
490
Jan Tattermusch7a3ac622015-07-23 18:40:48 -0700491GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_convert_clock_type(gpr_timespec t, gpr_clock_type target_clock) {
492 return gpr_convert_clock_type(t, target_clock);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800493}
494
Craig Tiller7536af02015-12-22 13:49:30 -0800495GPR_EXPORT int32_t GPR_CALLTYPE gprsharp_sizeof_timespec(void) {
Jan Tattermusch35e42802015-02-12 10:09:05 -0800496 return sizeof(gpr_timespec);
497}
498
499/* Call */
500
Jan Tattermusch35e42802015-02-12 10:09:05 -0800501GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_cancel(grpc_call *call) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200502 return grpc_call_cancel(call, NULL);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800503}
504
Jan Tattermuscha9edeef2015-02-12 14:29:10 -0800505GPR_EXPORT grpc_call_error GPR_CALLTYPE
506grpcsharp_call_cancel_with_status(grpc_call *call, grpc_status_code status,
507 const char *description) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200508 return grpc_call_cancel_with_status(call, status, description, NULL);
Jan Tattermusch35e42802015-02-12 10:09:05 -0800509}
510
Jan Tattermusch062c3292015-07-23 20:28:42 -0700511GPR_EXPORT char *GPR_CALLTYPE grpcsharp_call_get_peer(grpc_call *call) {
512 return grpc_call_get_peer(call);
513}
514
515GPR_EXPORT void GPR_CALLTYPE gprsharp_free(void *p) {
516 gpr_free(p);
517}
518
Jan Tattermusch35e42802015-02-12 10:09:05 -0800519GPR_EXPORT void GPR_CALLTYPE grpcsharp_call_destroy(grpc_call *call) {
520 grpc_call_destroy(call);
521}
522
Jan Tattermuschfa216732015-02-18 11:06:44 -0800523GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700524grpcsharp_call_start_unary(grpc_call *call, grpcsharp_batch_context *ctx,
Jan Tattermusch43416da2016-11-22 17:28:22 +0100525 const char *send_buffer, size_t send_buffer_len, uint32_t write_flags,
526 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800527 /* TODO: don't use magic number */
528 grpc_op ops[6];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700529 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800530 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700531 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
532 initial_metadata);
533 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
534 ops[0].data.send_initial_metadata.metadata =
535 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100536 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700537 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800538
539 ops[1].op = GRPC_OP_SEND_MESSAGE;
540 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800541 ops[1].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700542 ops[1].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700543 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800544
545 ops[2].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700546 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700547 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800548
549 ops[3].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800550 ops[3].data.recv_initial_metadata.recv_initial_metadata =
551 &(ctx->recv_initial_metadata);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700552 ops[3].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700553 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800554
555 ops[4].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800556 ops[4].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700557 ops[4].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700558 ops[4].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800559
560 ops[5].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
Jan Tattermuschfa216732015-02-18 11:06:44 -0800561 ops[5].data.recv_status_on_client.trailing_metadata =
562 &(ctx->recv_status_on_client.trailing_metadata);
563 ops[5].data.recv_status_on_client.status =
564 &(ctx->recv_status_on_client.status);
Jan Tattermuschfa216732015-02-18 11:06:44 -0800565 ops[5].data.recv_status_on_client.status_details =
566 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700567 ops[5].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700568 ops[5].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800569
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200570 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
571 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800572}
573
Jan Tattermuschfa216732015-02-18 11:06:44 -0800574GPR_EXPORT grpc_call_error GPR_CALLTYPE
575grpcsharp_call_start_client_streaming(grpc_call *call,
Jan Tattermuschd3677482015-06-01 19:27:40 -0700576 grpcsharp_batch_context *ctx,
Jan Tattermusch43416da2016-11-22 17:28:22 +0100577 grpc_metadata_array *initial_metadata,
578 uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800579 /* TODO: don't use magic number */
580 grpc_op ops[4];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700581 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800582 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700583 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
584 initial_metadata);
585 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
586 ops[0].data.send_initial_metadata.metadata =
587 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100588 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700589 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800590
591 ops[1].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800592 ops[1].data.recv_initial_metadata.recv_initial_metadata =
593 &(ctx->recv_initial_metadata);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700594 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700595 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800596
597 ops[2].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800598 ops[2].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700599 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700600 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800601
602 ops[3].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
Jan Tattermuschfa216732015-02-18 11:06:44 -0800603 ops[3].data.recv_status_on_client.trailing_metadata =
604 &(ctx->recv_status_on_client.trailing_metadata);
605 ops[3].data.recv_status_on_client.status =
606 &(ctx->recv_status_on_client.status);
Jan Tattermuschfa216732015-02-18 11:06:44 -0800607 ops[3].data.recv_status_on_client.status_details =
608 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700609 ops[3].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700610 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800611
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200612 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
613 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800614}
615
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700616GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_server_streaming(
Jan Tattermuschd3677482015-06-01 19:27:40 -0700617 grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer,
Jan Tattermusch43416da2016-11-22 17:28:22 +0100618 size_t send_buffer_len, uint32_t write_flags,
619 grpc_metadata_array *initial_metadata, uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800620 /* TODO: don't use magic number */
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700621 grpc_op ops[4];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700622 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800623 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700624 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
625 initial_metadata);
626 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
627 ops[0].data.send_initial_metadata.metadata =
628 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100629 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700630 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800631
632 ops[1].op = GRPC_OP_SEND_MESSAGE;
633 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800634 ops[1].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700635 ops[1].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700636 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800637
638 ops[2].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700639 ops[2].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700640 ops[2].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800641
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700642 ops[3].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
643 ops[3].data.recv_status_on_client.trailing_metadata =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800644 &(ctx->recv_status_on_client.trailing_metadata);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700645 ops[3].data.recv_status_on_client.status =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800646 &(ctx->recv_status_on_client.status);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700647 ops[3].data.recv_status_on_client.status_details =
Jan Tattermuschfa216732015-02-18 11:06:44 -0800648 &(ctx->recv_status_on_client.status_details);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700649 ops[3].flags = 0;
650 ops[3].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800651
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200652 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
653 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800654}
655
Jan Tattermuschfa216732015-02-18 11:06:44 -0800656GPR_EXPORT grpc_call_error GPR_CALLTYPE
657grpcsharp_call_start_duplex_streaming(grpc_call *call,
Jan Tattermuschd3677482015-06-01 19:27:40 -0700658 grpcsharp_batch_context *ctx,
Jan Tattermusch43416da2016-11-22 17:28:22 +0100659 grpc_metadata_array *initial_metadata,
660 uint32_t initial_metadata_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800661 /* TODO: don't use magic number */
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700662 grpc_op ops[2];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700663 memset(ops, 0, sizeof(ops));
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800664 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermuschc0b37212015-03-13 08:35:41 -0700665 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
666 initial_metadata);
667 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
668 ops[0].data.send_initial_metadata.metadata =
669 ctx->send_initial_metadata.metadata;
Jan Tattermusch43416da2016-11-22 17:28:22 +0100670 ops[0].flags = initial_metadata_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700671 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800672
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700673 ops[1].op = GRPC_OP_RECV_STATUS_ON_CLIENT;
674 ops[1].data.recv_status_on_client.trailing_metadata =
675 &(ctx->recv_status_on_client.trailing_metadata);
676 ops[1].data.recv_status_on_client.status =
677 &(ctx->recv_status_on_client.status);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700678 ops[1].data.recv_status_on_client.status_details =
679 &(ctx->recv_status_on_client.status_details);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700680 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700681 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800682
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200683 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
684 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800685}
686
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700687GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_recv_initial_metadata(
Jan Tattermusch706a0102015-09-24 18:34:39 -0700688 grpc_call *call, grpcsharp_batch_context *ctx) {
689 /* TODO: don't use magic number */
690 grpc_op ops[1];
691 ops[0].op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800692 ops[0].data.recv_initial_metadata.recv_initial_metadata =
693 &(ctx->recv_initial_metadata);
Jan Tattermusch706a0102015-09-24 18:34:39 -0700694 ops[0].flags = 0;
695 ops[0].reserved = NULL;
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700696
Jan Tattermusch706a0102015-09-24 18:34:39 -0700697 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
698 NULL);
Jan Tattermusch4c25efa2015-08-21 16:07:57 -0700699}
700
Jan Tattermuschfa216732015-02-18 11:06:44 -0800701GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700702grpcsharp_call_send_message(grpc_call *call, grpcsharp_batch_context *ctx,
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700703 const char *send_buffer, size_t send_buffer_len,
Craig Tiller7536af02015-12-22 13:49:30 -0800704 uint32_t write_flags,
705 int32_t send_empty_initial_metadata) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800706 /* TODO: don't use magic number */
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700707 grpc_op ops[2];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700708 memset(ops, 0, sizeof(ops));
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700709 size_t nops = send_empty_initial_metadata ? 2 : 1;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800710 ops[0].op = GRPC_OP_SEND_MESSAGE;
711 ctx->send_message = string_to_byte_buffer(send_buffer, send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800712 ops[0].data.send_message.send_message = ctx->send_message;
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700713 ops[0].flags = write_flags;
Craig Tiller42758992015-08-18 10:34:32 -0700714 ops[0].reserved = NULL;
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700715 ops[1].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermusch8368b2e2015-08-07 01:18:37 -0700716 ops[1].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700717 ops[1].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800718
Nicolas "Pixel" Nobleb457cd82015-08-12 01:14:17 +0200719 return grpc_call_start_batch(call, ops, nops, ctx, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800720}
721
Jan Tattermuschfa216732015-02-18 11:06:44 -0800722GPR_EXPORT grpc_call_error GPR_CALLTYPE
723grpcsharp_call_send_close_from_client(grpc_call *call,
Jan Tattermuschd3677482015-06-01 19:27:40 -0700724 grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800725 /* TODO: don't use magic number */
726 grpc_op ops[1];
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800727 ops[0].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700728 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700729 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800730
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200731 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
732 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800733}
734
Craig Tillerb256faa2015-07-23 11:28:16 -0700735GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_status_from_server(
736 grpc_call *call, grpcsharp_batch_context *ctx, grpc_status_code status_code,
Jan Tattermusch60324922017-01-18 21:15:12 +0100737 const char *status_details, size_t status_details_len,
738 grpc_metadata_array *trailing_metadata,
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700739 int32_t send_empty_initial_metadata, const char* optional_send_buffer,
740 size_t optional_send_buffer_len, uint32_t write_flags) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800741 /* TODO: don't use magic number */
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700742 grpc_op ops[3];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700743 memset(ops, 0, sizeof(ops));
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700744 size_t nops = 1;
Jan Tattermusch60324922017-01-18 21:15:12 +0100745 grpc_slice status_details_slice = grpc_slice_from_copied_buffer(status_details, status_details_len);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800746 ops[0].op = GRPC_OP_SEND_STATUS_FROM_SERVER;
747 ops[0].data.send_status_from_server.status = status_code;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800748 ops[0].data.send_status_from_server.status_details = &status_details_slice;
Craig Tillerb256faa2015-07-23 11:28:16 -0700749 grpcsharp_metadata_array_move(
750 &(ctx->send_status_from_server.trailing_metadata), trailing_metadata);
Jan Tattermuscha0bb0652015-07-20 22:34:19 -0700751 ops[0].data.send_status_from_server.trailing_metadata_count =
752 ctx->send_status_from_server.trailing_metadata.count;
753 ops[0].data.send_status_from_server.trailing_metadata =
754 ctx->send_status_from_server.trailing_metadata.metadata;
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700755 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700756 ops[0].reserved = NULL;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700757 if (optional_send_buffer) {
758 ops[nops].op = GRPC_OP_SEND_MESSAGE;
759 ctx->send_message = string_to_byte_buffer(optional_send_buffer,
760 optional_send_buffer_len);
Mark D. Roth448c1f02017-01-25 10:44:30 -0800761 ops[nops].data.send_message.send_message = ctx->send_message;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700762 ops[nops].flags = write_flags;
763 ops[nops].reserved = NULL;
Carl Mastrangelo5f3a1432017-02-07 08:14:29 -0800764 nops++;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700765 }
766 if (send_empty_initial_metadata) {
767 ops[nops].op = GRPC_OP_SEND_INITIAL_METADATA;
Jan Tattermusch305ffd42016-05-04 10:26:24 -0700768 ops[nops].flags = 0;
769 ops[nops].reserved = NULL;
770 nops++;
771 }
Nicolas "Pixel" Nobleb457cd82015-08-12 01:14:17 +0200772 return grpc_call_start_batch(call, ops, nops, ctx, NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800773}
774
Jan Tattermuschfa216732015-02-18 11:06:44 -0800775GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700776grpcsharp_call_recv_message(grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800777 /* TODO: don't use magic number */
778 grpc_op ops[1];
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800779 ops[0].op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth448c1f02017-01-25 10:44:30 -0800780 ops[0].data.recv_message.recv_message = &(ctx->recv_message);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700781 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700782 ops[0].reserved = NULL;
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200783 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
784 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800785}
786
Jan Tattermuschfa216732015-02-18 11:06:44 -0800787GPR_EXPORT grpc_call_error GPR_CALLTYPE
Jan Tattermuschd3677482015-06-01 19:27:40 -0700788grpcsharp_call_start_serverside(grpc_call *call, grpcsharp_batch_context *ctx) {
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800789 /* TODO: don't use magic number */
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700790 grpc_op ops[1];
791 ops[0].op = GRPC_OP_RECV_CLOSE_ON_SERVER;
792 ops[0].data.recv_close_on_server.cancelled =
793 (&ctx->recv_close_on_server_cancelled);
David Garcia Quintasd7e0bea2015-06-15 13:27:17 -0700794 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700795 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800796
Nicolas "Pixel" Noble720903a2015-08-12 20:07:54 +0200797 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
798 NULL);
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700799}
800
801GPR_EXPORT grpc_call_error GPR_CALLTYPE
802grpcsharp_call_send_initial_metadata(grpc_call *call,
803 grpcsharp_batch_context *ctx,
Jan Tattermusch5321d492015-08-07 23:21:27 -0700804 grpc_metadata_array *initial_metadata) {
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700805 /* TODO: don't use magic number */
806 grpc_op ops[1];
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700807 memset(ops, 0, sizeof(ops));
Jan Tattermuschbff90ac2015-08-06 21:30:26 -0700808 ops[0].op = GRPC_OP_SEND_INITIAL_METADATA;
809 grpcsharp_metadata_array_move(&(ctx->send_initial_metadata),
810 initial_metadata);
811 ops[0].data.send_initial_metadata.count = ctx->send_initial_metadata.count;
812 ops[0].data.send_initial_metadata.metadata =
813 ctx->send_initial_metadata.metadata;
Jan Tattermusch5321d492015-08-07 23:21:27 -0700814 ops[0].flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700815 ops[0].reserved = NULL;
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800816
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200817 return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx,
818 NULL);
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800819}
820
Jan Tattermusch08dea322015-10-26 17:34:10 -0700821GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_set_credentials(
822 grpc_call *call,
823 grpc_call_credentials *creds) {
824 return grpc_call_set_credentials(call, creds);
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700825}
826
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800827/* Server */
828
829GPR_EXPORT grpc_server *GPR_CALLTYPE
Jan Tattermusch5ee8e772016-05-24 16:17:10 -0400830grpcsharp_server_create(const grpc_channel_args *args) {
831 return grpc_server_create(args, NULL);
832}
833
834GPR_EXPORT void GPR_CALLTYPE
835grpcsharp_server_register_completion_queue(grpc_server *server,
836 grpc_completion_queue *cq) {
Nicolas "Pixel" Noble8c597912015-08-07 20:42:22 +0200837 grpc_server_register_completion_queue(server, cq, NULL);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800838}
839
Craig Tiller7536af02015-12-22 13:49:30 -0800840GPR_EXPORT int32_t GPR_CALLTYPE
Jan Tattermuscha96ac052015-07-24 14:49:30 -0700841grpcsharp_server_add_insecure_http2_port(grpc_server *server, const char *addr) {
Craig Tillerc5ae3eb2015-08-03 10:42:22 -0700842 return grpc_server_add_insecure_http2_port(server, addr);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800843}
844
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800845GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_start(grpc_server *server) {
846 grpc_server_start(server);
847}
848
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800849GPR_EXPORT void GPR_CALLTYPE
Jan Tattermusch1215c332015-05-04 19:39:59 -0700850grpcsharp_server_shutdown_and_notify_callback(grpc_server *server,
Jan Tattermuschc4e81ad2015-05-29 17:39:07 -0700851 grpc_completion_queue *cq,
Jan Tattermuschd3677482015-06-01 19:27:40 -0700852 grpcsharp_batch_context *ctx) {
Jan Tattermuschc4e81ad2015-05-29 17:39:07 -0700853 grpc_server_shutdown_and_notify(server, cq, ctx);
854}
855
856GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_cancel_all_calls(grpc_server *server) {
857 grpc_server_cancel_all_calls(server);
Jan Tattermusch3f8962c2015-02-17 19:20:39 -0800858}
859
860GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_destroy(grpc_server *server) {
861 grpc_server_destroy(server);
862}
Jan Tattermusch337a2dd2015-02-13 15:41:41 -0800863
Jan Tattermuschfa216732015-02-18 11:06:44 -0800864GPR_EXPORT grpc_call_error GPR_CALLTYPE
865grpcsharp_server_request_call(grpc_server *server, grpc_completion_queue *cq,
Jan Tattermusch6e901712016-10-21 00:42:37 +0200866 grpcsharp_request_call_context *ctx) {
Jan Tattermuschfa216732015-02-18 11:06:44 -0800867 return grpc_server_request_call(
Jan Tattermusch6e901712016-10-21 00:42:37 +0200868 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
886GPR_EXPORT void GPR_CALLTYPE grpcsharp_override_default_ssl_roots(
887 const char *pem_root_certs) {
888 /*
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
Jan Tattermusch08dea322015-10-26 17:34:10 -0700914GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_credentials_release(
915 grpc_channel_credentials *creds) {
916 grpc_channel_credentials_release(creds);
917}
918
919GPR_EXPORT void GPR_CALLTYPE grpcsharp_call_credentials_release(
920 grpc_call_credentials *creds) {
921 grpc_call_credentials_release(creds);
Jan Tattermusch15329232015-03-02 15:32:47 -0800922}
923
924GPR_EXPORT grpc_channel *GPR_CALLTYPE
Jan Tattermusch08dea322015-10-26 17:34:10 -0700925grpcsharp_secure_channel_create(grpc_channel_credentials *creds,
926 const char *target,
Jan Tattermusch15329232015-03-02 15:32:47 -0800927 const grpc_channel_args *args) {
Julien Boeufc5b570f2015-08-25 17:47:55 -0700928 return grpc_secure_channel_create(creds, target, args, NULL);
Jan Tattermusch15329232015-03-02 15:32:47 -0800929}
930
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800931GPR_EXPORT grpc_server_credentials *GPR_CALLTYPE
932grpcsharp_ssl_server_credentials_create(
933 const char *pem_root_certs, const char **key_cert_pair_cert_chain_array,
Jan Tattermuschd27dfa72015-08-04 18:10:54 -0700934 const char **key_cert_pair_private_key_array, size_t num_key_cert_pairs,
935 int force_client_auth) {
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800936 size_t i;
937 grpc_server_credentials *creds;
938 grpc_ssl_pem_key_cert_pair *key_cert_pairs =
939 gpr_malloc(sizeof(grpc_ssl_pem_key_cert_pair) * num_key_cert_pairs);
940 memset(key_cert_pairs, 0,
941 sizeof(grpc_ssl_pem_key_cert_pair) * num_key_cert_pairs);
942
943 for (i = 0; i < num_key_cert_pairs; i++) {
944 if (key_cert_pair_cert_chain_array[i] ||
945 key_cert_pair_private_key_array[i]) {
946 key_cert_pairs[i].cert_chain = key_cert_pair_cert_chain_array[i];
947 key_cert_pairs[i].private_key = key_cert_pair_private_key_array[i];
948 }
949 }
Deepak Lukosedba4c5f2016-03-25 12:54:25 -0700950 creds = grpc_ssl_server_credentials_create_ex(
951 pem_root_certs, key_cert_pairs, num_key_cert_pairs,
952 force_client_auth
953 ? GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
954 : GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE,
955 NULL);
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800956 gpr_free(key_cert_pairs);
957 return creds;
958}
959
Jan Tattermusch8c5d68b2015-04-07 12:34:50 -0700960GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_credentials_release(
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800961 grpc_server_credentials *creds) {
962 grpc_server_credentials_release(creds);
963}
964
Craig Tiller7536af02015-12-22 13:49:30 -0800965GPR_EXPORT int32_t GPR_CALLTYPE
Jan Tattermuschb0829eb2015-03-03 09:30:55 -0800966grpcsharp_server_add_secure_http2_port(grpc_server *server, const char *addr,
967 grpc_server_credentials *creds) {
968 return grpc_server_add_secure_http2_port(server, addr, creds);
969}
970
Jan Tattermusch08dea322015-10-26 17:34:10 -0700971GPR_EXPORT grpc_channel_credentials *GPR_CALLTYPE grpcsharp_composite_channel_credentials_create(
972 grpc_channel_credentials *channel_creds,
973 grpc_call_credentials *call_creds) {
974 return grpc_composite_channel_credentials_create(channel_creds, call_creds, NULL);
975}
976
977GPR_EXPORT grpc_call_credentials *GPR_CALLTYPE grpcsharp_composite_call_credentials_create(
978 grpc_call_credentials *creds1,
979 grpc_call_credentials *creds2) {
980 return grpc_composite_call_credentials_create(creds1, creds2, NULL);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -0700981}
982
Jan Tattermusch660c15b2016-02-02 06:39:10 -0800983
Jan Tattermusch5bd75d72015-09-08 10:55:20 -0700984/* Metadata credentials plugin */
985
986GPR_EXPORT void GPR_CALLTYPE grpcsharp_metadata_credentials_notify_from_plugin(
Jan Tattermusch706a0102015-09-24 18:34:39 -0700987 grpc_credentials_plugin_metadata_cb cb,
988 void *user_data, grpc_metadata_array *metadata,
989 grpc_status_code status, const char *error_details) {
Jan Tattermuschae4ab4f2016-11-09 22:52:38 +0100990 if (metadata) {
991 cb(user_data, metadata->metadata, metadata->count, status, error_details);
992 } else {
993 cb(user_data, NULL, 0, status, error_details);
994 }
Jan Tattermusch5bd75d72015-09-08 10:55:20 -0700995}
996
997typedef void(GPR_CALLTYPE *grpcsharp_metadata_interceptor_func)(
Jan Tattermusch189fcf82015-12-02 13:41:12 -0800998 void *state, const char *service_url, const char *method_name,
999 grpc_credentials_plugin_metadata_cb cb,
Craig Tiller7536af02015-12-22 13:49:30 -08001000 void *user_data, int32_t is_destroy);
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001001
Julien Boeuf3c957e62015-11-18 21:33:58 -08001002static void grpcsharp_get_metadata_handler(
1003 void *state, grpc_auth_metadata_context context,
1004 grpc_credentials_plugin_metadata_cb cb, void *user_data) {
Jan Tattermusch706a0102015-09-24 18:34:39 -07001005 grpcsharp_metadata_interceptor_func interceptor =
Craig Tiller7536af02015-12-22 13:49:30 -08001006 (grpcsharp_metadata_interceptor_func)(intptr_t)state;
Jan Tattermusch189fcf82015-12-02 13:41:12 -08001007 interceptor(state, context.service_url, context.method_name, cb, user_data, 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
Jan Tattermusch08dea322015-10-26 17:34:10 -07001016GPR_EXPORT grpc_call_credentials *GPR_CALLTYPE grpcsharp_metadata_credentials_create_from_plugin(
Jan Tattermusch706a0102015-09-24 18:34:39 -07001017 grpcsharp_metadata_interceptor_func metadata_interceptor) {
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001018 grpc_metadata_credentials_plugin plugin;
1019 plugin.get_metadata = grpcsharp_get_metadata_handler;
1020 plugin.destroy = grpcsharp_metadata_credentials_destroy_handler;
Craig Tiller7536af02015-12-22 13:49:30 -08001021 plugin.state = (void*)(intptr_t)metadata_interceptor;
Julien Boeufcaf99352015-11-19 22:00:30 -08001022 plugin.type = "";
Jan Tattermusch5bd75d72015-09-08 10:55:20 -07001023 return grpc_metadata_credentials_create_from_plugin(plugin, NULL);
1024}
1025
Jan Tattermusch53398142015-02-24 08:21:57 -08001026/* Logging */
1027
Craig Tiller7536af02015-12-22 13:49:30 -08001028typedef void(GPR_CALLTYPE *grpcsharp_log_func)(const char *file, int32_t line,
1029 uint64_t thd_id,
Jan Tattermusch44553b52015-02-25 09:52:18 -08001030 const char *severity_string,
1031 const char *msg);
Jan Tattermusch53398142015-02-24 08:21:57 -08001032static grpcsharp_log_func log_func = NULL;
1033
1034/* Redirects gpr_log to log_func callback */
1035static void grpcsharp_log_handler(gpr_log_func_args *args) {
Jan Tattermusch44553b52015-02-25 09:52:18 -08001036 log_func(args->file, args->line, gpr_thd_currentid(),
1037 gpr_log_severity_string(args->severity), args->message);
Jan Tattermusch53398142015-02-24 08:21:57 -08001038}
1039
Jan Tattermusch44553b52015-02-25 09:52:18 -08001040GPR_EXPORT void GPR_CALLTYPE grpcsharp_redirect_log(grpcsharp_log_func func) {
1041 GPR_ASSERT(func);
1042 log_func = func;
1043 gpr_set_log_function(grpcsharp_log_handler);
Jan Tattermusch53398142015-02-24 08:21:57 -08001044}
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001045
Craig Tiller7536af02015-12-22 13:49:30 -08001046typedef void(GPR_CALLTYPE *test_callback_funcptr)(int32_t success);
Jan Tattermuscheb741d12015-06-11 19:09:15 -07001047
Jan Tattermuschc5a6aca2015-08-09 23:41:17 -07001048/* Version info */
Jan Tattermusch03ad9512015-08-10 11:06:58 -07001049GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_version_string() {
Jan Tattermuschc5a6aca2015-08-09 23:41:17 -07001050 return grpc_version_string();
1051}
1052
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001053/* For testing */
1054GPR_EXPORT void GPR_CALLTYPE
Jan Tattermuscheb741d12015-06-11 19:09:15 -07001055grpcsharp_test_callback(test_callback_funcptr callback) {
1056 callback(1);
Jan Tattermusch50faa8f2015-02-21 17:51:52 -08001057}
1058
1059/* For testing */
Jan Tattermusch44553b52015-02-25 09:52:18 -08001060GPR_EXPORT void *GPR_CALLTYPE grpcsharp_test_nop(void *ptr) { return ptr; }
Jan Tattermuschd3677482015-06-01 19:27:40 -07001061
1062/* For testing */
Craig Tiller7536af02015-12-22 13:49:30 -08001063GPR_EXPORT int32_t GPR_CALLTYPE grpcsharp_sizeof_grpc_event(void) {
Jan Tattermuschd3677482015-06-01 19:27:40 -07001064 return sizeof(grpc_event);
1065}