Class: GVariantDictionaryType

Inherits:
GVariantOffsetType show all
Defined in:
lib/gvariant.rb

Instance Attribute Summary

Attributes inherited from GVariantBasicType

#alignment, #default_value, #fixed_size, #id

Instance Method Summary collapse

Methods inherited from GVariantOffsetType

#read_offset, #write_offsets

Methods inherited from GVariantBasicType

#align, #pad

Constructor Details

#initialize(id, key_element, value_element) ⇒ GVariantDictionaryType

Returns a new instance of GVariantDictionaryType.



206
207
208
209
210
211
212
213
214
215
216
# 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

Instance Method Details

#read(buf) ⇒ Object



218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# 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) ⇒ Object



236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# 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