1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4 
5 #include "Efl.h"
6 #include "Ecore.h"
7 #include <Eo.h>
8 
9 #ifdef EAPI
10 # undef EAPI
11 #endif
12 
13 #ifdef _WIN32
14 #  define EAPI __declspec(dllexport)
15 #else
16 # ifdef __GNUC__
17 #  if __GNUC__ >= 4
18 #   define EAPI __attribute__ ((visibility("default")))
19 #  else
20 #   define EAPI
21 #  endif
22 # else
23 #  define EAPI
24 # endif
25 #endif /* ! _WIN32 */
26 
27 
28 #include "efl_mono_model_internal.eo.h"
29 #include "efl_mono_model_internal_child.eo.h"
30 
31 #include "assert.h"
32 
33 typedef struct _Efl_Mono_Model_Internal_Data Efl_Mono_Model_Internal_Data;
34 
35 typedef struct _Properties_Info Properties_Info;
36 struct _Properties_Info
37 {
38   const char* name;
39   const Eina_Value_Type* type;
40 };
41 
42 typedef struct _Efl_Mono_Model_Internal_Data
43 {
44   Eina_Array *properties_info;
45   Eina_Array *properties_names;
46   Eina_Array *items;
47 } _Efl_Mono_Model_Internal_Data;
48 
49 
50 #define MY_CLASS EFL_MONO_MODEL_INTERNAL_CLASS
51 
52 typedef struct _Efl_Mono_Model_Internal_Child_Data
53 {
54   Efl_Mono_Model_Internal_Data* model_pd;
55   size_t index;
56   Eina_Array *values;
57   Eo* child;
58   //Eina_Array *items;
59 } Efl_Mono_Model_Internal_Child_Data;
60 
_find_property_index(const char * name,Eina_Array * properties_name)61 static int _find_property_index (const char* name, Eina_Array* properties_name)
62 {
63    int i, size = eina_array_count_get(properties_name);
64    for (i = 0; i != size; ++i)
65    {
66      if (!strcmp(properties_name->data[i], name))
67        {
68          return i;
69        }
70    }
71    return -1;
72 }
73 
74 static Eo *
_efl_mono_model_internal_efl_object_constructor(Eo * obj,Efl_Mono_Model_Internal_Data * pd)75 _efl_mono_model_internal_efl_object_constructor(Eo *obj, Efl_Mono_Model_Internal_Data *pd)
76 {
77    obj = efl_constructor(efl_super(obj, MY_CLASS));
78 
79    pd->properties_info = eina_array_new(5);
80    pd->properties_names = eina_array_new(5);
81    pd->items = eina_array_new(5);
82 
83    if (!obj) return NULL;
84 
85    return obj;
86 }
87 
88 static void
_efl_mono_model_internal_efl_object_destructor(Eo * obj,Efl_Mono_Model_Internal_Data * pd EINA_UNUSED)89 _efl_mono_model_internal_efl_object_destructor(Eo *obj, Efl_Mono_Model_Internal_Data *pd EINA_UNUSED)
90 {
91    efl_destructor(efl_super(obj, MY_CLASS));
92 }
93 
94 static void
_efl_mono_model_internal_add_property(Eo * obj EINA_UNUSED,Efl_Mono_Model_Internal_Data * pd,const char * name,const Eina_Value_Type * type)95 _efl_mono_model_internal_add_property(Eo *obj EINA_UNUSED, Efl_Mono_Model_Internal_Data *pd, const char *name, const Eina_Value_Type *type)
96 {
97   Properties_Info* info = malloc(sizeof(Properties_Info));
98   info->name = eina_stringshare_add(name);
99   info->type = type;
100   eina_array_push (pd->properties_info, info);
101   eina_array_push (pd->properties_names, eina_stringshare_add(info->name));
102 }
103 
104 static const char* _efl_mono_model_properties_names[] = { };
105 
106 static Eina_Iterator *
_efl_mono_model_internal_efl_model_properties_get(const Eo * obj EINA_UNUSED,Efl_Mono_Model_Internal_Data * pd EINA_UNUSED)107 _efl_mono_model_internal_efl_model_properties_get(const Eo *obj EINA_UNUSED, Efl_Mono_Model_Internal_Data *pd EINA_UNUSED)
108 {
109   return EINA_C_ARRAY_ITERATOR_NEW(_efl_mono_model_properties_names);
110 }
111 
112 static Efl_Object*
_efl_mono_model_internal_efl_model_child_add(Eo * obj,Efl_Mono_Model_Internal_Data * pd)113 _efl_mono_model_internal_efl_model_child_add(Eo *obj, Efl_Mono_Model_Internal_Data *pd)
114 {
115   Efl_Mono_Model_Internal_Child* child = efl_add (EFL_MONO_MODEL_INTERNAL_CHILD_CLASS, obj);
116   assert (child != NULL);
117   Efl_Mono_Model_Internal_Child_Data* pcd = efl_data_xref (child, EFL_MONO_MODEL_INTERNAL_CHILD_CLASS, obj);
118   pcd->model_pd = pd;
119   pcd->index = eina_array_count_get(pd->items);
120   pcd->child = child;
121   pcd->values = eina_array_new(5);
122   eina_array_push (pd->items, pcd);
123 
124   return child;
125 }
126 
127 static unsigned int
_efl_mono_model_internal_efl_model_children_count_get(const Eo * obj EINA_UNUSED,Efl_Mono_Model_Internal_Data * pd)128 _efl_mono_model_internal_efl_model_children_count_get(const Eo *obj EINA_UNUSED, Efl_Mono_Model_Internal_Data *pd)
129 {
130   return eina_array_count_get(pd->items);
131 }
132 
133 static Eina_Future *
_efl_mono_model_internal_efl_model_children_slice_get(Eo * obj,Efl_Mono_Model_Internal_Data * pd,unsigned int start,unsigned int count EINA_UNUSED)134 _efl_mono_model_internal_efl_model_children_slice_get(Eo *obj, Efl_Mono_Model_Internal_Data *pd, unsigned int start, unsigned int count EINA_UNUSED)
135 {
136   unsigned int i;
137   Eina_Value array = EINA_VALUE_EMPTY;
138   Efl_Mono_Model_Internal_Child_Data* pcd;
139 
140   eina_value_array_setup(&array, EINA_VALUE_TYPE_OBJECT, count % 8);
141 
142   for (i = start; i != start + count; ++i)
143   {
144     pcd = eina_array_data_get(pd->items, i);
145     eina_value_array_append (&array, pcd->child);
146   }
147 
148   return efl_loop_future_resolved(obj, array);
149 }
150 
151 static Eina_Future *
_efl_mono_model_internal_efl_model_property_set(Eo * obj,Efl_Mono_Model_Internal_Data * pd EINA_UNUSED,const char * property EINA_UNUSED,Eina_Value * value EINA_UNUSED)152 _efl_mono_model_internal_efl_model_property_set(Eo *obj, Efl_Mono_Model_Internal_Data *pd EINA_UNUSED, const char *property EINA_UNUSED, Eina_Value *value EINA_UNUSED)
153 {
154   return efl_loop_future_rejected(obj, ENOSYS);
155 }
156 
157 static Eina_Value *
_efl_mono_model_internal_efl_model_property_get(const Eo * obj EINA_UNUSED,Efl_Mono_Model_Internal_Data * pd EINA_UNUSED,const char * property EINA_UNUSED)158 _efl_mono_model_internal_efl_model_property_get(const Eo *obj EINA_UNUSED, Efl_Mono_Model_Internal_Data *pd EINA_UNUSED, const char *property EINA_UNUSED)
159 {
160   return eina_value_error_new(ENOSYS);
161 }
162 
163 /// Model_Internal_Child implementations
164 
165 static Eina_Future *
_efl_mono_model_internal_child_efl_model_property_set(Eo * obj,Efl_Mono_Model_Internal_Child_Data * pd,const char * property,Eina_Value * value)166 _efl_mono_model_internal_child_efl_model_property_set(Eo *obj, Efl_Mono_Model_Internal_Child_Data *pd, const char *property, Eina_Value *value)
167 {
168   int i = _find_property_index (property, pd->model_pd->properties_names);
169   int j;
170   Eina_Value* old_value;
171   Eina_Value* new_value;
172   Eina_Value tmp_value;
173 
174   if (i >= 0)
175   {
176     for (j = i - eina_array_count_get (pd->values); j >= 0; --j)
177     {
178       eina_array_push (pd->values, (void*)1);
179       pd->values->data[pd->values->count-1] = NULL;
180     }
181 
182     old_value = eina_array_data_get (pd->values, i);
183     if (old_value)
184       eina_value_free (old_value);
185     new_value = malloc (sizeof(Eina_Value));
186     eina_value_copy (value, new_value);
187     eina_value_copy (value, &tmp_value);
188     eina_array_data_set (pd->values, i, new_value);
189 
190 
191     return efl_loop_future_resolved(obj, tmp_value);
192   }
193   else
194   {
195     // not found property
196     return efl_loop_future_rejected(obj, EAGAIN);
197   }
198 }
199 
200 static Eina_Value *
_efl_mono_model_internal_child_efl_model_property_get(const Eo * obj EINA_UNUSED,Efl_Mono_Model_Internal_Child_Data * pd EINA_UNUSED,const char * property EINA_UNUSED)201 _efl_mono_model_internal_child_efl_model_property_get(const Eo *obj EINA_UNUSED, Efl_Mono_Model_Internal_Child_Data *pd EINA_UNUSED, const char *property EINA_UNUSED)
202 {
203   unsigned int i = _find_property_index (property, pd->model_pd->properties_names);
204   if(eina_array_count_get (pd->values) <= i
205      || eina_array_data_get (pd->values, i) == NULL)
206     return eina_value_error_new(EAGAIN);
207   else
208     {
209       Eina_Value* src = eina_array_data_get(pd->values, i);
210       Eina_Value* clone = malloc (sizeof(Eina_Value));
211       eina_value_copy (src, clone);
212       return clone;
213     }
214 }
215 
216 static Eo *
_efl_mono_model_internal_child_efl_object_constructor(Eo * obj,Efl_Mono_Model_Internal_Child_Data * pd EINA_UNUSED)217 _efl_mono_model_internal_child_efl_object_constructor(Eo *obj, Efl_Mono_Model_Internal_Child_Data *pd EINA_UNUSED)
218 {
219    obj = efl_constructor(efl_super(obj, EFL_MONO_MODEL_INTERNAL_CHILD_CLASS));
220 
221    return obj;
222 }
223 
224 static void
_efl_mono_model_internal_child_efl_object_destructor(Eo * obj,Efl_Mono_Model_Internal_Child_Data * pd EINA_UNUSED)225 _efl_mono_model_internal_child_efl_object_destructor(Eo *obj, Efl_Mono_Model_Internal_Child_Data *pd EINA_UNUSED)
226 {
227    efl_destructor(efl_super(obj, EFL_MONO_MODEL_INTERNAL_CHILD_CLASS));
228 }
229 
230 static Efl_Object*
_efl_mono_model_internal_child_efl_model_child_add(Eo * obj EINA_UNUSED,Efl_Mono_Model_Internal_Child_Data * pd EINA_UNUSED)231 _efl_mono_model_internal_child_efl_model_child_add(Eo *obj EINA_UNUSED, Efl_Mono_Model_Internal_Child_Data *pd EINA_UNUSED)
232 {
233   abort();
234   return NULL;
235 }
236 
237 static Eina_Iterator *
_efl_mono_model_internal_child_efl_model_properties_get(const Eo * obj EINA_UNUSED,Efl_Mono_Model_Internal_Child_Data * pd)238 _efl_mono_model_internal_child_efl_model_properties_get(const Eo *obj EINA_UNUSED, Efl_Mono_Model_Internal_Child_Data *pd)
239 {
240   return eina_array_iterator_new (pd->model_pd->properties_names);
241 }
242 
243 #include "efl_mono_model_internal.eo.c"
244 #include "efl_mono_model_internal_child.eo.c"
245