3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include <eina_list.h>
22 #include <setting-debug.h>
23 #include <setting-common-general-func.h>
24 #include <setting-common-draw-widget.h>
26 #include <setting-plugin.h>
29 extern setting_main_appdata *g_main_ad;
31 static Setting_GenGroupItem_Data *g_list_item; /*TEST*/
34 * UI draw handler table : _g_draw_list
35 * - contains Object_Drawer typed object.
37 Eina_List *_g_drawer_list = NULL;
41 * @return Evas_Object * obj
43 static void* navigationbar_func(void *data, xmlNode *xmlObj);
49 static void* group_func(void *data, xmlNode *xmlObj);
52 * @return Setting_GenGroupItem_Data* ptr
54 static void* link_func(void *data, xmlNode *xmlObj);
57 * @return Setting_GenGroupItem_Data* ptr
59 static void* slider_func(void *data, xmlNode *xmlObj);
62 * @return Setting_GenGroupItem_Data* ptr
64 static void* label_func(void *data, xmlNode *xmlObj);
67 * @return Setting_GenGroupItem_Data* ptr
69 static void* checkbox_func(void *data, xmlNode *xmlObj);
72 * @return Setting_GenGroupItem_Data* ptr
74 static void* editbox_func(void *data, xmlNode *xmlObj);
77 * @return Setting_GenGroupItem_Data* ptr
79 static void* expandlist_func(void *data, xmlNode *xmlObj);
84 static void* expanditem_func(void *data, xmlNode *xmlObj);
89 static void* settings_func(void *data, xmlNode *xmlObj);
92 static void* launch_func(void *data, xmlNode *xmlObj);
97 static void* setting_func(void *data, xmlNode *xmlObj);
99 static int __node_walker(PluginNode* context, xmlNode* cur);
101 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end);
104 static void __drawer_add(const char *type, drawer_fp draw)
106 Object_Drawer *node = calloc(1, sizeof(Object_Drawer));
107 if (node && type && draw)
112 _g_drawer_list = eina_list_append(_g_drawer_list, node);
118 static drawer_fp __drawer_find(char* type)
121 SETTING_TRACE("node type:%s", type);
122 Eina_List *check_list = _g_drawer_list;
123 Object_Drawer *list_item = NULL;
126 list_item = (Object_Drawer *) eina_list_data_get(check_list);
127 if (NULL == list_item)
130 if (0 == safeStrCmp(list_item->type, type))
132 //SETTING_TRACE("list_item->type:%s", list_item->type);
135 //if not matched,to check next node.
136 check_list = eina_list_next(check_list);
139 //SETTING_TRACE("list_item:%p", list_item);
140 return list_item ? list_item->draw : NULL;
142 void setting_drawer_list_init()
146 /* <navigationbar> */__drawer_add("navigationbar", navigationbar_func);
148 /* <bool> */__drawer_add("bool", checkbox_func);
149 /* <string> */__drawer_add("string", editbox_func);
150 /* <group> */__drawer_add("group", group_func);
151 /* <integer> */__drawer_add("integer", slider_func);
152 /* <label> */__drawer_add("label", label_func);
153 /* <link> */__drawer_add("link", link_func);
154 /* <launch> */__drawer_add("launch", launch_func);
155 /* <extendlist> */__drawer_add("expandlist", expandlist_func);
156 /* <extenditem> */__drawer_add("expanditem", expanditem_func);
157 /* <settings> */__drawer_add("settings", settings_func);
158 /* <setting> */__drawer_add("setting", setting_func);
161 void setting_drawer_list_fini()
165 Object_Drawer *node = NULL;
166 Eina_List *li = _g_drawer_list;
168 node = (Object_Drawer *) eina_list_data_get(li);
171 //SETTING_TRACE("Deregister %s", node->type);
174 li = eina_list_next(li);
176 _g_drawer_list = eina_list_free(_g_drawer_list);
177 _g_drawer_list = NULL;
181 /////////////////////////
182 /////////////////////////
183 /////////////////////////
185 #define MAX_CONTENT_LEN 512
186 #define MAX_LOCAL_BUFSIZE 128
187 #define DBUS_PATH "/setting/dbus_handler"
188 #define DBUS_SIGNAL_INTERFACE "org.tizen.setting.signal"
190 #define APPID_LENGTH 10
191 #define APPID_POS_FROM_PATH 10
193 static char* s_pkg_name;
196 static char* substring(const char* str, size_t begin, size_t len)
198 if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
201 return strndup(str + begin, len);
208 * ncbyusjryr.AppSetting --> package ID is ncbyusjryr
209 * "Update_" "ncbyusjryr"
211 static char* get_app_string(char* path)
214 char* temp = substring(path, APPID_POS_FROM_PATH, APPID_LENGTH/*string size*/);
215 SETTING_TRACE("package ID : >>> %s ",temp );
219 //------------------------------------------------------
221 static DBusConnection *bus;
222 //------------------------------------------------------
223 static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* message, void* user_data)
225 int my_pid = getpid();
231 dbus_error_init(&error);
233 setting_main_appdata *ad = user_data;
234 char* plugin_path = ad->plugin_path;
235 char* pkg_name = get_app_string(plugin_path);
237 if (pkg_name == NULL)
239 SETTING_TRACE("pkg_name is NULL - it's abnormal operation");
240 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
243 char str_buf[MAX_COMMON_BUFFER_LEN];
244 snprintf(str_buf, MAX_COMMON_BUFFER_LEN, "Update_%s", pkg_name);
245 s_pkg_name = strdup(str_buf);
253 if (s_pkg_name == NULL)
255 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
256 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
258 SETTING_TRACE("s_pkg_name : %s ", s_pkg_name);
259 if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, s_pkg_name))
261 if (dbus_message_get_args(message, &error,
262 DBUS_TYPE_UINT32, &sender_pid,
263 DBUS_TYPE_STRING, &key,
264 DBUS_TYPE_STRING, &value,
265 DBUS_TYPE_INVALID) == FALSE)
267 SETTING_TRACE_ERROR("Fail to get data : %s", error.message);
268 dbus_error_free(&error);
269 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
273 if (sender_pid != 0 && my_pid != sender_pid)
275 SETTING_TRACE("received key : %s , value : %s", key, value);
276 //-------------------------------------------------------------
277 // received key : checkbox1|N/A , value : INT|1
278 //-------------------------------------------------------------
279 //char* key = "checkbox1|N/A";
283 ptr = strchr(key, '|');
286 xmlDocPtr doc = NULL;
289 //parsing for : checkbox1|N/A -> checkbox1
290 char* key_name = substring(key, 0, strlen(key)-strlen(ptr));
291 char* val_name = strchr(value, '|');
295 doc = xmlParseFile(plugin_path);
298 SETTING_TRACE("unable to parse file : %s", plugin_path);
300 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* xml parsing error */
303 xmlNode *root = xmlDocGetRootElement(doc);
307 // TODO : message queing
308 // get key/value from d-bus and parse xml and search xml data with key
309 static int count = 0;
310 SETTING_TRACE(" BEGIN ---------------------------- dbus--> before __node_finder : %d", count);
311 __node_finder((PluginNode*)ad->plugin_node, root, key_name ,val_name, &is_end);
312 SETTING_TRACE(" END ----------------------------- dbus--> after __node_finder : %d", count);
316 GError *error = NULL;
321 xmlSaveFormatFile(ad->plugin_path, doc, 1);
322 // TODO: make sure this is right
325 SETTING_TRACE("__cfg_file_write successful");
332 return DBUS_HANDLER_RESULT_HANDLED;
335 static int __send_msg(char* key, char* value)
337 DBusMessage* message;
339 int sender_pid = getpid();
344 // ex) in gdb --> $15 = 0x43b6eb78 "Update_(null)" -> error codintion
345 if (s_pkg_name == NULL)
347 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
351 message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, s_pkg_name);
353 SETTING_TRACE("Sending message[%s:%s] via dbus", key ,value);
354 if (dbus_message_append_args(message,
355 DBUS_TYPE_UINT32, &sender_pid,
356 DBUS_TYPE_STRING, &key,
357 DBUS_TYPE_STRING, &value,
358 DBUS_TYPE_INVALID) == FALSE)
360 SETTING_TRACE("Fail to load data error");
364 if (dbus_connection_send(bus, message, NULL) == FALSE)
366 SETTING_TRACE("Fail to send message");
370 dbus_connection_flush(bus);
371 dbus_message_unref(message);
373 SETTING_TRACE("[CLIENT] send data signal done");
379 static void __send_int_msg(xmlNode* xmlObj, int val)
382 const char *id = (char*)xmlGetProp(xmlObj, "id");
383 const char *title = (char*)xmlGetProp(xmlObj, "title");
384 char key[MAX_CONTENT_LEN] = {0,};
385 snprintf(key, sizeof(key), "%s|%s", id, title);
387 char value[MAX_CONTENT_LEN] = {0,};
388 snprintf(value, sizeof(value), "INT|%d", val);
389 __send_msg(key, value);
394 static void __send_string_msg(xmlNode* xmlObj, char *string)
396 const char *id = (char*)xmlGetProp(xmlObj, "id");
397 const char *title = (char*)xmlGetProp(xmlObj, "title");
398 char key[MAX_CONTENT_LEN] = {0,};
399 snprintf(key, sizeof(key), "%s|%s", id, title);
401 char value[MAX_CONTENT_LEN] = {0,};
402 snprintf(value, sizeof(value), "STRING|%s", string);
403 __send_msg(key, value);
407 int setting_dbus_handler_init(void* user_data)
412 SETTING_TRACE("already get a bus, need release first.");
413 setting_dbus_handler_fini();
417 memset(&error, 0, sizeof(DBusError));
418 char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
419 dbus_error_init(&error);
420 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
423 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
424 dbus_error_free(&error);
428 dbus_connection_setup_with_g_main(bus, NULL);
429 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
431 dbus_bus_add_match(bus, rule, &error);
432 if (dbus_error_is_set(&error))
434 SETTING_TRACE("Fail to rule set; %s", error.message);
435 dbus_bus_remove_match(bus, rule, &error);
436 dbus_error_free(&error);
437 dbus_connection_close(bus);
442 if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
444 dbus_bus_remove_match(bus, rule, &error);
445 dbus_error_free(&error);
446 dbus_connection_close(bus);
451 SETTING_TRACE("app signal initialized");
455 int setting_dbus_handler_fini(void)
458 //do safty checking first.
459 setting_retvm_if(!bus, 0, "!bus");
461 memset(&error, 0, sizeof(DBusError));
462 char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
464 dbus_error_init(&error);
467 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
469 //dbus_connection_remove_filter(bus, __signal_filter, NULL);
472 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
473 dbus_bus_remove_match(bus, rule, &error);
475 if (dbus_error_is_set(&error))
477 SETTING_TRACE("Fail to rule unset: %s", error.message);
478 dbus_error_free(&error);
482 dbus_connection_close(bus);
484 SETTING_TRACE("app signal finalized");
488 /////////////////////////////
489 /////////////////////////////
490 /////////////////////////////
492 Elm_Genlist_Item_Class itc_layout;
495 static int __cfg_file_write(Draw_Data *pd)
499 GError *error = NULL;
502 xmlSaveFormatFile(pd->cfg_file, pd->doc, 1);
503 //xmlFreeDoc(pd->doc);
505 SETTING_TRACE("__cfg_file_write successful");
513 static void ___click_softkey_back_cb(void *data, Evas_Object *obj,
519 PluginNode* node = (PluginNode*)data;
520 Draw_Data *pd = node->pd;
522 evas_object_del(pd->ly_main);
526 setting_plugin_destroy(node);
527 if (g_main_ad->navibar_main)
529 elm_naviframe_item_pop(g_main_ad->navibar_main);
542 static void* group_func(void *data, xmlNode *xmlObj)
545 retv_if(!data || !xmlObj, NULL);
547 PluginNode* node = (PluginNode*)data;
548 Draw_Data *pd = node->pd;
550 // original code is non-recursive
552 const char *title = (char*)json_object_get_string_member(jsonObj, "title");
553 (void)setting_create_Gendial_field_titleItem(pd->scroller,
557 // non recursive method
558 if (json_object_has_member(jsonObj, "elements"))
560 JsonNode* elements_node = json_object_get_member(jsonObj, "elements");
564 for (i=0; i < json_array_get_length(json_node_get_array(elements_node)); i++)
566 tempobj = json_array_get_object_element(json_node_get_array(elements_node), i);
567 type = (char*)json_object_get_string_member(tempobj, "type");
568 drawer_fp fp = __drawer_find(type);
569 if (fp) fp(pd, tempobj); // draw it
573 // new code is recursive
574 const char *title = (char*)xmlGetProp(xmlObj, "title");
575 SETTING_TRACE (" >>> GROUP NAME : %s \n", title);
576 (void)setting_create_Gendial_field_titleItem(pd->scroller, &(itc_group_item), title, NULL);
583 static void* __link_list_cb(void *data, Evas_Object *obj, void *event_info)
586 retv_if(data == NULL, NULL);
587 retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
588 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
589 elm_genlist_item_selected_set(item, 0);
590 Setting_GenGroupItem_Data *list_item =
591 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
593 xmlNode* xmlObj = data;
594 retv_if(!xmlObj, NULL);
595 const char *link_file = (char*)xmlGetProp(xmlObj, "value");
599 SETTING_TRACE_ERROR("Invalidate liked file");
602 char file[1024] = {0,};
603 snprintf(file, sizeof(file), "%s/%s", PLUGIN_CFG_DIR, link_file);
604 SETTING_TRACE("file:%s", file);
606 PluginNode* plugin_node = setting_plugin_create(file);
607 setting_plugin_load(plugin_node, (const char *)file);
609 //setting_plugin_load(NULL, file);
614 static void* __launch_list_cb(void *data, Evas_Object *obj, void *event_info)
617 retv_if(data == NULL, NULL);
618 retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
619 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
620 elm_genlist_item_selected_set(item, 0);
621 Setting_GenGroupItem_Data *list_item =
622 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
624 xmlNode* xmlObj = data;
625 retv_if(!xmlObj, NULL);
626 const char *key_str = (char*)xmlGetProp(xmlObj, "id");
627 const char *title_str = (char*)xmlGetProp(xmlObj, "title");
628 const char *appid_str = (char*)xmlGetProp(xmlObj, "appid");
629 const char *operation_str = (char*)xmlGetProp(xmlObj, "operation");
632 service_h svc = NULL;
633 service_create(&svc);
634 service_set_app_id(svc, appid_str); // xml property – appid
635 service_set_operation(svc, operation_str); // property : operation
636 service_send_launch_request(svc, NULL, NULL);
637 service_destroy(svc);
642 static void* label_func(void *data, xmlNode *xmlObj)
645 retv_if(!data || !xmlObj, NULL);
646 PluginNode* node = (PluginNode*)data;
647 Draw_Data *pd = node->pd;
649 const char *title = (char*)xmlGetProp(xmlObj, "title");
651 Setting_GenGroupItem_Data *obj =
652 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
654 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
655 0, title, NULL, NULL);
660 static void* link_func(void *data, xmlNode *xmlObj)
663 retv_if(!data || !xmlObj, NULL);
664 PluginNode* node = (PluginNode*)data;
665 Draw_Data *pd = node->pd;
667 const char *key_str = (char*)xmlGetProp(xmlObj, "id");
668 Setting_GenGroupItem_Data * obj =
669 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
671 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
672 0, key_str, NULL, NULL);
677 static void* launch_func(void *data, xmlNode *xmlObj)
680 retv_if(!data || !xmlObj, NULL);
681 PluginNode* node = (PluginNode*)data;
682 Draw_Data *pd = node->pd;
684 const char *title_str = (char*)xmlGetProp(xmlObj, "title");
686 Setting_GenGroupItem_Data * obj =
687 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
689 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
690 0, title_str, NULL, NULL);
695 static void __slider_stop_cb(void *data, Evas_Object *obj,
698 ret_if(data == NULL || obj == NULL);
699 double val = elm_slider_value_get(obj);
700 SETTING_TRACE("val = %f", val);
701 Setting_GenGroupItem_Data *list_item = data;
702 ret_if(list_item->userdata == NULL);
704 xmlNode* xmlObj = list_item->userdata;
707 //apply the vconf changes after stopping moving slider..
708 list_item->chk_status = (int)(val + 0.5);
709 elm_slider_value_set(obj, list_item->chk_status);
711 SETTING_TRACE(" slider after ---> val = %d", (int) list_item->chk_status);
713 // int -> double -> xmlChar*
716 sprintf(buf, "%d", (int) list_item->chk_status);
717 newattr = xmlSetProp(xmlObj, "value", buf);
719 __send_int_msg(xmlObj, list_item->chk_status);
720 __cfg_file_write((Draw_Data *)list_item->belongs_to);
724 static void* slider_func(void *data, xmlNode *xmlObj)
727 retv_if(!data || !xmlObj, NULL);
728 PluginNode* node = (PluginNode*)data;
729 Draw_Data *pd = node->pd;
732 const char *title = (char*)xmlGetProp(xmlObj, "title");
734 SETTING_TRACE (" >>> [slider input] min=%s max=%s value=%s ",(char*)xmlGetProp(xmlObj, "min"), (char*)xmlGetProp(xmlObj, "max"), (char*)xmlGetProp(xmlObj, "value"));
736 int value = atoi((char*)xmlGetProp(xmlObj, "value"));
737 int min = atoi((char*)xmlGetProp(xmlObj, "min"));
738 int max = atoi((char*)xmlGetProp(xmlObj, "max"));
740 SETTING_TRACE ("[slider input] min=%d max=%d value=%d ", min, max, value);
742 setting_create_Gendial_itc("dialogue/1text.1icon.5", &(itc_layout));
743 Setting_GenGroupItem_Data *list_item =
744 setting_create_Gendial_field_def(pd->scroller, &(itc_layout), NULL,
746 SWALLOW_Type_LAYOUT_SLIDER,
747 IMG_SENSITIVITY_ICON_01,
748 IMG_SENSITIVITY_ICON_02, value,
751 list_item->win_main = NULL;
752 list_item->evas = NULL;
753 list_item->isIndicatorVisible = true;
754 list_item->slider_min = min;
755 list_item->slider_max = max;
756 list_item->userdata = xmlObj;
757 list_item->stop_change_cb = __slider_stop_cb;
758 list_item->belongs_to = (int)pd;
761 g_list_item = list_item;
763 return (void*)list_item;
768 elm_object_item_data_set(item_to_update->item, item_to_update);
769 elm_genlist_item_update(item_to_update->item);
771 static void* navigationbar_func(void *data, xmlNode *xmlObj)
775 ret_if(!data || !xmlObj);
777 PluginNode* node = (PluginNode*)data;
778 Draw_Data *pd = node->pd;
780 //----------------------------------------------------------------
781 // [DATA] title, btn[0], btn[1]
782 const char *title = (char*)xmlGetProp(xmlObj, "title");
783 char *btn[2] = {0, };
785 // find child nodes named 'elements'
786 if (xmlObj->children) {
787 xmlNode* cur = xmlObj->children;
791 if (!xmlStrcmp(cur->name, (const xmlChar*)"button")) {
792 btn[i] = xmlGetProp(cur, "title");
793 SETTING_TRACE("------>>> node type : Element, name=%s id=%s / btn[%d] = %s ",
794 cur->name,xmlGetProp(cur, "id"),
802 //----------------------------------------------------------------
804 pd->ly_main = setting_create_layout_navi_bar_genlist(pd->win_get,
807 _(btn[1]), _(btn[0]),
808 ___click_softkey_back_cb,
809 ___click_softkey_back_cb, data, &pd->scroller,
817 static void __check_mouse_up_cb(void *data, Evas_Object *obj,
822 setting_retm_if(data == NULL, "Data parameter is NULL");
824 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
825 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
826 elm_genlist_item_selected_set(item, 0);
827 Setting_GenGroupItem_Data *list_item =
828 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
830 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
832 int old_status = elm_check_state_get(list_item->eo_check);
833 list_item->chk_status = !old_status;
834 elm_check_state_set(list_item->eo_check, list_item->chk_status);
836 xmlNode *xmlObj = data;
838 newattr = xmlSetProp(xmlObj, "state", xmlXPathCastNumberToString(list_item->chk_status));
840 __send_int_msg(xmlObj, list_item->chk_status);
841 __cfg_file_write((Draw_Data *)list_item->belongs_to);
845 static void __chk_btn_cb(void *data, Evas_Object *obj,
850 retm_if(data == NULL, "Data parameter is NULL");
851 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
853 xmlNode* xmlObj = list_item->userdata;
855 list_item->chk_status = elm_check_state_get(obj); /* for genlist update status */
858 if (list_item->chk_status == 1) {
859 newattr = xmlSetProp(xmlObj, "value", "true");
860 } else if (list_item->chk_status == 0) {
861 newattr = xmlSetProp(xmlObj, "value", "false");
863 newattr = xmlSetProp(xmlObj, "value", "false");
866 const char *id = (char*)xmlGetProp(xmlObj, "id");
867 const char *title = (char*)xmlGetProp(xmlObj, "title");
868 //SETTING_TRACE(" >>>> id:%s , title:%s", id, title);
869 __send_int_msg(xmlObj, list_item->chk_status);
870 __cfg_file_write((Draw_Data *)list_item->belongs_to);
875 static void* checkbox_func(void *data, xmlNode *xmlObj)
878 retv_if(!data || !xmlObj, NULL);
880 PluginNode* node = (PluginNode*)data;
881 Draw_Data *pd = node->pd;
883 // [DATA] title, value
884 const char *title = (char*)xmlGetProp(xmlObj, "title");
887 char* value = (char*)xmlGetProp(xmlObj, "value");
891 if ( 0 == safeStrCmp(value, "true")) {
893 } else if ( 0 == safeStrCmp(value, "false")) {
896 ival = 0; // default : false (0)
899 // title, value, xmlObj
900 Setting_GenGroupItem_Data *list_item =
901 setting_create_Gendial_field_def(pd->scroller,
905 SWALLOW_Type_1TOGGLE,
912 list_item->userdata = xmlObj;
913 list_item->belongs_to = (int) pd;
914 SETTING_TRACE("pd:%p,list_item->belongs_to:%d", pd, list_item->belongs_to);
921 static void __entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
924 retm_if(!data || !obj, "Data parameter is NULL");
926 setting_hide_input_pannel_cb(obj);
927 const char *entry_str = elm_entry_entry_get(obj);
928 char *entry_str_utf8 = NULL;
929 entry_str_utf8 = elm_entry_markup_to_utf8(entry_str);
931 Setting_GenGroupItem_Data *list_item = data;
933 xmlNode* xmlObj = list_item->userdata;
935 FREE(entry_str_utf8);
940 const char *title = (char*)xmlSetProp(xmlObj, "value",entry_str_utf8);
942 __send_string_msg(xmlObj, entry_str_utf8);
943 __cfg_file_write((Draw_Data *)list_item->belongs_to);
945 FREE(entry_str_utf8);
950 static void __editbox_list_cb(void *data, Evas_Object *obj,
956 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
957 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
958 elm_genlist_item_selected_set(item, 0);
959 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
961 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
962 if (!elm_object_focus_get(list_item->eo_check)) {
963 elm_object_focus_set(list_item->eo_check, EINA_TRUE);
966 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(list_item->eo_check);
967 setting_retm_if(imf_context == NULL, "imf_context is NULL");
968 ecore_imf_context_input_panel_show(imf_context);
972 static void __editbox_changed_cb(void *data, Evas_Object *obj,
976 retm_if(!data || !obj, "Data parameter is NULL");
977 retm_if(!elm_object_focus_get(obj), "Entry is not focused");
979 Setting_GenGroupItem_Data *list_item =
980 (Setting_GenGroupItem_Data *) data;
982 const char *entry_str = elm_entry_entry_get(obj);
983 int entry_len = safeStrLen(entry_str);
984 SETTING_TRACE("entry_str:[%s], lenght:%d", entry_str, entry_len);
986 G_FREE(list_item->sub_desc);//release first
987 list_item->sub_desc = (char *)g_strdup(entry_str);
994 * @see also __editbox_changed_cb
995 * @see also __entry_unfocus_cb
997 static void* editbox_func(void *data, xmlNode *xmlObj)
1000 retv_if(!data || !xmlObj, NULL);
1002 PluginNode* node = (PluginNode*)data;
1003 Draw_Data *pd = node->pd;
1005 const char *title = (char*)xmlGetProp(xmlObj, "title");
1006 const char *key_str= (char*)xmlGetProp(xmlObj, "value");
1008 const char *minlength= (char*)xmlGetProp(xmlObj, "minlength");
1009 const char *maxlength= (char*)xmlGetProp(xmlObj, "maxlength");
1014 max_len = atoi(maxlength);
1015 SETTING_TRACE(" >> MAXLENGTH FILTER IS AVAILABLE !!!! maxlength = %d", max_len);
1018 Setting_GenGroupItem_Data *list_item = NULL;
1023 // without maxlength filter
1024 list_item = setting_create_Gendial_field_def(pd->scroller, &(itc_1icon),
1026 pd, SWALLOW_Type_LAYOUT_ENTRY,
1027 NULL, NULL, 0, title, key_str,
1028 __editbox_changed_cb);
1031 // add max length filter
1032 list_item = setting_create_Gendial_field_entry_fo(
1037 SWALLOW_Type_LAYOUT_ENTRY,
1038 NULL, NULL, 0, title, key_str,
1039 __editbox_changed_cb,
1041 ELM_INPUT_PANEL_LAYOUT_NORMAL,
1051 list_item->userdata = xmlObj;
1052 list_item->stop_change_cb = __entry_unfocus_cb;
1053 list_item->belongs_to = (int)pd;
1060 static void __expanditem_func_sel_cb(void *data, Evas_Object *obj, void *event_info)
1062 SETTING_TRACE_BEGIN;
1064 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
1065 Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
1066 Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subitem);
1067 elm_genlist_item_selected_set(subitem, 0);
1068 Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
1069 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
1070 ret_if(NULL == data_subItem || NULL == data_parentItem);
1072 elm_radio_value_set(data_subItem->rgd, data_subItem->chk_status);
1074 data_parentItem->sub_desc = (char *)g_strdup(_(data_subItem->keyStr));
1075 elm_object_item_data_set(data_parentItem->item, data_parentItem);
1076 elm_genlist_item_update(data_parentItem->item);
1078 xmlNode* xmlObj = data_parentItem->userdata;
1082 //newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
1083 newattr = xmlSetProp(xmlObj, "value", data_parentItem->sub_desc);
1085 __send_string_msg(xmlObj, data_parentItem->sub_desc);
1086 __cfg_file_write((Draw_Data *)data_parentItem->belongs_to);
1090 static void __expanditem_func_exp_cb(void *data, Evas_Object *obj, void *event_info)
1092 ret_if(NULL == data || NULL == event_info);
1093 SETTING_TRACE_BEGIN;
1095 PluginNode* node = (PluginNode*)data;
1096 Draw_Data *pd = node->pd;
1098 Elm_Object_Item *parentItem = event_info; /* parent item */
1099 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
1100 Evas_Object *scroller = elm_object_item_widget_get(parentItem);
1103 xmlNode *xmlObj = data_parentItem->userdata;
1104 char *value = (char*)xmlGetProp(xmlObj, "value");
1105 SETTING_TRACE(">>> value = %s", value);
1106 Evas_Object *rgd = NULL;
1108 if (xmlObj->children && !data_parentItem->rgd) {//to protect from entering repeatly
1109 xmlNode* cur = xmlObj->children;
1111 rgd = elm_radio_add(scroller);
1112 elm_radio_value_set(rgd, -1);
1115 char *subitem_title = NULL;
1116 int subitem_index = 0;
1120 // print out debug message
1121 if (data_parentItem->childs)
1124 Eina_List *li = data_parentItem->childs;
1127 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1129 SETTING_TRACE(" <<< node->keyStr : %s >>> ", node->keyStr);
1132 li = eina_list_next(li);
1134 SETTING_TRACE(" <<<how many : %d>>> ", howmany);
1137 if (data_parentItem->childs)
1139 eina_list_free(data_parentItem->childs);
1140 data_parentItem->childs = NULL;
1143 while (cur != NULL) {
1144 if (!xmlStrcmp(cur->name, (const xmlChar*)"expanditem")) {
1145 type = (char*)xmlGetProp(cur, "type");
1146 if (0 == safeStrCmp(type, "radio")) {
1147 subitem_title = (char*)xmlGetProp(cur, "title");
1148 Setting_GenGroupItem_Data *list_item =
1149 setting_create_Gendial_exp_sub_field(scroller,
1150 &(itc_1icon_1text_sub),
1151 __expanditem_func_sel_cb, NULL, parentItem,
1152 SWALLOW_Type_1RADIO, rgd,
1154 subitem_title, NULL);
1157 if (0 == safeStrCmp(value, subitem_title)) {
1158 sel_idx = subitem_index;
1159 SETTING_TRACE("%d is selected in Radio Group", sel_idx);
1161 SETTING_TRACE(" eina list add >>> value = %s, subitem_title = %s ", value, subitem_title);
1162 data_parentItem->childs = eina_list_append(data_parentItem->childs, list_item);
1166 SETTING_TRACE("invalid type[:%s]", type);
1173 elm_radio_value_set(rgd, sel_idx);
1174 data_parentItem->rgd = rgd;//protecting condition
1179 static void __expanditem_func_smart_cb(void *data, Evas_Object *obj, void *event_info)
1181 ret_if(data == NULL || event_info == NULL);
1182 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
1183 Setting_GenGroupItem_Data *data_item = elm_object_item_data_get(item);
1184 char *cb_type = data;
1186 if (0 == safeStrCmp(cb_type, "contracted")) {
1187 data_item->rgd = NULL;
1188 elm_genlist_item_subitems_clear(item);
1193 static void* settings_func(void *data, xmlNode *xmlObj)
1199 static Evas_Object *setting_create_win_layout2(Evas_Object *win_layout, Evas_Object *win_obj)
1202 Evas_Object *layout = NULL;
1205 layout = elm_layout_add(win_obj);
1206 setting_retvm_if(layout == NULL, FALSE, "layout == NULL");
1208 elm_layout_theme_set(layout, "layout", "application", "default");
1209 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1210 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
1211 elm_win_resize_object_add(win_obj, layout);
1213 Evas_Object *bg = setting_create_bg(layout, win_obj, "group_list");
1214 elm_object_part_content_set(layout, "elm.swallow.bg", bg);
1215 evas_object_show(layout);
1220 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 */
1221 Evas_Object **navi_bar,
1222 Evas_Object **titleobj)
1225 Evas_Object *layout = setting_create_win_layout2(win_layout, win_obj);
1226 *navi_bar = setting_create_navi_bar(layout);
1228 setting_create_navi_bar_buttons(title_str,
1229 lbutton_str, rbutton_str, mbutton_str,
1230 lbutton_click_cb, rbutton_click_cb,
1231 mbutton_click_cb, cb_data, eo_view /*content */ ,
1236 static void __plugin_genlist_unrealized_cb(void* data,Evas_Object* obj, void* event_info)
1238 SETTING_TRACE_BEGIN;
1239 ret_if(data == NULL);
1241 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
1242 Setting_GenGroupItem_Data *node = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
1243 ret_if(node== NULL);
1245 SETTING_TRACE("keyStr : %s ", node->keyStr);
1246 //item_to_update->childs)
1250 eina_list_free(node->childs);
1251 node->childs = NULL;
1256 static void* setting_func(void *data, xmlNode *xmlObj)
1258 SETTING_TRACE_BEGIN;
1259 retv_if(!data || !xmlObj, NULL);
1261 PluginNode* node = (PluginNode*)data;
1262 Draw_Data *pd = node->pd;
1264 // [DATA] title, btn[0], btn[1]
1265 const char *title = (char*)xmlGetProp(xmlObj, "title");
1266 char *btn[2] = {/* 0 */"OK", /* 1 */"NO"};
1268 SETTING_TRACE("before setting_create_layout_navi_bar_genlist");
1271 pd->scroller = elm_genlist_add(g_main_ad->win_main);
1272 retvm_if(pd->scroller == NULL, NULL,
1273 "Cannot set scroller object as contento of layout");
1274 elm_object_style_set(pd->scroller, "dialogue");
1275 elm_genlist_clear(pd->scroller); /* first to clear list */
1277 evas_object_smart_callback_add(pd->scroller, "unrealized", __plugin_genlist_unrealized_cb, node);
1280 SETTING_TRACE("_(title):%s", _(title));
1282 setting_push_layout_navi_bar(
1284 _("IDS_COM_BODY_BACK"), NULL, NULL,
1285 ___click_softkey_back_cb,
1288 g_main_ad->navibar_main, NULL);
1289 SETTING_TRACE("after setting_create_layout_navi_bar_genlist");
1295 static void* expanditem_func(void *data, xmlNode *xmlObj)
1297 // DO NOTHING - expandlist draws this area
1301 static void* expandlist_func(void *data, xmlNode *xmlObj)
1303 SETTING_TRACE_BEGIN;
1304 retv_if(!data || !xmlObj, NULL);
1306 PluginNode* node = (PluginNode*)data;
1307 Draw_Data *pd = node->pd;
1309 const char *key_str = (char*)xmlGetProp(xmlObj, "title");
1310 const char *value = (char*)xmlGetProp(xmlObj, "value"); // string -> value
1312 setting_enable_expandable_genlist(pd->scroller, data, __expanditem_func_exp_cb, __expanditem_func_smart_cb);
1313 Setting_GenGroupItem_Data *list_item =
1314 setting_create_Gendial_exp_parent_field(pd->scroller,
1315 &(itc_2text_3_parent),
1317 SWALLOW_Type_INVALID,
1321 list_item->userdata = xmlObj;
1322 list_item->belongs_to = (int)pd;
1323 list_item->childs = NULL; /* init */
1331 static int __node_walker(PluginNode* context, xmlNode* cur)
1333 //SETTING_TRACE_BEGIN;
1334 Draw_Data *pd = context->pd;
1337 retv_if(!context->ui_list, -1);
1339 xmlNode *cur_node = NULL;
1340 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1341 if (cur_node->type == XML_ELEMENT_NODE) {
1342 // SETTING_TRACE("node type : %s id= %s", cur_node->name,xmlGetProp(cur_node, "id"));
1343 drawer_fp fp = __drawer_find(cur_node->name);
1347 void* vret = fp(context, cur_node); // draw it
1351 Setting_GenGroupItem_Data* genlist_node = (Setting_GenGroupItem_Data* )vret;
1352 //SETTING_TRACE("add node to Eina List name : %s, id : ", cur_node->name, xmlGetProp(cur_node, "id"));
1353 // add it to the hash table create before.
1356 char* key_name = xmlGetProp(cur_node, "id");
1357 eina_hash_add(context->ui_list, strdup(key_name),(void*)genlist_node);
1360 SETTING_TRACE(" >>>> fp is NULL ");
1363 __node_walker(context, cur_node->children); /* RECURSIVE */
1369 * @param id_str [in] "id"
1370 * @param value [in] value to be udpated
1371 * @see __expanditem_func_sel_cb
1373 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end)
1375 SETTING_TRACE_BEGIN;
1376 xmlNode *cur_node = NULL;
1380 SETTING_TRACE("context is NULL - it's error CONDITION ");
1384 retv_if(!context->ui_list, -1);
1385 if (*is_end == true) return 0;
1387 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1388 if (cur_node->type == XML_ELEMENT_NODE) {
1390 char* id_name = (char*)xmlGetProp(cur_node, "id");
1391 if ( id_name && 0 == strcmp(id_str, id_name))
1393 SETTING_TRACE("FOUND >>>> %s", id_name);
1394 // cur_node - update xml code
1395 xmlAttrPtr newattr = xmlSetProp(cur_node, "value", value);
1397 //-----------------------------------------------------------
1400 if ( 0 == strcmp (cur_node->name, "integer"))
1402 SETTING_TRACE(">>>>> UPDATE SLIDER CONTROL %x --- %s ",context->ui_list, id_name);
1403 Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1406 item_to_update->chk_status = atoi(value);
1407 SETTING_TRACE(">>> o-------------0 SLIDER VALUE = %d ", item_to_update->chk_status);
1409 elm_object_item_data_set(item_to_update->item, item_to_update);
1410 elm_genlist_item_update(item_to_update->item);
1412 SETTING_TRACE("item_to_update is NULL");
1416 if ( 0 == strcmp (cur_node->name, "bool"))
1418 SETTING_TRACE(">>>>> UPDATE TOGGLE CONTROL pluginpath:%s, ---- %x --- %s ", context->plugin_path, context->ui_list, id_name);
1419 Setting_GenGroupItem_Data* item_to_update = NULL;
1420 item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1423 item_to_update->chk_status = atoi(value);
1424 SETTING_TRACE(">>> o-------------0 TOGGLE VALUE = %d ", item_to_update->chk_status);
1426 elm_object_item_data_set(item_to_update->item, item_to_update);
1427 elm_genlist_item_update(item_to_update->item);
1429 SETTING_TRACE("item_to_update is NULL");
1432 // case : edit control
1433 if ( 0 == strcmp (cur_node->name, "string"))
1435 SETTING_TRACE(">>>>> UPDATE EDIT CONTROL CONTROL %x --- %s ",context->ui_list, id_name);
1436 Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1439 char* old_string = item_to_update->sub_desc;
1440 item_to_update->sub_desc = strdup(value);
1441 SETTING_TRACE(">>> o-------------0 STRING VALUE = %s ", value);
1445 elm_object_item_data_set(item_to_update->item, item_to_update);
1446 elm_genlist_item_update(item_to_update->item);
1449 SETTING_TRACE("item_to_update is NULL");
1452 // case : expand list
1458 //-----------------------------------------------------------
1459 if ( 0 == strcmp (cur_node->name, "expandlist"))
1462 SETTING_TRACE(">>>>> UPDATE EXPAND LIST CONTROL %x --- %s ",context->ui_list, id_name);
1463 Setting_GenGroupItem_Data* item_to_update = NULL;
1464 item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1467 char* old_string = item_to_update->sub_desc;
1468 item_to_update->sub_desc = strdup(value);
1469 SETTING_TRACE(">>> o-------------0 EXPAND LIST VALUE = %s ", value);
1473 elm_object_item_data_set(item_to_update->item, item_to_update);
1474 elm_genlist_item_update(item_to_update->item);
1476 // TODO: need to update child elements
1477 // item_to_update->childs ---> expanded list
1480 // there should have 4 sub items.
1481 //-----------------------------------------------------
1482 // has it already freed by someone?
1483 //-----------------------------------------------------
1484 if (item_to_update->childs)
1487 Eina_List *li = item_to_update->childs;
1490 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1492 li = eina_list_next(li);
1494 SETTING_TRACE(" expandlist -- how many items are there? : %d ", howmany2);
1497 if (item_to_update->childs)
1499 Eina_List *li = item_to_update->childs;
1500 int radio_index = 0;
1503 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1505 if (node->item && node->keyStr)
1507 // do something more
1508 // SETTING_TRACE(">>> RADIO LIST STRING VALUE = %s ", node->keyStr);
1509 // set position of radio button
1510 if (strcmp(node->keyStr, value) == 0) // << CRAAH !!!!
1512 elm_radio_value_set(node->rgd, radio_index);
1515 SETTING_TRACE(">>> node has unproper values - Setting_GenGroupItem_Data");
1517 elm_object_item_data_set(item_to_update->item, item_to_update);
1518 elm_genlist_item_update(item_to_update->item);
1521 li = eina_list_next(li);
1527 SETTING_TRACE("item_to_update is NULL");
1536 __node_finder(context, cur_node->children, id_str, value, is_end); /* RECURSIVE */
1541 static unsigned int _plugin_string_key_length(const char*key)
1546 return (int)strlen(key) + 1;
1549 static int _plugin_string_key_cmp(const char* key1, int key1_length,
1550 const char* key2, int key2_length)
1552 return strcmp(key1, key2);
1555 static void _plugin_entry_free_cb(void* data)
1557 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1560 eina_list_free(node->childs);
1561 node->childs = NULL;
1565 PluginNode* setting_plugin_create()
1567 PluginNode *node = calloc(1, sizeof(PluginNode));
1568 setting_retvm_if(!node, -1, "Create PluginNode obj failed");
1569 Draw_Data *pd = calloc(1, sizeof(Draw_Data));
1576 setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
1580 node->ui_list = eina_hash_new(EINA_KEY_LENGTH(_plugin_string_key_length),
1581 EINA_KEY_CMP(_plugin_string_key_cmp),
1582 EINA_KEY_HASH(eina_hash_superfast),
1583 _plugin_entry_free_cb,
1589 void setting_plugin_destroy(PluginNode* node)
1591 SETTING_TRACE_BEGIN;
1593 SETTING_TRACE("node is NOT NULL")
1595 SETTING_TRACE("node->pd is NOT NULL")
1596 if(node->pd->doc != NULL) {
1597 xmlSaveFormatFile(node->plugin_path, node->pd->doc, 1);
1598 xmlFreeDoc(node->pd->doc);
1599 node->pd->doc = NULL;
1600 SETTING_TRACE("__cfg_file_write successful");
1607 if (node->ui_list) {
1608 eina_hash_free(node->ui_list);
1609 node->ui_list = NULL;
1618 static Eina_Bool _plugin_foreach_cb(const Eina_Hash *hash, const void*key, void* data, void* fdata)
1620 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1621 SETTING_TRACE("%s --- %s ", (char*)key, node->keyStr);
1626 void setting_plugin_debug(PluginNode* context)
1628 // SETTING_TRACE("HASH TABLE -------------------------------------");
1629 if (context->ui_list) {
1630 eina_hash_foreach(context->ui_list,_plugin_foreach_cb, NULL);
1632 // SETTING_TRACE("HASH TABLE -------------------------------------");
1636 void setting_plugin_update(PluginNode* context)
1638 Eina_List *li = context->ui_list;
1641 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) eina_list_data_get(li);
1643 // SETTING_TRACE(" ---> keyStr : %s , swallow type : %d ", node->keyStr, node->swallow_type);
1644 Setting_GenGroupItem_Data* item_to_update = NULL;
1645 item_to_update = node;
1646 elm_object_item_data_set(item_to_update->item, item_to_update);
1647 elm_genlist_item_update(item_to_update->item);
1649 li = eina_list_next(li);
1657 bool setting_plugin_load(PluginNode* context, const char *cfg_file)
1659 SETTING_TRACE("cfg_file:%s", cfg_file)
1660 if (isEmptyStr(cfg_file) || 0 != access(cfg_file, R_OK|W_OK|F_OK ))
1662 SETTING_TRACE_ERROR(" error occured : access \n");
1665 context->pd->cfg_file = cfg_file;
1667 //GError *error = NULL;
1669 context->pd->doc = xmlParseFile(cfg_file);
1670 context->pd->root = xmlDocGetRootElement(context->pd->doc);
1672 // signal filter change
1673 //setting_dbus_handler_init(g_main_ad);
1674 void* user_data = (void*)g_main_ad;
1677 dbus_error_init(&error);
1678 char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
1679 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
1682 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
1683 dbus_error_free(&error);
1688 // dbus_connection_remove_filter(bus, __signal_filter, NULL);
1691 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
1692 dbus_bus_add_match(bus, rule, &error);
1693 if (dbus_error_is_set(&error))
1695 SETTING_TRACE("Fail to rule set; %s", error.message);
1696 dbus_bus_remove_match(bus, rule, &error);
1697 dbus_error_free(&error);
1698 dbus_connection_close(bus);
1704 if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
1706 dbus_bus_remove_match(bus, rule, &error);
1707 dbus_error_free(&error);
1708 dbus_connection_close(bus);
1713 // TODO: error handler here
1714 __node_walker(context, context->pd->root);
1717 setting_plugin_debug(context);