module GirFFI::ArgHelper

Constants

OBJECT_STORE
POINTER_SIZE
SIMPLE_G_TYPES

Public Class Methods

allocate_array_of_type(type, length) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 108
def self.allocate_array_of_type type, length
  AllocationHelper.safe_malloc FFI.type_size(type) * length
end
cast_from_pointer(type, it) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 123
def self.cast_from_pointer type, it
  case type
  when :utf8, :filename
    ptr_to_utf8 it
  when :gint32
    cast_pointer_to_int32 it
  else
    it.address
  end
end
cast_pointer_to_int32(ptr) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 142
def self.cast_pointer_to_int32 ptr
  cast_uint32_to_int32(ptr.address & 0xffffffff)
end
cast_uint32_to_int32(val) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 134
def self.cast_uint32_to_int32 val
  if val >= 0x80000000
    -(0x100000000-val)
  else
    val
  end
end
check_error(errpp) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 97
def self.check_error errpp
  err = GLib::Error.wrap(errpp.read_pointer)
  raise err.message unless err.nil?
end
check_fixed_array_size(size, arr, name) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 102
def self.check_fixed_array_size size, arr, name
  unless arr.size == size
    raise ArgumentError, "#{name} should have size #{size}"
  end
end
object_pointer_to_object(optr) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 112
def self.object_pointer_to_object optr
  gtype = GObject.type_from_instance_pointer optr
  wrap_object_pointer_by_gtype optr, gtype
end
object_to_inptr(obj) click to toggle source

FIXME: Hideous TODO: Move this implementation to InPointer

# File lib/gir_ffi/arg_helper.rb, line 19
def self.object_to_inptr obj
  return obj.to_ptr if obj.respond_to? :to_ptr
  return nil if obj.nil?
  return obj if obj.is_a? FFI::Pointer

  FFI::Pointer.new(obj.object_id).tap {|ptr|
    OBJECT_STORE[ptr.address] = obj }
end
ptr_to_interface_array(klass, ptr, size) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 60
def self.ptr_to_interface_array klass, ptr, size
  return [] if ptr.nil? or ptr.null?
  struct_size = klass.ffi_structure.size
  size.times.map do |idx|
    klass.wrap(ptr + struct_size * idx)
  end
end
ptr_to_interface_pointer_array(klass, ptr, size) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 68
def self.ptr_to_interface_pointer_array klass, ptr, size
  return [] if ptr.nil? or ptr.null?
  ptrs = ptr.read_array_of_pointer(size)
  ptrs.map do |optr|
    klass.wrap(optr)
  end
end
ptr_to_typed_array(type, ptr, size) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 28
def self.ptr_to_typed_array type, ptr, size
  if type.is_a? Class
    ptr_to_interface_array type, ptr, size
  elsif type.is_a? Array
    ptr_to_interface_pointer_array type[1], ptr, size
  elsif type == :utf8
    ptr_to_utf8_array ptr, size
  else
    self.send "ptr_to_#{type}_array", ptr, size
  end
end
ptr_to_utf8(ptr) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 77
def self.ptr_to_utf8 ptr
  ptr.null? ? nil : ptr.read_string
end
ptr_to_utf8_array(ptr, size) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 54
def self.ptr_to_utf8_array ptr, size
  return [] if ptr.nil? or ptr.null?
  ptrs = ptr.read_array_of_pointer(size)
  ptrs.map { |pt| ptr_to_utf8 pt }
end
ptr_to_utf8_length(ptr, len) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 86
def self.ptr_to_utf8_length ptr, len
  ptr.null? ? nil : ptr.read_string(len)
end
setup_ptr_to_type_array_handler_for(*types) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 40
def self.setup_ptr_to_type_array_handler_for *types
  types.flatten.each do |type|
    ffi_type = TypeMap.map_basic_type type
    defn =
      "def self.ptr_to_#{type}_array ptr, size
        return [] if ptr.nil? or ptr.null?
        ptr.get_array_of_#{ffi_type}(0, size)
      end"
    eval defn
  end
end
wrap_object_pointer_by_gtype(optr, gtype) click to toggle source
# File lib/gir_ffi/arg_helper.rb, line 117
def self.wrap_object_pointer_by_gtype optr, gtype
  return nil if optr.null?
  klass = Builder.build_by_gtype gtype
  klass.direct_wrap optr
end