1# Copyright 2019 gRPC authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14# distutils: language=c++
15
16from libcpp cimport bool as bool_t
17from libcpp.string cimport string as cppstring
18
19cdef extern from "grpc/impl/codegen/slice.h":
20  struct grpc_slice_buffer:
21    int count
22
23cdef extern from "src/core/lib/iomgr/error.h":
24  struct grpc_error:
25    pass
26
27# TODO(https://github.com/grpc/grpc/issues/20135) Change the filename
28# for something more meaningful.
29cdef extern from "src/core/lib/iomgr/python_util.h":
30  grpc_error* grpc_socket_error(char* error)
31  char* grpc_slice_buffer_start(grpc_slice_buffer* buffer, int i)
32  int grpc_slice_buffer_length(grpc_slice_buffer* buffer, int i)
33
34cdef extern from "src/core/lib/iomgr/sockaddr.h":
35  ctypedef struct grpc_sockaddr:
36    pass
37
38cdef extern from "src/core/lib/iomgr/resolve_address.h":
39  ctypedef struct grpc_resolved_addresses:
40    size_t naddrs
41    grpc_resolved_address* addrs
42
43  ctypedef struct grpc_resolved_address:
44    char[128] addr
45    size_t len
46
47cdef extern from "src/core/lib/iomgr/resolve_address_custom.h":
48  struct grpc_custom_resolver:
49    pass
50
51  struct grpc_custom_resolver_vtable:
52    grpc_error* (*resolve)(const char* host, const char* port, grpc_resolved_addresses** res);
53    void (*resolve_async)(grpc_custom_resolver* resolver, const char* host, const char* port);
54
55  void grpc_custom_resolve_callback(grpc_custom_resolver* resolver,
56                                    grpc_resolved_addresses* result,
57                                    grpc_error* error);
58
59cdef extern from "src/core/lib/iomgr/tcp_custom.h":
60  cdef int GRPC_CUSTOM_SOCKET_OPT_SO_REUSEPORT
61
62  struct grpc_custom_socket:
63    void* impl
64    # We don't care about the rest of the fields
65  ctypedef void (*grpc_custom_connect_callback)(grpc_custom_socket* socket,
66                                             grpc_error* error)
67  ctypedef void (*grpc_custom_write_callback)(grpc_custom_socket* socket,
68                                           grpc_error* error)
69  ctypedef void (*grpc_custom_read_callback)(grpc_custom_socket* socket,
70                                          size_t nread, grpc_error* error)
71  ctypedef void (*grpc_custom_accept_callback)(grpc_custom_socket* socket,
72                                            grpc_custom_socket* client,
73                                            grpc_error* error)
74  ctypedef void (*grpc_custom_close_callback)(grpc_custom_socket* socket)
75
76  struct grpc_socket_vtable:
77      grpc_error* (*init)(grpc_custom_socket* socket, int domain);
78      void (*connect)(grpc_custom_socket* socket, const grpc_sockaddr* addr,
79                      size_t len, grpc_custom_connect_callback cb);
80      void (*destroy)(grpc_custom_socket* socket);
81      void (*shutdown)(grpc_custom_socket* socket);
82      void (*close)(grpc_custom_socket* socket, grpc_custom_close_callback cb);
83      void (*write)(grpc_custom_socket* socket, grpc_slice_buffer* slices,
84                    grpc_custom_write_callback cb);
85      void (*read)(grpc_custom_socket* socket, char* buffer, size_t length,
86                   grpc_custom_read_callback cb);
87      grpc_error* (*getpeername)(grpc_custom_socket* socket,
88                                 const grpc_sockaddr* addr, int* len);
89      grpc_error* (*getsockname)(grpc_custom_socket* socket,
90                             const grpc_sockaddr* addr, int* len);
91      grpc_error* (*bind)(grpc_custom_socket* socket, const grpc_sockaddr* addr,
92                          size_t len, int flags);
93      grpc_error* (*listen)(grpc_custom_socket* socket);
94      void (*accept)(grpc_custom_socket* socket, grpc_custom_socket* client,
95                     grpc_custom_accept_callback cb);
96
97cdef extern from "src/core/lib/iomgr/timer_custom.h":
98  struct grpc_custom_timer:
99    void* timer
100    int timeout_ms
101     # We don't care about the rest of the fields
102
103  struct grpc_custom_timer_vtable:
104    void (*start)(grpc_custom_timer* t);
105    void (*stop)(grpc_custom_timer* t);
106
107  void grpc_custom_timer_callback(grpc_custom_timer* t, grpc_error* error);
108
109cdef extern from "src/core/lib/iomgr/pollset_custom.h":
110  struct grpc_custom_poller_vtable:
111    void (*init)()
112    void (*poll)(size_t timeout_ms)
113    void (*kick)()
114    void (*shutdown)()
115
116cdef extern from "src/core/lib/iomgr/iomgr_custom.h":
117  void grpc_custom_iomgr_init(grpc_socket_vtable* socket,
118                            grpc_custom_resolver_vtable* resolver,
119                            grpc_custom_timer_vtable* timer,
120                            grpc_custom_poller_vtable* poller);
121
122cdef extern from "src/core/lib/iomgr/sockaddr_utils.h":
123  int grpc_sockaddr_get_port(const grpc_resolved_address *addr);
124  cppstring grpc_sockaddr_to_string(const grpc_resolved_address *addr,
125                                    bool_t normalize);
126  void grpc_string_to_sockaddr(grpc_resolved_address *out, char* addr, int port);
127  int grpc_sockaddr_set_port(const grpc_resolved_address *resolved_addr,
128                             int port)
129  const char* grpc_sockaddr_get_uri_scheme(const grpc_resolved_address* resolved_addr)
130