12e830165fbd7feecabfb0b9ff0c88e5041e63be
[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   ffi_lib "/Users/tamas/work/iface/grid/ws/gp-arc-client-c/build/Debug/libarcclientc.dylib"
51   #ffi_lib "/Users/tamas/tmp/bbbb/gp-arc-client-c/src/arc_client_r.bundle"
52   
53   attach_function :initialize, [], :string
54   
55   attach_function :arc_submit, [:int, :pointer], :pointer
56   attach_function :arc_stat, [:int, :pointer], :pointer
57   attach_function :arc_get, [:int, :pointer], :pointer
58   
59   def self.string_array_as_pointer(arr)
60     result = FFI::MemoryPointer.new(:pointer, arr.size)
61         result.write_array_of_pointer(arr.map {|item| FFI::MemoryPointer.from_string(item.to_s)})
62   end
63   
64   def self.free_array_of_pointer(arr, length)
65     pointers = arr.read_array_of_pointer length
66     
67     pointers.each do |i| 
68       p "freeeeeeeeeee#{i}"
69       LibC::free(i) 
70     end
71
72     LibC::free(arr)
73   end
74
75 end