fixed N_SE_23995
[apps/core/preloaded/settings.git] / src / setting-plugin.c
index 7896658..e37a7fc 100755 (executable)
@@ -23,8 +23,6 @@
 #include <eina_list.h>
 #include <glib.h>
 
-#include <libxml/xmlmemory.h>
-#include <libxml/parser.h>
 
 #include <setting-debug.h>
 #include <setting-common-general-func.h>
 
 #include <setting-plugin.h>
 
+
+extern setting_main_appdata *g_main_ad;
+
+static Setting_GenGroupItem_Data *g_list_item; /*TEST*/
+
 /*
  * UI draw handler table : _g_draw_list
  *  - contains Object_Drawer typed object.
  */
 Eina_List *_g_drawer_list = NULL;
 
-typedef void (*drawer_fp)(void *data, xmlNode *xmlObj);
-static void group_func(void *data, xmlNode *xmlObj);
-static void link_func(void *data, xmlNode *xmlObj);
-static void slider_func(void *data, xmlNode *xmlObj);
-static void navigationbar_func(void *data, xmlNode *xmlObj);
-static void checkbox_func(void *data, xmlNode *xmlObj);
-static void editbox_func(void *data, xmlNode *xmlObj);
-static void expanditem_func(void *data, xmlNode *xmlObj);
-static void expandlist_func(void *data, xmlNode *xmlObj);
-static void settings_func(void *data, xmlNode *xmlObj);
-static void setting_func(void *data, xmlNode *xmlObj);
-
-// draw handler
-typedef struct
-{
-       const char* type;                       // ui type
-       drawer_fp draw;
-} Object_Drawer;
+#if 0
+/**
+ * @return Evas_Object * obj
+ */
+static void* navigationbar_func(void *data, xmlNode *xmlObj);
+#endif
+
+/*
+ * @return void
+ */
+static void* group_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* link_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* slider_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* label_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* checkbox_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* editbox_func(void *data, xmlNode *xmlObj);
+
+/*
+ * @return Setting_GenGroupItem_Data* ptr
+ */
+static void* expandlist_func(void *data, xmlNode *xmlObj);
+
+/**
+ * @return nothing
+ */
+static void* expanditem_func(void *data, xmlNode *xmlObj);
+
+/**
+ * do nothing
+ */
+static void* settings_func(void *data, xmlNode *xmlObj);
+
+
+static void* launch_func(void *data, xmlNode *xmlObj);
+
+/**
+ * do nothing
+ */
+static void* setting_func(void *data, xmlNode *xmlObj);
+
+static int __node_walker(PluginNode* context, xmlNode* cur);
+
+static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end);
+
 
 static void __drawer_add(const char *type, drawer_fp draw)
 {
@@ -67,18 +116,18 @@ static void __drawer_add(const char *type, drawer_fp draw)
 
                _g_drawer_list = eina_list_append(_g_drawer_list, node);
        }
+       // FREE(node);
 }
 
 
 static drawer_fp __drawer_find(char* type)
 {
        SETTING_TRACE_BEGIN;
+       SETTING_TRACE("node type:%s", type);
        Eina_List *check_list = _g_drawer_list;
-       Object_Drawer *list_item = NULL;
+       Object_Drawer *list_item = NULL;
 
        while (check_list) {
-
-               list_item = NULL;
                list_item = (Object_Drawer *) eina_list_data_get(check_list);
                if (NULL == list_item)
                        continue;
@@ -88,20 +137,26 @@ static drawer_fp __drawer_find(char* type)
                        //SETTING_TRACE("list_item->type:%s", list_item->type);
                        break;
                }
-
+               //if not matched,to check next node.
                check_list = eina_list_next(check_list);
+               list_item = NULL;
        }
        //SETTING_TRACE("list_item:%p", list_item);
        return list_item ? list_item->draw : NULL;
 }
 void setting_drawer_list_init()
