Home | History | Annotate | Download | only in _cygrpc
      1 # Copyright 2017 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 
     15 
     16 cdef class Operation:
     17 
     18   cdef void c(self):
     19     raise NotImplementedError()
     20 
     21   cdef void un_c(self):
     22     raise NotImplementedError()
     23 
     24 
     25 cdef class SendInitialMetadataOperation(Operation):
     26 
     27   def __cinit__(self, initial_metadata, flags):
     28     self._initial_metadata = initial_metadata
     29     self._flags = flags
     30 
     31   def type(self):
     32     return GRPC_OP_SEND_INITIAL_METADATA
     33 
     34   cdef void c(self):
     35     self.c_op.type = GRPC_OP_SEND_INITIAL_METADATA
     36     self.c_op.flags = self._flags
     37     _store_c_metadata(
     38         self._initial_metadata, &self._c_initial_metadata,
     39         &self._c_initial_metadata_count)
     40     self.c_op.data.send_initial_metadata.metadata = self._c_initial_metadata
     41     self.c_op.data.send_initial_metadata.count = self._c_initial_metadata_count
     42     self.c_op.data.send_initial_metadata.maybe_compression_level.is_set = 0
     43 
     44   cdef void un_c(self):
     45     _release_c_metadata(
     46         self._c_initial_metadata, self._c_initial_metadata_count)
     47 
     48 
     49 cdef class SendMessageOperation(Operation):
     50 
     51   def __cinit__(self, bytes message, int flags):
     52     self._message = message
     53     self._flags = flags
     54 
     55   def type(self):
     56     return GRPC_OP_SEND_MESSAGE
     57 
     58   cdef void c(self):
     59     self.c_op.type = GRPC_OP_SEND_MESSAGE
     60     self.c_op.flags = self._flags
     61     cdef grpc_slice message_slice = grpc_slice_from_copied_buffer(
     62         self._message, len(self._message))
     63     self._c_message_byte_buffer = grpc_raw_byte_buffer_create(
     64         &message_slice, 1)
     65     grpc_slice_unref(message_slice)
     66     self.c_op.data.send_message.send_message = self._c_message_byte_buffer
     67 
     68   cdef void un_c(self):
     69     grpc_byte_buffer_destroy(self._c_message_byte_buffer)
     70 
     71 
     72 cdef class SendCloseFromClientOperation(Operation):
     73 
     74   def __cinit__(self, int flags):
     75     self._flags = flags
     76 
     77   def type(self):
     78     return GRPC_OP_SEND_CLOSE_FROM_CLIENT
     79 
     80   cdef void c(self):
     81     self.c_op.type = GRPC_OP_SEND_CLOSE_FROM_CLIENT
     82     self.c_op.flags = self._flags
     83 
     84   cdef void un_c(self):
     85     pass
     86 
     87 
     88 cdef class SendStatusFromServerOperation(Operation):
     89 
     90   def __cinit__(self, trailing_metadata, code, object details, int flags):
     91     self._trailing_metadata = trailing_metadata
     92     self._code = code
     93     self._details = details
     94     self._flags = flags
     95 
     96   def type(self):
     97     return GRPC_OP_SEND_STATUS_FROM_SERVER
     98 
     99   cdef void c(self):
    100     self.c_op.type = GRPC_OP_SEND_STATUS_FROM_SERVER
    101     self.c_op.flags = self._flags
    102     _store_c_metadata(
    103         self._trailing_metadata, &self._c_trailing_metadata,
    104         &self._c_trailing_metadata_count)
    105     self.c_op.data.send_status_from_server.trailing_metadata = (
    106         self._c_trailing_metadata)
    107     self.c_op.data.send_status_from_server.trailing_metadata_count = (
    108         self._c_trailing_metadata_count)
    109     self.c_op.data.send_status_from_server.status = self._code
    110     self._c_details = _slice_from_bytes(_encode(self._details))
    111     self.c_op.data.send_status_from_server.status_details = &self._c_details
    112 
    113   cdef void un_c(self):
    114     grpc_slice_unref(self._c_details)
    115     _release_c_metadata(
    116         self._c_trailing_metadata, self._c_trailing_metadata_count)
    117 
    118 
    119 cdef class ReceiveInitialMetadataOperation(Operation):
    120 
    121   def __cinit__(self, flags):
    122     self._flags = flags
    123 
    124   def type(self):
    125     return GRPC_OP_RECV_INITIAL_METADATA
    126 
    127   cdef void c(self):
    128     self.c_op.type = GRPC_OP_RECV_INITIAL_METADATA
    129     self.c_op.flags = self._flags
    130     grpc_metadata_array_init(&self._c_initial_metadata)
    131     self.c_op.data.receive_initial_metadata.receive_initial_metadata = (
    132         &self._c_initial_metadata)
    133 
    134   cdef void un_c(self):
    135     self._initial_metadata = _metadata(&self._c_initial_metadata)
    136     grpc_metadata_array_destroy(&self._c_initial_metadata)
    137 
    138   def initial_metadata(self):
    139     return self._initial_metadata
    140 
    141 
    142 cdef class ReceiveMessageOperation(Operation):
    143 
    144   def __cinit__(self, flags):
    145     self._flags = flags
    146 
    147   def type(self):
    148     return GRPC_OP_RECV_MESSAGE
    149 
    150   cdef void c(self):
    151     self.c_op.type = GRPC_OP_RECV_MESSAGE
    152     self.c_op.flags = self._flags
    153     self.c_op.data.receive_message.receive_message = (
    154         &self._c_message_byte_buffer)
    155 
    156   cdef void un_c(self):
    157     cdef grpc_byte_buffer_reader message_reader
    158     cdef bint message_reader_status
    159     cdef grpc_slice message_slice
    160     cdef size_t message_slice_length
    161     cdef void *message_slice_pointer
    162     if self._c_message_byte_buffer != NULL:
    163       message_reader_status = grpc_byte_buffer_reader_init(
    164           &message_reader, self._c_message_byte_buffer)
    165       if message_reader_status:
    166         message = bytearray()
    167         while grpc_byte_buffer_reader_next(&message_reader, &message_slice):
    168           message_slice_pointer = grpc_slice_start_ptr(message_slice)
    169           message_slice_length = grpc_slice_length(message_slice)
    170           message += (<char *>message_slice_pointer)[:message_slice_length]
    171           grpc_slice_unref(message_slice)
    172         grpc_byte_buffer_reader_destroy(&message_reader)
    173         self._message = bytes(message)
    174       else:
    175         self._message = None
    176       grpc_byte_buffer_destroy(self._c_message_byte_buffer)
    177     else:
    178       self._message = None
    179 
    180   def message(self):
    181     return self._message
    182 
    183 
    184 cdef class ReceiveStatusOnClientOperation(Operation):
    185 
    186   def __cinit__(self, flags):
    187     self._flags = flags
    188 
    189   def type(self):
    190     return GRPC_OP_RECV_STATUS_ON_CLIENT
    191 
    192   cdef void c(self):
    193     self.c_op.type = GRPC_OP_RECV_STATUS_ON_CLIENT
    194     self.c_op.flags = self._flags
    195     grpc_metadata_array_init(&self._c_trailing_metadata)
    196     self.c_op.data.receive_status_on_client.trailing_metadata = (
    197         &self._c_trailing_metadata)
    198     self.c_op.data.receive_status_on_client.status = (
    199         &self._c_code)
    200     self.c_op.data.receive_status_on_client.status_details = (
    201         &self._c_details)
    202     self.c_op.data.receive_status_on_client.error_string = (
    203         &self._c_error_string)
    204 
    205   cdef void un_c(self):
    206     self._trailing_metadata = _metadata(&self._c_trailing_metadata)
    207     grpc_metadata_array_destroy(&self._c_trailing_metadata)
    208     self._code = self._c_code
    209     self._details = _decode(_slice_bytes(self._c_details))
    210     grpc_slice_unref(self._c_details)
    211     if self._c_error_string != NULL:
    212       self._error_string = _decode(self._c_error_string)
    213       gpr_free(<void*>self._c_error_string)
    214     else:
    215       self._error_string = ""
    216 
    217   def trailing_metadata(self):
    218     return self._trailing_metadata
    219 
    220   def code(self):
    221     return self._code
    222 
    223   def details(self):
    224     return self._details
    225 
    226   def error_string(self):
    227     return self._error_string
    228 
    229 
    230 cdef class ReceiveCloseOnServerOperation(Operation):
    231 
    232   def __cinit__(self, flags):
    233     self._flags = flags
    234 
    235   def type(self):
    236     return GRPC_OP_RECV_CLOSE_ON_SERVER
    237 
    238   cdef void c(self):
    239     self.c_op.type = GRPC_OP_RECV_CLOSE_ON_SERVER
    240     self.c_op.flags = self._flags
    241     self.c_op.data.receive_close_on_server.cancelled = &self._c_cancelled
    242 
    243   cdef void un_c(self):
    244     self._cancelled = bool(self._c_cancelled)
    245 
    246   def cancelled(self):
    247     return self._cancelled
    248