aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi')
-rw-r--r--src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi
new file mode 100644
index 0000000000..ac67f32d92
--- /dev/null
+++ b/src/python/grpcio/grpc/_cython/_cygrpc/channel.pyx.pxi
@@ -0,0 +1,111 @@
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+cimport cpython
+
+
+cdef class Channel:
+
+ def __cinit__(self, target, ChannelArgs arguments=None,
+ ChannelCredentials channel_credentials=None):
+ cdef grpc_channel_args *c_arguments = NULL
+ self.c_channel = NULL
+ self.references = []
+ if arguments is not None:
+ c_arguments = &arguments.c_args
+ if isinstance(target, bytes):
+ pass
+ elif isinstance(target, basestring):
+ target = target.encode()
+ else:
+ raise TypeError("expected target to be str or bytes")
+ if channel_credentials is None:
+ self.c_channel = grpc_insecure_channel_create(target, c_arguments,
+ NULL)
+ else:
+ self.c_channel = grpc_secure_channel_create(
+ channel_credentials.c_credentials, target, c_arguments, NULL)
+ self.references.append(channel_credentials)
+ self.references.append(target)
+ self.references.append(arguments)
+
+ def create_call(self, Call parent, int flags,
+ CompletionQueue queue not None,
+ method, host, Timespec deadline not None):
+ if queue.is_shutting_down:
+ raise ValueError("queue must not be shutting down or shutdown")
+ if isinstance(method, bytes):
+ pass
+ elif isinstance(method, basestring):
+ method = method.encode()
+ else:
+ raise TypeError("expected method to be str or bytes")
+ cdef char *host_c_string = NULL
+ if host is None:
+ pass
+ elif isinstance(host, bytes):
+ host_c_string = host
+ elif isinstance(host, basestring):
+ host = host.encode()
+ host_c_string = host
+ else:
+ raise TypeError("expected host to be str, bytes, or None")
+ cdef Call operation_call = Call()
+ operation_call.references = [self, method, host, queue]
+ cdef grpc_call *parent_call = NULL
+ if parent is not None:
+ parent_call = parent.c_call
+ operation_call.c_call = grpc_channel_create_call(
+ self.c_channel, parent_call, flags,
+ queue.c_completion_queue, method, host_c_string, deadline.c_time,
+ NULL)
+ return operation_call
+
+ def check_connectivity_state(self, bint try_to_connect):
+ return grpc_channel_check_connectivity_state(self.c_channel,
+ try_to_connect)
+
+ def watch_connectivity_state(
+ self, last_observed_state, Timespec deadline not None,
+ CompletionQueue queue not None, tag):
+ cdef OperationTag operation_tag = OperationTag(tag)
+ cpython.Py_INCREF(operation_tag)
+ grpc_channel_watch_connectivity_state(
+ self.c_channel, last_observed_state, deadline.c_time,
+ queue.c_completion_queue, <cpython.PyObject *>operation_tag)
+
+ def target(self):
+ cdef char * target = grpc_channel_get_target(self.c_channel)
+ result = <bytes>target
+ gpr_free(target)
+ return result
+
+ def __dealloc__(self):
+ if self.c_channel != NULL:
+ grpc_channel_destroy(self.c_channel)