class MessagePack::Unpacker
Public Class Methods
new(*args)
click to toggle source
VALUE MessagePack_Unpacker_initialize(int argc, VALUE* argv, VALUE self)
{
VALUE io = Qnil;
VALUE options = Qnil;
if(argc == 0 || (argc == 1 && argv[0] == Qnil)) {
/* Qnil */
} else if(argc == 1) {
VALUE v = argv[0];
if(rb_type(v) == T_HASH) {
options = v;
} else {
io = v;
}
} else if(argc == 2) {
io = argv[0];
options = argv[1];
if(rb_type(options) != T_HASH) {
rb_raise(rb_eArgError, "expected Hash but found %s.", rb_obj_classname(options));
}
} else {
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0..2)", argc);
}
UNPACKER(self, uk);
uk->buffer_ref = MessagePack_Buffer_wrap(UNPACKER_BUFFER_(uk), self);
MessagePack_Buffer_set_options(UNPACKER_BUFFER_(uk), io, options);
if(options != Qnil) {
VALUE v;
v = rb_hash_aref(options, ID2SYM(rb_intern("symbolize_keys")));
msgpack_unpacker_set_symbolized_keys(uk, RTEST(v));
v = rb_hash_aref(options, ID2SYM(rb_intern("freeze")));
msgpack_unpacker_set_freeze(uk, RTEST(v));
v = rb_hash_aref(options, ID2SYM(rb_intern("allow_unknown_ext")));
msgpack_unpacker_set_allow_unknown_ext(uk, RTEST(v));
}
return self;
}
Public Instance Methods
allow_unknown_ext?()
click to toggle source
static VALUE Unpacker_allow_unknown_ext_p(VALUE self)
{
UNPACKER(self, uk);
return uk->allow_unknown_ext ? Qtrue : Qfalse;
}
buffer()
click to toggle source
static VALUE Unpacker_buffer(VALUE self)
{
UNPACKER(self, uk);
return uk->buffer_ref;
}
each()
click to toggle source
static VALUE Unpacker_each(VALUE self)
{
UNPACKER(self, uk);
#ifdef RETURN_ENUMERATOR
RETURN_ENUMERATOR(self, 0, 0);
#endif
if(msgpack_buffer_has_io(UNPACKER_BUFFER_(uk))) {
/* rescue EOFError only if io is set */
return rb_rescue2(Unpacker_each_impl, self,
Unpacker_rescue_EOFError, self,
rb_eEOFError, NULL);
} else {
return Unpacker_each_impl(self);
}
}
feed(p1)
click to toggle source
static VALUE Unpacker_feed(VALUE self, VALUE data)
{
UNPACKER(self, uk);
StringValue(data);
msgpack_buffer_append_string(UNPACKER_BUFFER_(uk), data);
return self;
}
feed_each(p1)
click to toggle source
static VALUE Unpacker_feed_each(VALUE self, VALUE data)
{
#ifdef RETURN_ENUMERATOR
{
VALUE argv[] = { data };
RETURN_ENUMERATOR(self, sizeof(argv) / sizeof(VALUE), argv);
}
#endif
Unpacker_feed_reference(self, data);
return Unpacker_each(self);
}
feed_reference(p1)
click to toggle source
static VALUE Unpacker_feed_reference(VALUE self, VALUE data)
{
UNPACKER(self, uk);
StringValue(data);
msgpack_buffer_append_string_reference(UNPACKER_BUFFER_(uk), data);
return self;
}
freeze?()
click to toggle source
static VALUE Unpacker_freeze_p(VALUE self)
{
UNPACKER(self, uk);
return uk->freeze ? Qtrue : Qfalse;
}
full_unpack()
click to toggle source
static VALUE Unpacker_full_unpack(VALUE self)
{
UNPACKER(self, uk);
int r = msgpack_unpacker_read(uk, 0);
if(r < 0) {
raise_unpacker_error(r);
}
/* raise if extra bytes follow */
size_t extra = msgpack_buffer_top_readable_size(UNPACKER_BUFFER_(uk));
if(extra > 0) {
rb_raise(eMalformedFormatError, "%zd extra bytes after the deserialized object", extra);
}
return msgpack_unpacker_get_last_object(uk);
}
read()
click to toggle source
static VALUE Unpacker_read(VALUE self)
{
UNPACKER(self, uk);
int r = msgpack_unpacker_read(uk, 0);
if(r < 0) {
raise_unpacker_error(r);
}
return msgpack_unpacker_get_last_object(uk);
}
Also aliased as: unpack
read_array_header()
click to toggle source
static VALUE Unpacker_read_array_header(VALUE self)
{
UNPACKER(self, uk);
uint32_t size;
int r = msgpack_unpacker_read_array_header(uk, &size);
if(r < 0) {
raise_unpacker_error(r);
}
return ULONG2NUM(size);
}
read_map_header()
click to toggle source
static VALUE Unpacker_read_map_header(VALUE self)
{
UNPACKER(self, uk);
uint32_t size;
int r = msgpack_unpacker_read_map_header(uk, &size);
if(r < 0) {
raise_unpacker_error((int)r);
}
return ULONG2NUM(size);
}
register_type(*args)
click to toggle source
static VALUE Unpacker_register_type(int argc, VALUE* argv, VALUE self)
{
UNPACKER(self, uk);
int ext_type;
VALUE proc;
VALUE arg;
VALUE ext_module;
switch (argc) {
case 1:
/* register_type(0x7f) {|data| block... } */
rb_need_block();
proc = rb_block_lambda();
arg = proc;
ext_module = Qnil;
break;
case 3:
/* register_type(0x7f, Time, :from_msgpack_ext) */
ext_module = argv[1];
arg = argv[2];
proc = rb_obj_method(ext_module, arg);
break;
default:
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 3)", argc);
}
ext_type = NUM2INT(argv[0]);
if(ext_type < -128 || ext_type > 127) {
rb_raise(rb_eRangeError, "integer %d too big to convert to `signed char'", ext_type);
}
msgpack_unpacker_ext_registry_put(&uk->ext_registry, ext_module, ext_type, proc, arg);
return Qnil;
}
registered_types()
click to toggle source
see ext for other methods
# File lib/msgpack/unpacker.rb, line 5 def registered_types list = [] registered_types_internal.each_pair do |type, ary| list << {type: type, class: ary[0], unpacker: ary[2]} end list.sort{|a, b| a[:type] <=> b[:type] } end
reset()
click to toggle source
static VALUE Unpacker_reset(VALUE self)
{
UNPACKER(self, uk);
_msgpack_unpacker_reset(uk);
return Qnil;
}
skip()
click to toggle source
static VALUE Unpacker_skip(VALUE self)
{
UNPACKER(self, uk);
int r = msgpack_unpacker_skip(uk, 0);
if(r < 0) {
raise_unpacker_error(r);
}
return Qnil;
}
skip_nil()
click to toggle source
static VALUE Unpacker_skip_nil(VALUE self)
{
UNPACKER(self, uk);
int r = msgpack_unpacker_skip_nil(uk);
if(r < 0) {
raise_unpacker_error(r);
}
if(r) {
return Qtrue;
}
return Qfalse;
}
symbolize_keys?()
click to toggle source
static VALUE Unpacker_symbolized_keys_p(VALUE self)
{
UNPACKER(self, uk);
return uk->symbolize_keys ? Qtrue : Qfalse;
}
type_registered?(klass_or_type)
click to toggle source
# File lib/msgpack/unpacker.rb, line 15 def type_registered?(klass_or_type) case klass_or_type when Class klass = klass_or_type registered_types.any?{|entry| klass == entry[:class] } when Integer type = klass_or_type registered_types.any?{|entry| type == entry[:type] } else raise ArgumentError, "class or type id" end end
Private Instance Methods
registered_types_internal()
click to toggle source
static VALUE Unpacker_registered_types_internal(VALUE self)
{
UNPACKER(self, uk);
VALUE mapping = rb_hash_new();
if (uk->ext_registry) {
for(int i=0; i < 256; i++) {
if(uk->ext_registry->array[i] != Qnil) {
rb_hash_aset(mapping, INT2FIX(i - 128), uk->ext_registry->array[i]);
}
}
}
return mapping;
}