feat: use cimports for message marshalling (#149)
This commit is contained in:
@@ -9,12 +9,16 @@ cdef bytes PACKED_UINT32_ZERO
|
|||||||
cdef bytes PACKED_BOOL_TRUE
|
cdef bytes PACKED_BOOL_TRUE
|
||||||
cdef bytes PACKED_BOOL_FALSE
|
cdef bytes PACKED_BOOL_FALSE
|
||||||
|
|
||||||
|
cdef get_signature_tree
|
||||||
|
|
||||||
cdef class Marshaller:
|
cdef class Marshaller:
|
||||||
|
|
||||||
cdef object signature_tree
|
cdef object signature_tree
|
||||||
cdef bytearray _buf
|
cdef bytearray _buf
|
||||||
cdef object body
|
cdef object body
|
||||||
|
|
||||||
|
cdef _buffer(self)
|
||||||
|
|
||||||
cpdef align(self, unsigned int n)
|
cpdef align(self, unsigned int n)
|
||||||
|
|
||||||
@cython.locals(
|
@cython.locals(
|
||||||
@@ -89,6 +93,8 @@ cdef class Marshaller:
|
|||||||
|
|
||||||
cpdef marshall(self)
|
cpdef marshall(self)
|
||||||
|
|
||||||
|
cdef _marshall(self)
|
||||||
|
|
||||||
@cython.locals(
|
@cython.locals(
|
||||||
offset=cython.ulong,
|
offset=cython.ulong,
|
||||||
t=cython.str,
|
t=cython.str,
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ class Marshaller:
|
|||||||
def buffer(self) -> bytearray:
|
def buffer(self) -> bytearray:
|
||||||
return self._buf
|
return self._buf
|
||||||
|
|
||||||
|
def _buffer(self) -> bytearray:
|
||||||
|
return self._buf
|
||||||
|
|
||||||
def align(self, n):
|
def align(self, n):
|
||||||
return self._align(n)
|
return self._align(n)
|
||||||
|
|
||||||
@@ -168,6 +171,10 @@ class Marshaller:
|
|||||||
return writer(self, body, type_)
|
return writer(self, body, type_)
|
||||||
|
|
||||||
def marshall(self) -> bytearray:
|
def marshall(self) -> bytearray:
|
||||||
|
"""Marshalls the body into a byte array"""
|
||||||
|
return self._marshall()
|
||||||
|
|
||||||
|
def _marshall(self) -> bytearray:
|
||||||
"""Marshalls the body into a byte array"""
|
"""Marshalls the body into a byte array"""
|
||||||
try:
|
try:
|
||||||
self._construct_buffer()
|
self._construct_buffer()
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ cdef unsigned int TOKEN_G_AS_INT
|
|||||||
|
|
||||||
cdef object MARSHALL_STREAM_END_ERROR
|
cdef object MARSHALL_STREAM_END_ERROR
|
||||||
|
|
||||||
|
cdef get_signature_tree
|
||||||
|
|
||||||
|
|
||||||
cdef inline unsigned long _cast_uint32_native(const char * payload, unsigned int offset):
|
cdef inline unsigned long _cast_uint32_native(const char * payload, unsigned int offset):
|
||||||
cdef unsigned long *u32p = <unsigned long *> &payload[offset]
|
cdef unsigned long *u32p = <unsigned long *> &payload[offset]
|
||||||
return u32p[0]
|
return u32p[0]
|
||||||
|
|||||||
@@ -2,13 +2,14 @@
|
|||||||
|
|
||||||
import cython
|
import cython
|
||||||
|
|
||||||
|
from ._private.marshaller cimport Marshaller
|
||||||
|
from .signature cimport Variant
|
||||||
|
|
||||||
|
|
||||||
cdef object ErrorType
|
cdef object ErrorType
|
||||||
cdef object SignatureTree
|
cdef object SignatureTree
|
||||||
cdef object SignatureType
|
cdef object SignatureType
|
||||||
cdef object MessageType
|
cdef object MessageType
|
||||||
cdef object Variant
|
|
||||||
cdef object Marshaller
|
|
||||||
|
|
||||||
|
|
||||||
cdef object HEADER_PATH
|
cdef object HEADER_PATH
|
||||||
@@ -25,6 +26,8 @@ cdef object HEADER_UNIX_FDS
|
|||||||
cdef object LITTLE_ENDIAN
|
cdef object LITTLE_ENDIAN
|
||||||
cdef object PROTOCOL_VERSION
|
cdef object PROTOCOL_VERSION
|
||||||
|
|
||||||
|
cdef object MESSAGE_FLAG
|
||||||
|
|
||||||
cdef get_signature_tree
|
cdef get_signature_tree
|
||||||
|
|
||||||
cdef class Message:
|
cdef class Message:
|
||||||
@@ -36,12 +39,16 @@ cdef class Message:
|
|||||||
cdef public object message_type
|
cdef public object message_type
|
||||||
cdef public object flags
|
cdef public object flags
|
||||||
cdef public object error_name
|
cdef public object error_name
|
||||||
cdef public unsigned int reply_serial
|
cdef public object reply_serial
|
||||||
cdef public object sender
|
cdef public object sender
|
||||||
cdef public object unix_fds
|
cdef public object unix_fds
|
||||||
cdef public object signature
|
cdef public object signature
|
||||||
cdef public object signature_tree
|
cdef public object signature_tree
|
||||||
cdef public object body
|
cdef public object body
|
||||||
cdef public unsigned int serial
|
cdef public object serial
|
||||||
|
|
||||||
cpdef _marshall(self, bint negotiate_unix_fd)
|
@cython.locals(
|
||||||
|
body_buffer=cython.bytearray,
|
||||||
|
header_buffer=cython.bytearray
|
||||||
|
)
|
||||||
|
cpdef _marshall(self, object negotiate_unix_fd)
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ HEADER_DESTINATION = HeaderField.DESTINATION.value
|
|||||||
HEADER_SIGNATURE = HeaderField.SIGNATURE.value
|
HEADER_SIGNATURE = HeaderField.SIGNATURE.value
|
||||||
HEADER_UNIX_FDS = HeaderField.UNIX_FDS.value
|
HEADER_UNIX_FDS = HeaderField.UNIX_FDS.value
|
||||||
|
|
||||||
|
MESSAGE_FLAG = MessageFlag
|
||||||
|
|
||||||
|
|
||||||
class Message:
|
class Message:
|
||||||
"""A class for sending and receiving messages through the
|
"""A class for sending and receiving messages through the
|
||||||
@@ -115,7 +117,7 @@ class Message:
|
|||||||
self.interface = interface
|
self.interface = interface
|
||||||
self.member = member
|
self.member = member
|
||||||
self.message_type = message_type
|
self.message_type = message_type
|
||||||
self.flags = flags if type(flags) is MessageFlag else MessageFlag(flags)
|
self.flags = flags if type(flags) is MESSAGE_FLAG else MESSAGE_FLAG(flags)
|
||||||
self.error_name = (
|
self.error_name = (
|
||||||
str(error_name.value) if type(error_name) is ErrorType else error_name
|
str(error_name.value) if type(error_name) is ErrorType else error_name
|
||||||
)
|
)
|
||||||
@@ -258,7 +260,7 @@ class Message:
|
|||||||
"""Marshall this message into a byte array."""
|
"""Marshall this message into a byte array."""
|
||||||
# TODO maximum message size is 134217728 (128 MiB)
|
# TODO maximum message size is 134217728 (128 MiB)
|
||||||
body_block = Marshaller(self.signature, self.body)
|
body_block = Marshaller(self.signature, self.body)
|
||||||
body_block.marshall()
|
body_buffer = body_block._marshall()
|
||||||
|
|
||||||
fields = []
|
fields = []
|
||||||
|
|
||||||
@@ -287,11 +289,12 @@ class Message:
|
|||||||
self.message_type.value,
|
self.message_type.value,
|
||||||
self.flags.value,
|
self.flags.value,
|
||||||
PROTOCOL_VERSION,
|
PROTOCOL_VERSION,
|
||||||
len(body_block.buffer),
|
len(body_buffer),
|
||||||
self.serial,
|
self.serial,
|
||||||
fields,
|
fields,
|
||||||
]
|
]
|
||||||
header_block = Marshaller("yyyyuua(yv)", header_body)
|
header_block = Marshaller("yyyyuua(yv)", header_body)
|
||||||
header_block.marshall()
|
header_block._marshall()
|
||||||
header_block.align(8)
|
header_block._align(8)
|
||||||
return header_block.buffer + body_block.buffer
|
header_buffer = header_block._buffer()
|
||||||
|
return header_buffer + body_buffer
|
||||||
|
|||||||
Reference in New Issue
Block a user