2 * Copyright © 2013 Intel Corporation
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <sys/types.h>
25 #include "wkb-ibus-config-key.h"
27 typedef void (*key_free_cb) (void *);
28 typedef Eina_Bool (*key_set_cb) (struct wkb_config_key *, Eldbus_Message_Iter *);
29 typedef Eina_Bool (*key_get_cb) (struct wkb_config_key *, Eldbus_Message_Iter *);
34 const char *signature;
35 void *field; /* pointer to the actual struct field */
42 static struct wkb_config_key *
43 _key_new(const char *id, const char *signature, void *field, key_free_cb free_cb, key_set_cb set_cb, key_get_cb get_cb)
45 struct wkb_config_key *key = calloc(1, sizeof(*key));
46 key->id = eina_stringshare_add(id);
47 key->signature = eina_stringshare_add(signature);
55 #define _key_basic_set(_key, _type) \
58 _type *__field = (_type *) _key->field; \
59 if (!eldbus_message_iter_arguments_get(iter, _key->signature, &__value)) \
61 printf("Error decoding " #_type " value using '%s'\n", _key->signature); \
68 #define _key_basic_get(_key, _type, _iter) \
70 _type *__field = (_type *) _key->field; \
71 eldbus_message_iter_basic_append(_iter, *_key->signature, *__field); \
76 _key_int_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
78 _key_basic_set(key, int);
82 _key_int_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
84 _key_basic_get(key, int, reply);
88 _key_bool_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
90 _key_basic_set(key, Eina_Bool);
94 _key_bool_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
96 _key_basic_get(key, Eina_Bool, reply);
100 _key_string_free(const char **str)
103 eina_stringshare_del(*str);
107 _key_string_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
112 if (!eldbus_message_iter_arguments_get(iter, "s", &str))
114 printf("Error decoding string value using 's'\n");
118 if ((field = (const char **) key->field) && *field)
119 eina_stringshare_del(*field);
121 if (str && strlen(str))
122 *field = eina_stringshare_add(str);
130 _key_string_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
132 _key_basic_get(key, const char *, reply);
136 _key_string_list_free(Eina_List **list)
140 EINA_LIST_FREE(*list, str)
141 eina_stringshare_del(str);
143 eina_list_free(*list);
147 _key_string_list_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
150 Eina_List *list = NULL;
153 while (eldbus_message_iter_get_and_next(iter, 's', &str))
154 list = eina_list_append(list,eina_stringshare_add(str));
156 if ((field = (Eina_List **) key->field) && *field)
157 _key_string_list_free(field);
165 _key_string_list_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
167 Eina_List *node, **list = (Eina_List **) key->field;
169 Eldbus_Message_Iter *array;
171 array = eldbus_message_iter_container_new(reply, 'a', "s");
173 EINA_LIST_FOREACH(*list, node, str)
174 eldbus_message_iter_basic_append(array, 's', str);
176 eldbus_message_iter_container_close(reply, array);
184 struct wkb_config_key *
185 wkb_config_key_int(const char *id, void *field)
187 return _key_new(id, "i", field, NULL, _key_int_set, _key_int_get);
190 struct wkb_config_key *
191 wkb_config_key_bool(const char *id, void *field)
193 return _key_new(id, "b", field, NULL, _key_bool_set, _key_bool_get);
196 struct wkb_config_key *
197 wkb_config_key_string(const char *id, void *field)
199 return _key_new(id, "s", field, (key_free_cb) _key_string_free, _key_string_set, _key_string_get);
202 struct wkb_config_key *
203 wkb_config_key_string_list(const char *id, void *field)
205 return _key_new(id, "as", field, (key_free_cb) _key_string_list_free, _key_string_list_set, _key_string_list_get);
209 wkb_config_key_free(struct wkb_config_key *key)
211 if (key->free && key->field)
212 key->free(key->field);
214 eina_stringshare_del(key->id);
215 eina_stringshare_del(key->signature);
220 wkb_config_key_id(struct wkb_config_key *key)
226 wkb_config_key_signature(struct wkb_config_key *key)
228 return key->signature;
232 wkb_config_key_set(struct wkb_config_key * key, Eldbus_Message_Iter *iter)
234 if (!key->field || !key->set)
237 return key->set(key, iter);
241 wkb_config_key_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
243 if (!key->field || !key->get)
246 return key->get(key, reply);