Add ReaderOptions to read/read_packed/from_bytes

This commit is contained in:
Jason Paryani 2013-11-05 15:51:55 -08:00
parent 1424d46d71
commit 23e7a3891c
2 changed files with 34 additions and 13 deletions

View file

@ -997,17 +997,17 @@ cdef class SchemaParser:
if proto.isStruct: if proto.isStruct:
local_module.schema = schema.as_struct() local_module.schema = schema.as_struct()
def read(bound_local_module): def read(bound_local_module):
def helper(file): def helper(file, traversalLimitInWords = None, nestingLimit = None):
reader = _StreamFdMessageReader(file.fileno()) reader = _StreamFdMessageReader(file.fileno(), traversalLimitInWords, nestingLimit)
return reader.get_root(bound_local_module) return reader.get_root(bound_local_module)
return helper return helper
def read_packed(bound_local_module): def read_packed(bound_local_module):
def helper(file): def helper(file, traversalLimitInWords = None, nestingLimit = None):
reader = _PackedFdMessageReader(file.fileno()) reader = _PackedFdMessageReader(file.fileno(), traversalLimitInWords, nestingLimit)
return reader.get_root(bound_local_module) return reader.get_root(bound_local_module)
return helper return helper
def make_from_bytes(bound_local_module): def make_from_bytes(bound_local_module):
def from_bytes(buf, builder=False): def from_bytes(buf, traversalLimitInWords = None, nestingLimit = None, builder=False):
"""Returns a Reader for the unpacked object in buf. """Returns a Reader for the unpacked object in buf.
:type buf: buffer :type buf: buffer
@ -1017,7 +1017,7 @@ cdef class SchemaParser:
if builder: if builder:
message = _FlatMessageBuilder(buf) message = _FlatMessageBuilder(buf)
else: else:
message = _FlatArrayMessageReader(buf) message = _FlatArrayMessageReader(buf, traversalLimitInWords, nestingLimit)
return message.get_root(bound_local_module) return message.get_root(bound_local_module)
return from_bytes return from_bytes
def new_message(bound_local_module): def new_message(bound_local_module):
@ -1246,8 +1246,15 @@ cdef class _StreamFdMessageReader(_MessageReader):
:Parameters: - fd (`int`) - A file descriptor :Parameters: - fd (`int`) - A file descriptor
""" """
def __init__(self, int fd): def __init__(self, int fd, traversalLimitInWords = None, nestingLimit = None):
self.thisptr = new schema_cpp.StreamFdMessageReader(fd) cdef schema_cpp.ReaderOptions opts
if traversalLimitInWords is not None:
opts.traversalLimitInWords = traversalLimitInWords
if nestingLimit is not None:
opts.nestingLimit = nestingLimit
self.thisptr = new schema_cpp.StreamFdMessageReader(fd, opts)
cdef class _PackedFdMessageReader(_MessageReader): cdef class _PackedFdMessageReader(_MessageReader):
"""Read a Cap'n Proto message from a file descriptor in a packed manner """Read a Cap'n Proto message from a file descriptor in a packed manner
@ -1261,20 +1268,34 @@ cdef class _PackedFdMessageReader(_MessageReader):
:Parameters: - fd (`int`) - A file descriptor :Parameters: - fd (`int`) - A file descriptor
""" """
def __init__(self, int fd): def __init__(self, int fd, traversalLimitInWords = None, nestingLimit = None):
self.thisptr = new schema_cpp.PackedFdMessageReader(fd) cdef schema_cpp.ReaderOptions opts
if traversalLimitInWords is not None:
opts.traversalLimitInWords = traversalLimitInWords
if nestingLimit is not None:
opts.nestingLimit = nestingLimit
self.thisptr = new schema_cpp.PackedFdMessageReader(fd, opts)
@cython.internal @cython.internal
cdef class _FlatArrayMessageReader(_MessageReader): cdef class _FlatArrayMessageReader(_MessageReader):
cdef object _object_to_pin cdef object _object_to_pin
def __init__(self, buf): def __init__(self, buf, traversalLimitInWords = None, nestingLimit = None):
cdef schema_cpp.ReaderOptions opts
if traversalLimitInWords is not None:
opts.traversalLimitInWords = traversalLimitInWords
if nestingLimit is not None:
opts.nestingLimit = nestingLimit
cdef const void *ptr cdef const void *ptr
cdef Py_ssize_t sz cdef Py_ssize_t sz
PyObject_AsReadBuffer(buf, &ptr, &sz) PyObject_AsReadBuffer(buf, &ptr, &sz)
if sz % 8 != 0: if sz % 8 != 0:
raise ValueError("input length must be a multiple of eight bytes") raise ValueError("input length must be a multiple of eight bytes")
self._object_to_pin = buf self._object_to_pin = buf
self.thisptr = new schema_cpp.FlatArrayMessageReader(capnp.WordArrayPtr(<capnp.word*>ptr, sz//8)) self.thisptr = new schema_cpp.FlatArrayMessageReader(capnp.WordArrayPtr(<capnp.word*>ptr, sz//8), opts)
@cython.internal @cython.internal
cdef class _FlatMessageBuilder(_MessageBuilder): cdef class _FlatMessageBuilder(_MessageBuilder):

View file

@ -711,6 +711,6 @@ cdef extern from "capnp/serialize.h" namespace " ::capnp":
cdef extern from "capnp/serialize-packed.h" namespace " ::capnp": cdef extern from "capnp/serialize-packed.h" namespace " ::capnp":
cdef cppclass PackedFdMessageReader(MessageReader): cdef cppclass PackedFdMessageReader(MessageReader):
PackedFdMessageReader(int) except + PackedFdMessageReader(int) except +
StreamFdMessageReader(int, ReaderOptions) except + PackedFdMessageReader(int, ReaderOptions) except +
void writePackedMessageToFd(int, MessageBuilder&) except + void writePackedMessageToFd(int, MessageBuilder&) except +