-{SETTING_TRACE_BEGIN;
+{
+       SETTING_TRACE_BEGIN;
+#if 0
        /* <navigationbar> */__drawer_add("navigationbar", navigationbar_func);
+#endif
        /* <bool>          */__drawer_add("bool", checkbox_func);
        /* <string>        */__drawer_add("string", editbox_func);
        /* <group>         */__drawer_add("group", group_func);
        /* <integer>       */__drawer_add("integer", slider_func);
-       /* <link           */__drawer_add("link", link_func);
+       /* <label>         */__drawer_add("label", label_func);
+       /* <link>          */__drawer_add("link", link_func);
+       /* <launch>        */__drawer_add("launch", launch_func);
        /* <extendlist>    */__drawer_add("expandlist", expandlist_func);
        /* <extenditem>    */__drawer_add("expanditem", expanditem_func);
        /* <settings>      */__drawer_add("settings", settings_func);
@@ -118,7 +173,7 @@ void setting_drawer_list_fini()
                        node = (Object_Drawer *) eina_list_data_get(li);
                        if (node)
                        {
-                               SETTING_TRACE("Deregister %s", node->type);
+                               //SETTING_TRACE("Deregister %s", node->type);
                                FREE(node);
                        }
                        li = eina_list_next(li);
@@ -136,8 +191,35 @@ void setting_drawer_list_fini()
 #define MAX_LOCAL_BUFSIZE 128
 #define DBUS_PATH "/setting/dbus_handler"
 #define DBUS_SIGNAL_INTERFACE "org.tizen.setting.signal"
-#define DBUS_SIGNAL "test"
 
+#define APPID_LENGTH 10
+#define APPID_POS_FROM_PATH 10
+
+static char* s_pkg_name;
+
+#if 0
+static char* substring(const char* str, size_t begin, size_t len)
+{
+  if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
+    return 0;
+
+  return strndup(str + begin, len);
+}
+#endif
+
+/**
+ * package ID
+ *
+ * ncbyusjryr.AppSetting --> package ID is ncbyusjryr
+ * "Update_" "ncbyusjryr"
+ */
+static char* get_app_string(char* path)
+{
+       SETTING_TRACE_BEGIN;
+       char* temp = substring(path, APPID_POS_FROM_PATH, APPID_LENGTH/*string size*/);
+       SETTING_TRACE("package ID : >>> %s ",temp );
+       return temp;
+}
 
 //------------------------------------------------------
 // for client - bus
@@ -153,7 +235,33 @@ static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* mess
     DBusError error;
     dbus_error_init(&error);
 
-    if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, DBUS_SIGNAL))
+       setting_main_appdata *ad = user_data;
+       char* plugin_path = ad->plugin_path;
+       char* pkg_name = get_app_string(plugin_path);
+
+       if (pkg_name == NULL)
+       {
+               SETTING_TRACE("pkg_name is NULL - it's abnormal operation");
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       }
+
+       char str_buf[MAX_COMMON_BUFFER_LEN];
+       snprintf(str_buf, MAX_COMMON_BUFFER_LEN, "Update_%s", pkg_name);
+       s_pkg_name = strdup(str_buf);
+
+       if (pkg_name)
+       {
+               free(pkg_name);
+               pkg_name = NULL;
+       }
+
+       if (s_pkg_name == NULL)
+       {
+               SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
+               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       }
+       SETTING_TRACE("s_pkg_name : %s ", s_pkg_name);
+    if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, s_pkg_name))
     {
         if (dbus_message_get_args(message, &error,
                 DBUS_TYPE_UINT32, &sender_pid,
@@ -170,6 +278,59 @@ static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* mess
     if (sender_pid != 0 && my_pid != sender_pid)
     {
         SETTING_TRACE("received key : %s , value : %s", key, value);
+               //-------------------------------------------------------------
+               // received key : checkbox1|N/A , value : INT|1
+               //-------------------------------------------------------------
+               //char* key = "checkbox1|N/A";
+               char* ptr = NULL;
+
+               if (key) {
+                       ptr = strchr(key, '|');
+               }
+
+               xmlDocPtr doc = NULL;
+               if (ptr && key)
+               {
+                       //parsing for : checkbox1|N/A  -> checkbox1
+                       char* key_name = substring(key, 0, strlen(key)-strlen(ptr));
+                       char* val_name = strchr(value, '|');
+                       val_name++;
+
+                       // access xml file
+                       doc = xmlParseFile(plugin_path);
+                       if (doc == NULL)
+                       {
+                               SETTING_TRACE("unable to parse file : %s", plugin_path);
+                               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;     /* xml parsing error */
+                       }
+                       // generate xml tree
+                       xmlNode *root = xmlDocGetRootElement(doc);
+                       // find a node
+                       bool is_end = false;
+
+                       // TODO : message queing
+                       // get key/value from d-bus and parse xml and search xml data with key
+                       static int count = 0;
+                       SETTING_TRACE(" BEGIN ---------------------------- dbus--> before __node_finder : %d", count);
+                       __node_finder((PluginNode*)ad->plugin_node, root, key_name ,val_name, &is_end);
+                       SETTING_TRACE(" END  ----------------------------- dbus--> after __node_finder : %d", count);
+                       count += 1;
+               }
+               // update the node
+               GError *error = NULL;
+
+#if 0
+               if(doc != NULL)
+               {
+                       xmlSaveFormatFile(ad->plugin_path, doc, 1);
+                       // TODO: make sure this is right
+                       xmlFreeDoc(doc);
+                       doc = NULL;
+                       SETTING_TRACE("__cfg_file_write successful");
+               }
+#endif
+
+               // update UI
     }
 
     return DBUS_HANDLER_RESULT_HANDLED;
@@ -178,12 +339,20 @@ static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* mess
 static int __send_msg(char* key, char* value)
 {
        DBusMessage* message;
+
        int sender_pid = getpid();
 
        if (bus == NULL)
                return -1;
 
-       message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, DBUS_SIGNAL);
+       // ex) in gdb --> $15 = 0x43b6eb78 "Update_(null)" -> error codintion
+       if (s_pkg_name == NULL)
+       {
+               SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
+               return -1;
+       }
+
+       message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, s_pkg_name);
 
        SETTING_TRACE("Sending message[%s:%s] via dbus", key ,value);
        if (dbus_message_append_args(message,
@@ -213,6 +382,7 @@ static int __send_msg(char* key, char* value)
 
 static void __send_int_msg(xmlNode* xmlObj, int val)
 {
+       SETTING_TRACE_BEGIN;
        const char *id = (char*)xmlGetProp(xmlObj, "id");
        const char *title = (char*)xmlGetProp(xmlObj, "title");
        char key[MAX_CONTENT_LEN] = {0,};
@@ -221,6 +391,7 @@ static void __send_int_msg(xmlNode* xmlObj, int val)
        char value[MAX_CONTENT_LEN] = {0,};
        snprintf(value, sizeof(value), "INT|%d", val);
        __send_msg(key, value);
+       SETTING_TRACE_END;
 }
 
 
@@ -237,63 +408,85 @@ static void __send_string_msg(xmlNode* xmlObj, char *string)
 }
 
 
-int setting_dbus_handler_init(void)
+int setting_dbus_handler_init(void* user_data)
 {
        SETTING_TRACE_BEGIN;
-    DBusError error;
-    char rule[MAX_LOCAL_BUFSIZE];
-
-    dbus_error_init(&error);
-    bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
-    if (!bus)
-    {
-        SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
-
-    dbus_connection_setup_with_g_main(bus, NULL);
-    snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+       if (bus)
+       {
+               SETTING_TRACE("already get a bus, need release first.");
+               setting_dbus_handler_fini();
+//             return -1;
+       }
+       DBusError error;
+       memset(&error, 0, sizeof(DBusError));
+       char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
+       dbus_error_init(&error);
+       bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+       if (!bus)
+       {
+               SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
+               dbus_error_free(&error);
+               return -1;
+       }
 
-    dbus_bus_add_match(bus, rule, &error);
-    if (dbus_error_is_set(&error))
-    {
-        SETTING_TRACE("Fail to rule set; %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
+       dbus_connection_setup_with_g_main(bus, NULL);
+       snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
 
-    if (dbus_connection_add_filter(bus, __signal_filter, NULL, NULL) == FALSE)
-    {
-        return -1;
-    }
+       dbus_bus_add_match(bus, rule, &error);
+       if (dbus_error_is_set(&error))
+       {
+               SETTING_TRACE("Fail to rule set; %s", error.message);
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
 
-    SETTING_TRACE("app signal initialized");
+       if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
+       {
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
 
-    return 0;
+       SETTING_TRACE("app signal initialized");
+       return 0;
 }
 
-
 int setting_dbus_handler_fini(void)
 {
-    DBusError error;
-    char rule[MAX_LOCAL_BUFSIZE];
+       SETTING_TRACE_BEGIN;
+       //do safty checking first.
+       setting_retvm_if(!bus, 0, "!bus");
+       DBusError error;
+       memset(&error, 0, sizeof(DBusError));
+       char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
 
-    dbus_error_init(&error);
-    dbus_connection_remove_filter(bus, __signal_filter, NULL);
-    snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
-    dbus_bus_remove_match(bus, rule, &error);
+       dbus_error_init(&error);
 
-    if (dbus_error_is_set(&error))
-    {
-        SETTING_TRACE("Fail to rule unset: %s", error.message);
-        dbus_error_free(&error);
-        return -1;
-    }
+       // why??
+       bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
 
-    dbus_connection_close(bus);
-    SETTING_TRACE("app signal finalized");
-    return 0;
+       //dbus_connection_remove_filter(bus, __signal_filter, NULL);
+
+
+       snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+       dbus_bus_remove_match(bus, rule, &error);
+
+       if (dbus_error_is_set(&error))
+       {
+               SETTING_TRACE("Fail to rule unset: %s", error.message);
+               dbus_error_free(&error);
+               //return -1;
+       }
+
+       dbus_connection_close(bus);
+       bus = NULL;
+       SETTING_TRACE("app signal finalized");
+       return 0;
 }
 
 /////////////////////////////
@@ -302,20 +495,6 @@ int setting_dbus_handler_fini(void)
 
 Elm_Genlist_Item_Class itc_layout;
 
-// draw handler
-typedef struct
-{
-       xmlDocPtr doc;
-       xmlNode *root;
-
-       const char *cfg_file;
-       Evas_Object *win_get;
-       Evas_Object *ly_main;
-       Evas_Object *scroller;
-       Evas_Object *navi_bar;
-} Draw_Data;
-
-
 // write -> update
 static int __cfg_file_write(Draw_Data *pd)
 {
@@ -325,12 +504,12 @@ static int __cfg_file_write(Draw_Data *pd)
        if(pd->doc != NULL)
        {
                xmlSaveFormatFile(pd->cfg_file, pd->doc, 1);
-               // TODO: make sure this is right
                //xmlFreeDoc(pd->doc);
                //pd->doc = NULL;
                SETTING_TRACE("__cfg_file_write successful");
        }
 
+       SETTING_TRACE_END;
        return TRUE;
 }
 
@@ -340,25 +519,37 @@ static void ___click_softkey_back_cb(void *data, Evas_Object *obj,
 {
        SETTING_TRACE_BEGIN;
        ret_if(!data);
-       Draw_Data *pd = data;
+
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
        if (pd->ly_main) {
                evas_object_del(pd->ly_main);
                pd->ly_main = NULL;
        }
 
+       setting_plugin_destroy(node);
+       if (g_main_ad->navibar_main)
+       {
+               elm_naviframe_item_pop(g_main_ad->navibar_main);
+       }
        pd->scroller = NULL;
        pd->navi_bar = NULL;
        pd->cfg_file = NULL;
 
+
+
+
        pd->root = NULL;
 }
 
 
-static void group_func(void *data, xmlNode *xmlObj)
+static void* group_func(void *data, xmlNode *xmlObj)
 {
        SETTING_TRACE_BEGIN;
-       ret_if(!data || !xmlObj);
-       Draw_Data *pd = data;
+       retv_if(!data || !xmlObj, NULL);
+
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
 
        // original code is non-recursive
 #if 0
@@ -388,48 +579,122 @@ static void group_func(void *data, xmlNode *xmlObj)
        SETTING_TRACE (" >>> GROUP NAME : %s \n", title);
        (void)setting_create_Gendial_field_titleItem(pd->scroller, &(itc_group_item), title, NULL);
 #endif
+
+       return NULL;
 };
 
 
-static void __link_list_cb(void *data, Evas_Object *obj, void *event_info)
+static void* __link_list_cb(void *data, Evas_Object *obj, void *event_info)
 {
-       ret_if(data == NULL);
-       retm_if(event_info == NULL, "Invalid argument: event info is NULL");
+       SETTING_TRACE_BEGIN;
+       retv_if(data == NULL, NULL);
+       retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
        Elm_Object_Item *item = (Elm_Object_Item *) event_info;
        elm_genlist_item_selected_set(item, 0);
        Setting_GenGroupItem_Data *list_item =
            (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
 
        xmlNode* xmlObj = data;
-       ret_if(!xmlObj);
+       retv_if(!xmlObj, NULL);
        const char *link_file = (char*)xmlGetProp(xmlObj, "value");
 
        if(!link_file)
        {
                SETTING_TRACE_ERROR("Invalidate liked file");
-               return;
+               return NULL;
        }
        char file[1024] = {0,};
        snprintf(file, sizeof(file), "%s/%s", PLUGIN_CFG_DIR, link_file);
        SETTING_TRACE("file:%s", file);
 
-       setting_plugin_load(file);
+       PluginNode* plugin_node = setting_plugin_create(file);
+       setting_plugin_load(plugin_node, (const char *)file);
+
+       //setting_plugin_load(NULL, file);
+
+       return NULL;
 }
 
+static void* __launch_list_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       SETTING_TRACE_BEGIN;
+       retv_if(data == NULL, NULL);
+       retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
+       Elm_Object_Item *item = (Elm_Object_Item *) event_info;
+       elm_genlist_item_selected_set(item, 0);
+       Setting_GenGroupItem_Data *list_item =
+           (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
+
+       xmlNode* xmlObj = data;
+       retv_if(!xmlObj, NULL);
+       const char *key_str = (char*)xmlGetProp(xmlObj, "id");
+       const char *title_str = (char*)xmlGetProp(xmlObj, "title");
+       const char *appid_str = (char*)xmlGetProp(xmlObj, "appid");
+       const char *operation_str = (char*)xmlGetProp(xmlObj, "operation");
+
+
+       service_h svc = NULL;
+       service_create(&svc);
+       service_set_app_id(svc, appid_str);                                                     // xml property â€“ appid
+       service_set_operation(svc, operation_str);                                              // property : operation
+       service_send_launch_request(svc, NULL, NULL);
+       service_destroy(svc);
 
-static void link_func(void *data, xmlNode *xmlObj)
+       return NULL;
+}
+
+static void* label_func(void *data, xmlNode *xmlObj)
 {
        SETTING_TRACE_BEGIN;
-       ret_if(!data || !xmlObj);
-       Draw_Data *pd = data;
+       retv_if(!data || !xmlObj, NULL);
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
+
+       const char *title = (char*)xmlGetProp(xmlObj, "title");
+
+       Setting_GenGroupItem_Data *obj =
+               setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
+                                                NULL,
+                                                xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
+                                                0, title, NULL, NULL);
+
+       return obj;
+}
+
+static void* link_func(void *data, xmlNode *xmlObj)
+{
+       SETTING_TRACE_BEGIN;
+       retv_if(!data || !xmlObj, NULL);
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
+
        const char *key_str = (char*)xmlGetProp(xmlObj, "id");
+       Setting_GenGroupItem_Data * obj =
+               setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
+                                                __link_list_cb,
+                                                xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
+                                                0, key_str, NULL, NULL);
 
-       setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
-                                        __link_list_cb,
-                                        xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
-                                        0, key_str, NULL, NULL);
+       return (void*)obj;
 };
 
+static void* launch_func(void *data, xmlNode *xmlObj)
+{
+       SETTING_TRACE_BEGIN;
+       retv_if(!data || !xmlObj, NULL);
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
+
+       const char *title_str = (char*)xmlGetProp(xmlObj, "title");
+
+       Setting_GenGroupItem_Data * obj =
+               setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
+                                                __launch_list_cb,
+                                                xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
+                                                0, title_str, NULL, NULL);
+
+       return (void*)obj;
+};
 
 static void __slider_stop_cb(void *data, Evas_Object *obj,
                                    void *event_info)
@@ -460,11 +725,12 @@ static void __slider_stop_cb(void *data, Evas_Object *obj,
 }
 
 
-static void slider_func(void *data, xmlNode *xmlObj)
+static void* slider_func(void *data, xmlNode *xmlObj)
 {
        SETTING_TRACE_BEGIN;
-       ret_if(!data || !xmlObj);
-       Draw_Data *pd = data;
+       retv_if(!data || !xmlObj, NULL);
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
 
        // type casting
        const char *title = (char*)xmlGetProp(xmlObj, "title");
@@ -495,14 +761,25 @@ static void slider_func(void *data, xmlNode *xmlObj)
                list_item->stop_change_cb = __slider_stop_cb;
                list_item->belongs_to = (int)pd;
        }
-};
 
+       g_list_item = list_item;
 
-static void navigationbar_func(void *data, xmlNode *xmlObj)
+       return (void*)list_item;
+};
+
+#if 0
+/*
+  elm_object_item_data_set(item_to_update->item, item_to_update);
+  elm_genlist_item_update(item_to_update->item);
+*/
+static void* navigationbar_func(void *data, xmlNode *xmlObj)
 {
+#if 1
        SETTING_TRACE_BEGIN;
        ret_if(!data || !xmlObj);
-       Draw_Data *pd = data;
+
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
 
        //----------------------------------------------------------------
        // [DATA] title, btn[0], btn[1]
@@ -517,7 +794,10 @@ static void navigationbar_func(void *data, xmlNode *xmlObj)
                {
                        if (!xmlStrcmp(cur->name, (const xmlChar*)"button")) {
                                btn[i] = xmlGetProp(cur, "title");
-                               SETTING_TRACE("------>>> node type : Element, name=%s id=%s / btn[%d] = %s ", cur->name,xmlGetProp(cur, "id"), i, btn[i]);
+                               SETTING_TRACE("------>>> node type : Element, name=%s id=%s / btn[%d] = %s ",
+                                                               cur->name,xmlGetProp(cur, "id"),
+                                                               i,
+                                                               btn[i]);
                                i++;
                        }
                        cur = cur->next;
@@ -530,10 +810,13 @@ static void navigationbar_func(void *data, xmlNode *xmlObj)
                                                   _(title),
                                                   _(btn[1]), _(btn[0]),
                                                   ___click_softkey_back_cb,
-                                                  ___click_softkey_back_cb, pd, &pd->scroller,
+                                                  ___click_softkey_back_cb, data, &pd->scroller,
                                                   &(pd->navi_bar));
-};
 
+#endif
+       return NULL;
+};
+#endif
 
 static void __check_mouse_up_cb(void *data, Evas_Object *obj,
                                             void *event_info)
@@ -586,18 +869,20 @@ static void __chk_btn_cb(void *data, Evas_Object *obj,
 
        const char *id = (char*)xmlGetProp(xmlObj, "id");
        const char *title = (char*)xmlGetProp(xmlObj, "title");
-       SETTING_TRACE(" >>>> id:%s , title:%s", id, title);
+       //SETTING_TRACE(" >>>> id:%s , title:%s", id, title);
        __send_int_msg(xmlObj, list_item->chk_status);
        __cfg_file_write((Draw_Data *)list_item->belongs_to);
        return;
 }
 
 
-static void checkbox_func(void *data, xmlNode *xmlObj)
+static void* checkbox_func(void *data, xmlNode *xmlObj)
 {
        SETTING_TRACE_BEGIN;
-       ret_if(!data || !xmlObj);
-       Draw_Data *pd = data;
+       retv_if(!data || !xmlObj, NULL);
+
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
 
        // [DATA] title, value
        const char *title = (char*)xmlGetProp(xmlObj, "title");
@@ -632,7 +917,9 @@ static void checkbox_func(void *data, xmlNode *xmlObj)
                list_item->belongs_to = (int) pd;
                SETTING_TRACE("pd:%p,list_item->belongs_to:%d", pd, list_item->belongs_to);
        }
-};
+
+       return list_item;
+}
 
 
 static void __entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
@@ -648,14 +935,19 @@ static void __entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
        Setting_GenGroupItem_Data *list_item = data;
 
        xmlNode* xmlObj = list_item->userdata;
-       ret_if(!xmlObj);
+       if(!xmlObj) {
+               FREE(entry_str_utf8);
+               return;
+       }
+
        xmlAttrPtr newattr;
-       const char *title = (char*)xmlSetProp(xmlObj, "string",entry_str_utf8);
+       const char *title = (char*)xmlSetProp(xmlObj, "value",entry_str_utf8);
 
        __send_string_msg(xmlObj, entry_str_utf8);
        __cfg_file_write((Draw_Data *)list_item->belongs_to);
 
        FREE(entry_str_utf8);
+       SETTING_TRACE_END;
 }
 
 
