X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fsetting-plugin.c;h=e37a7fcdc576bca88a37e2f7febc755796dbc4ac;hb=e0eff2930a0adf2f416e830de4bfb64dac08757e;hp=78966587a0a2fb14a4af9106fda1fcbe5d88a46c;hpb=92ff175c17b6875b96ef82de5096b6928f9c5df8;p=apps%2Fcore%2Fpreloaded%2Fsettings.git diff --git a/src/setting-plugin.c b/src/setting-plugin.c index 7896658..e37a7fc 100755 --- a/src/setting-plugin.c +++ b/src/setting-plugin.c @@ -23,8 +23,6 @@ #include #include -#include -#include #include #include @@ -32,30 +30,81 @@ #include + +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 /* */__drawer_add("navigationbar", navigationbar_func); +#endif /* */__drawer_add("bool", checkbox_func); /* */__drawer_add("string", editbox_func); /* */__drawer_add("group", group_func); /* */__drawer_add("integer", slider_func); - /* */__drawer_add("label", label_func); + /* */__drawer_add("link", link_func); + /* */__drawer_add("launch", launch_func); /* */__drawer_add("expandlist", expandlist_func); /* */__drawer_add("expanditem", expanditem_func); /* */__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(" <<>> ", 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; + } } // -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; }