class GVariantTupleType

Public Class Methods

new(id, elements) click to toggle source
Calls superclass method GVariantOffsetType::new
# File lib/gvariant.rb, line 313
def initialize(id, elements)
  super(id, 1, [])
  @elements = elements
  @fixed_size = 0

  elements.each do |element|
    if element.fixed_size
      unless @fixed_size.nil?
        @fixed_size = element.align(@fixed_size + element.fixed_size)
      end
    else
      @fixed_size = nil
    end

    if element.alignment > @alignment
      @alignment = element.alignment
    end

    @default_value << element.default_value
  end

  @fixed_size = 1 if @fixed_size == 0

  if @fixed_size
    @fixed_size = align(@fixed_size)
  end
end

Public Instance Methods

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

  cur_offset = 0
  c = 0

  @elements.map do |element|
    c = element.align(c)

    if element.fixed_size
      n = c + element.fixed_size
    elsif element != @elements.last
      cur_offset -= 1
      n = read_offset(buf, cur_offset)
    else
      read_offset(buf, 0)
      n = buf.length - @offset_size * -cur_offset
    end

    v = element.read(buf[c..n - 1])
    c = n
    v
  end
end
write(vals) click to toggle source
# File lib/gvariant.rb, line 366
def write(vals)
  buf = ""
  offsets = []
  o = 0
  i = 0

  @elements.each do |element|
    b = element.write(vals[i])
    element.pad(buf)
    buf << b
    i += 1

    o += b.length
    offsets << o unless element.fixed_size || element == @elements.last
  end

  pad(buf)
  write_offsets(buf, offsets)
  buf
end