@@ -700,26 +992,72 @@ static void __editbox_changed_cb(void *data, Evas_Object *obj,
 }
 
 
-static void editbox_func(void *data, xmlNode *xmlObj)
+/**
+ *  editbox
+ *
+ * @see also __editbox_changed_cb
+ * @see also __entry_unfocus_cb
+ */
+static void* editbox_func(void *data, xmlNode *xmlObj)
 {
        SETTING_TRACE_BEGIN;
-       ret_if(!data || !xmlObj);
-       Draw_Data *pd = data;
+       retv_if(!data || !xmlObj, NULL);
+
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
 
        const char *title = (char*)xmlGetProp(xmlObj, "title");
-       const char *key_str= (char*)xmlGetProp(xmlObj, "string");
+       const char *key_str= (char*)xmlGetProp(xmlObj, "value");
 
-       Setting_GenGroupItem_Data *list_item =
-           setting_create_Gendial_field_def(pd->scroller, &(itc_1icon),
-                                            __editbox_list_cb,
-                                            pd, SWALLOW_Type_LAYOUT_ENTRY,
-                                            NULL, NULL, 0, title, key_str,
-                                            __editbox_changed_cb);
+       const char *minlength= (char*)xmlGetProp(xmlObj, "minlength");
+       const char *maxlength= (char*)xmlGetProp(xmlObj, "maxlength");
+
+       int max_len = -1;
+       if (maxlength)
+       {
+               max_len = atoi(maxlength);
+               SETTING_TRACE(" >> MAXLENGTH FILTER IS AVAILABLE !!!! maxlength = %d", max_len);
+       }
+
+       Setting_GenGroupItem_Data *list_item = NULL;
+
+#if 1
+       if (max_len == -1)
+       {
+               // without maxlength filter
+               list_item = setting_create_Gendial_field_def(pd->scroller, &(itc_1icon),
+                                                                __editbox_list_cb,
+                                                        pd, SWALLOW_Type_LAYOUT_ENTRY,
+                                                        NULL, NULL, 0, title, key_str,
+                                                        __editbox_changed_cb);
+
+       } else {
+               // add max length filter
+               list_item = setting_create_Gendial_field_entry_fo(
+                                                                       pd->scroller,
+                                                                       &(itc_1icon),
+                                                                       __editbox_list_cb,
+                                                                       pd,
+                                                                       SWALLOW_Type_LAYOUT_ENTRY,
+                                                                       NULL, NULL, 0, title, key_str,
+                                                                       __editbox_changed_cb,
+                                                                       __entry_unfocus_cb,
+                                                                       ELM_INPUT_PANEL_LAYOUT_NORMAL,
+                                                                       false,
+                                                                       false,
+                                                                       max_len,
+                                                                       0,
+                                                                       NULL, NULL);
+
+       }
+#endif
        if (list_item) {
                list_item->userdata = xmlObj;
                list_item->stop_change_cb = __entry_unfocus_cb;
                list_item->belongs_to = (int)pd;
        }
+
+       return list_item;
 };
 
 
