Sha256: 26079e5021c9f6ac7503eb47f2127b774a24e78f9dbe2b5e82f495abd3ce46b8

Contents?: true

Size: 1.25 KB

Versions: 3

Compression:

Stored size: 1.25 KB

Contents

module GirFFI
  module CallbackHelper
    def self.wrap_in_callback_args_mapper namespace, name, prc
      return prc if FFI::Function === prc
      return nil if prc.nil?
      info = IRepository.default.find_by_name namespace, name
      return Proc.new do |*args|
	prc.call(*map_callback_args(args, info))
      end
    end

    def self.map_callback_args args, info
      args.zip(info.args).map { |arg, inf|
	map_single_callback_arg arg, inf }
    end

    # TODO: Use GirFFI::ReturnValue classes for mapping.
    def self.map_single_callback_arg arg, info
      case info.argument_type.tag
      when :interface
        map_interface_callback_arg arg, info
      when :utf8
	ArgHelper.ptr_to_utf8 arg
      when :void
        map_void_callback_arg arg
      else
	arg
      end
    end

    def self.map_interface_callback_arg arg, info
      iface = info.argument_type.interface
      case iface.info_type
      when :object
        ArgHelper.object_pointer_to_object arg
      when :struct
        klass = GirFFI::Builder.build_class iface
        klass.wrap arg
      else
        arg
      end
    end

    def self.map_void_callback_arg arg
      if arg.null?
        nil
      else
        GirFFI::ArgHelper::OBJECT_STORE[arg.address]
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
gir_ffi-0.0.14 lib/gir_ffi/callback_helper.rb
gir_ffi-0.0.13 lib/gir_ffi/callback_helper.rb
gir_ffi-0.0.12 lib/gir_ffi/callback_helper.rb