class GVariant

Public Class Methods

new(typestr, buffer) click to toggle source
# File lib/gvariant.rb, line 390
def initialize(typestr, buffer)
  @typestr, @buffer = typestr, buffer
end
next_type(signature, index) click to toggle source
# File lib/gvariant.rb, line 394
def self.next_type(signature, index)

  case signature[index]
  when 'y'
    GVariantByteType.new
  when 'n'
    GVariantSignedShortType.new
  when 'q'
    GVariantUnsignedShortType.new
  when 'i'
    GVariantSignedIntType.new
  when 'u', 'h'
    GVariantUnsignedIntType.new
  when 'x'
    GVariantSignedLongType.new
  when 't'
    GVariantUnsignedLongType.new
  when 'd'
    GVariantDoubleType.new
  when 'b'
    GVariantBooleanType.new
  when 's', 'g', 'o'
    GVariantStringType.new(signature[index])
  when 'v'
    GVariantVariantType.new
  when 'm'
    maybe_element = next_type(signature, index + 1)
    raise ArgumentError.new("Invalid type string") unless maybe_element
    GVariantMaybeType.new(signature[index, maybe_element.id.length + 1], maybe_element)
  when 'a'
    array_element = next_type(signature, index + 1)
    raise ArgumentError.new("Invalid type string") unless array_element
    GVariantArrayType.new(signature[index, array_element.id.length + 1], array_element)
  when '{'
    key_element = next_type(signature, index + 1)
    value_element = next_type(signature, index + 1 + key_element.id.length)
    raise ArgumentError.new("Invalid type string") unless key_element && value_element
    GVariantDictionaryType.new(signature[index, key_element.id.length + value_element.id.length + 2], key_element, value_element)
  when '('
    sig_end = index + 1
    elements = []

    while signature[sig_end] != ')' do
      e = next_type(signature, sig_end)
      sig_end += e.id.length
      elements << e
    end

    GVariantTupleType.new(signature[index..sig_end], elements)
  end
end
parse_type(typestr) click to toggle source
# File lib/gvariant.rb, line 446
def self.parse_type(typestr)
  type = next_type(typestr, 0)

  if type.nil? || type.id.length != typestr.length
    raise ArgumentError.new("Invalid type string: #{typestr}")
  end

  type
end
read(typestr, buf) click to toggle source
# File lib/gvariant.rb, line 456
def self.read(typestr, buf)
  buf = buf.pack("C*") if buf.is_a? Array
  buf.freeze if RUBY_VERSION >= '2.1.0'
  type = parse_type(typestr)
  type.read(buf)
end
write(typestr, value) click to toggle source
# File lib/gvariant.rb, line 463
def self.write(typestr, value)
  type = parse_type(typestr)
  type.write(value)
end