class GVariantArrayType

Public Class Methods

new(id, array_element) click to toggle source
Calls superclass method GVariantOffsetType::new
# File lib/gvariant.rb, line 260
def initialize(id, array_element)
  super(id, array_element.alignment, [])
  @element = array_element
end

Public Instance Methods

read(buf) click to toggle source
# File lib/gvariant.rb, line 265
def read(buf)
  size = buf.length

  if size == 0
    return @element.is_a?(GVariantDictionaryType) ? {} : @default_value
  end

  values = []
  c = 0

  if (@element.fixed_size)
    return @default_value if (size % @element.fixed_size != 0)
    n = size / @element.fixed_size

    n.times do
      values << @element.read(buf[c, @element.fixed_size])
      c += @element.fixed_size
    end
  else
    n = (size - read_offset(buf, -1)) / @offset_size

    n.times do |i|
      o = read_offset(buf, -n + i)
      values << @element.read(buf[c..o - 1])
      c = @element.align(o)
    end
  end

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

  vals.each do |val|
    v = @element.write(val)
    @element.pad(buf)
    buf << v
    offsets << buf.length
  end

  write_offsets(buf, offsets) unless @element.fixed_size
  buf
end