ffi-efl 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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