ffi-efl 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. data/Changelog +13 -1
  2. data/README.rdoc +24 -14
  3. data/lib/efl/ecore.rb +7 -7
  4. data/lib/efl/ecore_evas.rb +78 -0
  5. data/lib/efl/ecore_getopt.rb +28 -29
  6. data/lib/efl/ecore_input.rb +14 -0
  7. data/lib/efl/edje.rb +47 -1
  8. data/lib/efl/eet.rb +18 -25
  9. data/lib/efl/eina.rb +14 -0
  10. data/lib/efl/eina_hash.rb +84 -0
  11. data/lib/efl/eina_list.rb +77 -0
  12. data/lib/efl/elementary.rb +22 -9
  13. data/lib/efl/evas.rb +67 -25
  14. data/lib/efl/{ecore/ecore-ffi.rb → ffi/ecore.rb} +8 -5
  15. data/lib/efl/{ecore/ecore_evas-ffi.rb → ffi/ecore_evas.rb} +10 -7
  16. data/lib/efl/{ecore/ecore_getopt-ffi.rb → ffi/ecore_getopt.rb} +8 -5
  17. data/lib/efl/{ecore/ecore_input-ffi.rb → ffi/ecore_input.rb} +9 -6
  18. data/lib/efl/{edje/edje-ffi.rb → ffi/edje.rb} +10 -7
  19. data/lib/efl/{eet/eet-ffi.rb → ffi/eet.rb} +8 -5
  20. data/lib/efl/ffi/eina.rb +48 -0
  21. data/lib/efl/ffi/eina_hash.rb +111 -0
  22. data/lib/efl/ffi/eina_list.rb +108 -0
  23. data/lib/efl/{eina/eina_types-ffi.rb → ffi/eina_types.rb} +8 -5
  24. data/lib/efl/{elementary/elementary-ffi.rb → ffi/elementary.rb} +16 -9
  25. data/lib/efl/{evas/evas-ffi.rb → ffi/evas.rb} +153 -150
  26. data/lib/efl/ffi.rb +81 -38
  27. data/lib/efl.rb +9 -4
  28. data/spec/ecore_evas_spec.rb +24 -0
  29. data/spec/ecore_getopt_spec.rb +1 -2
  30. data/spec/ecore_input_spec.rb +24 -0
  31. data/spec/ecore_spec.rb +2 -3
  32. data/spec/edje_spec.rb +1 -1
  33. data/spec/eet_spec.rb +68 -69
  34. data/spec/eina_hash_spec.rb +180 -0
  35. data/spec/eina_list_spec.rb +101 -0
  36. data/spec/eina_spec.rb +20 -0
  37. data/spec/evas_spec.rb +288 -40
  38. data/tasks/ffi.rake +1 -1
  39. data/test/test_edje.rb +141 -0
  40. data/test/test_elm_win.rb +25 -28
  41. data/test/test_elm_win_class.rb +7 -7
  42. data/test/test_evas.rb +106 -0
  43. metadata +30 -17
data/Changelog CHANGED
@@ -1,5 +1,17 @@
1
+ 2011-05-01 Jérémy Zurcher <jeremy@asynk.ch>
2
+ * release 0.0.3
3
+ + Evas, Evas_Ecore, Edje, Elm ... usable
4
+ * use FFI::AutoPointer in ruby classes
5
+ * cleanup method_missing proxies usage and definition
6
+ * Eina_List <=> Array
7
+ * Eina_Hash <=> Hash
8
+ * .*= setters handled
9
+ * .*? getters handled
10
+ * evas test from http://docs.enlightenment.org/auto/evas/ implemented
11
+ * edje test from http://docs.enlightenment.org/auto/edje/ implemented
12
+
1
13
  2011-04-25 Jérémy Zurcher <jeremy@asynk.ch>
2
- * release 0.2.0
14
+ * release 0.0.2
3
15
  * ecore getopt seems good
4
16
  * basis of module function mapping and class method_missing usage setup
5
17
  * small elementary elm_Win test app
