New function wkb_config_key_signature()
[profile/ivi/weekeyboard.git] / src / wkb-ibus-config-key.c
index 6853974..9a12564 100644 (file)
 
 typedef void (*key_free_cb) (void *);
 typedef Eina_Bool (*key_set_cb) (struct wkb_config_key *, Eldbus_Message_Iter *);
-typedef void *(*key_get_cb) (struct wkb_config_key *);
+typedef Eina_Bool (*key_get_cb) (struct wkb_config_key *, Eldbus_Message_Iter *);
 
 struct wkb_config_key
 {
    const char *id;
+   const char *signature;
    void *field; /* pointer to the actual struct field */
 
    key_free_cb free;
@@ -39,10 +40,11 @@ struct wkb_config_key
 };
 
 static struct wkb_config_key *
-_key_new(const char *id, void *field, key_free_cb free_cb, key_set_cb set_cb, key_get_cb get_cb)
+_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)
 {
    struct wkb_config_key *key = calloc(1, sizeof(*key));
    key->id = eina_stringshare_add(id);
+   key->signature = eina_stringshare_add(signature);
    key->field = field;
    key->free = free_cb;
    key->set = set_cb;
@@ -50,47 +52,48 @@ _key_new(const char *id, void *field, key_free_cb free_cb, key_set_cb set_cb, ke
    return key;
 }
 
-#define _key_basic_set(_type, _dtype) \
+#define _key_basic_set(_key, _type) \
    do { \
         _type __value = 0; \
-        _type *__field = (_type *) key->field; \
-        if (!eldbus_message_iter_arguments_get(iter, _dtype, &__value)) \
+        _type *__field = (_type *) _key->field; \
+        if (!eldbus_message_iter_arguments_get(iter, _key->signature, &__value)) \
           { \
-             printf("Error decoding " #_type " value using '" _dtype "'\n"); \
+             printf("Error decoding " #_type " value using '%s'\n", _key->signature); \
              return EINA_FALSE; \
           } \
         *__field = __value; \
         return EINA_TRUE; \
    } while (0)
 
-#define _key_basic_get(_type, _key) \
+#define _key_basic_get(_key, _type, _iter) \
    do { \
         _type *__field = (_type *) _key->field; \
-        return (void *) *__field; \
+       eldbus_message_iter_basic_append(_iter, *_key->signature, *__field); \
+       return EINA_TRUE; \
    } while (0)
 
 static Eina_Bool
 _key_int_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
 {
-   _key_basic_set(int, "i");
+   _key_basic_set(key, int);
 }
 
-static void *
-_key_int_get(struct wkb_config_key *key)
+static Eina_Bool
+_key_int_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
 {
-   _key_basic_get(int, key);
+   _key_basic_get(key, int, reply);
 }
 
 static Eina_Bool
 _key_bool_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
 {
-   _key_basic_set(Eina_Bool, "b");
+   _key_basic_set(key, Eina_Bool);
 }
 
-static void *
-_key_bool_get(struct wkb_config_key *key)
+static Eina_Bool
+_key_bool_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
 {
-   _key_basic_get(Eina_Bool, key);
+   _key_basic_get(key, Eina_Bool, reply);
 }
 
 static void
@@ -112,7 +115,7 @@ _key_string_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
         return EINA_FALSE;
      }
 
-   if ((*field = (const char *) key->field) != NULL)
+   if ((field = (const char **) key->field) && *field)
       eina_stringshare_del(*field);
 
    if (str && strlen(str))
@@ -123,10 +126,10 @@ _key_string_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
    return EINA_TRUE;
 }
 
-static void *
-_key_string_get(struct wkb_config_key *key)
+static Eina_Bool
+_key_string_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
 {
-   return NULL;
+   _key_basic_get(key, const char *, reply);
 }
 
 static void
@@ -143,41 +146,63 @@ _key_string_list_free(Eina_List **list)
 static Eina_Bool
 _key_string_list_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
 {
+   const char *str;
+   Eina_List *list = NULL;
+   Eina_List **field;
+
+   while (eldbus_message_iter_get_and_next(iter, 's', &str))
+      list = eina_list_append(list,eina_stringshare_add(str));
+
+   if ((field = (Eina_List **) key->field) && *field)
+      _key_string_list_free(field);
+
+   *field = list;
+
    return EINA_TRUE;
 }
 
-static void *
-_key_string_list_get(struct wkb_config_key *key)
+static Eina_Bool
+_key_string_list_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
 {
-   return NULL;
+   Eina_List *node, **list = (Eina_List **) key->field;
+   const char *str;
+   Eldbus_Message_Iter *array;
+
+   array = eldbus_message_iter_container_new(reply, 'a', "s");
+
+   EINA_LIST_FOREACH(*list, node, str)
+      eldbus_message_iter_basic_append(array, 's', str);
+
+   eldbus_message_iter_container_close(reply, array);
+
+   return EINA_TRUE;
 }
 
 /*
  * PUBLIC FUNCTIONS
  */
-
 struct wkb_config_key *
 wkb_config_key_int(const char *id, void *field)
 {
-   return _key_new(id, field, NULL, _key_int_set, _key_int_get);
+   return _key_new(id, "i", field, NULL, _key_int_set, _key_int_get);
 }
 
 struct wkb_config_key *
 wkb_config_key_bool(const char *id, void *field)
 {
-   return _key_new(id, field, NULL, _key_bool_set, _key_bool_get);
+   return _key_new(id, "b", field, NULL, _key_bool_set, _key_bool_get);
 }
 
 struct wkb_config_key *
 wkb_config_key_string(const char *id, void *field)
 {
-   return _key_new(id, field, (key_free_cb) _key_string_free, _key_string_set, _key_string_get);
+   return _key_new(id, "s", field, (key_free_cb) _key_string_free, _key_string_set, _key_string_get);
 }
 
 struct wkb_config_key *
 wkb_config_key_string_list(const char *id, void *field)
 {
-   return _key_new(id, field, (key_free_cb) _key_string_list_free, _key_string_list_set, _key_string_list_get);
+   return _key_new(id, "as", field, (key_free_cb) _key_string_list_free, _key_string_list_set, _key_string_list_get);
 }
 
 void
@@ -187,6 +212,7 @@ wkb_config_key_free(struct wkb_config_key *key)
       key->free(key->field);
 
    eina_stringshare_del(key->id);
+   eina_stringshare_del(key->signature);
    free(key);
 }
 
@@ -196,6 +222,12 @@ wkb_config_key_id(struct wkb_config_key *key)
    return key->id;
 }
 
+const char *
+wkb_config_key_signature(struct wkb_config_key *key)
+{
+   return key->signature;
+}
+
 Eina_Bool
 wkb_config_key_set(struct wkb_config_key * key, Eldbus_Message_Iter *iter)
 {
@@ -205,12 +237,12 @@ wkb_config_key_set(struct wkb_config_key * key, Eldbus_Message_Iter *iter)
    return key->set(key, iter);
 }
 
-void *
-wkb_config_key_get(struct wkb_config_key *key)
+Eina_Bool
+wkb_config_key_get(struct wkb_config_key *key, Eldbus_Message_Iter *reply)
 {
    if (!key->field || !key->get)
-      return NULL;
+      return EINA_FALSE;
 
-   return key->get(key);
+   return key->get(key, reply);
 }