@@ -745,7 +1083,8 @@ static void __expanditem_func_sel_cb(void *data, Evas_Object *obj, void *event_i
        ret_if(!xmlObj);
 
        xmlAttrPtr newattr;
-       newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
+       //newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
+       newattr = xmlSetProp(xmlObj, "value", data_parentItem->sub_desc);
 
        __send_string_msg(xmlObj, data_parentItem->sub_desc);
        __cfg_file_write((Draw_Data *)data_parentItem->belongs_to);
@@ -756,14 +1095,18 @@ static void __expanditem_func_exp_cb(void *data, Evas_Object *obj, void *event_i
 {
        ret_if(NULL == data || NULL == event_info);
        SETTING_TRACE_BEGIN;
-       Draw_Data *pd = data;
+
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
+
        Elm_Object_Item *parentItem = event_info;       /* parent item */
        Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
        Evas_Object *scroller = elm_object_item_widget_get(parentItem);
 
+
        xmlNode *xmlObj = data_parentItem->userdata;
-       char *value = (char*)xmlGetProp(xmlObj, "string");
-       int i=0;
+       char *value = (char*)xmlGetProp(xmlObj, "value");
+       SETTING_TRACE(">>> value = %s", value);
        Evas_Object *rgd = NULL;
 
        if (xmlObj->children && !data_parentItem->rgd) {//to protect from entering repeatly
@@ -772,32 +1115,60 @@ static void __expanditem_func_exp_cb(void *data, Evas_Object *obj, void *event_i
                rgd = elm_radio_add(scroller);
                elm_radio_value_set(rgd, -1);
 
-               int i;
                char *type;
                char *subitem_title = NULL;
                int subitem_index = 0;
                int sel_idx = -1;
 
+#if 1
+               // print out debug message
+               if (data_parentItem->childs)
+               {
+                       int howmany = 0;
+                       Eina_List *li = data_parentItem->childs;
+                       while(li)
+                       {
+                               Setting_GenGroupItem_Data* node = eina_list_data_get(li);
+                               howmany += 1;
+                               SETTING_TRACE(" <<< node->keyStr : %s >>> ", node->keyStr);
+
+                               // go next
+                               li = eina_list_next(li);
+                       }
+                       SETTING_TRACE(" <<<how many : %d>>> ", howmany);
+               }
+#endif
+               if (data_parentItem->childs)
+               {
+                       eina_list_free(data_parentItem->childs);
+                       data_parentItem->childs = NULL;
+               }
+
                while (cur != NULL) {
                        if (!xmlStrcmp(cur->name, (const xmlChar*)"expanditem")) {
                                type = (char*)xmlGetProp(cur, "type");
                                if (0 == safeStrCmp(type, "radio")) {
                                        subitem_title = (char*)xmlGetProp(cur, "title");
-                                       setting_create_Gendial_exp_sub_field(scroller,
-                                                                                &(itc_1icon_1text_sub),
-                                                                                __expanditem_func_sel_cb, NULL, parentItem,
-                                                                                SWALLOW_Type_1RADIO, rgd,
-                                                                                subitem_index,
-                                                                                subitem_title, NULL);
+                                       Setting_GenGroupItem_Data *list_item =
+                                                                                       setting_create_Gendial_exp_sub_field(scroller,
+                                                                                                       &(itc_1icon_1text_sub),
+                                                                                                       __expanditem_func_sel_cb, NULL, parentItem,
+                                                                                                       SWALLOW_Type_1RADIO, rgd,
+                                                                                                       subitem_index,
+                                                                                                       subitem_title, NULL);
+
+
                                        if (0 == safeStrCmp(value, subitem_title)) {
                                                sel_idx = subitem_index;
+                                               SETTING_TRACE("%d is selected in Radio Group", sel_idx);
                                        }
+                                       SETTING_TRACE(" eina list add >>> value = %s, subitem_title = %s ", value, subitem_title);
+                                       data_parentItem->childs = eina_list_append(data_parentItem->childs, list_item);
                                        subitem_index++;
+
                                } else {
                                        SETTING_TRACE("invalid type[:%s]", type);
                                }
-
-                               i++;
                        }
                        cur = cur->next;
                }
@@ -823,33 +1194,126 @@ static void __expanditem_func_smart_cb(void *data, Evas_Object *obj, void *event
 }
 
 
-static void settings_func(void *data, xmlNode *xmlObj)
+static void* settings_func(void *data, xmlNode *xmlObj)
+{
+       return NULL;
+}
+
+
+static Evas_Object *setting_create_win_layout2(Evas_Object *win_layout, Evas_Object *win_obj)
+{
+
+    Evas_Object *layout = NULL;
+
+    /*  Base Layout */
+    layout = elm_layout_add(win_obj);
+    setting_retvm_if(layout == NULL, FALSE, "layout == NULL");
+
+    elm_layout_theme_set(layout, "layout", "application", "default");
+    evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       elm_win_resize_object_add(win_obj, layout);
+
+    Evas_Object *bg = setting_create_bg(layout, win_obj, "group_list");
+    elm_object_part_content_set(layout, "elm.swallow.bg", bg);
+    evas_object_show(layout);
+    return layout;
+}
+
+
+Evas_Object *setting_create_layout_navi_bar2(Evas_Object *win_layout, Evas_Object *win_obj, char *title_str, char *lbutton_str, char *rbutton_str, char *mbutton_str, setting_call_back_func lbutton_click_cb, setting_call_back_func rbutton_click_cb, setting_call_back_func mbutton_click_cb, void *cb_data, Evas_Object *eo_view,  /*any container obj constructed on any evas obj */
+                                           Evas_Object **navi_bar,
+                                           Evas_Object **titleobj)
 {
-       // DO NOTHING
+
+       Evas_Object *layout = setting_create_win_layout2(win_layout, win_obj);
+       *navi_bar = setting_create_navi_bar(layout);
+
+       setting_create_navi_bar_buttons(title_str,
+                                       lbutton_str, rbutton_str, mbutton_str,
+                                       lbutton_click_cb, rbutton_click_cb,
+                                       mbutton_click_cb, cb_data, eo_view /*content */ ,
+                                       *navi_bar, NULL);
+       return layout;
+}
+
+static void __plugin_genlist_unrealized_cb(void* data,Evas_Object* obj, void* event_info)
+{
+       SETTING_TRACE_BEGIN;
+       ret_if(data == NULL);
+
+       Elm_Object_Item *item = (Elm_Object_Item*)event_info;
+       Setting_GenGroupItem_Data *node = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
+       ret_if(node== NULL);
+
+       SETTING_TRACE("keyStr : %s ", node->keyStr);
+       //item_to_update->childs)
+
+       if (node->childs)
+       {
+               eina_list_free(node->childs);
+               node->childs = NULL;
+       }
 }
 
 // <setting>
-static void setting_func(void *data, xmlNode *xmlObj)
+static void* setting_func(void *data, xmlNode *xmlObj)
 {
-       // DO NOTHING
+       SETTING_TRACE_BEGIN;
+       retv_if(!data || !xmlObj, NULL);
+#if 1
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
+
+       // [DATA] title, btn[0], btn[1]
+       const char *title = (char*)xmlGetProp(xmlObj, "title");
+       char *btn[2] = {/* 0 */"OK", /* 1 */"NO"};
+
+       SETTING_TRACE("before setting_create_layout_navi_bar_genlist");
+
+       // [UI] with DATA
+       pd->scroller = elm_genlist_add(g_main_ad->win_main);
+       retvm_if(pd->scroller == NULL, NULL,
+                "Cannot set scroller object  as contento of layout");
+       elm_object_style_set(pd->scroller, "dialogue");
+       elm_genlist_clear(pd->scroller);        /* first to clear list */
+
+       evas_object_smart_callback_add(pd->scroller, "unrealized", __plugin_genlist_unrealized_cb, node);
+
+
+       SETTING_TRACE("_(title):%s", _(title));
+
+       setting_push_layout_navi_bar(
+                                          _(title),
+                                          _("IDS_COM_BODY_BACK"), NULL, NULL,
+                                          ___click_softkey_back_cb,
+                                          NULL, NULL,
+                                          data, pd->scroller,
+                                          g_main_ad->navibar_main, NULL);
+       SETTING_TRACE("after setting_create_layout_navi_bar_genlist");
+#endif
+       return NULL;
 }
 
 
-static void expanditem_func(void *data, xmlNode *xmlObj)
+static void* expanditem_func(void *data, xmlNode *xmlObj)
 {
        // DO NOTHING - expandlist draws this area
-};
-
+       return NULL;
+}
 
-static void expandlist_func(void *data, xmlNode *xmlObj)
+static void* expandlist_func(void *data, xmlNode *xmlObj)
 {
        SETTING_TRACE_BEGIN;
-       ret_if(!data || !xmlObj);
-       Draw_Data *pd = data;
+       retv_if(!data || !xmlObj, NULL);
+
+       PluginNode* node = (PluginNode*)data;
+       Draw_Data *pd = node->pd;
+
        const char *key_str = (char*)xmlGetProp(xmlObj, "title");
        const char *value = (char*)xmlGetProp(xmlObj, "value"); // string -> value
 
-       setting_enable_expandable_genlist(pd->scroller, pd, __expanditem_func_exp_cb, __expanditem_func_smart_cb);
+       setting_enable_expandable_genlist(pd->scroller, data, __expanditem_func_exp_cb, __expanditem_func_smart_cb);
        Setting_GenGroupItem_Data *list_item =
            setting_create_Gendial_exp_parent_field(pd->scroller,
                                                    &(itc_2text_3_parent),
@@ -860,31 +1324,341 @@ static void expandlist_func(void *data, xmlNode *xmlObj)
        if (list_item) {
                list_item->userdata = xmlObj;
                list_item->belongs_to = (int)pd;
+               list_item->childs = NULL;               /* init */
        }
-};
+
+       return list_item;
+}
 
 
-/////////////
-static int __node_walker(Draw_Data *pd, xmlNode* cur)
+
+static int __node_walker(PluginNode* context, xmlNode* cur)
 {
        //SETTING_TRACE_BEGIN;
+       Draw_Data *pd = context->pd;
+
        retv_if(!pd, -1);
+       retv_if(!context->ui_list, -1);
+
        xmlNode *cur_node = NULL;
        for (cur_node = cur; cur_node;cur_node = cur_node->next) {
                if (cur_node->type == XML_ELEMENT_NODE) {
-                       SETTING_TRACE("node type : Element, name=%s id=%s", cur_node->name,xmlGetProp(cur_node, "id"));
-
+                       // SETTING_TRACE("node type : %s id= %s", cur_node->name,xmlGetProp(cur_node, "id"));
                        drawer_fp  fp = __drawer_find(cur_node->name);
                        if (fp)
-                               fp(pd, cur_node); // draw it
+                       {
+                               // type check
+                               void* vret = fp(context, cur_node); // draw it
+
+                               if (vret)
+                               {
+                                       Setting_GenGroupItem_Data* genlist_node = (Setting_GenGroupItem_Data* )vret;
+                                       //SETTING_TRACE("add node to Eina List name : %s, id : ", cur_node->name, xmlGetProp(cur_node, "id"));
+                                       // add it to the hash table create before.
+                                       // id, object
+                                       // add list
+                                       char* key_name = xmlGetProp(cur_node, "id");
+                                       eina_hash_add(context->ui_list, strdup(key_name),(void*)genlist_node);
+                               }
+                       }else {
+                               SETTING_TRACE(" >>>> fp is NULL ");
+                       }
                }
-               __node_walker(pd, cur_node->children);  /* RECURSIVE */
+               __node_walker(context, cur_node->children);     /* RECURSIVE */
        }
        return 0;
 }
 
+/**
+ * @param id_str [in] "id"
+ * @param value [in] value to be udpated
+ * @see __expanditem_func_sel_cb
+ */
+static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end)
+{
+       SETTING_TRACE_BEGIN;
+       xmlNode *cur_node = NULL;
+
+       if (! context)
+       {
+               SETTING_TRACE("context is NULL - it's error CONDITION ");
+               return -1;
+       }
+
+       retv_if(!context->ui_list, -1);
+       if (*is_end == true) return 0;
+
+       for (cur_node = cur; cur_node;cur_node = cur_node->next) {
+               if (cur_node->type == XML_ELEMENT_NODE) {
 
-bool setting_plugin_load(const char *cfg_file)
+                       char* id_name = (char*)xmlGetProp(cur_node, "id");
+                       if ( id_name && 0 == strcmp(id_str, id_name))
+                       {
+                               SETTING_TRACE("FOUND >>>> %s", id_name);
+                               // cur_node     - update xml code
+                               xmlAttrPtr newattr = xmlSetProp(cur_node, "value", value);
+
+                               //-----------------------------------------------------------
+                               // UI UPDATE
+                               // case : slider
+                               if ( 0 == strcmp (cur_node->name, "integer"))
+                               {
+                                       SETTING_TRACE(">>>>> UPDATE SLIDER CONTROL %x --- %s ",context->ui_list, id_name);
+                                       Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+                                       if      (item_to_update)
+                                       {
+                                               item_to_update->chk_status = atoi(value);
+                                               SETTING_TRACE(">>>   o-------------0 SLIDER VALUE = %d ", item_to_update->chk_status);
+
+                                               elm_object_item_data_set(item_to_update->item, item_to_update);
+                                               elm_genlist_item_update(item_to_update->item);
+                                       } else {
+                                               SETTING_TRACE("item_to_update is NULL");
+                                       }
+                               }
+                               // case : toggle
+                               if ( 0 == strcmp (cur_node->name, "bool"))
+                               {
+                                       SETTING_TRACE(">>>>> UPDATE TOGGLE CONTROL pluginpath:%s, ----  %x --- %s ", context->plugin_path, context->ui_list, id_name);
+                                       Setting_GenGroupItem_Data* item_to_update = NULL;
+                                       item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+                                       if      (item_to_update)
+                                       {
+                                               item_to_update->chk_status = atoi(value);
+                                               SETTING_TRACE(">>>   o-------------0 TOGGLE VALUE = %d ", item_to_update->chk_status);
+
+                                               elm_object_item_data_set(item_to_update->item, item_to_update);
+                                               elm_genlist_item_update(item_to_update->item);
+                                       } else {
+                                               SETTING_TRACE("item_to_update is NULL");
+                                       }
+                               }
+                               // case : edit control
+                               if ( 0 == strcmp (cur_node->name, "string"))
+                               {
+                                       SETTING_TRACE(">>>>> UPDATE EDIT CONTROL CONTROL %x --- %s ",context->ui_list, id_name);
+                                       Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+                                       if      (item_to_update)
+                                       {
+                                               char* old_string = item_to_update->sub_desc;
+                                               item_to_update->sub_desc = strdup(value);
+                                               SETTING_TRACE(">>>   o-------------0 STRING VALUE = %s ", value);
+
+                                               // free old string
+
+                                               elm_object_item_data_set(item_to_update->item, item_to_update);
+                                               elm_genlist_item_update(item_to_update->item);
+
+                                       } else {
+                                               SETTING_TRACE("item_to_update is NULL");
+                                       }
+                               }
+                               // case : expand list
+                               // parent
+                               //    child1
+                               //    child2
+                               //    child3
+                               //    child4
+                               //-----------------------------------------------------------
+                               if ( 0 == strcmp (cur_node->name, "expandlist"))
+                               {
+                                       #if 1
+                    SETTING_TRACE(">>>>> UPDATE EXPAND LIST CONTROL %x --- %s ",context->ui_list, id_name);
+                    Setting_GenGroupItem_Data* item_to_update = NULL;
+                                       item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
+                    if  (item_to_update)
+                    {
+                        char* old_string = item_to_update->sub_desc;
+                        item_to_update->sub_desc = strdup(value);
+                        SETTING_TRACE(">>>   o-------------0 EXPAND LIST VALUE = %s ", value);
+
+                        // free old string
+                        // string update
+                        elm_object_item_data_set(item_to_update->item, item_to_update);
+                        elm_genlist_item_update(item_to_update->item);
+
+                        // TODO: need to update child elements
+                        // item_to_update->childs ---> expanded list
+
+                                               // debug log
+                                               // there should have 4 sub items.
+                                               //-----------------------------------------------------
+                                               // has it already freed by someone?
+                                               //-----------------------------------------------------
+                                               if (item_to_update->childs)
+                                               {
+                                                       int howmany2 =0;
+                                                       Eina_List *li = item_to_update->childs;
+                                                       while(li)
+                                                       {
+                                                               Setting_GenGroupItem_Data* node = eina_list_data_get(li);
+                                                               howmany2 += 1;
+                                                               li = eina_list_next(li);
+                                                       }
+                                                       SETTING_TRACE(" expandlist -- how many items are there? : %d ", howmany2);
+                                               }
+
+                        if (item_to_update->childs)
+                        {
+                            Eina_List *li = item_to_update->childs;
+                            int radio_index = 0;
+                            while(li)
+                            {
+                                Setting_GenGroupItem_Data* node = eina_list_data_get(li);
+
+                                if (node->item && node->keyStr)
+                                {
+                                    // do something more
+                                    // SETTING_TRACE(">>> RADIO LIST STRING VALUE = %s ", node->keyStr);
+                                    // set position of radio button
+                                    if (strcmp(node->keyStr, value) == 0) // << CRAAH !!!!
+                                    {
+                                        elm_radio_value_set(node->rgd, radio_index);
+                                    }
+                                } else {
+                                     SETTING_TRACE(">>> node has unproper values - Setting_GenGroupItem_Data");
+                                }
+                                elm_object_item_data_set(item_to_update->item, item_to_update);
+                                elm_genlist_item_update(item_to_update->item);
+
+                                // go next
+                                li = eina_list_next(li);
+                                radio_index++;
+                            }
+
+                        }
+                    } else {
+                        SETTING_TRACE("item_to_update is NULL");
+                    }
+
+
+                                       #endif
+                               }
+                               *is_end = true;
+                       }
+               }
+               __node_finder(context, cur_node->children, id_str, value, is_end);      /* RECURSIVE */
+       }
+       return 0;
+}
+
+static unsigned int _plugin_string_key_length(const char*key)
+{
+       if (!key)
+               return 0;
+
+       return (int)strlen(key) + 1;
+}
+
+static int _plugin_string_key_cmp(const char* key1, int key1_length,
+                                                                       const char* key2, int key2_length)
+{
+       return strcmp(key1, key2);
+}
+
+static void _plugin_entry_free_cb(void* data)
+{
+    Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
+       if (node->childs)
+       {
+               eina_list_free(node->childs);
+               node->childs = NULL;
+       }
+}
+
+PluginNode* setting_plugin_create()
+{
+       PluginNode *node = calloc(1, sizeof(PluginNode));
+       setting_retvm_if(!node, -1, "Create PluginNode obj failed");
+       Draw_Data *pd = calloc(1, sizeof(Draw_Data));
+
+
+       if (!pd) {
+               FREE(node);
+       }
+
+       setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
+       //eina_init();
+
+       node->pd = pd;
+       node->ui_list = eina_hash_new(EINA_KEY_LENGTH(_plugin_string_key_length),
+                                                                 EINA_KEY_CMP(_plugin_string_key_cmp),
+                                                                 EINA_KEY_HASH(eina_hash_superfast),
+                                                                 _plugin_entry_free_cb,
+                                                                 5); // 2^5
+
+       return node;
+}
+
+void setting_plugin_destroy(PluginNode* node)
+{
+       SETTING_TRACE_BEGIN;
+       if (node) {
+               SETTING_TRACE("node is NOT NULL")
+               if (node->pd) {
+                       SETTING_TRACE("node->pd is NOT NULL")
+                       if(node->pd->doc != NULL) {
+                               xmlSaveFormatFile(node->plugin_path, node->pd->doc, 1);
+                               xmlFreeDoc(node->pd->doc);
+                               node->pd->doc = NULL;
+                               SETTING_TRACE("__cfg_file_write successful");
+                       }
+
+                       free(node->pd);
+                       node->pd = NULL;
+               }
+
+               if (node->ui_list) {
+                       eina_hash_free(node->ui_list);
+                       node->ui_list = NULL;
+               }
+               free(node);
+               node = NULL;
+//             PLUGIN_FINI;
+       }
+}
+
+
+static Eina_Bool _plugin_foreach_cb(const Eina_Hash *hash, const void*key, void* data, void* fdata)
+{
+    Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
+       SETTING_TRACE("%s --- %s ", (char*)key, node->keyStr);
+       return EINA_TRUE;
+}
+
+
+void setting_plugin_debug(PluginNode* context)
+{
+//     SETTING_TRACE("HASH TABLE -------------------------------------");
+       if (context->ui_list) {
+               eina_hash_foreach(context->ui_list,_plugin_foreach_cb, NULL);
+       }
+//     SETTING_TRACE("HASH TABLE -------------------------------------");
+
+}
+
+void setting_plugin_update(PluginNode* context)
+{
+    Eina_List *li = context->ui_list;
+
+    while (li) {
+        Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) eina_list_data_get(li);
+        if (node) {
+            // SETTING_TRACE(" ---> keyStr : %s , swallow type : %d  ", node->keyStr, node->swallow_type);
+                       Setting_GenGroupItem_Data* item_to_update = NULL;
+                       item_to_update = node;
+                       elm_object_item_data_set(item_to_update->item, item_to_update);
+                       elm_genlist_item_update(item_to_update->item);
+        }
+        li = eina_list_next(li);
+       }
+}
+
+
+/**
+ * set modifiable
+ */
+bool setting_plugin_load(PluginNode* context, const char *cfg_file)
 {
        SETTING_TRACE("cfg_file:%s", cfg_file)
        if (isEmptyStr(cfg_file) || 0 != access(cfg_file, R_OK|W_OK|F_OK ))
@@ -892,20 +1666,60 @@ bool setting_plugin_load(const char *cfg_file)
                SETTING_TRACE_ERROR(" error occured : access \n");
                return FALSE;
        }
+       context->pd->cfg_file = cfg_file;
 
-       Draw_Data *pd = calloc(1, sizeof(Draw_Data));
-       setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
+       //GError *error = NULL;
 
-       pd->cfg_file = cfg_file;
-       pd->win_get = (Evas_Object *) ug_get_window();
-       GError *error = NULL;
+       context->pd->doc = xmlParseFile(cfg_file);
+       context->pd->root = xmlDocGetRootElement(context->pd->doc);
+
+       // signal filter change
+       //setting_dbus_handler_init(g_main_ad);
+       void* user_data = (void*)g_main_ad;
+
+       DBusError error;
+       dbus_error_init(&error);
+       char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
+       bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+       if (!bus)
+       {
+               SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
+               dbus_error_free(&error);
+               return -1;
+       }
+
+       // remove filter
+       // dbus_connection_remove_filter(bus, __signal_filter, NULL);
+
+       // get rule
+       snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
+       dbus_bus_add_match(bus, rule, &error);
+       if (dbus_error_is_set(&error))
+       {
+               SETTING_TRACE("Fail to rule set; %s", error.message);
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
+
+       // re-add filter
+       if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
+       {
+               dbus_bus_remove_match(bus, rule, &error);
+               dbus_error_free(&error);
+               dbus_connection_close(bus);
+               bus = NULL;
+               return -1;
+       }
 
-       pd->doc = xmlParseFile(cfg_file);
-       pd->root = xmlDocGetRootElement(pd->doc);
        // TODO: error handler here
-       __node_walker(pd, pd->root);
+       __node_walker(context, context->pd->root);
 
-       return TRUE;
+       // debug message
+       setting_plugin_debug(context);
+       return true;
 }