class GVariantOffsetType

Public Class Methods

new(id, alignment, default_value) click to toggle source
Calls superclass method GVariantBasicType::new
# File lib/gvariant.rb, line 155
def initialize(id, alignment, default_value)
  @offset_size = nil
  super(id, nil, alignment, nil, default_value)
end

Public Instance Methods

read_offset(buf, n) click to toggle source
# File lib/gvariant.rb, line 160
def read_offset(buf, n)
  l = buf.length
  determine_offset_type(l)
  buf.unpack("@#{l + @offset_size * n}#{@offset_pack_format}")[0]
end
write_offsets(buf, offsets) click to toggle source
# File lib/gvariant.rb, line 166
def write_offsets(buf, offsets)
  return buf if offsets.empty?
  offset_size_prev = nil
  packed_size = 0
  packed = ""

  loop do
    determine_offset_type(buf.length + packed_size, false)
    break if @offset_size == offset_size_prev
    offset_size_prev = @offset_size

    packed_size = offsets.count * @offset_size
    packed = offsets.pack("#{@offset_pack_format}*")
  end

  buf << packed
end

Private Instance Methods

determine_offset_type(l, use_cache = true) click to toggle source
# File lib/gvariant.rb, line 186
def determine_offset_type(l, use_cache = true)
  if @offset_size.nil? || !use_cache
    if (l < 0xff)
      @offset_size = 1
      @offset_pack_format = 'C'
    elsif (l <= 0xffff)
      @offset_size = 2
      @offset_pack_format = 'S'
    elsif (l < 0xffffffff)
      @offset_size = 4
      @offset_pack_format = 'L'
    else
      raise ArgumentError.new("Offset range too big.")
    end
  end
end