data/README.rdoc CHANGED
@@ -4,31 +4,27 @@ ffi-efl
4
4
 
5
5
  == DESCRIPTION:
6
6
 
7
- ffi-efl is a FFI[https://github.com/ffi/ffi/wiki] binding to Enlightenment Foundation Libraries (eina,eet,evas,ecore,edje...)
8
- base components of the Enlightenment project. (EFL API[http://www.enlightenment.org/p.php?p=docs&l=en])
9
-
10
- ffi-efl project is developed on asynk[http://cgit.asynk.ch/cgi-bin/cgit/ffi-efl], github[https://github.com/jeremyz] and gitorious[https://gitorious.org/~jeyzu]
7
+ A ruby-ffi binding to efl libraries (Enlightenment Foundation Libraries).
11
8
 
12
9
  == FEATURES/PROBLEMS:
13
10
 
14
- * Project just started
11
+ * Not 1.8 compatible yet !!!
15
12
 
16
13
  == SYNOPSIS:
17
14
 
18
- require './lib/efl'
19
- include Efl
20
- Eet.init
21
- Eet.open('/tmp/_eet.cfg', :eet_file_mode_write) do |f|
15
+ require 'efl'
16
+ Efl::Eet.init
17
+ Efl::Eet::REetFile.open('/tmp/_eet.cfg', :eet_file_mode_write) do |f|
22
18
  f.write 'config2', 'test--key'
23
19
  end
24
- Eet.open('/tmp/_eet.cfg', :eet_file_mode_read) do |f|
20
+ Efl::Eet::REetFile.open('/tmp/_eet.cfg', :eet_file_mode_read) do |f|
25
21
  puts f.read('config2')
26
22
  end
27
- Eet.shutdown
23
+ Efl::Eet.shutdown
28
24
 
29
25
  For less minimalistic and more sane examples you may look at:
30
26
 
31
- * the spec/ folder
27
+ * the spec/ and test/ folders
32
28
 
33
29
  == REQUIREMENTS:
34
30
 
@@ -37,7 +33,7 @@ For less minimalistic and more sane examples you may look at:
37
33
 
38
34
  == DOWNLOAD/INSTALL:
39
35
 
40
- From rubyforge:
36
+ From rubygems:
41
37
 
42
38
  [sudo] gem install ffi-efl
43
39
 
@@ -47,11 +43,25 @@ or from the git repository on github:
47
43
  cd ffi-efl
48
44
  rake gem:install
49
45
 
46
+ == RESOURCES:
47
+
48
+ You can find this project in a few places:
49
+
50
+ Online repositories:
51
+
52
+ * https://github.com/jeremyz/ffi-efl
53
+ * http://cgit.asynk.ch/cgi-bin/cgit/ffi-efl/
54
+ * https://gitorious.org/ffi-efl
55
+
56
+ Gem:
57
+
58
+ * https://rubygems.org/gems/ffi-efl
59
+
50
60
  == CREDITS:
51
61
 
52
62
  Special thanks to:
53
63
 
54
- * need help ...
64
+ * Lionel Orry
55
65
 
56
66
  == LICENSE:
57
67
 
data/lib/efl/ecore.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #! /usr/bin/env ruby
2
2
  # -*- coding: UTF-8 -*-
3
3
  #
4
- require 'efl/ecore/ecore-ffi'
4
+ require 'efl/ffi/ecore'
5
5
  #
6
6
  module Efl
7
7
  module Ecore
@@ -15,15 +15,15 @@ module Efl
15
15
  EVENT_SIGNAL_REALTIME = 5 # Realtime signal event
16
16
  EVENT_COUNT = 6
17
17
  #
18
- class EcorePipe
18
+ class REcorePipe
19
19
  def initialize cb, data
20
- @ptr = Efl::API.ecore_pipe_add cb, data
20
+ @ptr = Efl::Ecore.ecore_pipe_add cb, data
21
21
  end
22
- def del; Efl::API.ecore_pipe_del @ptr; end
23
- def read_close; Efl::API.ecore_pipe_read_close @ptr; end
24
- def write_close; Efl::API.ecore_pipe_write_close @ptr; end
22
+ def del; Efl::Ecore.ecore_pipe_del @ptr; end
23
+ def read_close; Efl::Ecore.ecore_pipe_read_close @ptr; end
24
+ def write_close; Efl::Ecore.ecore_pipe_write_close @ptr; end
25
25
  def write data
26
- Efl::API.ecore_pipe_write @ptr, FFI::MemoryPointer.from_string(data.to_s), data.to_s.length+1
26
+ Efl::Ecore.ecore_pipe_write @ptr, FFI::MemoryPointer.from_string(data.to_s), data.to_s.length+1
27
27
  end
28
28
  #
29
29
  end
@@ -0,0 +1,78 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/ffi/ecore_evas'
5
+ #
6
+ module Efl
7
+ #
8
+ module EcoreEvas
9
+ #
10
+ class REcoreEvas
11
+ include Efl::ClassHelper
12
+ proxy_list [Efl::EcoreEvas,'ecore_evas_'].freeze
13
+ def initialize o=nil, &block
14
+ @ptr = (
15
+ case o
16
+ when NilClass
17
+ FFI::AutoPointer.new Efl::EcoreEvas.ecore_evas_new(nil, 0, 0, 0, 0, nil), method(:free)
18
+ when self.class
19
+ o.to_ptr
20
+ when FFI::AutoPointer
21
+ o
22
+ when FFI::Pointer
23
+ FFI::AutoPointer.new o, method(:free)
24
+ else
25
+ raise ArgumentError.new "wrong argument #{o.class.name}"
26
+ end
27
+ )
28
+ yield self if block_given?
29
+ end
30
+ def free p=nil
31
+ return Efl::EcoreEvas.ecore_evas_free p unless p.nil?
32
+ Efl::EcoreEvas.ecore_evas_free @ptr
33
+ @ptr.free
34
+ @ptr=nil
35
+ end
36
+ def get
37
+ # EAPI Evas *ecore_evas_get(const Ecore_Evas *ee);
38
+ Efl::Evas::REvas.new Efl::EcoreEvas.ecore_evas_get @ptr
39
+ end
40
+ def object_image_new
41
+ # EAPI Evas_Object *ecore_evas_object_image_new(Ecore_Evas *ee_target);
42
+ Efl::Evas::REvasObject.new Efl::EcoreEvas.ecore_evas_object_image_new @prt
43
+ end
44
+ def object_associate_get
45
+ # EAPI Evas_Object *ecore_evas_object_associate_get(const Ecore_Evas *ee);
46
+ Efl::Evas::REvasObject.new Efl::EcoreEvas.ecore_evas_object_associate_get @prt
47
+ end
48
+ #
49
+ end
50
+ #
51
+ end
52
+ #
53
+ module Evas
54
+ #
55
+ class REvas
56
+ def ecore_evas_get
57
+ # EAPI Ecore_Evas *ecore_evas_ecore_evas_get(const Evas *e);
58
+ Efl::EcoreEvas::REcoreEvas.new Efl::EcoreEvas.ecore_evas_ecore_evas_get @ptr
59
+ end
60
+ end
61
+ #
62
+ class REvasObject
63
+ def ecore_evas_get
64
+ # EAPI Ecore_Evas *ecore_evas_object_ecore_evas_get(Evas_Object *obj);
65
+ Efl::EcoreEvas::REcoreEvas.new Efl::EcoreEvas.ecore_evas_object_ecore_evas_get @ptr
66
+ end
67
+ def evas_get
68
+ # EAPI Evas *ecore_evas_object_evas_get(Evas_Object *obj);
69
+ Efl::Evas::REvas.new Efl::EcoreEvas.ecore_evas_object_evas_get @ptr
70
+ end
71
+ end
72
+ end
73
+ # TODO
74
+ #EAPI unsigned char ecore_getopt_callback_ecore_evas_list_engines(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, const char *str, void *data, Ecore_Getopt_Value *storage);
75
+ #
76
+ end
77
+ #
78
+ # EOF
@@ -1,12 +1,13 @@
1
1
  #! /usr/bin/env ruby
2
2
  # -*- coding: UTF-8 -*-
3
3
  #
4
- require 'efl/ecore/ecore_getopt-ffi'
4
+ require 'efl/ffi/ecore_getopt'
5
5
  #
6
6
  module Efl
7
- module API
7
+ #
8
+ module EcoreGetopt
8
9
  #
9
- class EcoreGetoptValue < FFI::Union
10
+ class Value < FFI::Union
10
11
  layout :strp, :pointer,
11
12
  :boolp, :eina_bool_p,
12
13
  :shortp, :short_p,
@@ -20,7 +21,7 @@ module Efl
20
21
  :ptrp, :void_p,
21
22
  end
22
23
  #
23
- class EcoreGetoptDescStoreDef < FFI::Union
24
+ class DescStoreDef < FFI::Union
24
25
  layout :strv, :pointer,
25
26
  :boolv, :uchar,
26
27
  :shortv, :short,
@@ -32,37 +33,37 @@ module Efl
32
33
  :doublev, :double,
33
34
  end
34
35
  #
35
- class EcoreGetoptDescStore < FFI::Struct
36
+ class DescStore < FFI::Struct
36
37
  layout :type, :ecore_getopt_type, # enum
37
38
  :arg_req, :ecore_getopt_desc_arg_requirement, # enum
38
- :def, EcoreGetoptDescStoreDef,
39
+ :def, DescStoreDef,
39
40
  end
40
41
  #
41
42
  callback :ecore_getopt_desc_cb, [:ecore_getopt_p, :ecore_getopt_desc_p, :string, :pointer, :ecore_getopt_value_p ], :eina_bool
42
43
  #
43
- class EcoreGetoptDescCallback < FFI::Struct
44
+ class DescCallback < FFI::Struct
44
45
  layout :func, :ecore_getopt_desc_cb,
45
46
  :data, :pointer,
46
47
  :arg_req, :ecore_getopt_desc_arg_requirement, # enum
47
48
  :def, :pointer,
48
49
  end
49
50
  #
50
- class EcoreActionParam < FFI::Union
51
- layout :store, EcoreGetoptDescStore,
51
+ class ActionParam < FFI::Union
52
+ layout :store, DescStore,
52
53
  :store_const, :pointer,
53
54
  :choices, :pointer,
54
55
  :append_type, :ecore_getopt_type, # enum
55
- :callback, EcoreGetoptDescCallback,
56
+ :callback, DescCallback,
56
57
  :dummy, :pointer,
57
58
  end
58
59
  #
59
- class EcoreGetoptDesc < FFI::Struct
60
+ class Desc < FFI::Struct
60
61
  layout :shortname, :char,
61
62
  :longname, :pointer,
62
63
  :help, :pointer,
63
64
  :metavar, :pointer,
64
65
  :action, :ecore_getopt_action, # enum
65
- :action_param, EcoreActionParam,
66
+ :action_param, ActionParam,
66
67
  end
67
68
  #
68
69
  class EcoreGetopt < FFI::Struct
@@ -76,15 +77,13 @@ module Efl
76
77
  # :descs, :pointer, # NULL terminated EcoreGetopt_Desc[]
77
78
 
78
79
  def desc_ptr idx
79
- EcoreGetoptDesc.new to_ptr+Efl::API::EcoreGetopt.size+(idx*Efl::API::EcoreGetoptDesc.size)
80
+ Efl::EcoreGetopt::Desc.new to_ptr+Efl::EcoreGetopt::EcoreGetopt.size+(idx*Efl::EcoreGetopt::Desc.size)
80
81
  end
81
82
  end
82
83
  #
83
- end
84
- #
85
- module EcoreGetopt
86
- class Parser
84
+ class REcoreGetopt
87
85
  def initialize desc
86
+ @ecore_getopt = nil
88
87
  @desc = desc
89
88
  @options = [
90
89
  [ 0, FFI::Pointer::NULL, FFI::Pointer::NULL, FFI::Pointer::NULL, 0, {:dummy=>FFI::Pointer::NULL} ]
@@ -107,16 +106,16 @@ module Efl
107
106
  @values.insert -2, [ type, ptr ]
108
107
  end
109
108
  def to_ptr
110
- @parser_p.to_ptr
109
+ @ecore_getopt.to_ptr
111
110
  end
112
111
  def create
113
- @parser_p = Efl::API::EcoreGetopt.new FFI::MemoryPointer.new (Efl::API::EcoreGetopt.size+Efl::API::EcoreGetoptDesc.size*@options.length), 1
112
+ @ecore_getopt = Efl::EcoreGetopt::EcoreGetopt.new FFI::MemoryPointer.new (Efl::EcoreGetopt::EcoreGetopt.size+Efl::EcoreGetopt::Desc.size*@options.length), 1
114
113
  [:prog,:usage,:version,:copyright,:license,:description].each do |sym|
115
- @parser_p[sym] = ( @desc.has_key?(sym) ? FFI::MemoryPointer.from_string(@desc[sym]) : FFI::Pointer::NULL )
114
+ @ecore_getopt[sym] = ( @desc.has_key?(sym) ? FFI::MemoryPointer.from_string(@desc[sym]) : FFI::Pointer::NULL )
116
115
  end
117
- @parser_p[:strict] = @desc[:strict] if @desc.has_key? :strict
116
+ @ecore_getopt[:strict] = @desc[:strict] if @desc.has_key? :strict
118
117
  @options.each_with_index do |o,i|
119
- d = @parser_p.desc_ptr i
118
+ d = @ecore_getopt.desc_ptr i
120
119
  d[:shortname] = o[0].ord
121
120
  d[:longname] = p_from_string o[1]
122
121
  d[:help] = p_from_string o[2]
@@ -153,9 +152,9 @@ module Efl
153
152
  d[:action_param][:dummy] = FFI::Pointer::NULL
154
153
  end
155
154
  end
156
- @values_p = FFI::MemoryPointer.new Efl::API::EcoreGetoptValue, @values.length, false
155
+ @values_p = FFI::MemoryPointer.new Efl::EcoreGetopt::Value, @values.length, false
157
156
  @values.each_with_index do |v,i|
158
- Efl::API::EcoreGetoptValue.new(@values_p+(i*Efl::API::EcoreGetoptValue.size))[v[0]] = v[1]
157
+ Efl::EcoreGetopt::Value.new(@values_p+(i*Efl::EcoreGetopt::Value.size))[v[0]] = v[1]
159
158
  end
160
159
  end
161
160
  def parse argv
@@ -164,7 +163,7 @@ module Efl
164
163
  ptr[i].put_pointer 0, p_from_string(s)
165
164
  end
166
165
  ptr[argv.length].put_pointer 0, FFI::Pointer::NULL
167
- Efl::EcoreGetopt.parse @parser_p, @values_p, argv.length, ptr
166
+ Efl::EcoreGetopt.ecore_getopt_parse @ecore_getopt, @values_p, argv.length, ptr
168
167
  end
169
168
  def store_full short, long, help, meta, type, arg_req, def_val
170
169
  self << [ short, long, help, meta, :ecore_getopt_action_store, [:store, [type,arg_req, def_val] ] ]
@@ -251,14 +250,14 @@ module Efl
251
250
  #
252
251
  def debug
253
252
  r = ''
254
- r << "#{self.class} : #{@parser_p.to_ptr}\n"
253
+ r << "#{self.class} : #{@ecore_getopt.to_ptr}\n"
255
254
  [:prog,:usage,:version,:copyright,:license,:description].each do |sym|
256
- r<< " #{sym.to_s} : #{@parser_p[sym]==FFI::Pointer::NULL ? 'NULL' : @parser_p[sym].read_string}\n"
255
+ r<< " #{sym.to_s} : #{@ecore_getopt[sym]==FFI::Pointer::NULL ? 'NULL' : @ecore_getopt[sym].read_string}\n"
257
256
  end
258
- r << " strict : #{@parser_p[:strict]}\n"
257
+ r << " strict : #{@ecore_getopt[:strict]}\n"
259
258
  i=0
260
259
  while true
261
- d = @parser_p.desc_ptr i
260
+ d = @ecore_getopt.desc_ptr i
262
261
  break if d[:shortname]==0 and d[:longname] == FFI::Pointer::NULL
263
262
  r << " desc #{d.to_ptr}\n"
264
263
  r << " short: #{d[:shortname].chr}\n" unless d[:shortname]==0
@@ -0,0 +1,14 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/ffi/ecore_input'
5
+ #
6
+ module Efl
7
+ #
8
+ module EcoreInput
9
+ #
10
+ end
11
+ #
12
+ end
13
+ #
14
+ # EOF
data/lib/efl/edje.rb CHANGED
@@ -1,11 +1,57 @@
1
1
  #! /usr/bin/env ruby
2
2
  # -*- coding: UTF-8 -*-
3
3
  #
4
- require 'efl/edje/edje-ffi'
4
+ require 'efl/evas'
5
+ require 'efl/ffi/edje'
5
6
  #
6
7
  module Efl
8
+ #
7
9
  module Edje
8
10
  #
11
+ class REdje < Efl::Evas::REvasObject
12
+ #
13
+ proxy_list [Efl::Edje,'edje_object_'].freeze
14
+ def part_object_get part
15
+ # EAPI const Evas_Object *edje_object_part_object_get (const Evas_Object *obj, const char *part);
16
+ Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_object_get @ptr, part
17
+ end
18
+ def part_swallow_get part
19
+ # EAPI Evas_Object *edje_object_part_swallow_get (const Evas_Object *obj, const char *part);
20
+ Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_swallow_get @ptr, part
21
+ end
22
+ def external_object_get part
23
+ # EAPI Evas_Object *edje_object_part_external_object_get (const Evas_Object *obj, const char *part);
24
+ Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_external_object_get @ptr, part
25
+ end
26
+ def external_content_get part, content
27
+ # EAPI Evas_Object *edje_object_part_external_content_get (const Evas_Object *obj, const char *part, const char *content);
28
+ Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_external_content_get @ptr, part, content
29
+ end
30
+ def part_box_remove part, child
31
+ # EAPI Evas_Object *edje_object_part_box_remove (Evas_Object *obj, const char *part, Evas_Object *child);
32
+ Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_box_remove @ptr, part, child
33
+ end
34
+ def part_box_remove_at part, pos
35
+ # EAPI Evas_Object *edje_object_part_box_remove_at (Evas_Object *obj, const char *part, unsigned int pos);
36
+ Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_box_remove_at @ptr, part, pos
37
+ end
38
+ def part_child_get part, col, row
39
+ # EAPI Evas_Object *edje_object_part_table_child_get (Evas_Object *obj, const char *part, unsigned int col, unsigned int row);
40
+ Efl::Evas::RevasObject.new Efl::Edje.edje_object_part_child_get @ptr, part, col, row
41
+ end
42
+ end
43
+ #
44
+ end
45
+ #
46
+ module Evas
47
+ #
48
+ class REvas
49
+ def edje_object_add
50
+ # EAPI Evas_Object *edje_object_add (Evas *evas);
51
+ Efl::Edje::REdje.new Efl::Edje.edje_object_add @ptr
52
+ end
53
+ end
54
+ #
9
55
  end
10
56
  end
11
57
  #
data/lib/efl/eet.rb CHANGED
@@ -1,49 +1,41 @@
1
1
  #! /usr/bin/env ruby
2
2
  # -*- coding: UTF-8 -*-
3
3
  #
4
- require 'efl/eet/eet-ffi'
4
+ require 'efl/ffi/eet'
5
5
  #
6
6
  module Efl
7
+ #
7
8
  module Eet
8
9
  #
9
- class << self
10
+ class REetFile
10
11
  #
11
- def open path, mode=FILE_MODE_READ, &blk
12
- if blk
13
- f = Efl::API.eet_open path, mode
14
- raise Exception.new "Unable to open file #{path}" if f.nil?
15
- yield EetFile.new f
16
- Efl::API.eet_close f
17
- else
18
- f = Efl::API.eet_open path, mode
19
- return EetFile.new f unless f.nil?
20
- end
21
- end
22
- end
23
- #
24
- class EetFile
12
+ include Efl::ClassHelper
13
+ proxy_list [Efl::Eet,'eet_'].freeze
25
14
  #
26
15
  def initialize ptr
27
16
  @ptr=ptr
28
17
  end
29
18
  private :initialize
30
19
  #
31
- def close
32
- Efl::API.eet_close @ptr
33
- @ptr=nil
34
- end
35
- #
36
- def mode_get
37
- Efl::API.eet_mode_get @ptr
20
+ def self.open path, mode=:eet_file_mode_read, &blk
21
+ if blk
22
+ f = Efl::Eet.eet_open path, mode
23
+ raise Exception.new "Unable to open file #{path}" if f.nil?
24
+ yield REetFile.new f
25
+ Efl::Eet.eet_close f
26
+ else
27
+ f = Efl::Eet.eet_open path, mode
28
+ return REetFile.new f unless f.nil?
29
+ end
38
30
  end
39
31
  #
40
32
  def write key, data, compress=false
41
- Efl::API.eet_write @ptr, key, FFI::MemoryPointer.from_string(data), data.bytesize, ( compress ? 1 : 0 )
33
+ Efl::Eet.eet_write @ptr, key, FFI::MemoryPointer.from_string(data), data.bytesize, ( compress ? 1 : 0 )
42
34
  end
43
35
  #
44
36
  def read key
45
37
  ptr = FFI::MemoryPointer.new(:int)
46
- data = Efl::API.eet_read @ptr, key, ptr
38
+ data = Efl::Eet.eet_read @ptr, key, ptr
47
39
  s = ptr.read_int
48
40
  ptr.free
49
41
  return nil if s==0
@@ -53,6 +45,7 @@ module Efl
53
45
  end
54
46
  #
55
47
  end
48
+ #
56
49
  end
57
50
  #
58
51
  # EOF
data/lib/efl/eina.rb ADDED
@@ -0,0 +1,14 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/ffi/eina'
5
+ #
6
+ module Efl
7
+ #
8
+ module Eina
9
+ #
10
+ end
11
+ #
12
+ end
13
+ #
14
+ # EOF
@@ -0,0 +1,84 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/ffi/eina_hash'
5
+ #
6
+ class Hash
7
+ def self.from_eina_hash o
8
+ if o.is_a? Efl::EinaHash::REinaHash
9
+ o.to_h
10
+ elsif o.is_a? FFI::Pointer
11
+ Efl::EinaHash::REinaHash.new(o).to_h
12
+ else
13
+ raise ArgumentError.new " wrong argument #{o.class.name}"
14
+ end
15
+ end
16
+ end
17
+ module Efl
18
+ module EinaHash
19
+ #
20
+ class REinaHash
21
+ include Enumerable
22
+ include Efl::ClassHelper
23
+ proxy_list [Efl::EinaHash,'eina_hash_'].freeze
24
+ def initialize o=nil, &block
25
+ cstr = ( block_given? ? block : Proc.new { Efl::EinaHash.eina_hash_string_djb2_new FFI::Pointer::NULL } )
26
+ @ptr = (
27
+ case o
28
+ when NilClass
29
+ FFI::AutoPointer.new cstr.call, method(:free)
30
+ when self.class
31
+ o.to_ptr
32
+ when FFI::AutoPointer
33
+ o
34
+ when FFI::Pointer
35
+ FFI::AutoPointer.new ( o==FFI::Pointer::NULL ? cstr.call : o ), method(:free)
36
+ when Hash
37
+ ptr = cstr.call
38
+ o.each do |k,v| Efl::EinaHash.eina_hash_add ptr, k, v end
39
+ FFI::AutoPointer.new ptr, method(:free)
40
+ else
41
+ raise ArgumentError.new "wrong argument #{o.class.name}"
42
+ end
43
+ )
44
+ end
45
+ def free p=nil
46
+ return Efl::EinaHash.eina_hash_free p unless p.nil?
47
+ Efl::EinaHash.eina_hash_free @ptr
48
+ @ptr.free
49
+ @ptr = nil
50
+ end
51
+ def each data=FFI::Pointer::NULL, &block
52
+ return if not block_given?
53
+ Efl::EinaHash::eina_hash_foreach @ptr, Proc.new{|h,k,v,d| block.call(k,v) }, data
54
+ end
55
+ def to_h
56
+ rh = {}
57
+ each { |k,v| rh[k]=v; true }
58
+ rh
59
+ end
60
+ def to_h_conv &block
61
+ rh = {}
62
+ if block_given?
63
+ each { |k,v| rh[block.call(k)]=v; true }
64
+ else
65
+ each { |k,v| rh[k.read_string]=v; true }
66
+ end
67
+ rh
68
+ end
69
+ # for fun and tests
70
+ def add k, v
71
+ Efl::EinaHash.eina_hash_add @ptr, k, v
72
+ v
73
+ end
74
+ alias :[]= :add
75
+ def find k
76
+ r = Efl::EinaHash.eina_hash_find @ptr, k
77
+ return ( r==FFI::Pointer::NULL ? nil : r )
78
+ end
79
+ alias :[] :find
80
+ end
81
+ end
82
+ end
83
+ #
84
+ # EOF
@@ -0,0 +1,77 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+ #
4
+ require 'efl/ffi/eina_list'
5
+ #
6
+ class Array
7
+ def self.from_eina_list o
8
+ if o.is_a? Efl::EinaList::REinaList
9
+ o.to_ary
10
+ elsif o.is_a? FFI::Pointer
11
+ Efl::EinaList::REinaList.new(o).to_ary
12
+ else
13
+ raise ArgumentError.new "wrong argument #{o.class.name}"
14
+ end
15
+ end
16
+ end
17
+ module Efl
18
+ module EinaList
19
+ #
20
+ class EinaListStruct < FFI::Struct
21
+ layout :data, :pointer,
22
+ :next, :pointer,
23
+ :prev, :pointer,
24
+ :accounting, :pointer,
25
+ :magic, :uint,
26
+ end
27
+ #
28
+ class REinaList
29
+ include Enumerable
30
+ include Efl::ClassHelper
31
+ proxy_list [Efl::EinaList,'eina_list_'].freeze
32
+ def initialize o=nil
33
+ @ptr = (
34
+ case o
35
+ when FFI::Pointer
36
+ o
37
+ when NilClass
38
+ FFI::Pointer::NULL
39
+ when self.class
40
+ o.to_ptr
41
+ when Array
42
+ o.inject(FFI::Pointer::NULL) { |p,e| Efl::EinaList.eina_list_append p, e }
43
+ else
44
+ raise ArgumentError.new "wrong argument #{o.class.name}"
45
+ end
46
+ )
47
+ end
48
+ def free p=nil
49
+ return Efl::EinaList.eina_list_free p unless p.nil?
50
+ Efl::EinaList.eina_list_free @ptr
51
+ @ptr = nil
52
+ end
53
+ def each
54
+ p = @ptr
55
+ while p!=::FFI::Pointer::NULL
56
+ l = Efl::EinaList::EinaListStruct.new p
57
+ yield l[:data]
58
+ p = l[:next]
59
+ end
60
+ end
61
+ def to_ary
62
+ inject([]) { |s,e| s<<e }
63
+ end
64
+ # for fun and tests
65
+ def append p
66
+ @ptr = Efl::EinaList.eina_list_append @ptr, p
67
+ end
68
+ alias :<< :append
69
+ def prepend p
70
+ @ptr = Efl::EinaList.eina_list_prepend @ptr, p
71
+ end
72
+ alias :unshift :prepend
73
+ end
74
+ end
75
+ end
76
+ #
77
+ # EOF