works as gem
[gp-arc-client-c.git] / lib / arc_client_c_wrapper.rb
1 require 'ffi'
2 require 'ffi_libc'
3 class ArcClientCWrapper
4   
5   class BaseStruct < FFI::Struct
6     
7     def get_str(name)
8       result = nil
9       val = self[name]
10       if(!val.null?)
11         result = val.read_string
12       end
13       result
14     end
15        
16     def free_pointer(name)
17       val = self[name]
18       if(val.is_a? FFI::Pointer)
19         LibC::free(val)
20       end
21     end
22     
23     def free_pointer_members
24       members.each do |member|
25         free_pointer member
26       end
27     end
28   end
29
30   class SubmitResult < BaseStruct
31     layout      :message,  :pointer,\
32             :job_id,  :pointer
33             
34   end
35   class StatResult < BaseStruct
36     layout      :message,  :pointer,\
37             :stat,  :pointer
38     
39   end
40   
41   class GetResult < BaseStruct
42     layout  :message, :pointer, \
43             :get, :int
44
45   end
46
47
48   extend FFI::Library
49   
50   THIS_DIR = File.dirname(__FILE__)
51   #ffi_lib "/Users/tamas/work/iface/grid/ws/gp-arc-client-c/build/Debug/libarcclientc.dylib"
52   ffi_lib ['arc_client_c', 'arc_client_c.bundle'].map {|file| File.join THIS_DIR, file}
53   #ffi_lib "/Users/tamas/tmp/bbbb/gp-arc-client-c/src/arc_client_r.bundle"
54   
55   attach_function :initialize, [], :string
56   
57   attach_function :arc_submit, [:int, :pointer], :pointer
58   attach_function :arc_stat, [:int, :pointer], :pointer
59   attach_function :arc_get, [:int, :pointer], :pointer
60   
61   def self.string_array_as_pointer(arr)
62     result = FFI::MemoryPointer.new(:pointer, arr.size)
63         result.write_array_of_pointer(arr.map {|item| FFI::MemoryPointer.from_string(item.to_s)})
64   end
65   
66   def self.free_array_of_pointer(arr, length)
67     pointers = arr.read_array_of_pointer length
68     
69     pointers.each do |i| 
70       p "freeeeeeeeeee#{i}"
71       LibC::free(i) 
72     end
73
74     LibC::free(arr)
75   end
76
77 end