2 //gcc -g eina_model_03.c -o eina_model_03 `pkg-config --cflags --libs eina`
9 static Eina_Model_Type *ADDRESS_BOOK_TYPE;
10 static Eina_Model_Type *PERSON_TYPE;
12 static void address_book_init(void);
16 Eina_Model *address_book;
25 address_book = eina_model_new(ADDRESS_BOOK_TYPE);
27 eina_value_setup(&val, EINA_VALUE_TYPE_STRING);
28 eina_value_set(&val, "addr_book.txt");
29 eina_model_property_set(address_book, "filename", &val);
30 eina_value_flush(&val);
32 eina_model_load(address_book);
33 s = eina_model_to_string(address_book);
34 printf("model as string:\n%s\n\n", s);
37 count = eina_model_child_count(address_book);
38 printf("Address Book with %d entries:\n", count);
39 for (i = 0; i < count; i++)
41 Eina_Model *person = eina_model_child_get(address_book, i);
42 Eina_Value nameval, emailval;
43 const char *name, *email;
45 eina_model_property_get(person, "name", &nameval);
46 eina_model_property_get(person, "email", &emailval);
48 eina_value_get(&nameval, &name);
49 eina_value_get(&emailval, &email);
51 printf("%02d \"%s\" <%s>\n", i, name, email);
53 // We don't need property values anymore
54 eina_value_flush(&nameval);
55 eina_value_flush(&emailval);
57 // We don't need our reference to person anymore
58 eina_model_unref(person);
61 eina_model_unref(address_book);
67 // Structure Descriptions are just used internally in the type constructors:
68 static Eina_Value_Struct_Desc *ADDRESS_BOOK_DESC;
69 static Eina_Value_Struct_Desc *PERSON_DESC;
72 _person_constructor(Eina_Model *model)
74 // call parent type constructor, like "super" in other languages:
75 if (!eina_model_type_constructor(EINA_MODEL_TYPE_STRUCT, model))
78 // Do specific setup of our internal structure, letting it know about
80 return eina_model_struct_set(model, PERSON_DESC, NULL);
84 _address_book_constructor(Eina_Model *model)
86 // call parent type constructor, like "super" in other languages:
87 if (!eina_model_type_constructor(EINA_MODEL_TYPE_STRUCT, model))
90 // Do specific setup of our internal structure, letting it know about
92 return eina_model_struct_set(model, ADDRESS_BOOK_DESC, NULL);
96 _address_book_load(Eina_Model *model)
103 // We retrieve filename from property of same name:
104 eina_model_property_get(model, "filename", &val);
105 eina_value_get(&val, &filename);
107 EINA_SAFETY_ON_NULL_RETURN_VAL(filename, EINA_FALSE);
109 f = fopen(filename, "r");
111 // Now that we have used filename, we must free its memory holder:
112 eina_value_flush(&val);
114 EINA_SAFETY_ON_NULL_RETURN_VAL(f, EINA_FALSE);
116 while (fgets(buf, sizeof(buf), f))
121 if (strlen(buf) <= 1)
124 name = strtok(buf, "\t");
125 email = strtok(NULL, "\n");
127 if ((!name) || (!email)) continue;
130 person = eina_model_new(PERSON_TYPE);
132 // Setup value type as string, as our properties are strings:
133 eina_value_setup(&val, EINA_VALUE_TYPE_STRING);
135 // Set string properties:
136 eina_value_set(&val, name);
137 eina_model_property_set(person, "name", &val);
139 eina_value_set(&val, email);
140 eina_model_property_set(person, "email", &val);
142 // Flush value, free string
143 eina_value_flush(&val);
145 // Add person to the end of model children
146 eina_model_child_append(model, person);
148 // Model already holds its reference to person, we release ours
149 eina_model_unref(person);
157 address_book_init(void)
159 // Declare type for internal struct, this is just used to easily
160 // create Eina_Value_Struct_Member array for Eina_Value_Struct_Desc.
162 // We don't need this structure outside address_book_init()
163 // as it is managed automatically by Eina_Value_Struct, used by
164 // Eina_Model_Struct! Handy! :-)
165 typedef struct _Person Person;
171 static Eina_Value_Struct_Member person_members[] = {
172 // no eina_value_type as they are not constant initializers, see below.
173 EINA_VALUE_STRUCT_MEMBER(NULL, Person, name),
174 EINA_VALUE_STRUCT_MEMBER(NULL, Person, email)
176 // Values that cannot be set on static declarations since they are not
177 // constant initializers. It is a nitpick from C that we need to deal with
178 // here and on all our other declarations.
179 person_members[0].type = EINA_VALUE_TYPE_STRING;
180 person_members[1].type = EINA_VALUE_TYPE_STRING;
182 static Eina_Value_Struct_Desc person_desc = {
183 EINA_VALUE_STRUCT_DESC_VERSION,
184 NULL, // no special operations
186 EINA_C_ARRAY_LENGTH(person_members),
189 static Eina_Model_Type person_type = EINA_MODEL_TYPE_INIT_NOPRIVATE
192 NULL, // no type as EINA_MODEL_TYPE_STRUCT is not constant initializer!
193 NULL, // no extra interfaces
194 NULL // no extra events);
196 person_type.parent = EINA_MODEL_TYPE_STRUCT;
197 // Set our overloaded methods:
198 person_type.constructor = _person_constructor;
200 typedef struct _Address_Book Address_Book;
203 const char *filename;
205 static Eina_Value_Struct_Member address_book_members[] = {
206 // no eina_value_type as they are not constant initializers, see below.
207 EINA_VALUE_STRUCT_MEMBER(NULL, Address_Book, filename)
209 address_book_members[0].type = EINA_VALUE_TYPE_STRING;
210 static Eina_Value_Struct_Desc address_book_desc = {
211 EINA_VALUE_STRUCT_DESC_VERSION,
212 NULL, // no special operations
213 address_book_members,
214 EINA_C_ARRAY_LENGTH(address_book_members),
217 static Eina_Model_Type address_book_type = EINA_MODEL_TYPE_INIT_NOPRIVATE
218 ("Address_Book_Type",
220 NULL, // no type as EINA_MODEL_TYPE_STRUCT is not constant initializer!
221 NULL, // no extra interfaces
222 NULL // no extra events);
224 address_book_type.parent = EINA_MODEL_TYPE_STRUCT;
225 // Set our overloaded methods:
226 address_book_type.constructor = _address_book_constructor;
227 address_book_type.load = _address_book_load;
229 // Expose the configured pointers to public usage:
230 // NOTE: they are static, so they live after this function returns!
231 PERSON_TYPE = &person_type;
232 PERSON_DESC = &person_desc;
234 ADDRESS_BOOK_TYPE = &address_book_type;
235 ADDRESS_BOOK_DESC = &address_book_desc;