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