class DBus::PacketUnmarshaller
D-Bus packet unmarshaller class¶ ↑
Class that handles the conversion (unmarshalling) of payload data to Array.
Attributes
idx[R]
Index pointer that points to the byte in the data that is currently being processed.
Used to kown what part of the buffer has been consumed by unmarshalling. FIXME: Maybe should be accessed with a “consumed_size” method.
Public Class Methods
new(buffer, endianness)
click to toggle source
Create a new unmarshaller for the given data buffer and endianness.
# File lib/dbus/marshall.rb, line 34 def initialize(buffer, endianness) @buffy = buffer.dup @endianness = endianness if @endianness == BIG_END @uint32 = "N" @uint16 = "n" @double = "G" elsif @endianness == LIL_END @uint32 = "V" @uint16 = "v" @double = "E" else raise InvalidPacketException, "Incorrect endianness #{@endianness}" end @idx = 0 end
Public Instance Methods
align(a)
click to toggle source
Align the pointer index on a byte index of a, where a must be 1, 2, 4 or 8.
# File lib/dbus/marshall.rb, line 69 def align(a) case a when 1 when 2, 4, 8 bits = a - 1 @idx = @idx + bits & ~bits raise IncompleteBufferException if @idx > @buffy.bytesize else raise "Unsupported alignment #{a}" end end
unmarshall(signature, len = nil)
click to toggle source
Unmarshall the buffer for a given signature and length len. Return an array of unmarshalled objects
# File lib/dbus/marshall.rb, line 53 def unmarshall(signature, len = nil) if !len.nil? if @buffy.bytesize < @idx + len raise IncompleteBufferException end end sigtree = Type::Parser.new(signature).parse ret = [] sigtree.each do |elem| ret << do_parse(elem) end ret end