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