Module: GirFFI::ArgHelper

Defined in:
lib/gir_ffi/arg_helper.rb

Constant Summary collapse

OBJECT_STORE =
{}

Class Method Summary collapse

Class Method Details

.cast_from_pointer(type, it) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/gir_ffi/arg_helper.rb', line 23

def self.cast_from_pointer type, it
  case type
  when :utf8, :filename
    it.to_utf8
  when :gint32, :gint8
    cast_pointer_to_int32 it
  when Class
    type.wrap it
  when :guint32
    it.address
  when Array
    main_type, subtype = *type
    raise "Unexpected main type #{main_type}" if main_type != :pointer
    case subtype
    when Array
      container_type, *element_type = *subtype
      raise "Unexpected container type #{container_type}" if container_type != :ghash
      GLib::HashTable.wrap(element_type, it)
    else
      raise "Unexpected subtype #{subtype}"
    end

  else
    raise "Don't know how to cast #{type}"
  end
end

.cast_pointer_to_int32(ptr) ⇒ Object



58
59
60
# File 'lib/gir_ffi/arg_helper.rb', line 58

def self.cast_pointer_to_int32 ptr
  cast_uint32_to_int32(ptr.address & 0xffffffff)
end

.cast_uint32_to_int32(val) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/gir_ffi/arg_helper.rb', line 50

def self.cast_uint32_to_int32 val
  if val >= 0x80000000
    -(0x100000000-val)
  else
    val
  end
end

.check_error(errpp) ⇒ Object



12
13
14
15
# File 'lib/gir_ffi/arg_helper.rb', line 12

def self.check_error errpp
  err = GLib::Error.wrap(errpp.read_pointer)
  raise err.message if err
end

.check_fixed_array_size(size, arr, name) ⇒ Object



17
18
19
20
21
# File 'lib/gir_ffi/arg_helper.rb', line 17

def self.check_fixed_array_size size, arr, name
  unless arr.size == size
    raise ArgumentError, "#{name} should have size #{size}"
  end
end

.ptr_to_utf8_length(ptr, len) ⇒ Object



8
9
10
# File 'lib/gir_ffi/arg_helper.rb', line 8

def self.ptr_to_utf8_length ptr, len
  ptr.null? ? nil : ptr.read_string(len)
end