1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include "Efl.h"
6 #include "Efl_MVVM_Common.h"
7
8 EAPI Eina_Error EFL_MODEL_ERROR_UNKNOWN = 0;
9 EAPI Eina_Error EFL_MODEL_ERROR_NOT_SUPPORTED = 0;
10 EAPI Eina_Error EFL_MODEL_ERROR_NOT_FOUND = 0;
11 EAPI Eina_Error EFL_MODEL_ERROR_READ_ONLY = 0;
12 EAPI Eina_Error EFL_MODEL_ERROR_INIT_FAILED = 0;
13 EAPI Eina_Error EFL_MODEL_ERROR_PERMISSION_DENIED = 0;
14 EAPI Eina_Error EFL_MODEL_ERROR_INCORRECT_VALUE = 0;
15 EAPI Eina_Error EFL_MODEL_ERROR_INVALID_OBJECT = 0;
16
17 EAPI Eina_Error EFL_FACTORY_ERROR_NOT_SUPPORTED = 0;
18 EAPI Eina_Error EFL_PROPERTY_ERROR_INVALID_KEY = 0;
19
20 static const char EFL_MODEL_ERROR_UNKNOWN_STR[] = "Unknown Error";
21 static const char EFL_MODEL_ERROR_NOT_SUPPORTED_STR[] = "Operation not supported";
22 static const char EFL_MODEL_ERROR_NOT_FOUND_STR[] = "Value not found";
23 static const char EFL_MODEL_ERROR_READ_ONLY_STR[] = "Value read only";
24 static const char EFL_MODEL_ERROR_INIT_FAILED_STR[] = "Init failed";
25 static const char EFL_MODEL_ERROR_PERMISSION_DENIED_STR[] = "Permission denied";
26 static const char EFL_MODEL_ERROR_INCORRECT_VALUE_STR[] = "Incorrect value";
27 static const char EFL_MODEL_ERROR_INVALID_OBJECT_STR[] = "Object is invalid";
28
29 static const char EFL_FACTORY_ERROR_NOT_SUPPORTED_STR[] = "Operation not supported";
30
31 static const char EFL_PROPERTY_ERROR_INVALID_KEY_STR[] = "Incorrect key provided";
32
33
34 EAPI int
efl_model_init(void)35 efl_model_init(void)
36 {
37 #define _ERROR(Name) EFL_MODEL_ERROR_##Name = eina_error_msg_static_register(EFL_MODEL_ERROR_##Name##_STR);
38 _ERROR(INCORRECT_VALUE);
39 _ERROR(UNKNOWN);
40 _ERROR(NOT_SUPPORTED);
41 _ERROR(NOT_FOUND);
42 _ERROR(READ_ONLY);
43 _ERROR(INIT_FAILED);
44 _ERROR(PERMISSION_DENIED);
45 _ERROR(INVALID_OBJECT);
46
47 #undef _ERROR
48 #define _ERROR(Name) EFL_FACTORY_ERROR_##Name = eina_error_msg_static_register(EFL_FACTORY_ERROR_##Name##_STR);
49 _ERROR(NOT_SUPPORTED);
50
51 #undef _ERROR
52 #define _ERROR(Name) EFL_PROPERTY_ERROR_##Name = eina_error_msg_static_register(EFL_PROPERTY_ERROR_##Name##_STR);
53 _ERROR(INVALID_KEY);
54
55 return EINA_TRUE;
56 }
57
58 #undef _ERROR
59
60 EAPI void
_efl_model_properties_changed_internal(const Efl_Model * model,...)61 _efl_model_properties_changed_internal(const Efl_Model *model, ...)
62 {
63 Efl_Model_Property_Event ev = { 0 };
64 Eina_Array *properties = eina_array_new(1);
65 Eina_Stringshare *sp;
66 const char *property;
67 va_list args;
68
69 va_start(args, model);
70
71 while ((property = (const char*) va_arg(args, const char*)))
72 {
73 eina_array_push(properties, eina_stringshare_add(property));
74 }
75
76 va_end(args);
77
78 ev.changed_properties = properties;
79
80 efl_event_callback_call((Efl_Model *) model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, &ev);
81
82 while ((sp = eina_array_pop(properties)))
83 eina_stringshare_del(sp);
84 eina_array_free(properties);
85 }
86
87 EAPI void
efl_model_property_invalidated_notify(Efl_Model * model,const char * property)88 efl_model_property_invalidated_notify(Efl_Model *model, const char *property)
89 {
90 Eina_Array *invalidated_properties = eina_array_new(1);
91 EINA_SAFETY_ON_NULL_RETURN(invalidated_properties);
92
93 Eina_Stringshare *sp = eina_stringshare_add(property);
94
95 Eina_Bool ret = eina_array_push(invalidated_properties, sp);
96 EINA_SAFETY_ON_FALSE_GOTO(ret, on_error);
97
98 Efl_Model_Property_Event evt = {.invalidated_properties = invalidated_properties};
99 efl_event_callback_call(model, EFL_MODEL_EVENT_PROPERTIES_CHANGED, &evt);
100
101 on_error:
102 eina_stringshare_del(sp);
103 eina_array_free(invalidated_properties);
104 }
105
106 typedef struct _Efl_Model_Value_Struct_Desc Efl_Model_Value_Struct_Desc;
107
108 struct _Efl_Model_Value_Struct_Desc
109 {
110 Eina_Value_Struct_Desc base;
111 void *data;
112 Eina_Value_Struct_Member members[];
113 };
114
115 EAPI Eina_Value_Struct_Desc *
efl_model_value_struct_description_new(unsigned int member_count,Efl_Model_Value_Struct_Member_Setup_Cb setup_cb,void * data)116 efl_model_value_struct_description_new(unsigned int member_count, Efl_Model_Value_Struct_Member_Setup_Cb setup_cb, void *data)
117 {
118 Efl_Model_Value_Struct_Desc *desc;
119 unsigned int offset = 0;
120 size_t i;
121
122 EINA_SAFETY_ON_FALSE_RETURN_VAL(member_count > 0, NULL);
123 EINA_SAFETY_ON_NULL_RETURN_VAL(setup_cb, NULL);
124 EINA_SAFETY_ON_NULL_RETURN_VAL(data, NULL);
125
126 desc = malloc(sizeof(Efl_Model_Value_Struct_Desc) + member_count * sizeof(Eina_Value_Struct_Member));
127 EINA_SAFETY_ON_NULL_RETURN_VAL(desc, NULL);
128
129 desc->base.version = EINA_VALUE_STRUCT_DESC_VERSION;
130 desc->base.ops = EINA_VALUE_STRUCT_OPERATIONS_STRINGSHARE;
131 desc->base.members = desc->members;
132 desc->base.member_count = member_count;
133 desc->base.size = 0;
134 desc->data = data;
135
136 for (i = 0; i < member_count; ++i)
137 {
138 Eina_Value_Struct_Member *m = (Eina_Value_Struct_Member *)desc->members + i;
139 unsigned int size;
140
141 m->offset = offset;
142 setup_cb(data, i, m);
143
144 size = m->type->value_size;
145 if (size % sizeof(void *) != 0)
146 size += size - (size % sizeof(void *));
147
148 offset += size;
149 }
150
151 desc->base.size = offset;
152 return &desc->base;
153 }
154
155 EAPI void
efl_model_value_struct_description_free(Eina_Value_Struct_Desc * desc)156 efl_model_value_struct_description_free(Eina_Value_Struct_Desc *desc)
157 {
158 size_t i;
159
160 if (!desc) return;
161
162 for (i = 0; i < desc->member_count; i++)
163 eina_stringshare_del(desc->members[i].name);
164 free(desc);
165 }
166