Skip to content
Prev Previous commit
Next Next commit
Move parse into cython
  • Loading branch information
yunhaoling committed Sep 26, 2019
commit b174b926801e24f9f337a1a3accadb4052a9cc0e
39 changes: 39 additions & 0 deletions src/message.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
# Python imports
from enum import Enum
import logging
import message

# C imports
from libc cimport stdint
Expand All @@ -18,6 +19,44 @@ cimport c_amqpvalue

_logger = logging.getLogger(__name__)

cpdef c_message_to_py_message(cMessage c_message, py_message):
_logger.debug("Parsing received message %r.", py_message.delivery_no)
py_message._message = c_message
body_type = c_message.body_type
body_type = c_message.body_type
if body_type == MessageBodyType.NoneType:
py_message._body = None
elif body_type == MessageBodyType.DataType:
py_message._body = message.DataBody(py_message._message)
elif body_type == MessageBodyType.SequenceType:
raise TypeError("Message body type Sequence not supported.")
else:
py_message._body = message.ValueBody(py_message._message)
_props = py_message._message.properties
if _props:
_logger.debug("Parsing received message properties %r.", py_message.delivery_no)
py_message.properties = message.MessageProperties(properties=_props, encoding=py_message._encoding)
_header = py_message._message.header
if _header:
_logger.debug("Parsing received message header %r.", py_message.delivery_no)
py_message.header = message.MessageHeader(header=_header)
_footer = py_message._message.footer
if _footer:
_logger.debug("Parsing received message footer %r.", py_message.delivery_no)
py_message.footer = _footer.map
_app_props = py_message._message.application_properties
if _app_props:
_logger.debug("Parsing received message application properties %r.", py_message.delivery_no)
py_message.application_properties = _app_props.map
_ann = py_message._message.message_annotations
if _ann:
_logger.debug("Parsing received message annotations %r.", py_message.delivery_no)
py_message.annotations = _ann.map
_delivery_ann = py_message._message.delivery_annotations
if _delivery_ann:
_logger.debug("Parsing received message delivery annotations %r.", py_message.delivery_no)
py_message.delivery_annotations = _delivery_ann.map


class MessageBodyType(Enum):
NoneType = c_message.MESSAGE_BODY_TYPE_TAG.MESSAGE_BODY_TYPE_NONE
Expand Down
3 changes: 3 additions & 0 deletions uamqp/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ def _parse_message(self, message):
:param message: The received C message.
:type message: uamqp.c_uamqp.cMessage
"""
c_uamqp.c_message_to_py_message(message, self)
'''
_logger.debug("Parsing received message %r.", self.delivery_no)
self._message = message
body_type = message.body_type
Expand Down Expand Up @@ -172,6 +174,7 @@ def _parse_message(self, message):
if _delivery_ann:
_logger.debug("Parsing received message delivery annotations %r.", self.delivery_no)
self.delivery_annotations = _delivery_ann.map
'''

def _can_settle_message(self):
if self.state not in constants.RECEIVE_STATES:
Expand Down