util: add utiliy functions for system settings and runtime info 08/59008/5
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Mon, 8 Feb 2016 10:39:15 +0000 (11:39 +0100)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Wed, 10 Feb 2016 16:48:12 +0000 (08:48 -0800)
System settings and runtime info API allows to register only one global
callback per key. In case when multiple indicator modules wants to listen
on the same key changes API enforces some cross module dependencies.

Adding utility function for handling multiple callbacks per key solves this
issue, making module more independent of each other.

Change-Id: Ie760ab7184a6a7f5ca402e6ef1db2350b57a2de2
Signed-off-by: Lukasz Stanislawski <l.stanislaws@samsung.com>
inc/util.h
src/util.c

index 27d79e9..2a8ced2 100644 (file)
@@ -23,6 +23,8 @@
 #define __INDICATOR_UTIL_H__
 #include <Ecore.h>
 #include <wifi.h>
+#include <system_settings.h>
+#include <runtime_info.h>
 
 typedef enum {
        INDICATOR_ERROR_NONE = 0,
@@ -128,4 +130,42 @@ int util_wifi_set_connection_state_changed_cb(wifi_connection_state_changed_cb,
  */
 void util_wifi_unset_connection_state_changed_cb(wifi_connection_state_changed_cb);
 
+/**
+ * @brief Allows to register multiple callbacks using system_settings_changed_cb API.
+ *
+ * @param key key to monitor.
+ * @param cb callback.
+ * @param data user_data passed to callback function.
+ *
+ * @return 0 on success, other value on failure.
+ */
+int util_system_settings_set_changed_cb(system_settings_key_e key, system_settings_changed_cb cb, void *data);
+
+/**
+ * @brief Unregisters callback set with util_system_settings_set_changed_cb.
+ *
+ * @param key key to stop monitor.
+ * @param cb callback
+ */
+void util_system_settings_unset_changed_cb(system_settings_key_e key, system_settings_changed_cb cb);
+
+/**
+ * @brief Allows to register multiple callbacks using runtime_info_set_changed_cb API.
+ *
+ * @param key key to monitor.
+ * @param cb callback.
+ * @param data user data passed to callback function.
+ *
+ * @return 0 on success, other value on failure.
+ */
+int util_runtime_info_set_changed_cb(runtime_info_key_e key, runtime_info_changed_cb cb, void *data);
+
+/**
+ * @brief Unregisters callback set with util_runtime_info_set_changed_cb.
+ *
+ * @param key key to stop monitor.
+ * @param cb callback.
+ */
+void util_runtime_info_unset_changed_cb(runtime_info_key_e key, runtime_info_changed_cb cb);
+
 #endif /* __INDICATOR_UTIL_H__ */
index aaffbfc..1258b8d 100644 (file)
@@ -44,7 +44,21 @@ typedef struct {
        void *data;
 } wifi_handler_t;
 
+typedef struct {
+       system_settings_key_e key;
+       system_settings_changed_cb cb;
+       void *data;
+} system_settings_handler_t;
+
+typedef struct {
+       runtime_info_key_e key;
+       runtime_info_changed_cb cb;
+       void *data;
+} runtime_info_handler_t;
+
 static Eina_List *wifi_callbacks;
+static Eina_List *ss_callbacks;
+static Eina_List *ri_callbacks;
 
 char *util_set_label_text_color(const char *txt)
 {
@@ -670,4 +684,115 @@ void util_wifi_unset_connection_state_changed_cb(wifi_connection_state_changed_c
                wifi_unset_connection_state_changed_cb();
 }
 
+static void _system_settings_cb(system_settings_key_e key, void *data)
+{
+       Eina_List *l;
+       system_settings_handler_t *hdl;
+
+       EINA_LIST_FOREACH(ss_callbacks, l, hdl) {
+               if (hdl->key == key) {
+                       if (hdl->cb) hdl->cb(key, hdl->data);
+               }
+       }
+}
+
+int util_system_settings_set_changed_cb(system_settings_key_e key, system_settings_changed_cb cb, void *data)
+{
+       system_settings_handler_t *handler = malloc(sizeof(system_settings_handler_t));
+       if (!handler) {
+               return -1;
+       }
+
+       int err = system_settings_set_changed_cb(key, _system_settings_cb, NULL);
+       if (err != SYSTEM_SETTINGS_ERROR_NONE) {
+               free(handler);
+               return -1;
+       }
+
+       handler->key = key;
+       handler->cb = cb;
+       handler->data = data;
+
+       ss_callbacks = eina_list_append(ss_callbacks, handler);
+
+       return 0;
+}
+
+void util_system_settings_unset_changed_cb(system_settings_key_e key, system_settings_changed_cb cb)
+{
+       Eina_List *l, *l2;
+       system_settings_handler_t *hdl;
+       Eina_Bool del_key_cb = EINA_TRUE;
+
+       EINA_LIST_FOREACH_SAFE(ss_callbacks, l, l2, hdl) {
+               if (hdl->key == key) {
+                       if (hdl->cb == cb) {
+                               ss_callbacks = eina_list_remove_list(ss_callbacks, l);
+                               free(hdl);
+                       }
+                       else {
+                               del_key_cb = EINA_FALSE;
+                       }
+               }
+       }
+       if (del_key_cb)
+               system_settings_unset_changed_cb(key);
+}
+
+static void _runtime_info_cb(runtime_info_key_e key, void *data)
+{
+       Eina_List *l;
+       runtime_info_handler_t *hdl;
+
+       EINA_LIST_FOREACH(ri_callbacks, l, hdl) {
+               if (hdl->key == key) {
+                       if (hdl->cb) hdl->cb(key, hdl->data);
+               }
+       }
+}
+
+int util_runtime_info_set_changed_cb(runtime_info_key_e key, runtime_info_changed_cb cb, void *data)
+{
+       runtime_info_handler_t *handler = malloc(sizeof(runtime_info_handler_t));
+       if (!handler) {
+               return -1;
+       }
+
+       int err = runtime_info_set_changed_cb(key, _runtime_info_cb, NULL);
+       if (err != RUNTIME_INFO_ERROR_NONE) {
+               free(handler);
+               return -1;
+       }
+
+       handler->key = key;
+       handler->cb = cb;
+       handler->data = data;
+
+       ri_callbacks = eina_list_append(ri_callbacks, handler);
+
+       return 0;
+}
+
+void util_runtime_info_unset_changed_cb(runtime_info_key_e key, runtime_info_changed_cb cb)
+{
+       Eina_List *l, *l2;
+       runtime_info_handler_t *hdl;
+       Eina_Bool del_key_cb = EINA_TRUE;
+
+       EINA_LIST_FOREACH_SAFE(ri_callbacks, l, l2, hdl) {
+               if (hdl->key == key) {
+                       if (hdl->cb == cb) {
+                               ri_callbacks = eina_list_remove_list(ri_callbacks, l);
+                               free(hdl);
+                       }
+                       else {
+                               del_key_cb = EINA_FALSE;
+                       }
+               }
+       }
+       if (del_key_cb)
+               runtime_info_unset_changed_cb(key);
+
+}
+
 /* End of file */