3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (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.
19 #include <setting-common-plugin.h>
21 #include <eina_list.h>
24 //#include <libxml/xmlmemory.h>
25 //#include <libxml/parser.h>
27 #include <setting-debug.h>
28 #include <setting-common-general-func.h>
29 #include <setting-common-draw-widget.h>
31 //extern setting_main_appdata *g_main_ad;
33 static Setting_GenGroupItem_Data *g_list_item; /*TEST*/
36 * UI draw handler table : _g_draw_list
37 * - contains Object_Drawer typed object.
39 static Eina_List *_g_drawer_list = NULL;
43 * @return Evas_Object * obj
45 static void* navigationbar_func(void *data, xmlNode *xmlObj);
51 static void* group_func(void *data, xmlNode *xmlObj);
54 * @return Setting_GenGroupItem_Data* ptr
56 static void* link_func(void *data, xmlNode *xmlObj);
59 * @return Setting_GenGroupItem_Data* ptr
61 static void* slider_func(void *data, xmlNode *xmlObj);
64 * @return Setting_GenGroupItem_Data* ptr
66 static void* label_func(void *data, xmlNode *xmlObj);
69 * @return Setting_GenGroupItem_Data* ptr
71 static void* checkbox_func(void *data, xmlNode *xmlObj);
74 * @return Setting_GenGroupItem_Data* ptr
76 static void* editbox_func(void *data, xmlNode *xmlObj);
79 * @return Setting_GenGroupItem_Data* ptr
81 static void* expandlist_func(void *data, xmlNode *xmlObj);
86 static void* expanditem_func(void *data, xmlNode *xmlObj);
91 static void* settings_func(void *data, xmlNode *xmlObj);
94 static void* launch_func(void *data, xmlNode *xmlObj);
99 static void* setting_func(void *data, xmlNode *xmlObj);
101 static int __node_walker(PluginNode* context, xmlNode* cur);
103 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end);
106 static void __drawer_add(const char *type, drawer_fp draw)
108 Object_Drawer *node = calloc(1, sizeof(Object_Drawer));
109 if (node && type && draw)
114 _g_drawer_list = eina_list_append(_g_drawer_list, node);
120 static drawer_fp __drawer_find(char* type)
123 SETTING_TRACE("node type:%s", type);
124 Eina_List *check_list = _g_drawer_list;
125 Object_Drawer *list_item = NULL;
128 list_item = (Object_Drawer *) eina_list_data_get(check_list);
129 if (NULL == list_item)
132 if (0 == safeStrCmp(list_item->type, type))
134 //SETTING_TRACE("list_item->type:%s", list_item->type);
137 //if not matched,to check next node.
138 check_list = eina_list_next(check_list);
141 //SETTING_TRACE("list_item:%p", list_item);
142 return list_item ? list_item->draw : NULL;
145 void setting_drawer_list_init()
149 /* <navigationbar> */__drawer_add("navigationbar", navigationbar_func);
151 /* <bool> */__drawer_add("bool", checkbox_func);
152 /* <string> */__drawer_add("string", editbox_func);
153 /* <group> */__drawer_add("group", group_func);
154 /* <integer> */__drawer_add("integer", slider_func);
155 /* <label> */__drawer_add("label", label_func);
156 /* <link> */__drawer_add("link", link_func);
157 /* <launch> */__drawer_add("launch", launch_func);
158 /* <extendlist> */__drawer_add("expandlist", expandlist_func);
159 /* <extenditem> */__drawer_add("expanditem", expanditem_func);
160 /* <settings> */__drawer_add("settings", settings_func);
161 /* <setting> */__drawer_add("setting", setting_func);
164 void setting_drawer_list_fini()
168 Object_Drawer *node = NULL;
169 Eina_List *li = _g_drawer_list;
171 node = (Object_Drawer *) eina_list_data_get(li);
174 //SETTING_TRACE("Deregister %s", node->type);
177 li = eina_list_next(li);
179 _g_drawer_list = eina_list_free(_g_drawer_list);
180 _g_drawer_list = NULL;
184 /////////////////////////
185 /////////////////////////
186 /////////////////////////
188 #define MAX_CONTENT_LEN 512
189 #define MAX_LOCAL_BUFSIZE 128
190 #define DBUS_PATH "/setting/dbus_handler"
191 #define DBUS_SIGNAL_INTERFACE "org.tizen.setting.signal"
193 #define APPID_LENGTH 10
194 #define APPID_POS_FROM_PATH 10
196 static char* s_pkg_name;
199 static char* substring(const char* str, size_t begin, size_t len)
201 if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
204 return strndup(str + begin, len);
211 * ncbyusjryr.AppSetting --> package ID is ncbyusjryr
212 * "Update_" "ncbyusjryr"
214 static char* get_app_string(char* path)
217 char* temp = substring(path, APPID_POS_FROM_PATH, APPID_LENGTH/*string size*/);
218 SETTING_TRACE("package ID : >>> %s ",temp );
222 //------------------------------------------------------
224 static DBusConnection *bus;
225 //------------------------------------------------------
226 static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* message, void* user_data)
228 int my_pid = getpid();
234 dbus_error_init(&error);
236 //setting_main_appdata *ad = user_data;
237 PluginNode* ad = (PluginNode*)user_data;
239 char* plugin_path = ad->plugin_path;
240 char* pkg_name = get_app_string(plugin_path);
242 if (pkg_name == NULL)
244 SETTING_TRACE("pkg_name is NULL - it's abnormal operation");
245 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
248 char str_buf[MAX_COMMON_BUFFER_LEN];
249 snprintf(str_buf, MAX_COMMON_BUFFER_LEN, "Update_%s", pkg_name);
250 s_pkg_name = strdup(str_buf);
258 if (s_pkg_name == NULL)
260 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
261 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
263 SETTING_TRACE("s_pkg_name : %s ", s_pkg_name);
264 if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, s_pkg_name))
266 if (dbus_message_get_args(message, &error,
267 DBUS_TYPE_UINT32, &sender_pid,
268 DBUS_TYPE_STRING, &key,
269 DBUS_TYPE_STRING, &value,
270 DBUS_TYPE_INVALID) == FALSE)
272 SETTING_TRACE_ERROR("Fail to get data : %s", error.message);
273 dbus_error_free(&error);
274 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
278 if (sender_pid != 0 && my_pid != sender_pid)
280 SETTING_TRACE("received key : %s , value : %s", key, value);
281 //-------------------------------------------------------------
282 // received key : checkbox1|N/A , value : INT|1
283 //-------------------------------------------------------------
284 //char* key = "checkbox1|N/A";
288 ptr = strchr(key, '|');
291 xmlDocPtr doc = NULL;
294 //parsing for : checkbox1|N/A -> checkbox1
295 char* key_name = substring(key, 0, strlen(key)-strlen(ptr));
296 char* val_name = strchr(value, '|');
300 doc = xmlParseFile(plugin_path);
303 SETTING_TRACE("unable to parse file : %s", plugin_path);
305 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* xml parsing error */
308 xmlNode *root = xmlDocGetRootElement(doc);
312 // TODO : message queing
313 // get key/value from d-bus and parse xml and search xml data with key
314 static int count = 0;
315 SETTING_TRACE(" BEGIN ---------------------------- dbus--> before __node_finder : %d", count);
316 __node_finder((PluginNode*)ad, root, key_name ,val_name, &is_end);
317 SETTING_TRACE(" END ----------------------------- dbus--> after __node_finder : %d", count);
321 GError *error = NULL;
325 xmlSaveFormatFile(ad->plugin_path, doc, 1);
326 // TODO: make sure this is right
329 SETTING_TRACE("__cfg_file_write successful");
335 return DBUS_HANDLER_RESULT_HANDLED;
338 static int __send_msg(char* key, char* value)
340 DBusMessage* message;
342 int sender_pid = getpid();
347 // ex) in gdb --> $15 = 0x43b6eb78 "Update_(null)" -> error codintion
348 if (s_pkg_name == NULL)
350 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
354 message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, s_pkg_name);
356 SETTING_TRACE("Sending message[%s:%s] via dbus", key ,value);
357 if (dbus_message_append_args(message,
358 DBUS_TYPE_UINT32, &sender_pid,
359 DBUS_TYPE_STRING, &key,
360 DBUS_TYPE_STRING, &value,
361 DBUS_TYPE_INVALID) == FALSE)
363 SETTING_TRACE("Fail to load data error");
367 if (dbus_connection_send(bus, message, NULL) == FALSE)
369 SETTING_TRACE("Fail to send message");
373 dbus_connection_flush(bus);
374 dbus_message_unref(message);
376 SETTING_TRACE("[CLIENT] send data signal done");
382 static void __send_int_msg(xmlNode* xmlObj, int val)
385 const char *id = (char*)xmlGetProp(xmlObj, "id");
386 const char *title = (char*)xmlGetProp(xmlObj, "title");
387 char key[MAX_CONTENT_LEN] = {0,};
388 snprintf(key, sizeof(key), "%s|%s", id, title);
390 char value[MAX_CONTENT_LEN] = {0,};
391 snprintf(value, sizeof(value), "INT|%d", val);
392 __send_msg(key, value);
397 static void __send_string_msg(xmlNode* xmlObj, char *string)
399 const char *id = (char*)xmlGetProp(xmlObj, "id");
400 const char *title = (char*)xmlGetProp(xmlObj, "title");
401 char key[MAX_CONTENT_LEN] = {0,};
402 snprintf(key, sizeof(key), "%s|%s", id, title);
404 char value[MAX_CONTENT_LEN] = {0,};
405 snprintf(value, sizeof(value), "STRING|%s", string);
406 __send_msg(key, value);
410 int setting_dbus_handler_init(void* user_data)
415 SETTING_TRACE("already get a bus, need release first.");
416 setting_dbus_handler_fini();
420 memset(&error, 0, sizeof(DBusError));
421 char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
422 dbus_error_init(&error);
423 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
426 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
427 dbus_error_free(&error);
431 dbus_connection_setup_with_g_main(bus, NULL);
432 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
434 dbus_bus_add_match(bus, rule, &error);
435 if (dbus_error_is_set(&error))
437 SETTING_TRACE("Fail to rule set; %s", error.message);
438 dbus_bus_remove_match(bus, rule, &error);
439 dbus_error_free(&error);
440 dbus_connection_close(bus);
445 if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
447 dbus_bus_remove_match(bus, rule, &error);
448 dbus_error_free(&error);
449 dbus_connection_close(bus);
454 SETTING_TRACE("app signal initialized");
458 int setting_dbus_handler_fini(void)
461 //do safty checking first.
462 setting_retvm_if(!bus, 0, "!bus");
464 memset(&error, 0, sizeof(DBusError));
465 char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
467 dbus_error_init(&error);
470 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
472 //dbus_connection_remove_filter(bus, __signal_filter, NULL);
475 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
476 dbus_bus_remove_match(bus, rule, &error);
478 if (dbus_error_is_set(&error))
480 SETTING_TRACE("Fail to rule unset: %s", error.message);
481 dbus_error_free(&error);
485 dbus_connection_close(bus);
487 SETTING_TRACE("app signal finalized");
491 /////////////////////////////
492 /////////////////////////////
493 /////////////////////////////
495 Elm_Genlist_Item_Class itc_layout;
498 static int __cfg_file_write(Draw_Data *pd)
502 GError *error = NULL;
505 xmlSaveFormatFile(pd->cfg_file, pd->doc, 1);
506 //xmlFreeDoc(pd->doc);
508 SETTING_TRACE("__cfg_file_write successful");
516 static void ___click_softkey_back_cb(void *data, Evas_Object *obj,
522 PluginNode* node = (PluginNode*)data;
523 Draw_Data *pd = node->pd;
527 elm_naviframe_item_pop(node->navi_bar);
530 ui_gadget_h ug = node->ug;
531 setting_plugin_destroy(node);
545 static void* group_func(void *data, xmlNode *xmlObj)
548 retv_if(!data || !xmlObj, NULL);
550 PluginNode* node = (PluginNode*)data;
551 Draw_Data *pd = node->pd;
553 // new code is recursive
554 const char *title = (char*)xmlGetProp(xmlObj, "title");
555 SETTING_TRACE (" >>> GROUP NAME : %s \n", title);
556 (void)setting_create_Gendial_field_titleItem(pd->scroller, &(itc_group_item), title, NULL);
561 static void* __link_list_cb(void *data, Evas_Object *obj, void *event_info)
564 retv_if(data == NULL, NULL);
565 retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
566 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
567 elm_genlist_item_selected_set(item, 0);
568 Setting_GenGroupItem_Data *list_item =
569 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
571 xmlNode* xmlObj = data;
572 retv_if(!xmlObj, NULL);
573 const char *link_file = (char*)xmlGetProp(xmlObj, "value");
577 SETTING_TRACE_ERROR("Invalidate liked file");
580 char file[1024] = {0,};
581 snprintf(file, sizeof(file), "%s/%s", PLUGIN_CFG_DIR, link_file);
582 SETTING_TRACE("file:%s", file);
584 // Evas_Object* navi_bar, Evas_Object* win_main
585 PluginNode* plugin_node = setting_plugin_create( NULL, NULL );
586 setting_plugin_load(plugin_node, (const char *)file);
590 static void* __launch_list_cb(void *data, Evas_Object *obj, void *event_info)
593 retv_if(data == NULL, NULL);
594 retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
595 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
596 elm_genlist_item_selected_set(item, 0);
597 Setting_GenGroupItem_Data *list_item =
598 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
600 xmlNode* xmlObj = data;
601 retv_if(!xmlObj, NULL);
602 const char *key_str = (char*)xmlGetProp(xmlObj, "id");
603 const char *title_str = (char*)xmlGetProp(xmlObj, "title");
604 const char *appid_str = (char*)xmlGetProp(xmlObj, "appid");
605 const char *operation_str = (char*)xmlGetProp(xmlObj, "operation");
608 service_h svc = NULL;
609 service_create(&svc);
610 service_set_app_id(svc, appid_str); // xml property – appid
611 service_set_operation(svc, operation_str); // property : operation
612 service_send_launch_request(svc, NULL, NULL);
613 service_destroy(svc);
618 static void* label_func(void *data, xmlNode *xmlObj)
621 retv_if(!data || !xmlObj, NULL);
622 PluginNode* node = (PluginNode*)data;
623 Draw_Data *pd = node->pd;
625 const char *title = (char*)xmlGetProp(xmlObj, "title");
627 Setting_GenGroupItem_Data *obj =
628 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
630 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
631 0, title, NULL, NULL);
636 static void* link_func(void *data, xmlNode *xmlObj)
639 retv_if(!data || !xmlObj, NULL);
640 PluginNode* node = (PluginNode*)data;
641 Draw_Data *pd = node->pd;
643 const char *key_str = (char*)xmlGetProp(xmlObj, "id");
644 Setting_GenGroupItem_Data * obj =
645 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
647 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
648 0, key_str, NULL, NULL);
653 static void* launch_func(void *data, xmlNode *xmlObj)
656 retv_if(!data || !xmlObj, NULL);
657 PluginNode* node = (PluginNode*)data;
658 Draw_Data *pd = node->pd;
660 const char *title_str = (char*)xmlGetProp(xmlObj, "title");
662 Setting_GenGroupItem_Data * obj =
663 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
665 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
666 0, title_str, NULL, NULL);
671 static void __slider_stop_cb(void *data, Evas_Object *obj,
674 ret_if(data == NULL || obj == NULL);
675 double val = elm_slider_value_get(obj);
676 SETTING_TRACE("val = %f", val);
677 Setting_GenGroupItem_Data *list_item = data;
678 ret_if(list_item->userdata == NULL);
680 xmlNode* xmlObj = list_item->userdata;
683 //apply the vconf changes after stopping moving slider..
684 list_item->chk_status = (int)(val + 0.5);
685 elm_slider_value_set(obj, list_item->chk_status);
687 SETTING_TRACE(" slider after ---> val = %d", (int) list_item->chk_status);
689 // int -> double -> xmlChar*
692 sprintf(buf, "%d", (int) list_item->chk_status);
693 newattr = xmlSetProp(xmlObj, "value", buf);
695 __send_int_msg(xmlObj, list_item->chk_status);
696 __cfg_file_write((Draw_Data *)list_item->belongs_to);
700 static void* slider_func(void *data, xmlNode *xmlObj)
703 retv_if(!data || !xmlObj, NULL);
704 PluginNode* node = (PluginNode*)data;
705 Draw_Data *pd = node->pd;
708 const char *title = (char*)xmlGetProp(xmlObj, "title");
710 SETTING_TRACE (" >>> [slider input] min=%s max=%s value=%s ",(char*)xmlGetProp(xmlObj, "min"), (char*)xmlGetProp(xmlObj, "max"), (char*)xmlGetProp(xmlObj, "value"));
712 int value = atoi((char*)xmlGetProp(xmlObj, "value"));
713 int min = atoi((char*)xmlGetProp(xmlObj, "min"));
714 int max = atoi((char*)xmlGetProp(xmlObj, "max"));
716 SETTING_TRACE ("[slider input] min=%d max=%d value=%d ", min, max, value);
718 setting_create_Gendial_itc("dialogue/1text.1icon.5", &(itc_layout));
719 Setting_GenGroupItem_Data *list_item =
720 setting_create_Gendial_field_def(pd->scroller, &(itc_layout), NULL,
722 SWALLOW_Type_LAYOUT_SLIDER,
723 IMG_SENSITIVITY_ICON_01,
724 IMG_SENSITIVITY_ICON_02, value,
727 list_item->win_main = NULL;
728 list_item->evas = NULL;
729 list_item->isIndicatorVisible = true;
730 list_item->slider_min = min;
731 list_item->slider_max = max;
732 list_item->userdata = xmlObj;
733 list_item->stop_change_cb = __slider_stop_cb;
734 list_item->belongs_to = (int)pd;
737 g_list_item = list_item;
739 return (void*)list_item;
742 static void __check_mouse_up_cb(void *data, Evas_Object *obj,
747 setting_retm_if(data == NULL, "Data parameter is NULL");
749 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
750 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
751 elm_genlist_item_selected_set(item, 0);
752 Setting_GenGroupItem_Data *list_item =
753 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
755 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
757 int old_status = elm_check_state_get(list_item->eo_check);
758 list_item->chk_status = !old_status;
759 elm_check_state_set(list_item->eo_check, list_item->chk_status);
761 xmlNode *xmlObj = data;
763 newattr = xmlSetProp(xmlObj, "state", xmlXPathCastNumberToString(list_item->chk_status));
765 __send_int_msg(xmlObj, list_item->chk_status);
766 __cfg_file_write((Draw_Data *)list_item->belongs_to);
770 static void __chk_btn_cb(void *data, Evas_Object *obj,
775 retm_if(data == NULL, "Data parameter is NULL");
776 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
778 xmlNode* xmlObj = list_item->userdata;
780 list_item->chk_status = elm_check_state_get(obj); /* for genlist update status */
783 if (list_item->chk_status == 1) {
784 newattr = xmlSetProp(xmlObj, "value", "true");
785 } else if (list_item->chk_status == 0) {
786 newattr = xmlSetProp(xmlObj, "value", "false");
788 newattr = xmlSetProp(xmlObj, "value", "false");
791 const char *id = (char*)xmlGetProp(xmlObj, "id");
792 const char *title = (char*)xmlGetProp(xmlObj, "title");
793 //SETTING_TRACE(" >>>> id:%s , title:%s", id, title);
794 __send_int_msg(xmlObj, list_item->chk_status);
795 __cfg_file_write((Draw_Data *)list_item->belongs_to);
800 static void* checkbox_func(void *data, xmlNode *xmlObj)
803 retv_if(!data || !xmlObj, NULL);
805 PluginNode* node = (PluginNode*)data;
806 Draw_Data *pd = node->pd;
808 // [DATA] title, value
809 const char *title = (char*)xmlGetProp(xmlObj, "title");
812 char* value = (char*)xmlGetProp(xmlObj, "value");
816 if ( 0 == safeStrCmp(value, "true")) {
818 } else if ( 0 == safeStrCmp(value, "false")) {
821 ival = 0; // default : false (0)
824 // title, value, xmlObj
825 Setting_GenGroupItem_Data *list_item =
826 setting_create_Gendial_field_def(pd->scroller,
830 SWALLOW_Type_1TOGGLE,
837 list_item->userdata = xmlObj;
838 list_item->belongs_to = (int) pd;
839 SETTING_TRACE("pd:%p,list_item->belongs_to:%d", pd, list_item->belongs_to);
846 static void __entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
849 retm_if(!data || !obj, "Data parameter is NULL");
851 setting_hide_input_pannel_cb(obj);
852 const char *entry_str = elm_entry_entry_get(obj);
853 char *entry_str_utf8 = NULL;
854 entry_str_utf8 = elm_entry_markup_to_utf8(entry_str);
856 Setting_GenGroupItem_Data *list_item = data;
858 xmlNode* xmlObj = list_item->userdata;
860 FREE(entry_str_utf8);
865 const char *title = (char*)xmlSetProp(xmlObj, "value",entry_str_utf8);
867 __send_string_msg(xmlObj, entry_str_utf8);
868 __cfg_file_write((Draw_Data *)list_item->belongs_to);
870 FREE(entry_str_utf8);
875 static void __editbox_list_cb(void *data, Evas_Object *obj,
881 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
882 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
883 elm_genlist_item_selected_set(item, 0);
884 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
886 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
887 if (!elm_object_focus_get(list_item->eo_check)) {
888 elm_object_focus_set(list_item->eo_check, EINA_TRUE);
891 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(list_item->eo_check);
892 setting_retm_if(imf_context == NULL, "imf_context is NULL");
893 ecore_imf_context_input_panel_show(imf_context);
897 static void __editbox_changed_cb(void *data, Evas_Object *obj,
901 retm_if(!data || !obj, "Data parameter is NULL");
902 retm_if(!elm_object_focus_get(obj), "Entry is not focused");
904 Setting_GenGroupItem_Data *list_item =
905 (Setting_GenGroupItem_Data *) data;
907 const char *entry_str = elm_entry_entry_get(obj);
908 int entry_len = safeStrLen(entry_str);
909 SETTING_TRACE("entry_str:[%s], lenght:%d", entry_str, entry_len);
911 G_FREE(list_item->sub_desc);//release first
912 list_item->sub_desc = (char *)g_strdup(entry_str);
919 * @see also __editbox_changed_cb
920 * @see also __entry_unfocus_cb
922 static void* editbox_func(void *data, xmlNode *xmlObj)
925 retv_if(!data || !xmlObj, NULL);
927 PluginNode* node = (PluginNode*)data;
928 Draw_Data *pd = node->pd;
930 const char *title = (char*)xmlGetProp(xmlObj, "title");
931 const char *key_str= (char*)xmlGetProp(xmlObj, "value");
933 const char *minlength= (char*)xmlGetProp(xmlObj, "minlength");
934 const char *maxlength= (char*)xmlGetProp(xmlObj, "maxlength");
939 max_len = atoi(maxlength);
940 SETTING_TRACE(" >> MAXLENGTH FILTER IS AVAILABLE !!!! maxlength = %d", max_len);
943 Setting_GenGroupItem_Data *list_item = NULL;
948 // without maxlength filter
949 list_item = setting_create_Gendial_field_def(pd->scroller, &(itc_1icon),
951 pd, SWALLOW_Type_LAYOUT_ENTRY,
952 NULL, NULL, 0, title, key_str,
953 __editbox_changed_cb);
956 // add max length filter
957 list_item = setting_create_Gendial_field_entry_fo(
962 SWALLOW_Type_LAYOUT_ENTRY,
963 NULL, NULL, 0, title, key_str,
964 __editbox_changed_cb,
966 ELM_INPUT_PANEL_LAYOUT_NORMAL,
976 list_item->userdata = xmlObj;
977 list_item->stop_change_cb = __entry_unfocus_cb;
978 list_item->belongs_to = (int)pd;
985 static void __expanditem_func_sel_cb(void *data, Evas_Object *obj, void *event_info)
989 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
990 Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
991 Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subitem);
992 elm_genlist_item_selected_set(subitem, 0);
993 Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
994 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
995 ret_if(NULL == data_subItem || NULL == data_parentItem);
997 elm_radio_value_set(data_subItem->rgd, data_subItem->chk_status);
999 data_parentItem->sub_desc = (char *)g_strdup(_(data_subItem->keyStr));
1000 elm_object_item_data_set(data_parentItem->item, data_parentItem);
1001 elm_genlist_item_update(data_parentItem->item);
1003 xmlNode* xmlObj = data_parentItem->userdata;
1007 //newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
1008 newattr = xmlSetProp(xmlObj, "value", data_parentItem->sub_desc);
1010 __send_string_msg(xmlObj, data_parentItem->sub_desc);
1011 __cfg_file_write((Draw_Data *)data_parentItem->belongs_to);
1015 static void __expanditem_func_exp_cb(void *data, Evas_Object *obj, void *event_info)
1017 ret_if(NULL == data || NULL == event_info);
1018 SETTING_TRACE_BEGIN;
1020 PluginNode* node = (PluginNode*)data;
1021 Draw_Data *pd = node->pd;
1023 Elm_Object_Item *parentItem = event_info; /* parent item */
1024 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
1025 Evas_Object *scroller = elm_object_item_widget_get(parentItem);
1028 xmlNode *xmlObj = data_parentItem->userdata;
1029 char *value = (char*)xmlGetProp(xmlObj, "value");
1030 SETTING_TRACE(">>> value = %s", value);
1031 Evas_Object *rgd = NULL;
1033 if (xmlObj->children && !data_parentItem->rgd) {//to protect from entering repeatly
1034 xmlNode* cur = xmlObj->children;
1036 rgd = elm_radio_add(scroller);
1037 elm_radio_value_set(rgd, -1);
1040 char *subitem_title = NULL;
1041 int subitem_index = 0;
1045 // print out debug message
1046 if (data_parentItem->childs)
1049 Eina_List *li = data_parentItem->childs;
1052 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1054 SETTING_TRACE(" <<< node->keyStr : %s >>> ", node->keyStr);
1057 li = eina_list_next(li);
1059 SETTING_TRACE(" <<<how many : %d>>> ", howmany);
1062 if (data_parentItem->childs)
1064 eina_list_free(data_parentItem->childs);
1065 data_parentItem->childs = NULL;
1068 while (cur != NULL) {
1069 if (!xmlStrcmp(cur->name, (const xmlChar*)"expanditem")) {
1070 type = (char*)xmlGetProp(cur, "type");
1071 if (0 == safeStrCmp(type, "radio")) {
1072 subitem_title = (char*)xmlGetProp(cur, "title");
1073 Setting_GenGroupItem_Data *list_item =
1074 setting_create_Gendial_exp_sub_field(scroller,
1075 &(itc_1icon_1text_sub),
1076 __expanditem_func_sel_cb, NULL, parentItem,
1077 SWALLOW_Type_1RADIO, rgd,
1079 subitem_title, NULL);
1082 if (0 == safeStrCmp(value, subitem_title)) {
1083 sel_idx = subitem_index;
1084 SETTING_TRACE("%d is selected in Radio Group", sel_idx);
1086 SETTING_TRACE(" eina list add >>> value = %s, subitem_title = %s ", value, subitem_title);
1087 data_parentItem->childs = eina_list_append(data_parentItem->childs, list_item);
1091 SETTING_TRACE("invalid type[:%s]", type);
1098 elm_radio_value_set(rgd, sel_idx);
1099 data_parentItem->rgd = rgd;//protecting condition
1104 static void __expanditem_func_smart_cb(void *data, Evas_Object *obj, void *event_info)
1106 ret_if(data == NULL || event_info == NULL);
1107 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
1108 Setting_GenGroupItem_Data *data_item = elm_object_item_data_get(item);
1109 char *cb_type = data;
1111 if (0 == safeStrCmp(cb_type, "contracted")) {
1112 data_item->rgd = NULL;
1113 elm_genlist_item_subitems_clear(item);
1118 static void* settings_func(void *data, xmlNode *xmlObj)
1124 static void __plugin_genlist_unrealized_cb(void* data,Evas_Object* obj, void* event_info)
1126 SETTING_TRACE_BEGIN;
1127 ret_if(data == NULL);
1129 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
1130 Setting_GenGroupItem_Data *node = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
1131 ret_if(node== NULL);
1133 SETTING_TRACE("keyStr : %s ", node->keyStr);
1134 //item_to_update->childs)
1138 eina_list_free(node->childs);
1139 node->childs = NULL;
1144 // 1st create a window
1145 // 2nd push a window
1146 //--------------------------------------------------------
1147 static void* setting_func(void *data, xmlNode *xmlObj)
1149 SETTING_TRACE_BEGIN;
1150 retv_if(!data || !xmlObj, NULL);
1152 PluginNode* node = (PluginNode*)data;
1153 Draw_Data *pd = node->pd;
1155 // [DATA] title, btn[0], btn[1]
1156 const char *title = (char*)xmlGetProp(xmlObj, "title");
1157 char *btn[2] = {/* 0 */"OK", /* 1 */"NO"};
1159 SETTING_TRACE("before setting_create_layout_navi_bar_genlist");
1162 pd->scroller = elm_genlist_add(node->win_main);
1163 retvm_if(pd->scroller == NULL, NULL,
1164 "Cannot set scroller object as contento of layout");
1165 elm_object_style_set(pd->scroller, "dialogue");
1166 elm_genlist_clear(pd->scroller); /* first to clear list */
1168 evas_object_smart_callback_add(pd->scroller, "unrealized", __plugin_genlist_unrealized_cb, node);
1170 SETTING_TRACE("_(title):%s", _(title));
1172 if (node->ug == NULL)
1174 setting_push_layout_navi_bar(
1176 _("IDS_COM_BODY_BACK"), NULL, NULL,
1177 ___click_softkey_back_cb,
1180 node->navi_bar, NULL);
1182 node->ly_main = setting_create_layout_navi_bar(node->win_main_layout, node->win_main,
1184 _("IDS_COM_BODY_BACK"), NULL, NULL,
1185 ___click_softkey_back_cb,
1188 &node->navi_bar, NULL);
1190 SETTING_TRACE("after setting_create_layout_navi_bar_genlist");
1195 static void* expanditem_func(void *data, xmlNode *xmlObj)
1197 // DO NOTHING - expandlist draws this area
1201 static void* expandlist_func(void *data, xmlNode *xmlObj)
1203 SETTING_TRACE_BEGIN;
1204 retv_if(!data || !xmlObj, NULL);
1206 PluginNode* node = (PluginNode*)data;
1207 Draw_Data *pd = node->pd;
1209 const char *key_str = (char*)xmlGetProp(xmlObj, "title");
1210 const char *value = (char*)xmlGetProp(xmlObj, "value"); // string -> value
1212 setting_enable_expandable_genlist(pd->scroller, data, __expanditem_func_exp_cb, __expanditem_func_smart_cb);
1213 Setting_GenGroupItem_Data *list_item =
1214 setting_create_Gendial_exp_parent_field(pd->scroller,
1215 &(itc_2text_3_parent),
1217 SWALLOW_Type_INVALID,
1221 list_item->userdata = xmlObj;
1222 list_item->belongs_to = (int)pd;
1223 list_item->childs = NULL; /* init */
1231 static int __node_walker(PluginNode* context, xmlNode* cur)
1233 //SETTING_TRACE_BEGIN;
1234 Draw_Data *pd = context->pd;
1237 retv_if(!context->ui_list, -1);
1239 xmlNode *cur_node = NULL;
1240 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1241 if (cur_node->type == XML_ELEMENT_NODE) {
1242 // SETTING_TRACE("node type : %s id= %s", cur_node->name,xmlGetProp(cur_node, "id"));
1243 drawer_fp fp = __drawer_find(cur_node->name);
1247 void* vret = fp(context, cur_node); // draw it
1251 Setting_GenGroupItem_Data* genlist_node = (Setting_GenGroupItem_Data* )vret;
1252 //SETTING_TRACE("add node to Eina List name : %s, id : ", cur_node->name, xmlGetProp(cur_node, "id"));
1253 // add it to the hash table create before.
1256 char* key_name = xmlGetProp(cur_node, "id");
1257 eina_hash_add(context->ui_list, strdup(key_name),(void*)genlist_node);
1260 SETTING_TRACE(" >>>> fp is NULL ");
1263 __node_walker(context, cur_node->children); /* RECURSIVE */
1269 * @param id_str [in] "id"
1270 * @param value [in] value to be udpated
1271 * @see __expanditem_func_sel_cb
1273 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end)
1275 SETTING_TRACE_BEGIN;
1276 xmlNode *cur_node = NULL;
1280 SETTING_TRACE("context is NULL - it's error CONDITION ");
1284 retv_if(!context->ui_list, -1);
1285 if (*is_end == true) return 0;
1287 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1288 if (cur_node->type == XML_ELEMENT_NODE) {
1290 char* id_name = (char*)xmlGetProp(cur_node, "id");
1291 if ( id_name && 0 == strcmp(id_str, id_name))
1293 SETTING_TRACE("FOUND >>>> %s", id_name);
1294 // cur_node - update xml code
1295 xmlAttrPtr newattr = xmlSetProp(cur_node, "value", value);
1297 //-----------------------------------------------------------
1300 if ( 0 == strcmp (cur_node->name, "integer"))
1302 SETTING_TRACE(">>>>> UPDATE SLIDER CONTROL %x --- %s ",context->ui_list, id_name);
1303 Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1306 item_to_update->chk_status = atoi(value);
1307 SETTING_TRACE(">>> o-------------0 SLIDER VALUE = %d ", item_to_update->chk_status);
1309 elm_object_item_data_set(item_to_update->item, item_to_update);
1310 elm_genlist_item_update(item_to_update->item);
1312 SETTING_TRACE("item_to_update is NULL");
1316 if ( 0 == strcmp (cur_node->name, "bool"))
1318 SETTING_TRACE(">>>>> UPDATE TOGGLE CONTROL pluginpath:%s, ---- %x --- %s ", context->plugin_path, context->ui_list, id_name);
1319 Setting_GenGroupItem_Data* item_to_update = NULL;
1320 item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1323 item_to_update->chk_status = atoi(value);
1324 SETTING_TRACE(">>> o-------------0 TOGGLE VALUE = %d ", item_to_update->chk_status);
1326 elm_object_item_data_set(item_to_update->item, item_to_update);
1327 elm_genlist_item_update(item_to_update->item);
1329 SETTING_TRACE("item_to_update is NULL");
1332 // case : edit control
1333 if ( 0 == strcmp (cur_node->name, "string"))
1335 SETTING_TRACE(">>>>> UPDATE EDIT CONTROL CONTROL %x --- %s ",context->ui_list, id_name);
1336 Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1339 char* old_string = item_to_update->sub_desc;
1340 item_to_update->sub_desc = strdup(value);
1341 SETTING_TRACE(">>> o-------------0 STRING VALUE = %s ", value);
1345 elm_object_item_data_set(item_to_update->item, item_to_update);
1346 elm_genlist_item_update(item_to_update->item);
1349 SETTING_TRACE("item_to_update is NULL");
1352 // case : expand list
1358 //-----------------------------------------------------------
1359 if ( 0 == strcmp (cur_node->name, "expandlist"))
1362 SETTING_TRACE(">>>>> UPDATE EXPAND LIST CONTROL %x --- %s ",context->ui_list, id_name);
1363 Setting_GenGroupItem_Data* item_to_update = NULL;
1364 item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1367 char* old_string = item_to_update->sub_desc;
1368 item_to_update->sub_desc = strdup(value);
1369 SETTING_TRACE(">>> o-------------0 EXPAND LIST VALUE = %s ", value);
1373 elm_object_item_data_set(item_to_update->item, item_to_update);
1374 elm_genlist_item_update(item_to_update->item);
1376 // TODO: need to update child elements
1377 // item_to_update->childs ---> expanded list
1380 // there should have 4 sub items.
1381 //-----------------------------------------------------
1382 // has it already freed by someone?
1383 //-----------------------------------------------------
1384 if (item_to_update->childs)
1387 Eina_List *li = item_to_update->childs;
1390 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1392 li = eina_list_next(li);
1394 SETTING_TRACE(" expandlist -- how many items are there? : %d ", howmany2);
1397 if (item_to_update->childs)
1399 Eina_List *li = item_to_update->childs;
1400 int radio_index = 0;
1403 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1405 if (node->item && node->keyStr)
1407 // do something more
1408 // SETTING_TRACE(">>> RADIO LIST STRING VALUE = %s ", node->keyStr);
1409 // set position of radio button
1410 if (strcmp(node->keyStr, value) == 0) // << CRAAH !!!!
1412 elm_radio_value_set(node->rgd, radio_index);
1415 SETTING_TRACE(">>> node has unproper values - Setting_GenGroupItem_Data");
1417 elm_object_item_data_set(item_to_update->item, item_to_update);
1418 elm_genlist_item_update(item_to_update->item);
1421 li = eina_list_next(li);
1427 SETTING_TRACE("item_to_update is NULL");
1435 __node_finder(context, cur_node->children, id_str, value, is_end); /* RECURSIVE */
1440 static unsigned int _plugin_string_key_length(const char*key)
1445 return (int)strlen(key) + 1;
1448 static int _plugin_string_key_cmp(const char* key1, int key1_length,
1449 const char* key2, int key2_length)
1451 return strcmp(key1, key2);
1454 static void _plugin_entry_free_cb(void* data)
1456 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1459 eina_list_free(node->childs);
1460 node->childs = NULL;
1464 PluginNode* setting_plugin_create(Evas_Object* navi, Evas_Object* win)
1466 PluginNode *plugin = calloc(1, sizeof(PluginNode));
1467 setting_retvm_if(!plugin, -1, "Create PluginNode obj failed");
1468 Draw_Data *pd = calloc(1, sizeof(Draw_Data));
1474 setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
1477 plugin->navi_bar = navi;
1478 plugin->win_main = win;
1480 plugin->ui_list = eina_hash_new(EINA_KEY_LENGTH(_plugin_string_key_length),
1481 EINA_KEY_CMP(_plugin_string_key_cmp),
1482 EINA_KEY_HASH(eina_hash_superfast),
1483 _plugin_entry_free_cb,
1489 void setting_plugin_destroy(PluginNode* node)
1491 SETTING_TRACE_BEGIN;
1493 SETTING_TRACE("node is NOT NULL")
1495 SETTING_TRACE("node->pd is NOT NULL")
1496 if(node->pd->doc != NULL) {
1497 xmlSaveFormatFile(node->plugin_path, node->pd->doc, 1);
1498 xmlFreeDoc(node->pd->doc);
1499 node->pd->doc = NULL;
1500 SETTING_TRACE("__cfg_file_write successful");
1507 if (node->ui_list) {
1508 eina_hash_free(node->ui_list);
1509 node->ui_list = NULL;
1518 static Eina_Bool _plugin_foreach_cb(const Eina_Hash *hash, const void*key, void* data, void* fdata)
1520 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1521 SETTING_TRACE("%s --- %s ", (char*)key, node->keyStr);
1526 void setting_plugin_debug(PluginNode* context)
1528 // SETTING_TRACE("HASH TABLE -------------------------------------");
1529 if (context->ui_list) {
1530 eina_hash_foreach(context->ui_list,_plugin_foreach_cb, NULL);
1532 // SETTING_TRACE("HASH TABLE -------------------------------------");
1536 void setting_plugin_update(PluginNode* context)
1538 Eina_List *li = context->ui_list;
1541 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) eina_list_data_get(li);
1543 // SETTING_TRACE(" ---> keyStr : %s , swallow type : %d ", node->keyStr, node->swallow_type);
1544 Setting_GenGroupItem_Data* item_to_update = NULL;
1545 item_to_update = node;
1546 elm_object_item_data_set(item_to_update->item, item_to_update);
1547 elm_genlist_item_update(item_to_update->item);
1549 li = eina_list_next(li);
1557 int setting_plugin_load(PluginNode* node, const char *cfg_file)
1559 SETTING_TRACE("cfg_file:%s", cfg_file)
1560 if (isEmptyStr(cfg_file) || 0 != access(cfg_file, R_OK|W_OK|F_OK ))
1562 SETTING_TRACE_ERROR(" error occured : access \n");
1565 node->pd->cfg_file = cfg_file;
1567 node->pd->doc = xmlParseFile(cfg_file);
1568 node->pd->root = xmlDocGetRootElement(node->pd->doc);
1570 // signal filter change
1571 //void* user_data = (void*)g_main_ad;
1572 void* user_data = (void*)node;
1575 dbus_error_init(&error);
1576 char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
1577 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
1580 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
1581 dbus_error_free(&error);
1586 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
1587 dbus_bus_add_match(bus, rule, &error);
1588 if (dbus_error_is_set(&error))
1590 SETTING_TRACE("Fail to rule set; %s", error.message);
1591 dbus_bus_remove_match(bus, rule, &error);
1592 dbus_error_free(&error);
1593 dbus_connection_close(bus);
1599 if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
1601 dbus_bus_remove_match(bus, rule, &error);
1602 dbus_error_free(&error);
1603 dbus_connection_close(bus);
1608 // TODO: error handler here
1609 __node_walker(node, node->pd->root);
1612 setting_plugin_debug(node);