diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/csharp/ext/grpc_csharp_ext.c | 254 |
1 files changed, 218 insertions, 36 deletions
diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c index 74d11c655b..9860ab7ea3 100644 --- a/src/csharp/ext/grpc_csharp_ext.c +++ b/src/csharp/ext/grpc_csharp_ext.c @@ -1,9 +1,23 @@ +#include <grpc/support/port_platform.h> #include <grpc/grpc.h> #include <grpc/support/log.h> #include <grpc/support/slice.h> #include <string.h> +#ifdef GPR_WIN32 +#define GPR_EXPORT __declspec(dllexport) +#define GPR_CALLTYPE __stdcall +#endif + +#ifndef GPR_EXPORT +#define GPR_EXPORT +#endif + +#ifndef GPR_CALLTYPE +#define GPR_CALLTYPE +#endif + grpc_byte_buffer *string_to_byte_buffer(const char *buffer, size_t len) { gpr_slice slice = gpr_slice_from_copied_buffer(buffer, len); grpc_byte_buffer *bb = grpc_byte_buffer_create(&slice, 1); @@ -11,40 +25,112 @@ grpc_byte_buffer *string_to_byte_buffer(const char *buffer, size_t len) { return bb; } -void grpc_call_start_write_from_copied_buffer(grpc_call *call, - const char *buffer, size_t len, - void *tag, gpr_uint32 flags) { - grpc_byte_buffer *byte_buffer = string_to_byte_buffer(buffer, len); - GPR_ASSERT(grpc_call_start_write_old(call, byte_buffer, tag, flags) == - GRPC_CALL_OK); - grpc_byte_buffer_destroy(byte_buffer); +/* Init & shutdown */ + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_init(void) { + grpc_init(); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_shutdown(void) { + grpc_shutdown(); +} + +/* Completion queue */ + +GPR_EXPORT grpc_completion_queue * GPR_CALLTYPE grpcsharp_completion_queue_create(void) { + return grpc_completion_queue_create(); +} + +GPR_EXPORT grpc_event * GPR_CALLTYPE grpcsharp_completion_queue_next( + grpc_completion_queue *cq, gpr_timespec deadline) { + return grpc_completion_queue_next(cq, deadline); +} + +GPR_EXPORT grpc_event * GPR_CALLTYPE grpcsharp_completion_queue_pluck( + grpc_completion_queue *cq, void *tag, gpr_timespec deadline) { + return grpc_completion_queue_pluck(cq, tag, deadline); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_completion_queue_shutdown(grpc_completion_queue *cq) { + grpc_completion_queue_shutdown(cq); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_completion_queue_destroy(grpc_completion_queue *cq) { + grpc_completion_queue_destroy(cq); +} + +GPR_EXPORT grpc_completion_type GPR_CALLTYPE grpcsharp_completion_queue_next_with_callback( + grpc_completion_queue *cq) { + grpc_event *ev; + grpc_completion_type t; + void (*callback)(grpc_event *); + + ev = grpc_completion_queue_next(cq, gpr_inf_future); + t = ev->type; + if (ev->tag) { + /* call the callback in ev->tag */ + /* C forbids to cast object pointers to function pointers, so + * we cast to intptr first. + */ + callback = (void (*)(grpc_event *))(gpr_intptr)ev->tag; + (*callback)(ev); + } + grpc_event_finish(ev); + + /* return completion type to allow some handling for events that have no + * tag - such as GRPC_QUEUE_SHUTDOWN + */ + return t; +} + +/* Channel */ + +GPR_EXPORT grpc_channel * GPR_CALLTYPE grpcsharp_channel_create( + const char *target, const grpc_channel_args *args) { + return grpc_channel_create(target, args); } -grpc_completion_type grpc_event_type(const grpc_event *event) { +GPR_EXPORT void GPR_CALLTYPE grpcsharp_channel_destroy(grpc_channel *channel) { + grpc_channel_destroy(channel); +} + +GPR_EXPORT grpc_call * GPR_CALLTYPE grpcsharp_channel_create_call_old(grpc_channel *channel, + const char *method, const char *host, + gpr_timespec deadline) { + return grpc_channel_create_call_old(channel, method, host, deadline); +} + +/* Event */ + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_event_finish(grpc_event *event) { + grpc_event_finish(event); +} + +GPR_EXPORT grpc_completion_type GPR_CALLTYPE grpcsharp_event_type(const grpc_event *event) { return event->type; } -grpc_op_error grpc_event_write_accepted(const grpc_event *event) { +GPR_EXPORT grpc_op_error GPR_CALLTYPE grpcsharp_event_write_accepted(const grpc_event *event) { GPR_ASSERT(event->type == GRPC_WRITE_ACCEPTED); return event->data.invoke_accepted; } -grpc_op_error grpc_event_finish_accepted(const grpc_event *event) { +GPR_EXPORT grpc_op_error GPR_CALLTYPE grpcsharp_event_finish_accepted(const grpc_event *event) { GPR_ASSERT(event->type == GRPC_FINISH_ACCEPTED); return event->data.finish_accepted; } -grpc_status_code grpc_event_finished_status(const grpc_event *event) { +GPR_EXPORT grpc_status_code GPR_CALLTYPE grpcsharp_event_finished_status(const grpc_event *event) { GPR_ASSERT(event->type == GRPC_FINISHED); return event->data.finished.status; } -const char *grpc_event_finished_details(const grpc_event *event) { +GPR_EXPORT const char * GPR_CALLTYPE grpcsharp_event_finished_details(const grpc_event *event) { GPR_ASSERT(event->type == GRPC_FINISHED); return event->data.finished.details; } -gpr_intptr grpc_event_read_length(const grpc_event *event) { +GPR_EXPORT gpr_intptr GPR_CALLTYPE grpcsharp_event_read_length(const grpc_event *event) { GPR_ASSERT(event->type == GRPC_READ); if (!event->data.read) { return -1; @@ -56,7 +142,7 @@ gpr_intptr grpc_event_read_length(const grpc_event *event) { * Copies data from read event to a buffer. Fatal error occurs if * buffer is too small. */ -void grpc_event_read_copy_to_buffer(const grpc_event *event, char *buffer, +GPR_EXPORT void GPR_CALLTYPE grpcsharp_event_read_copy_to_buffer(const grpc_event *event, char *buffer, size_t buffer_len) { grpc_byte_buffer_reader *reader; gpr_slice slice; @@ -77,37 +163,133 @@ void grpc_event_read_copy_to_buffer(const grpc_event *event, char *buffer, grpc_byte_buffer_reader_destroy(reader); } -grpc_call *grpc_event_call(const grpc_event *event) { +GPR_EXPORT grpc_call * GPR_CALLTYPE grpcsharp_event_call(const grpc_event *event) { /* we only allow this for newly incoming server calls. */ GPR_ASSERT(event->type == GRPC_SERVER_RPC_NEW); return event->call; } -const char *grpc_event_server_rpc_new_method(const grpc_event *event) { +GPR_EXPORT const char * GPR_CALLTYPE grpcsharp_event_server_rpc_new_method(const grpc_event *event) { GPR_ASSERT(event->type == GRPC_SERVER_RPC_NEW); return event->data.server_rpc_new.method; } -grpc_completion_type grpc_completion_queue_next_with_callback( - grpc_completion_queue *cq) { - grpc_event *ev; - grpc_completion_type t; - void (*callback)(grpc_event *); +/* Timespec */ - ev = grpc_completion_queue_next(cq, gpr_inf_future); - t = ev->type; - if (ev->tag) { - /* call the callback in ev->tag */ - /* C forbids to cast object pointers to function pointers, so - * we cast to intptr first. - */ - callback = (void (*)(grpc_event *))(gpr_intptr)ev->tag; - (*callback)(ev); - } - grpc_event_finish(ev); +GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_now(void) { + return gpr_now(); +} - /* return completion type to allow some handling for events that have no - * tag - such as GRPC_QUEUE_SHUTDOWN - */ - return t; +GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_inf_future(void) { + return gpr_inf_future; +} + +GPR_EXPORT gpr_int32 GPR_CALLTYPE gprsharp_sizeof_timespec(void) { + return sizeof(gpr_timespec); +} + +/* Call */ + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_add_metadata_old( + grpc_call *call, grpc_metadata *metadata, gpr_uint32 flags) { + return grpc_call_add_metadata_old(call, metadata, flags); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_invoke_old( + grpc_call *call, grpc_completion_queue *cq, void *metadata_read_tag, + void *finished_tag, gpr_uint32 flags) { + return grpc_call_invoke_old(call, cq, metadata_read_tag, finished_tag, flags); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_server_accept_old( + grpc_call *call, grpc_completion_queue *cq, void *finished_tag) { + return grpc_call_server_accept_old(call, cq, finished_tag); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_server_end_initial_metadata_old( + grpc_call *call, gpr_uint32 flags) { + return grpc_call_server_end_initial_metadata_old(call, flags); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_cancel(grpc_call *call) { + return grpc_call_cancel(call); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_cancel_with_status( + grpc_call *call, grpc_status_code status, const char *description) { + return grpc_call_cancel_with_status(call, status, description); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_write_old( + grpc_call *call, grpc_byte_buffer *byte_buffer, void *tag, gpr_uint32 flags) { + return grpc_call_start_write_old(call, byte_buffer, tag, flags); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_write_status_old( + grpc_call *call, grpc_status_code status_code, const char *status_message, + void *tag) { + return grpc_call_start_write_status_old(call, status_code, status_message, + tag); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_writes_done_old( + grpc_call *call, void *tag) { + return grpc_call_writes_done_old(call, tag); +} + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_read_old( + grpc_call *call, void *tag) { + return grpc_call_start_read_old(call, tag); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_call_destroy(grpc_call *call) { + grpc_call_destroy(call); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_call_start_write_from_copied_buffer( + grpc_call *call, const char *buffer, size_t len, void *tag, + gpr_uint32 flags) { + grpc_byte_buffer *byte_buffer = string_to_byte_buffer(buffer, len); + GPR_ASSERT( + grpc_call_start_write_old(call, byte_buffer, tag, flags) == GRPC_CALL_OK); + grpc_byte_buffer_destroy(byte_buffer); +} + +/* Server */ + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_server_request_call_old(grpc_server *server, + void *tag_new); + +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_server_request_call( + grpc_server *server, grpc_call **call, grpc_call_details *details, + grpc_metadata_array *request_metadata, + grpc_completion_queue *completion_queue, void *tag_new); + + +GPR_EXPORT grpc_server * GPR_CALLTYPE grpcsharp_server_create(grpc_completion_queue *cq, + const grpc_channel_args *args); + + +GPR_EXPORT int GPR_CALLTYPE grpcsharp_server_add_http2_port(grpc_server *server, const char *addr) { + return grpc_server_add_http2_port(server, addr); +} + +GPR_EXPORT int GPR_CALLTYPE grpcsharp_server_add_secure_http2_port(grpc_server *server, const char *addr) { + return grpc_server_add_secure_http2_port(server, addr); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_start(grpc_server *server) { + grpc_server_start(server); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_shutdown(grpc_server *server) { + grpc_server_shutdown(server); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_shutdown_and_notify(grpc_server *server, void *tag) { + grpc_server_shutdown_and_notify(server, tag); +} + +GPR_EXPORT void GPR_CALLTYPE grpcsharp_server_destroy(grpc_server *server) { + grpc_server_destroy(server); } |