summaryrefslogtreecommitdiff
path: root/msgpack/_unpacker.pyx
diff options
context:
space:
mode:
authorAntonio Cuni <anto.cuni@gmail.com>2013-10-19 17:27:16 +0200
committerAntonio Cuni <anto.cuni@gmail.com>2013-10-19 17:27:16 +0200
commit56dd1650a42a454027ba335b494100a9f211758e (patch)
treebb40490af6a940e75d91d0e2e19a9975c78c8a15 /msgpack/_unpacker.pyx
parent985d4c1496d8c9186079ebc4e42aee319e67c385 (diff)
downloadmsgpack-python-56dd1650a42a454027ba335b494100a9f211758e.tar.gz
implement unpacking for all the fixtext formats
Diffstat (limited to 'msgpack/_unpacker.pyx')
-rw-r--r--msgpack/_unpacker.pyx21
1 files changed, 19 insertions, 2 deletions
diff --git a/msgpack/_unpacker.pyx b/msgpack/_unpacker.pyx
index e05b9ed..6500ef7 100644
--- a/msgpack/_unpacker.pyx
+++ b/msgpack/_unpacker.pyx
@@ -25,6 +25,7 @@ cdef extern from "unpack.h":
PyObject* object_hook
bint has_pairs_hook # call object_hook with k-v pairs
PyObject* list_hook
+ PyObject* ext_type_hook
char *encoding
char *unicode_errors
@@ -46,6 +47,7 @@ cdef extern from "unpack.h":
cdef inline init_ctx(unpack_context *ctx,
object object_hook, object object_pairs_hook, object list_hook,
+ object ext_type_hook,
bint use_list, char* encoding, char* unicode_errors):
unpack_init(ctx)
ctx.user.use_list = use_list
@@ -72,9 +74,17 @@ cdef inline init_ctx(unpack_context *ctx,
raise TypeError("list_hook must be a callable.")
ctx.user.list_hook = <PyObject*>list_hook
+ if ext_type_hook is not None:
+ if not PyCallable_Check(ext_type_hook):
+ raise TypeError("ext_type_hook must be a callable.")
+ ctx.user.ext_type_hook = <PyObject*>ext_type_hook
+
ctx.user.encoding = encoding
ctx.user.unicode_errors = unicode_errors
+def default_read_extended_type(typecode, data):
+ raise NotImplementedError("Cannot decode extended type with typecode=%d" % typecode)
+
def unpackb(object packed, object object_hook=None, object list_hook=None,
bint use_list=1, encoding=None, unicode_errors="strict",
object_pairs_hook=None,
@@ -107,7 +117,8 @@ def unpackb(object packed, object object_hook=None, object list_hook=None,
unicode_errors = unicode_errors.encode('ascii')
cerr = PyBytes_AsString(unicode_errors)
- init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr)
+ init_ctx(&ctx, object_hook, object_pairs_hook, list_hook, default_read_extended_type,
+ use_list, cenc, cerr)
ret = unpack_construct(&ctx, buf, buf_len, &off)
if ret == 1:
obj = unpack_data(&ctx)
@@ -249,7 +260,10 @@ cdef class Unpacker(object):
self.unicode_errors = unicode_errors
cerr = PyBytes_AsString(self.unicode_errors)
- init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook, use_list, cenc, cerr)
+ ext_type_hook = self.read_extended_type
+ Py_INCREF(ext_type_hook)
+ init_ctx(&self.ctx, object_hook, object_pairs_hook, list_hook,
+ ext_type_hook, use_list, cenc, cerr)
def feed(self, object next_bytes):
"""Append `next_bytes` to internal buffer."""
@@ -404,6 +418,9 @@ cdef class Unpacker(object):
"""
return self._unpack(read_map_header, write_bytes)
+ def read_extended_type(self, typecode, data):
+ return default_read_extended_type(typecode, data)
+
def __iter__(self):
return self