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; }