class GVariantDictionaryType

Public Class Methods

new(id, key_element, value_element) click to toggle source
Calls superclass method GVariantOffsetType::new
# File lib/gvariant.rb, line 206
def initialize(id, key_element, value_element)
  super(id, [ key_element.alignment, value_element.alignment ].max,
        [ key_element.default_value, value_element.default_value ])

  @key_element = key_element
  @value_element = value_element

  if key_element.fixed_size && value_element.fixed_size
    @fixed_size = value_element.align(key_element.fixed_size) + value_element.fixed_size
  end
end

Public Instance Methods

read(buf) click to toggle source
# File lib/gvariant.rb, line 218
def read(buf)
  return @default_value if @fixed_size && buf.length != @fixed_size

  if @key_element.fixed_size
    key_end = @key_element.fixed_size
    value_end = buf.length
  else
    key_end = read_offset(buf, -1)
    value_end = buf.length - @offset_size
  end

  key = @key_element.read(buf[0..key_end - 1])
  key = key.to_sym if key.is_a? String
  value = @value_element.read(buf[@value_element.align(key_end)..value_end - 1])

  Hash[key, value]
end
write(vals) click to toggle source
# File lib/gvariant.rb, line 236
def write(vals)
  buf = ""
  offsets = []

  vals.each_pair do |key, value|
    @key_element.pad(buf)
    buf << @key_element.write(key.to_s)
    unless @key_element.fixed_size
      offsets << buf.length
    end

    @value_element.pad(buf)
    buf << @value_element.write(value)
    unless @value_element.fixed_size || key == vals.keys.last
      offsets << buf.length
    end
  end

  write_offsets(buf, offsets)
  buf
end