Class: DBus::PacketUnmarshaller

Inherits:
Object
  • Object
show all
Defined in:
lib/dbus/marshall.rb

Overview

D-Bus packet unmarshaller class

Class that handles the conversion (unmarshalling) of payload data to Array.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(buffer, endianness) ⇒ PacketUnmarshaller

Create a new unmarshaller for the given data buffer and endianness.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/dbus/marshall.rb', line 34

def initialize(buffer, endianness)
  @buffy, @endianness = buffer.dup, endianness
  if @endianness == BIG_END
    @uint32 = "N"
    @uint16 = "n"
    @double = "G"
  elsif @endianness == LIL_END
    @uint32 = "V"
    @uint16 = "v"
    @double = "E"
  else
    # FIXME: shouldn't a more special exception be raised here?
    # yes, idea for a good name ? :)
    raise Exception, "Incorrect endianness"
  end
  @idx = 0
end

Instance Attribute Details

#idxObject (readonly)

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.



31
32
33
# File 'lib/dbus/marshall.rb', line 31

def idx
  @idx
end

Instance Method Details

#align(a) ⇒ Object

Align the pointer index on a byte index of a, where a must be 1, 2, 4 or 8.



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/dbus/marshall.rb', line 70

def align(a)
  case a
  when 1
  when 2, 4, 8
    bits = a - 1
    @idx = @idx + bits & ~bits
    raise IncompleteBufferException if @idx > @buffy.size
  else
    raise "Unsupported alignment #{a}"
  end
end

#unmarshall(signature, len = nil) ⇒ Object

Unmarshall the buffer for a given signature and length len. Return an array of unmarshalled objects



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/dbus/marshall.rb', line 54

def unmarshall(signature, len = nil)
  if len != nil
    if @buffy.size < @idx + len
      raise IncompleteBufferException
    end
  end
  sigtree = Type::Parser.new(signature).parse
  ret = Array.new
  sigtree.each do |elem|
    ret << do_parse(elem)
  end
  ret
end