Class: GVariant

Inherits:
Object
  • Object
show all
Defined in:
lib/gvariant.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(typestr, buffer) ⇒ GVariant

Returns a new instance of GVariant.



390
391
392
# File 'lib/gvariant.rb', line 390

def initialize(typestr, buffer)
  @typestr, @buffer = typestr, buffer
end

Class Method Details

.next_type(signature, index) ⇒ Object



394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
# 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) ⇒ Object



446
447
448
449
450
451
452
453
454
# 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) ⇒ Object



456
457
458
459
460
461
# 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) ⇒ Object



463
464
465
466
# File 'lib/gvariant.rb', line 463

def self.write(typestr, value)
  type = parse_type(typestr)
  type.write(value)
end