Tizen 2.0 Release
[apps/home/settings.git] / src / setting-plugin.c
1 /*
2  * setting
3  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4  *
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
8  *
9  *     http://floralicense.org/license/
10  *
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.
16  */
17 #include <unistd.h>
18 #include <eina_list.h>
19 #include <glib.h>
20
21
22 #include <setting-debug.h>
23 #include <setting-common-general-func.h>
24 #include <setting-common-draw-widget.h>
25
26 #include <setting-plugin.h>
27
28
29 extern setting_main_appdata *g_main_ad;
30
31 static Setting_GenGroupItem_Data *g_list_item;  /*TEST*/
32
33 /*
34  * UI draw handler table : _g_draw_list
35  *  - contains Object_Drawer typed object.
36  */
37 Eina_List *_g_drawer_list = NULL;
38
39 #if 0
40 /**
41  * @return Evas_Object * obj
42  */
43 static void* navigationbar_func(void *data, xmlNode *xmlObj);
44 #endif
45
46 /*
47  * @return void
48  */
49 static void* group_func(void *data, xmlNode *xmlObj);
50
51 /*
52  * @return Setting_GenGroupItem_Data* ptr
53  */
54 static void* link_func(void *data, xmlNode *xmlObj);
55
56 /*
57  * @return Setting_GenGroupItem_Data* ptr
58  */
59 static void* slider_func(void *data, xmlNode *xmlObj);
60
61 /*
62  * @return Setting_GenGroupItem_Data* ptr
63  */
64 static void* label_func(void *data, xmlNode *xmlObj);
65
66 /*
67  * @return Setting_GenGroupItem_Data* ptr
68  */
69 static void* checkbox_func(void *data, xmlNode *xmlObj);
70
71 /*
72  * @return Setting_GenGroupItem_Data* ptr
73  */
74 static void* editbox_func(void *data, xmlNode *xmlObj);
75
76 /*
77  * @return Setting_GenGroupItem_Data* ptr
78  */
79 static void* expandlist_func(void *data, xmlNode *xmlObj);
80
81 /**
82  * @return nothing
83  */
84 static void* expanditem_func(void *data, xmlNode *xmlObj);
85
86 /**
87  * do nothing
88  */
89 static void* settings_func(void *data, xmlNode *xmlObj);
90
91
92 static void* launch_func(void *data, xmlNode *xmlObj);
93
94 /**
95  * do nothing
96  */
97 static void* setting_func(void *data, xmlNode *xmlObj);
98
99 static int __node_walker(PluginNode* context, xmlNode* cur);
100
101 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end);
102
103
104 static void __drawer_add(const char *type, drawer_fp draw)
105 {
106         Object_Drawer *node = calloc(1, sizeof(Object_Drawer));
107         if (node && type && draw)
108         {
109                 node->type = type;
110                 node->draw = draw;
111
112                 _g_drawer_list = eina_list_append(_g_drawer_list, node);
113         }
114         // FREE(node);
115 }
116
117
118 static drawer_fp __drawer_find(char* type)
119 {
120         SETTING_TRACE_BEGIN;
121         SETTING_TRACE("node type:%s", type);
122         Eina_List *check_list = _g_drawer_list;
123         Object_Drawer *list_item = NULL;
124
125         while (check_list) {
126                 list_item = (Object_Drawer *) eina_list_data_get(check_list);
127                 if (NULL == list_item)
128                         continue;
129
130                 if (0 == safeStrCmp(list_item->type, type))
131                 {
132                         //SETTING_TRACE("list_item->type:%s", list_item->type);
133                         break;
134                 }
135                 //if not matched,to check next node.
136                 check_list = eina_list_next(check_list);
137                 list_item = NULL;
138         }
139         //SETTING_TRACE("list_item:%p", list_item);
140         return list_item ? list_item->draw : NULL;
141 }
142 void setting_drawer_list_init()
143 {
144         SETTING_TRACE_BEGIN;
145 #if 0
146         /* <navigationbar> */__drawer_add("navigationbar", navigationbar_func);
147 #endif
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);
159 }
160
161 void setting_drawer_list_fini()
162 {
163         if (_g_drawer_list)
164         {
165                 Object_Drawer *node = NULL;
166                 Eina_List *li = _g_drawer_list;
167                 while (li) {
168                         node = (Object_Drawer *) eina_list_data_get(li);
169                         if (node)
170                         {
171                                 //SETTING_TRACE("Deregister %s", node->type);
172                                 FREE(node);
173                         }
174                         li = eina_list_next(li);
175                 }
176                 _g_drawer_list = eina_list_free(_g_drawer_list);
177                 _g_drawer_list = NULL;
178         }
179 }
180
181 /////////////////////////
182 /////////////////////////
183 /////////////////////////
184
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"
189
190 #define APPID_LENGTH 10
191 #define APPID_POS_FROM_PATH 10
192
193 static char* s_pkg_name;
194
195 #if 0
196 static char* substring(const char* str, size_t begin, size_t len)
197 {
198   if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))
199     return 0;
200
201   return strndup(str + begin, len);
202 }
203 #endif
204
205 /**
206  * package ID
207  *
208  * ncbyusjryr.AppSetting --> package ID is ncbyusjryr
209  * "Update_" "ncbyusjryr"
210  */
211 static char* get_app_string(char* path)
212 {
213         SETTING_TRACE_BEGIN;
214         char* temp = substring(path, APPID_POS_FROM_PATH, APPID_LENGTH/*string size*/);
215         SETTING_TRACE("package ID : >>> %s ",temp );
216         return temp;
217 }
218
219 //------------------------------------------------------
220 // for client - bus
221 static DBusConnection *bus;
222 //------------------------------------------------------
223 static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* message, void* user_data)
224 {
225     int my_pid = getpid();
226     int sender_pid = 0;
227     char* key = NULL;
228     char* value = NULL;
229
230     DBusError error;
231     dbus_error_init(&error);
232
233         setting_main_appdata *ad = user_data;
234         char* plugin_path = ad->plugin_path;
235         char* pkg_name = get_app_string(plugin_path);
236
237         if (pkg_name == NULL)
238         {
239                 SETTING_TRACE("pkg_name is NULL - it's abnormal operation");
240                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
241         }
242
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);
246
247         if (pkg_name)
248         {
249                 free(pkg_name);
250                 pkg_name = NULL;
251         }
252
253         if (s_pkg_name == NULL)
254         {
255                 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
256                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
257         }
258         SETTING_TRACE("s_pkg_name : %s ", s_pkg_name);
259     if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, s_pkg_name))
260     {
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)
266         {
267             SETTING_TRACE_ERROR("Fail to get data : %s", error.message);
268             dbus_error_free(&error);
269             return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
270         }
271     }
272
273     if (sender_pid != 0 && my_pid != sender_pid)
274     {
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";
280                 char* ptr = NULL;
281
282                 if (key) {
283                         ptr = strchr(key, '|');
284                 }
285
286                 xmlDocPtr doc = NULL;
287                 if (ptr && key)
288                 {
289                         //parsing for : checkbox1|N/A  -> checkbox1
290                         char* key_name = substring(key, 0, strlen(key)-strlen(ptr));
291                         char* val_name = strchr(value, '|');
292                         val_name++;
293
294                         // access xml file
295                         doc = xmlParseFile(plugin_path);
296                         if (doc == NULL)
297                         {
298                                 SETTING_TRACE("unable to parse file : %s", plugin_path);
299                                 FREE(key_name);
300                                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;     /* xml parsing error */
301                         }
302                         // generate xml tree
303                         xmlNode *root = xmlDocGetRootElement(doc);
304                         // find a node
305                         bool is_end = false;
306
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);
313                         count += 1;
314                 }
315                 // update the node
316                 GError *error = NULL;
317
318 #if 0
319                 if(doc != NULL)
320                 {
321                         xmlSaveFormatFile(ad->plugin_path, doc, 1);
322                         // TODO: make sure this is right
323                         xmlFreeDoc(doc);
324                         doc = NULL;
325                         SETTING_TRACE("__cfg_file_write successful");
326                 }
327 #endif
328
329                 // update UI
330     }
331
332     return DBUS_HANDLER_RESULT_HANDLED;
333 }
334
335 static int __send_msg(char* key, char* value)
336 {
337         DBusMessage* message;
338
339         int sender_pid = getpid();
340
341         if (bus == NULL)
342                 return -1;
343
344         // ex) in gdb --> $15 = 0x43b6eb78 "Update_(null)" -> error codintion
345         if (s_pkg_name == NULL)
346         {
347                 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
348                 return -1;
349         }
350
351         message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, s_pkg_name);
352
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)
359         {
360                 SETTING_TRACE("Fail to load data error");
361                 return -1;
362         }
363
364         if (dbus_connection_send(bus, message, NULL) == FALSE)
365         {
366                 SETTING_TRACE("Fail to send message");
367                 return -1;
368         }
369
370         dbus_connection_flush(bus);
371         dbus_message_unref(message);
372
373         SETTING_TRACE("[CLIENT] send data signal done");
374
375     return 0;
376 }
377
378
379 static void __send_int_msg(xmlNode* xmlObj, int val)
380 {
381         SETTING_TRACE_BEGIN;
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);
386
387         char value[MAX_CONTENT_LEN] = {0,};
388         snprintf(value, sizeof(value), "INT|%d", val);
389         __send_msg(key, value);
390         SETTING_TRACE_END;
391 }
392
393
394 static void __send_string_msg(xmlNode* xmlObj, char *string)
395 {
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);
400
401         char value[MAX_CONTENT_LEN] = {0,};
402         snprintf(value, sizeof(value), "STRING|%s", string);
403         __send_msg(key, value);
404 }
405
406
407 int setting_dbus_handler_init(void* user_data)
408 {
409         SETTING_TRACE_BEGIN;
410         if (bus)
411         {
412                 SETTING_TRACE("already get a bus, need release first.");
413                 setting_dbus_handler_fini();
414 //              return -1;
415         }
416         DBusError error;
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);
421         if (!bus)
422         {
423                 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
424                 dbus_error_free(&error);
425                 return -1;
426         }
427
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);
430
431         dbus_bus_add_match(bus, rule, &error);
432         if (dbus_error_is_set(&error))
433         {
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);
438                 bus = NULL;
439                 return -1;
440         }
441
442         if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
443         {
444                 dbus_bus_remove_match(bus, rule, &error);
445                 dbus_error_free(&error);
446                 dbus_connection_close(bus);
447                 bus = NULL;
448                 return -1;
449         }
450
451         SETTING_TRACE("app signal initialized");
452         return 0;
453 }
454
455 int setting_dbus_handler_fini(void)
456 {
457         SETTING_TRACE_BEGIN;
458         //do safty checking first.
459         setting_retvm_if(!bus, 0, "!bus");
460         DBusError error;
461         memset(&error, 0, sizeof(DBusError));
462         char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
463
464         dbus_error_init(&error);
465
466         // why??
467         bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
468
469         //dbus_connection_remove_filter(bus, __signal_filter, NULL);
470
471
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);
474
475         if (dbus_error_is_set(&error))
476         {
477                 SETTING_TRACE("Fail to rule unset: %s", error.message);
478                 dbus_error_free(&error);
479                 //return -1;
480         }
481
482         dbus_connection_close(bus);
483         bus = NULL;
484         SETTING_TRACE("app signal finalized");
485         return 0;
486 }
487
488 /////////////////////////////
489 /////////////////////////////
490 /////////////////////////////
491
492 Elm_Genlist_Item_Class itc_layout;
493
494 // write -> update
495 static int __cfg_file_write(Draw_Data *pd)
496 {
497         SETTING_TRACE_BEGIN;
498
499         GError *error = NULL;
500         if(pd->doc != NULL)
501         {
502                 xmlSaveFormatFile(pd->cfg_file, pd->doc, 1);
503                 //xmlFreeDoc(pd->doc);
504                 //pd->doc = NULL;
505                 SETTING_TRACE("__cfg_file_write successful");
506         }
507
508         SETTING_TRACE_END;
509         return TRUE;
510 }
511
512
513 static void ___click_softkey_back_cb(void *data, Evas_Object *obj,
514                                           void *event_info)
515 {
516         SETTING_TRACE_BEGIN;
517         ret_if(!data);
518
519         PluginNode* node = (PluginNode*)data;
520         Draw_Data *pd = node->pd;
521         if (pd->ly_main) {
522                 evas_object_del(pd->ly_main);
523                 pd->ly_main = NULL;
524         }
525
526         setting_plugin_destroy(node);
527         if (g_main_ad->navibar_main)
528         {
529                 elm_naviframe_item_pop(g_main_ad->navibar_main);
530         }
531         pd->scroller = NULL;
532         pd->navi_bar = NULL;
533         pd->cfg_file = NULL;
534
535
536
537
538         pd->root = NULL;
539 }
540
541
542 static void* group_func(void *data, xmlNode *xmlObj)
543 {
544         SETTING_TRACE_BEGIN;
545         retv_if(!data || !xmlObj, NULL);
546
547         PluginNode* node = (PluginNode*)data;
548         Draw_Data *pd = node->pd;
549
550         // original code is non-recursive
551 #if 0
552         const char *title = (char*)json_object_get_string_member(jsonObj, "title");
553         (void)setting_create_Gendial_field_titleItem(pd->scroller,
554                                                      &(itc_group_item),
555                                                      title, NULL);
556
557         // non recursive method
558         if (json_object_has_member(jsonObj, "elements"))
559         {
560                 JsonNode* elements_node = json_object_get_member(jsonObj, "elements");
561                 int i;
562                 JsonObject* tempobj;
563                 char* type;
564                 for (i=0; i < json_array_get_length(json_node_get_array(elements_node)); i++)
565                 {
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
570                 }
571         }
572 #else
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);
577 #endif
578
579         return NULL;
580 };
581
582
583 static void* __link_list_cb(void *data, Evas_Object *obj, void *event_info)
584 {
585         SETTING_TRACE_BEGIN;
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);
592
593         xmlNode* xmlObj = data;
594         retv_if(!xmlObj, NULL);
595         const char *link_file = (char*)xmlGetProp(xmlObj, "value");
596
597         if(!link_file)
598         {
599                 SETTING_TRACE_ERROR("Invalidate liked file");
600                 return NULL;
601         }
602         char file[1024] = {0,};
603         snprintf(file, sizeof(file), "%s/%s", PLUGIN_CFG_DIR, link_file);
604         SETTING_TRACE("file:%s", file);
605
606         PluginNode* plugin_node = setting_plugin_create(file);
607         setting_plugin_load(plugin_node, (const char *)file);
608
609         //setting_plugin_load(NULL, file);
610
611         return NULL;
612 }
613
614 static void* __launch_list_cb(void *data, Evas_Object *obj, void *event_info)
615 {
616         SETTING_TRACE_BEGIN;
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);
623
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");
630
631
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);
638
639         return NULL;
640 }
641
642 static void* label_func(void *data, xmlNode *xmlObj)
643 {
644         SETTING_TRACE_BEGIN;
645         retv_if(!data || !xmlObj, NULL);
646         PluginNode* node = (PluginNode*)data;
647         Draw_Data *pd = node->pd;
648
649         const char *title = (char*)xmlGetProp(xmlObj, "title");
650
651         Setting_GenGroupItem_Data *obj =
652                 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
653                                                  NULL,
654                                                  xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
655                                                  0, title, NULL, NULL);
656
657         return obj;
658 }
659
660 static void* link_func(void *data, xmlNode *xmlObj)
661 {
662         SETTING_TRACE_BEGIN;
663         retv_if(!data || !xmlObj, NULL);
664         PluginNode* node = (PluginNode*)data;
665         Draw_Data *pd = node->pd;
666
667         const char *key_str = (char*)xmlGetProp(xmlObj, "id");
668         Setting_GenGroupItem_Data * obj =
669                 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
670                                                  __link_list_cb,
671                                                  xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
672                                                  0, key_str, NULL, NULL);
673
674         return (void*)obj;
675 };
676
677 static void* launch_func(void *data, xmlNode *xmlObj)
678 {
679         SETTING_TRACE_BEGIN;
680         retv_if(!data || !xmlObj, NULL);
681         PluginNode* node = (PluginNode*)data;
682         Draw_Data *pd = node->pd;
683
684         const char *title_str = (char*)xmlGetProp(xmlObj, "title");
685
686         Setting_GenGroupItem_Data * obj =
687                 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
688                                                  __launch_list_cb,
689                                                  xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
690                                                  0, title_str, NULL, NULL);
691
692         return (void*)obj;
693 };
694
695 static void __slider_stop_cb(void *data, Evas_Object *obj,
696                                     void *event_info)
697 {
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);
703
704         xmlNode* xmlObj = list_item->userdata;
705         ret_if(!xmlObj);
706
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);
710
711         SETTING_TRACE(" slider after ---> val = %d", (int) list_item->chk_status);
712
713         // int -> double -> xmlChar*
714         xmlAttrPtr newattr;
715         char buf[10];
716         sprintf(buf, "%d", (int) list_item->chk_status);
717         newattr = xmlSetProp(xmlObj, "value", buf);
718
719         __send_int_msg(xmlObj, list_item->chk_status);
720         __cfg_file_write((Draw_Data *)list_item->belongs_to);
721 }
722
723
724 static void* slider_func(void *data, xmlNode *xmlObj)
725 {
726         SETTING_TRACE_BEGIN;
727         retv_if(!data || !xmlObj, NULL);
728         PluginNode* node = (PluginNode*)data;
729         Draw_Data *pd = node->pd;
730
731         // type casting
732         const char *title = (char*)xmlGetProp(xmlObj, "title");
733
734         SETTING_TRACE (" >>> [slider input] min=%s max=%s value=%s ",(char*)xmlGetProp(xmlObj, "min"), (char*)xmlGetProp(xmlObj, "max"), (char*)xmlGetProp(xmlObj, "value"));
735
736         int value = atoi((char*)xmlGetProp(xmlObj, "value"));
737         int min = atoi((char*)xmlGetProp(xmlObj, "min"));
738         int max = atoi((char*)xmlGetProp(xmlObj, "max"));
739
740         SETTING_TRACE ("[slider input] min=%d max=%d value=%d ", min, max, value);
741
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,
745                                              NULL,
746                                              SWALLOW_Type_LAYOUT_SLIDER,
747                                              IMG_SENSITIVITY_ICON_01,
748                                              IMG_SENSITIVITY_ICON_02, value,
749                                              title, NULL, NULL);
750         if (list_item) {
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;
759         }
760
761         g_list_item = list_item;
762
763         return (void*)list_item;
764 };
765
766 #if 0
767 /*
768   elm_object_item_data_set(item_to_update->item, item_to_update);
769   elm_genlist_item_update(item_to_update->item);
770 */
771 static void* navigationbar_func(void *data, xmlNode *xmlObj)
772 {
773 #if 1
774         SETTING_TRACE_BEGIN;
775         ret_if(!data || !xmlObj);
776
777         PluginNode* node = (PluginNode*)data;
778         Draw_Data *pd = node->pd;
779
780         //----------------------------------------------------------------
781         // [DATA] title, btn[0], btn[1]
782         const char *title = (char*)xmlGetProp(xmlObj, "title");
783         char *btn[2] = {0, };
784
785         // find child nodes named 'elements'
786         if (xmlObj->children) {
787                 xmlNode* cur = xmlObj->children;
788                 int i =0;
789                 while (cur != NULL)
790                 {
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"),
795                                                                 i,
796                                                                 btn[i]);
797                                 i++;
798                         }
799                         cur = cur->next;
800                 }
801         }
802         //----------------------------------------------------------------
803         // [UI] with DATA
804         pd->ly_main = setting_create_layout_navi_bar_genlist(pd->win_get,
805                                                    pd->win_get,
806                                                    _(title),
807                                                    _(btn[1]), _(btn[0]),
808                                                    ___click_softkey_back_cb,
809                                                    ___click_softkey_back_cb, data, &pd->scroller,
810                                                    &(pd->navi_bar));
811
812 #endif
813         return NULL;
814 };
815 #endif
816
817 static void __check_mouse_up_cb(void *data, Evas_Object *obj,
818                                              void *event_info)
819 {
820         /* error check */
821         SETTING_TRACE_BEGIN;
822         setting_retm_if(data == NULL, "Data parameter is NULL");
823
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);
829
830         SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
831
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);
835
836         xmlNode *xmlObj = data;
837         xmlAttrPtr newattr;
838         newattr = xmlSetProp(xmlObj, "state", xmlXPathCastNumberToString(list_item->chk_status));
839
840         __send_int_msg(xmlObj, list_item->chk_status);
841         __cfg_file_write((Draw_Data *)list_item->belongs_to);
842 }
843
844
845 static void __chk_btn_cb(void *data, Evas_Object *obj,
846                                              void *event_info)
847 {
848         SETTING_TRACE_BEGIN;
849         /* error check */
850         retm_if(data == NULL, "Data parameter is NULL");
851         Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
852
853         xmlNode* xmlObj = list_item->userdata;
854         ret_if(!xmlObj);
855         list_item->chk_status = elm_check_state_get(obj);       /*  for genlist update status */
856
857         xmlAttrPtr newattr;
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");
862         } else {
863                 newattr = xmlSetProp(xmlObj, "value", "false");
864         }
865
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);
871         return;
872 }
873
874
875 static void* checkbox_func(void *data, xmlNode *xmlObj)
876 {
877         SETTING_TRACE_BEGIN;
878         retv_if(!data || !xmlObj, NULL);
879
880         PluginNode* node = (PluginNode*)data;
881         Draw_Data *pd = node->pd;
882
883         // [DATA] title, value
884         const char *title = (char*)xmlGetProp(xmlObj, "title");
885
886         // true / false
887         char* value = (char*)xmlGetProp(xmlObj, "value");
888
889         int ival = -1;
890
891         if ( 0 == safeStrCmp(value, "true")) {
892                 ival = 1;
893         } else if ( 0 == safeStrCmp(value, "false"))  {
894                 ival = 0;
895         } else {
896                 ival = 0;       // default : false (0)
897         }
898
899         // title, value, xmlObj
900         Setting_GenGroupItem_Data *list_item =
901                 setting_create_Gendial_field_def(pd->scroller,
902                                           &(itc_1text_1icon),
903                                           __check_mouse_up_cb,
904                                           xmlObj,
905                                           SWALLOW_Type_1TOGGLE,
906                                           NULL, NULL,
907                                           ival,
908                                           title,
909                                           NULL,
910                                           __chk_btn_cb);
911         if(list_item) {
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);
915         }
916
917         return list_item;
918 }
919
920
921 static void __entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
922 {
923         SETTING_TRACE_BEGIN;
924         retm_if(!data || !obj, "Data parameter is NULL");
925
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);
930
931         Setting_GenGroupItem_Data *list_item = data;
932
933         xmlNode* xmlObj = list_item->userdata;
934         if(!xmlObj) {
935                 FREE(entry_str_utf8);
936                 return;
937         }
938
939         xmlAttrPtr newattr;
940         const char *title = (char*)xmlSetProp(xmlObj, "value",entry_str_utf8);
941
942         __send_string_msg(xmlObj, entry_str_utf8);
943         __cfg_file_write((Draw_Data *)list_item->belongs_to);
944
945         FREE(entry_str_utf8);
946         SETTING_TRACE_END;
947 }
948
949
950 static void __editbox_list_cb(void *data, Evas_Object *obj,
951                                             void *event_info)
952 {
953         SETTING_TRACE_BEGIN;
954         /* error check */
955
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);
960
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);
964         }
965
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);
969 }
970
971
972 static void __editbox_changed_cb(void *data, Evas_Object *obj,
973                                        void *event_info)
974 {
975         SETTING_TRACE_BEGIN;
976         retm_if(!data || !obj, "Data parameter is NULL");
977         retm_if(!elm_object_focus_get(obj), "Entry is not focused");
978
979         Setting_GenGroupItem_Data *list_item =
980             (Setting_GenGroupItem_Data *) data;
981
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);
985
986         G_FREE(list_item->sub_desc);//release first
987         list_item->sub_desc = (char *)g_strdup(entry_str);
988 }
989
990
991 /**
992  *  editbox
993  *
994  * @see also __editbox_changed_cb
995  * @see also __entry_unfocus_cb
996  */
997 static void* editbox_func(void *data, xmlNode *xmlObj)
998 {
999         SETTING_TRACE_BEGIN;
1000         retv_if(!data || !xmlObj, NULL);
1001
1002         PluginNode* node = (PluginNode*)data;
1003         Draw_Data *pd = node->pd;
1004
1005         const char *title = (char*)xmlGetProp(xmlObj, "title");
1006         const char *key_str= (char*)xmlGetProp(xmlObj, "value");
1007
1008         const char *minlength= (char*)xmlGetProp(xmlObj, "minlength");
1009         const char *maxlength= (char*)xmlGetProp(xmlObj, "maxlength");
1010
1011         int max_len = -1;
1012         if (maxlength)
1013         {
1014                 max_len = atoi(maxlength);
1015                 SETTING_TRACE(" >> MAXLENGTH FILTER IS AVAILABLE !!!! maxlength = %d", max_len);
1016         }
1017
1018         Setting_GenGroupItem_Data *list_item = NULL;
1019
1020 #if 1
1021         if (max_len == -1)
1022         {
1023                 // without maxlength filter
1024                 list_item = setting_create_Gendial_field_def(pd->scroller, &(itc_1icon),
1025                                                                  __editbox_list_cb,
1026                                                          pd, SWALLOW_Type_LAYOUT_ENTRY,
1027                                                          NULL, NULL, 0, title, key_str,
1028                                                          __editbox_changed_cb);
1029
1030         } else {
1031                 // add max length filter
1032                 list_item = setting_create_Gendial_field_entry_fo(
1033                                                                         pd->scroller,
1034                                                                         &(itc_1icon),
1035                                                                         __editbox_list_cb,
1036                                                                         pd,
1037                                                                         SWALLOW_Type_LAYOUT_ENTRY,
1038                                                                         NULL, NULL, 0, title, key_str,
1039                                                                         __editbox_changed_cb,
1040                                                                         __entry_unfocus_cb,
1041                                                                         ELM_INPUT_PANEL_LAYOUT_NORMAL,
1042                                                                         false,
1043                                                                         false,
1044                                                                         max_len,
1045                                                                         0,
1046                                                                         NULL, NULL);
1047
1048         }
1049 #endif
1050         if (list_item) {
1051                 list_item->userdata = xmlObj;
1052                 list_item->stop_change_cb = __entry_unfocus_cb;
1053                 list_item->belongs_to = (int)pd;
1054         }
1055
1056         return list_item;
1057 };
1058
1059
1060 static void __expanditem_func_sel_cb(void *data, Evas_Object *obj, void *event_info)
1061 {
1062         SETTING_TRACE_BEGIN;
1063         /* error check */
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);
1071
1072         elm_radio_value_set(data_subItem->rgd, data_subItem->chk_status);
1073
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);
1077
1078         xmlNode* xmlObj = data_parentItem->userdata;
1079         ret_if(!xmlObj);
1080
1081         xmlAttrPtr newattr;
1082         //newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
1083         newattr = xmlSetProp(xmlObj, "value", data_parentItem->sub_desc);
1084
1085         __send_string_msg(xmlObj, data_parentItem->sub_desc);
1086         __cfg_file_write((Draw_Data *)data_parentItem->belongs_to);
1087 }
1088
1089
1090 static void __expanditem_func_exp_cb(void *data, Evas_Object *obj, void *event_info)
1091 {
1092         ret_if(NULL == data || NULL == event_info);
1093         SETTING_TRACE_BEGIN;
1094
1095         PluginNode* node = (PluginNode*)data;
1096         Draw_Data *pd = node->pd;
1097
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);
1101
1102
1103         xmlNode *xmlObj = data_parentItem->userdata;
1104         char *value = (char*)xmlGetProp(xmlObj, "value");
1105         SETTING_TRACE(">>> value = %s", value);
1106         Evas_Object *rgd = NULL;
1107
1108         if (xmlObj->children && !data_parentItem->rgd) {//to protect from entering repeatly
1109                 xmlNode* cur = xmlObj->children;
1110
1111                 rgd = elm_radio_add(scroller);
1112                 elm_radio_value_set(rgd, -1);
1113
1114                 char *type;
1115                 char *subitem_title = NULL;
1116                 int subitem_index = 0;
1117                 int sel_idx = -1;
1118
1119 #if 1
1120                 // print out debug message
1121                 if (data_parentItem->childs)
1122                 {
1123                         int howmany = 0;
1124                         Eina_List *li = data_parentItem->childs;
1125                         while(li)
1126                         {
1127                                 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1128                                 howmany += 1;
1129                                 SETTING_TRACE(" <<< node->keyStr : %s >>> ", node->keyStr);
1130
1131                                 // go next
1132                                 li = eina_list_next(li);
1133                         }
1134                         SETTING_TRACE(" <<<how many : %d>>> ", howmany);
1135                 }
1136 #endif
1137                 if (data_parentItem->childs)
1138                 {
1139                         eina_list_free(data_parentItem->childs);
1140                         data_parentItem->childs = NULL;
1141                 }
1142
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,
1153                                                                                                         subitem_index,
1154                                                                                                         subitem_title, NULL);
1155
1156
1157                                         if (0 == safeStrCmp(value, subitem_title)) {
1158                                                 sel_idx = subitem_index;
1159                                                 SETTING_TRACE("%d is selected in Radio Group", sel_idx);
1160                                         }
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);
1163                                         subitem_index++;
1164
1165                                 } else {
1166                                         SETTING_TRACE("invalid type[:%s]", type);
1167                                 }
1168                         }
1169                         cur = cur->next;
1170                 }
1171
1172                 // value set
1173                 elm_radio_value_set(rgd, sel_idx);
1174                 data_parentItem->rgd = rgd;//protecting condition
1175         }
1176 }
1177
1178
1179 static void __expanditem_func_smart_cb(void *data, Evas_Object *obj, void *event_info)
1180 {
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;
1185
1186         if (0 == safeStrCmp(cb_type, "contracted")) {
1187                 data_item->rgd = NULL;
1188                 elm_genlist_item_subitems_clear(item);
1189         }
1190 }
1191
1192
1193 static void* settings_func(void *data, xmlNode *xmlObj)
1194 {
1195         return NULL;
1196 }
1197
1198
1199 static Evas_Object *setting_create_win_layout2(Evas_Object *win_layout, Evas_Object *win_obj)
1200 {
1201
1202     Evas_Object *layout = NULL;
1203
1204     /*  Base Layout */
1205     layout = elm_layout_add(win_obj);
1206     setting_retvm_if(layout == NULL, FALSE, "layout == NULL");
1207
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);
1212
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);
1216     return layout;
1217 }
1218
1219
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)
1223 {
1224
1225         Evas_Object *layout = setting_create_win_layout2(win_layout, win_obj);
1226         *navi_bar = setting_create_navi_bar(layout);
1227
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 */ ,
1232                                         *navi_bar, NULL);
1233         return layout;
1234 }
1235
1236 static void __plugin_genlist_unrealized_cb(void* data,Evas_Object* obj, void* event_info)
1237 {
1238         SETTING_TRACE_BEGIN;
1239         ret_if(data == NULL);
1240
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);
1244
1245         SETTING_TRACE("keyStr : %s ", node->keyStr);
1246         //item_to_update->childs)
1247
1248         if (node->childs)
1249         {
1250                 eina_list_free(node->childs);
1251                 node->childs = NULL;
1252         }
1253 }
1254
1255 // <setting>
1256 static void* setting_func(void *data, xmlNode *xmlObj)
1257 {
1258         SETTING_TRACE_BEGIN;
1259         retv_if(!data || !xmlObj, NULL);
1260 #if 1
1261         PluginNode* node = (PluginNode*)data;
1262         Draw_Data *pd = node->pd;
1263
1264         // [DATA] title, btn[0], btn[1]
1265         const char *title = (char*)xmlGetProp(xmlObj, "title");
1266         char *btn[2] = {/* 0 */"OK", /* 1 */"NO"};
1267
1268         SETTING_TRACE("before setting_create_layout_navi_bar_genlist");
1269
1270         // [UI] with DATA
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 */
1276
1277         evas_object_smart_callback_add(pd->scroller, "unrealized", __plugin_genlist_unrealized_cb, node);
1278
1279
1280         SETTING_TRACE("_(title):%s", _(title));
1281
1282         setting_push_layout_navi_bar(
1283                                            _(title),
1284                                            _("IDS_COM_BODY_BACK"), NULL, NULL,
1285                                            ___click_softkey_back_cb,
1286                                            NULL, NULL,
1287                                            data, pd->scroller,
1288                                            g_main_ad->navibar_main, NULL);
1289         SETTING_TRACE("after setting_create_layout_navi_bar_genlist");
1290 #endif
1291         return NULL;
1292 }
1293
1294
1295 static void* expanditem_func(void *data, xmlNode *xmlObj)
1296 {
1297         // DO NOTHING - expandlist draws this area
1298         return NULL;
1299 }
1300
1301 static void* expandlist_func(void *data, xmlNode *xmlObj)
1302 {
1303         SETTING_TRACE_BEGIN;
1304         retv_if(!data || !xmlObj, NULL);
1305
1306         PluginNode* node = (PluginNode*)data;
1307         Draw_Data *pd = node->pd;
1308
1309         const char *key_str = (char*)xmlGetProp(xmlObj, "title");
1310         const char *value = (char*)xmlGetProp(xmlObj, "value"); // string -> value
1311
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),
1316                                                     NULL, NULL,
1317                                                     SWALLOW_Type_INVALID,
1318                                                     key_str,
1319                                                     value);
1320         if (list_item) {
1321                 list_item->userdata = xmlObj;
1322                 list_item->belongs_to = (int)pd;
1323                 list_item->childs = NULL;               /* init */
1324         }
1325
1326         return list_item;
1327 }
1328
1329
1330
1331 static int __node_walker(PluginNode* context, xmlNode* cur)
1332 {
1333         //SETTING_TRACE_BEGIN;
1334         Draw_Data *pd = context->pd;
1335
1336         retv_if(!pd, -1);
1337         retv_if(!context->ui_list, -1);
1338
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);
1344                         if (fp)
1345                         {
1346                                 // type check
1347                                 void* vret = fp(context, cur_node); // draw it
1348
1349                                 if (vret)
1350                                 {
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.
1354                                         // id, object
1355                                         // add list
1356                                         char* key_name = xmlGetProp(cur_node, "id");
1357                                         eina_hash_add(context->ui_list, strdup(key_name),(void*)genlist_node);
1358                                 }
1359                         }else {
1360                                 SETTING_TRACE(" >>>> fp is NULL ");
1361                         }
1362                 }
1363                 __node_walker(context, cur_node->children);     /* RECURSIVE */
1364         }
1365         return 0;
1366 }
1367
1368 /**
1369  * @param id_str [in] "id"
1370  * @param value [in] value to be udpated
1371  * @see __expanditem_func_sel_cb
1372  */
1373 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end)
1374 {
1375         SETTING_TRACE_BEGIN;
1376         xmlNode *cur_node = NULL;
1377
1378         if (! context)
1379         {
1380                 SETTING_TRACE("context is NULL - it's error CONDITION ");
1381                 return -1;
1382         }
1383
1384         retv_if(!context->ui_list, -1);
1385         if (*is_end == true) return 0;
1386
1387         for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1388                 if (cur_node->type == XML_ELEMENT_NODE) {
1389
1390                         char* id_name = (char*)xmlGetProp(cur_node, "id");
1391                         if ( id_name && 0 == strcmp(id_str, id_name))
1392                         {
1393                                 SETTING_TRACE("FOUND >>>> %s", id_name);
1394                                 // cur_node     - update xml code
1395                                 xmlAttrPtr newattr = xmlSetProp(cur_node, "value", value);
1396
1397                                 //-----------------------------------------------------------
1398                                 // UI UPDATE
1399                                 // case : slider
1400                                 if ( 0 == strcmp (cur_node->name, "integer"))
1401                                 {
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);
1404                                         if      (item_to_update)
1405                                         {
1406                                                 item_to_update->chk_status = atoi(value);
1407                                                 SETTING_TRACE(">>>   o-------------0 SLIDER VALUE = %d ", item_to_update->chk_status);
1408
1409                                                 elm_object_item_data_set(item_to_update->item, item_to_update);
1410                                                 elm_genlist_item_update(item_to_update->item);
1411                                         } else {
1412                                                 SETTING_TRACE("item_to_update is NULL");
1413                                         }
1414                                 }
1415                                 // case : toggle
1416                                 if ( 0 == strcmp (cur_node->name, "bool"))
1417                                 {
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);
1421                                         if      (item_to_update)
1422                                         {
1423                                                 item_to_update->chk_status = atoi(value);
1424                                                 SETTING_TRACE(">>>   o-------------0 TOGGLE VALUE = %d ", item_to_update->chk_status);
1425
1426                                                 elm_object_item_data_set(item_to_update->item, item_to_update);
1427                                                 elm_genlist_item_update(item_to_update->item);
1428                                         } else {
1429                                                 SETTING_TRACE("item_to_update is NULL");
1430                                         }
1431                                 }
1432                                 // case : edit control
1433                                 if ( 0 == strcmp (cur_node->name, "string"))
1434                                 {
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);
1437                                         if      (item_to_update)
1438                                         {
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);
1442
1443                                                 // free old string
1444
1445                                                 elm_object_item_data_set(item_to_update->item, item_to_update);
1446                                                 elm_genlist_item_update(item_to_update->item);
1447
1448                                         } else {
1449                                                 SETTING_TRACE("item_to_update is NULL");
1450                                         }
1451                                 }
1452                                 // case : expand list
1453                                 // parent
1454                                 //    child1
1455                                 //    child2
1456                                 //    child3
1457                                 //    child4
1458                                 //-----------------------------------------------------------
1459                                 if ( 0 == strcmp (cur_node->name, "expandlist"))
1460                                 {
1461                                         #if 1
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);
1465                     if  (item_to_update)
1466                     {
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);
1470
1471                         // free old string
1472                         // string update
1473                         elm_object_item_data_set(item_to_update->item, item_to_update);
1474                         elm_genlist_item_update(item_to_update->item);
1475
1476                         // TODO: need to update child elements
1477                         // item_to_update->childs ---> expanded list
1478
1479                                                 // debug log
1480                                                 // there should have 4 sub items.
1481                                                 //-----------------------------------------------------
1482                                                 // has it already freed by someone?
1483                                                 //-----------------------------------------------------
1484                                                 if (item_to_update->childs)
1485                                                 {
1486                                                         int howmany2 =0;
1487                                                         Eina_List *li = item_to_update->childs;
1488                                                         while(li)
1489                                                         {
1490                                                                 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1491                                                                 howmany2 += 1;
1492                                                                 li = eina_list_next(li);
1493                                                         }
1494                                                         SETTING_TRACE(" expandlist -- how many items are there? : %d ", howmany2);
1495                                                 }
1496
1497                         if (item_to_update->childs)
1498                         {
1499                             Eina_List *li = item_to_update->childs;
1500                             int radio_index = 0;
1501                             while(li)
1502                             {
1503                                 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1504
1505                                 if (node->item && node->keyStr)
1506                                 {
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 !!!!
1511                                     {
1512                                         elm_radio_value_set(node->rgd, radio_index);
1513                                     }
1514                                 } else {
1515                                      SETTING_TRACE(">>> node has unproper values - Setting_GenGroupItem_Data");
1516                                 }
1517                                 elm_object_item_data_set(item_to_update->item, item_to_update);
1518                                 elm_genlist_item_update(item_to_update->item);
1519
1520                                 // go next
1521                                 li = eina_list_next(li);
1522                                 radio_index++;
1523                             }
1524
1525                         }
1526                     } else {
1527                         SETTING_TRACE("item_to_update is NULL");
1528                     }
1529
1530
1531                                         #endif
1532                                 }
1533                                 *is_end = true;
1534                         }
1535                 }
1536                 __node_finder(context, cur_node->children, id_str, value, is_end);      /* RECURSIVE */
1537         }
1538         return 0;
1539 }
1540
1541 static unsigned int _plugin_string_key_length(const char*key)
1542 {
1543         if (!key)
1544                 return 0;
1545
1546         return (int)strlen(key) + 1;
1547 }
1548
1549 static int _plugin_string_key_cmp(const char* key1, int key1_length,
1550                                                                         const char* key2, int key2_length)
1551 {
1552         return strcmp(key1, key2);
1553 }
1554
1555 static void _plugin_entry_free_cb(void* data)
1556 {
1557     Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1558         if (node->childs)
1559         {
1560                 eina_list_free(node->childs);
1561                 node->childs = NULL;
1562         }
1563 }
1564
1565 PluginNode* setting_plugin_create()
1566 {
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));
1570
1571
1572         if (!pd) {
1573                 FREE(node);
1574         }
1575
1576         setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
1577         //eina_init();
1578
1579         node->pd = pd;
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,
1584                                                                   5); // 2^5
1585
1586         return node;
1587 }
1588
1589 void setting_plugin_destroy(PluginNode* node)
1590 {
1591         SETTING_TRACE_BEGIN;
1592         if (node) {
1593                 SETTING_TRACE("node is NOT NULL")
1594                 if (node->pd) {
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");
1601                         }
1602
1603                         free(node->pd);
1604                         node->pd = NULL;
1605                 }
1606
1607                 if (node->ui_list) {
1608                         eina_hash_free(node->ui_list);
1609                         node->ui_list = NULL;
1610                 }
1611                 free(node);
1612                 node = NULL;
1613 //              PLUGIN_FINI;
1614         }
1615 }
1616
1617
1618 static Eina_Bool _plugin_foreach_cb(const Eina_Hash *hash, const void*key, void* data, void* fdata)
1619 {
1620     Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1621         SETTING_TRACE("%s --- %s ", (char*)key, node->keyStr);
1622         return EINA_TRUE;
1623 }
1624
1625
1626 void setting_plugin_debug(PluginNode* context)
1627 {
1628 //      SETTING_TRACE("HASH TABLE -------------------------------------");
1629         if (context->ui_list) {
1630                 eina_hash_foreach(context->ui_list,_plugin_foreach_cb, NULL);
1631         }
1632 //      SETTING_TRACE("HASH TABLE -------------------------------------");
1633
1634 }
1635
1636 void setting_plugin_update(PluginNode* context)
1637 {
1638     Eina_List *li = context->ui_list;
1639
1640     while (li) {
1641         Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) eina_list_data_get(li);
1642         if (node) {
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);
1648         }
1649         li = eina_list_next(li);
1650         }
1651 }
1652
1653
1654 /**
1655  * set modifiable
1656  */
1657 bool setting_plugin_load(PluginNode* context, const char *cfg_file)
1658 {
1659         SETTING_TRACE("cfg_file:%s", cfg_file)
1660         if (isEmptyStr(cfg_file) || 0 != access(cfg_file, R_OK|W_OK|F_OK ))
1661         {
1662                 SETTING_TRACE_ERROR(" error occured : access \n");
1663                 return FALSE;
1664         }
1665         context->pd->cfg_file = cfg_file;
1666
1667         //GError *error = NULL;
1668
1669         context->pd->doc = xmlParseFile(cfg_file);
1670         context->pd->root = xmlDocGetRootElement(context->pd->doc);
1671
1672         // signal filter change
1673         //setting_dbus_handler_init(g_main_ad);
1674         void* user_data = (void*)g_main_ad;
1675
1676         DBusError error;
1677         dbus_error_init(&error);
1678         char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
1679         bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
1680         if (!bus)
1681         {
1682                 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
1683                 dbus_error_free(&error);
1684                 return -1;
1685         }
1686
1687         // remove filter
1688         // dbus_connection_remove_filter(bus, __signal_filter, NULL);
1689
1690         // get rule
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))
1694         {
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);
1699                 bus = NULL;
1700                 return -1;
1701         }
1702
1703         // re-add filter
1704         if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
1705         {
1706                 dbus_bus_remove_match(bus, rule, &error);
1707                 dbus_error_free(&error);
1708                 dbus_connection_close(bus);
1709                 bus = NULL;
1710                 return -1;
1711         }
1712
1713         // TODO: error handler here
1714         __node_walker(context, context->pd->root);
1715
1716         // debug message
1717         setting_plugin_debug(context);
1718         return true;
1719 }
1720
1721