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