4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include <setting-cfg.h>
23 #include <setting-debug.h>
25 #include <Elementary.h>
26 #include <setting-common-general-func.h>
27 #include <setting-common-data-type.h>
28 #include <setting-common-data-slp-setting.h>
32 #define CFG_FILE_DIR_PATH "/opt/usr/apps/org.tizen.setting/data/"
33 #define CFG_FILE_PATH CFG_FILE_DIR_PATH"setting.cfg"
36 JsonNode *root; /* category_list */
39 char *setting_cfg_get_path()
44 int setting_cfg_file_write(JsonNode *node);
46 #define __create_an_item(item_name, icon_path, ug_args, shortcut_appid, defaultPos, item_type, is_resetable, ug_exist, uuid, click_times, last_clicked) do\
49 if (!is_ug_installed_by_ug_args(ug_args)) break;\
51 menu_item = json_node_new(JSON_NODE_OBJECT); \
52 object = json_object_new(); \
53 json_node_take_object(menu_item, object); \
54 json_object_set_string_member(object, "key_name", item_name); \
55 json_object_set_string_member(object, "icon_path", icon_path); \
56 json_object_set_string_member(object, "ug_args", ug_args); \
57 json_object_set_string_member(object, "shortcut_appid", shortcut_appid); \
58 json_object_set_int_member(object, "pos", defaultPos); \
59 json_object_set_int_member(object, "click_times", click_times); \
60 json_object_set_int_member(object, "item_type", item_type); \
61 json_object_set_int_member(object, "is_resetable", is_resetable); \
62 json_object_set_int_member(object, "last_clicked", last_clicked); \
63 json_object_set_string_member(object, "uuid", uuid); \
64 json_array_add_element(menu, menu_item); \
67 #define __create_a_menu(menu_name)\
69 category = json_node_new(JSON_NODE_OBJECT);\
70 object = json_object_new();\
71 json_node_take_object(category, object);\
72 json_object_set_string_member(object, "name", menu_name);\
73 menu = json_array_new();\
74 json_object_set_array_member(object, "menu", menu);\
75 json_array_add_element(json_node_get_array(category_list), category);\
79 int wifi_toggle_get_state(Cfg_Item_State *stat, void *data);
80 int flightmode_toggle_get_state(Cfg_Item_State *stat, void *data);
81 int bluetooth_toggle_get_state(Cfg_Item_State *stat, void *data);
82 int drivingmode_toggle_get_state(Cfg_Item_State *stat, void *data);
83 int network_restriction_mode_toggle_get_state(Cfg_Item_State *stat, void *data);
84 int personalmode_toggle_get_state(Cfg_Item_State *stat, void *data);
85 int handfree_toggle_get_state(Cfg_Item_State *stat, void *data);
86 int nfc_toggle_get_state(Cfg_Item_State *stat, void *data);
88 /*/////////////////////////////////////////////////////////////////////////////////////////// */
91 cfg_func_table wifi_tfunc = {
92 .get_item_state = wifi_toggle_get_state,
93 .set_item_state = NULL,
94 .set_item_update_ui = NULL,
97 /* flight mode - DONE */
99 cfg_func_table flightmode_tfunc = {
100 .get_item_state = flightmode_toggle_get_state,
101 .set_item_state = NULL,
102 .set_item_update_ui = NULL,
105 /* bluetooth - ***** FAILED ***** */
107 cfg_func_table bluetooth_tfunc = {
108 .get_item_state = bluetooth_toggle_get_state,
109 .set_item_state = NULL,
110 .set_item_update_ui = NULL,
114 /* driving mode - Done */
116 cfg_func_table drivingmode_tfunc = {
117 .get_item_state = drivingmode_toggle_get_state,
118 .set_item_state = NULL,
119 .set_item_update_ui = NULL,
122 /* network restrictrion mode - Done */
124 cfg_func_table network_restruction_mode_tfunc = {
125 .get_item_state = network_restriction_mode_toggle_get_state,
126 .set_item_state = NULL,
127 .set_item_update_ui = NULL,
130 /* personal mode ?? - partially done */
132 cfg_func_table personalmode_tfunc = {
133 .get_item_state = personalmode_toggle_get_state,
134 .set_item_state = NULL,
135 .set_item_update_ui = NULL,
140 cfg_func_table nfc_tfunc = {
141 .get_item_state = nfc_toggle_get_state,
142 .set_item_state = NULL,
143 .set_item_update_ui = NULL,
148 void setting_cfg_print(void)
150 JsonNode *node = root;
152 JsonGenerator *generator = json_generator_new();
153 g_object_set(generator, "pretty", TRUE, NULL);
154 json_generator_set_root(generator, node);
155 gchar *data = json_generator_to_data(generator, NULL);
156 SETTING_TRACE("%s", (char *)data);
159 g_object_unref(generator);
163 /* create config file from scratch */
164 static Setting_Cfg_Node_T s_cfg_node_array[] = {
165 {KeyStr_Connections, NULL, "move://Tab2.top", Cfg_Item_Pos_Level0, 0, 0, Cfg_Item_Title_Node, NULL, NULL, NULL, uuid_Connectivity, 0, NULL},
166 {KeyStr_WiFi, IMG_WiFi, "wifi-efl-ug", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_Connections, &wifi_tfunc, uuid_WiFi, 0, "wifi-efl-ug"},
167 {KeyStr_Bluetooth, IMG_Bluetooth, "ug-bluetooth-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_Connections, &bluetooth_tfunc, uuid_Bluetooth, 0, "ug-bluetooth-efl"},
168 #ifdef TIZEN_BUILD_TARGET
169 {KeyStr_FlightMode, IMG_FlightMode, "setting-flightmode-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable, 0, Cfg_Item_Ui_Node_Toggle, NULL, KeyStr_Connections, &flightmode_tfunc, uuid_FlightMode, 0, NULL},
171 #ifdef TIZEN_BUILD_TARGET
172 {KeyStr_MobileAP, IMG_MobileAP, "setting-mobileap-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_Connections, NULL, uuid_MobileAP, 0, NULL},
174 {KeyStr_NFC, IMG_NFC, "setting-nfc-efl|type:nfc", Cfg_Item_Pos_Level0, Cfg_Item_unResetable, 0, Cfg_Item_Ug_Node_Toggle, NULL, KeyStr_Connections, &nfc_tfunc, uuid_NFC, 0, "setting-nfc-efl"},
177 #ifdef TIZEN_BUILD_TARGET
178 {KeyStr_MobileNetworks, IMG_Network, "setting-network-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_Connections, NULL, uuid_Network, 0, NULL},
179 /*More connections */
181 {KeyStr_MoreConnections, IMG_More_Connections, "setting-moreconnections-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_Connections, NULL, uuid_Network, 0, NULL},
184 {KeyStr_Device, NULL, "move://Tab3.top", Cfg_Item_Pos_Level0, 0, 0, Cfg_Item_Title_Node, NULL, NULL, NULL, uuid_SoundDisplay, 0, NULL},
185 {KeyStr_Sounds, IMG_Sounds, "setting-profile-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_Device, NULL, uuid_SoundDisplay, 0, NULL},
186 {KeyStr_Display, IMG_Display, "setting-display-efl|viewtype:main", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_Device, NULL, uuid_Display, 0, "org.tizen.setting.display"},
187 {KeyStr_ApplicationsItem, IMG_Applications, "setting-applications-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_Device, NULL, uuid_Display, 0, "org.tizen.setting.display"},
189 /* Group: Personal */
190 {KeyStr_Personal, NULL, "move://Tab3.top", Cfg_Item_Pos_Level0, 0, 0, Cfg_Item_Title_Node, NULL, NULL, NULL, uuid_Personal, 0, NULL},
191 {KeyStr_Wallpaper, IMG_Wallpaper, "org.tizen.wallpaper-ui-service", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_Personal, NULL, uuid_HomeAndLockscreen, 0, "org.tizen.setting.wallpaper-ui-service"},
192 {KeyStr_LockScreen, IMG_LockedScreen, "setting-security-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_Personal, NULL, uuid_LockedScreen, 0, "ug-lockscreen-options-efl"},
194 /*Accessbility - not supported since 2015.8.12 */
195 {KeyStr_Accessibility, IMG_Accessibility, "setting-accessibility-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_Personal, NULL, uuid_Accounts, 0, "setting-accessibility-efl"},
197 {KeyStr_Accounts, IMG_Accounts, "setting-myaccount-efl|mode:account_list", Cfg_Item_Pos_Level0, Cfg_Item_unResetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_Personal, NULL, uuid_Accounts, 0, "setting-myaccount-efl"},
200 {KeyStr_System, NULL, "move://Tab4.top", Cfg_Item_Pos_Level0, 0, 0, Cfg_Item_Title_Node, NULL, NULL, NULL, uuid_DeviceMange, 0, NULL},
201 {KeyStr_LanguageInput, IMG_LanguageInput, "setting-phone-efl|viewtype:language", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_System, NULL, uuid_LanguageKeyboard, 0, "org.tizen.setting.language"},
203 {KeyStr_Storage, IMG_Storage, "setting-storage-efl|caller:setting", Cfg_Item_Pos_Level0, Cfg_Item_unResetable, 0, Cfg_Item_AppLauncher_Node, NULL, KeyStr_System, NULL, uuid_Storage, 0, "setting-storage-efl"},
205 {KeyStr_DateTime, IMG_DateTime, "setting-time-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_System, NULL, uuid_DateTime, 0, NULL},
206 //{KeyStr_DeveloperOption, IMG_USBconnection, "setting-developeroption-efl|viewtype:usb", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_DeviceMange, NULL, uuid_DeveloperOption, 0, "org.tizen.setting.developeroptions"},
207 {KeyStr_AboutDevice, IMG_AboutDevice, "setting-about-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_System, NULL, uuid_AboutPhone, 0, NULL},
210 {KeyStr_Security, IMG_Security, "setting-security-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable, 0, Cfg_Item_Ug_Node, NULL, KeyStr_DeviceMange, NULL, uuid_Security, 0, NULL},
212 {KeyStr_DownloadedAPPs, NULL, "move://Tab6.top", Cfg_Item_Pos_Level0, 0, 0, Cfg_Item_Title_Node, NULL, NULL, NULL, uuid_APP, 0, NULL},
216 EXPORT_PUBLIC Setting_Cfg_Node_T *get_cfg_node_by_keystr(const char *keystr)
218 int size = get_cfg_array_size();
221 for (i = 0; i < size; i++) {
223 SETTING_TRACE("keystr: %s",keystr);
224 SETTING_TRACE("s_cfg_node_array[i].key_name: %s",s_cfg_node_array[i].key_name);
225 SETTING_TRACE("---------> _(keystr): %s",_(keystr));
226 SETTING_TRACE("---------> _(s_cfg_node_array[i].key_name): %s",_(s_cfg_node_array[i].key_name));
228 if (0 == safeStrCmp(_(keystr), _(s_cfg_node_array[i].key_name))) {
230 SETTING_TRACE("MATCH !!!!!!!!!!!!!!");
232 return &(s_cfg_node_array[i]);
238 EXPORT_PUBLIC int get_index_by_keystr(const char *keystr)
240 int size = get_cfg_array_size();
241 /*SETTING_TRACE(" size of array : %d ", size); */
244 /*SETTING_TRACE("keystr:%s", keystr); */
245 for (i = 0; i < size; i++) {
246 /*SETTING_TRACE("s_cfg_node_array[%d].key_name:%s", i, s_cfg_node_array[i].key_name); */
247 if (0 == safeStrCmp(keystr, s_cfg_node_array[i].key_name)) {
256 EXPORT_PUBLIC char *get_iconpath_by_keystr(const char *keystr)
258 int size = get_cfg_array_size();
261 /*SETTING_TRACE("keystr:%s", keystr); */
262 for (i = 0; i < size; i++) {
263 if (0 == safeStrCmp(keystr, _(s_cfg_node_array[i].key_name))) {
264 if (s_cfg_node_array[i].icon_path) {
265 return s_cfg_node_array[i].icon_path;
276 /* plistitem->title */
277 EXPORT_PUBLIC void *get_node_pointer(char *name)
279 int size = get_cfg_array_size();
282 for (i = 0; i < size; i++) {
283 if (0 == safeStrCmp(name, _(s_cfg_node_array[i].key_name))) {
284 return s_cfg_node_array[i].data;
291 EXPORT_PUBLIC int set_node_pointer(char *name, void *ptr)
293 int size = get_cfg_array_size();
296 for (i = 0; i < size; i++) {
297 if (0 == safeStrCmp(name, s_cfg_node_array[i].key_name)) {
299 s_cfg_node_array[i].data = ptr;
307 EXPORT_PUBLIC int set_cfg_node_tfunc(char *name, void *ptr)
309 int size = get_cfg_array_size();
312 for (i = 0; i < size; i++) {
313 if (0 == safeStrCmp(_(name), _(s_cfg_node_array[i].key_name))) {
315 s_cfg_node_array[i].tfunc = (cfg_func_table *)ptr;
323 EXPORT_PUBLIC int set_cfg_node_tfunc_set_ptr(char *name, int (*set_item_state)(Cfg_Item_State stat, void *item, void *data))
325 int size = get_cfg_array_size();
328 for (i = 0; i < size; i++) {
329 if (0 == safeStrCmp(_(name), _(s_cfg_node_array[i].key_name))) {
331 s_cfg_node_array[i].tfunc->set_item_state = set_item_state;
340 Setting_Cfg_Node_T *get_cfg_node_first()
342 return &s_cfg_node_array[0];
346 int get_cfg_array_size()
348 int arr_size = sizeof(s_cfg_node_array);
349 int node_size = sizeof(s_cfg_node_array[0]);
351 return arr_size / node_size;
367 int setting_cfg_create(bool check_ug_exist)
370 JsonNode *category_list, *category, *menu_item;
371 JsonArray *menu = NULL;
372 JsonObject *object = NULL;
375 category_list = json_node_new(JSON_NODE_ARRAY);
376 json_node_take_array(category_list, json_array_new());
378 Setting_Cfg_Node_T *pitem = get_cfg_node_first(); /* head */
379 int size = get_cfg_array_size();
380 SETTING_TRACE(" size of array : %d ", size);
383 for (i = 0; i < size; i++) {
384 /* Check Emul and block Wifi & Bluetooth menu */
386 (!safeStrCmp(pitem[i].key_name, KeyStr_Bluetooth) || !safeStrCmp(pitem[i].key_name, KeyStr_WiFi))) {
387 SETTING_TRACE("Skip %s", pitem[i].key_name);
391 SETTING_TRACE(" index : %d ", i);
392 Cfg_Item_Type item_type = pitem[i].item_type % 10;
393 if (item_type == Cfg_Item_Title_Node) {
394 SETTING_TRACE(" add title : %s ", pitem[i].key_name);
396 /* __create_a_menu HEADER */
397 __create_a_menu(pitem[i].key_name);
399 } else if (item_type == Cfg_Item_App_Node
400 || item_type == Cfg_Item_Ui_Node
401 || item_type == Cfg_Item_AppLauncher_Node) {
403 __create_an_item(pitem[i].key_name, pitem[i].icon_path, pitem[i].ug_args, pitem[i].shortcut_appid, pitem[i].pos, pitem[i].item_type, pitem[i].reset_type, false, pitem[i].uuid, pitem[i].click_times, pitem[i].last_clicked);
404 /*SETTING_TRACE(" add menu - name : %s (%d) - APP ", pitem[i].key_name,pitem[i].item_type); */
406 } else if (item_type == Cfg_Item_Ug_Node) {
408 __create_an_item(pitem[i].key_name, pitem[i].icon_path, pitem[i].ug_args, pitem[i].shortcut_appid, pitem[i].pos, pitem[i].item_type, pitem[i].reset_type, check_ug_exist, pitem[i].uuid, pitem[i].click_times, pitem[i].last_clicked);
409 /*SETTING_TRACE(" add menu - name : %s (%d) - UG ", pitem[i].key_name,pitem[i].item_type); */
413 int ret = setting_cfg_file_write(category_list);
414 json_node_free(category_list);
421 int setting_cfg_file_read(void)
424 memset(&sb, 0, sizeof(struct stat));
425 int r = stat(CFG_FILE_PATH, &sb);
427 SETTING_TRACE("ERROR, r:%d", r);
429 SETTING_TRACE("sb.st_size:%d", sb.st_size);
431 parser = json_parser_new(); /* to be freed on exit */
433 GError *error = NULL;
434 /*gboolean ret = json_parser_load_from_file( parser, CFG_FILE_PATH, &error ); */
435 if (!sb.st_size || FALSE == json_parser_load_from_file(parser, CFG_FILE_PATH, &error)) {
437 SETTING_TRACE_ERROR("error->message:%s", (char *)(error->message));
440 /* The file is existing and can be accessed normally, but it was
441 * loaded failed as a json script, it means setting.cfg is
442 * damaged(not the normal formatting ), we need to remove
443 * the file and recreate in next running time*/
444 SETTING_TRACE_ERROR("The file[%s] is existing and can be accessed "\
445 "normally, but it was 0 size or loaded failed as a json "\
446 "script, it means setting.cfg is damaged (the "\
447 "formatting ia abnormal), we need to remove the"\
448 " file and recreate in next running time!",
451 SETTING_TRACE("Trying to removing the damaged file.");
452 if (remove(CFG_FILE_PATH) != 0) {
453 SETTING_TRACE_ERROR("Error to remove the damaged file");
457 if (FALSE == setting_cfg_create(true)) {
458 SETTING_TRACE_ERROR("Error to create a new config file");
461 /*if the failed is caused by reading the file recursively invoking */
462 return setting_cfg_file_read();
466 root = json_parser_get_root(parser); /* to be freed on exit*/
471 * @brief dump JSON to file
474 int setting_cfg_file_write(JsonNode *node)
476 GError *error = NULL;
477 JsonGenerator *generator = json_generator_new();
478 json_generator_set_root(generator, node);
479 g_object_set(generator, "pretty", TRUE, NULL); /*write file in indent format */
480 gboolean ret = json_generator_to_file(generator, CFG_FILE_PATH, &error);
481 g_object_unref(generator);
483 /* ***BEGIN*** DAC black screen SAMSUNG 2010/8/9 add
485 *chown -R inhouse:inhouse /home/inhouse/setting.cfg
488 SETTING_TRACE_ERROR("Error writing file %s!", CFG_FILE_PATH);
494 /* public functions */
496 int setting_cfg_init(void)
498 if (!access(CFG_FILE_PATH, R_OK | W_OK | F_OK)) { /* succeed to access */
499 if (!setting_cfg_file_read()) { /* return FALSE */
500 if (remove(CFG_FILE_PATH)) {
501 return Cfg_Error_Type_RemoveCfg_Failed;
503 return Cfg_Error_Type_ReadCfg_Failed;
506 return Cfg_Error_Type_Sucess;
507 } else { /* fail to access */
509 /* file non-existing case */
511 SETTING_TRACE_ERROR("non-existing [%s]", CFG_FILE_PATH);
512 if (!ecore_file_is_dir(CFG_FILE_DIR_PATH)) {
513 SETTING_TRACE_ERROR("non-existing [%s]", CFG_FILE_DIR_PATH);
514 Eina_Bool flag = ecore_file_mkdir(CFG_FILE_DIR_PATH);
515 if (flag == EINA_FALSE) {
516 SETTING_TRACE_ERROR(">failed to create dir");
518 SETTING_TRACE_ERROR(">OK to create dir");
522 if (!setting_cfg_create(true)) { /* return FALSE */
523 SETTING_TRACE_ERROR("Error to create a new config file");
524 return Cfg_Error_Type_CreateCfg_Failed;
527 if (!setting_cfg_file_read()) { /* return FALSE */
528 SETTING_TRACE_ERROR("Error to read config file");
529 if (remove(CFG_FILE_PATH)) {
530 return Cfg_Error_Type_RemoveCfg_Failed;
532 return Cfg_Error_Type_ReadCfg_Failed;
535 return Cfg_Error_Type_Sucess;
540 return Cfg_Error_Type_DirPermissionDenied;
546 void setting_cfg_exit(void)
548 g_object_unref(parser);
552 int setting_cfg_file_update(void)
554 if (access(CFG_FILE_PATH, W_OK | F_OK) != 0) {
557 return setting_cfg_file_write(root);
560 static void _update_nodes_table_by_uuid(char *uuid, int click_times, int last_clicked)
562 int size = get_cfg_array_size();
565 for (i = 0; i < size; i++) {
566 if (0 == safeStrCmp(uuid, (s_cfg_node_array[i].uuid))) {
567 s_cfg_node_array[i].click_times = click_times;
568 s_cfg_node_array[i].last_clicked = last_clicked;
575 int setting_cfg_migrate(void)
577 /*1. read old cfg file */
579 memset(&sb, 0, sizeof(struct stat));
580 int r = stat(CFG_FILE_PATH, &sb);
582 SETTING_TRACE("ERROR, r:%d", r);
584 SETTING_TRACE("sb.st_size:%d", sb.st_size);
586 parser = json_parser_new();
587 GError *error = NULL;
588 if (!sb.st_size || FALSE == json_parser_load_from_file(parser, CFG_FILE_PATH, &error)) {
590 SETTING_TRACE_ERROR("error->message:%s", (char *)(error->message));
592 /*if read old cfg file unseccessfully, remove it */
593 SETTING_TRACE("Read old cfg fail, Trying to remove it");
594 if (remove(CFG_FILE_PATH) != 0) {
595 SETTING_TRACE_ERROR("Error to remove the damaged file");
597 /*re-create cfg file */
598 SETTING_TRACE("Trying to re-create cfg file.");
599 if (FALSE == setting_cfg_create(true)) {
600 SETTING_TRACE_ERROR("Error to create a new config file");
602 g_object_unref(parser);
605 root = json_parser_get_root(parser);
607 /*2. update click_times & last_clicked in s_cfg_node_array with old cfg */
608 int i, j, click_times, last_clicked;
609 JsonObject *category_obj;
611 JsonObject *menu_item;
613 for (i = 0; i < setting_cfg_get_category_length(); i++) {
614 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
615 category_obj = json_array_get_object_element(json_node_get_array(root), i);
616 menu = json_object_get_array_member(category_obj, "menu");
617 menu_item = json_array_get_object_element(menu, j);
618 uuid = (char *)json_object_get_string_member(menu_item, "uuid");
619 click_times = json_object_get_int_member(menu_item, "click_times");
620 last_clicked = json_object_get_int_member(menu_item, "last_clicked");
621 if (click_times != 0 || last_clicked != 0) {
622 _update_nodes_table_by_uuid(uuid, click_times, last_clicked);
627 /*3. create new cfg file */
628 if (!setting_cfg_create(true)) {
629 SETTING_TRACE_ERROR("fail to create new cfg file");
639 int setting_cfg_get_category_length(void)
641 return json_array_get_length(json_node_get_array(root));
645 char *setting_cfg_get_category_name(int category_index)
647 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
648 return (char *)json_object_get_string_member(category_obj, "name");
652 int setting_cfg_get_menu_length(int category_index)
654 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
655 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
656 return json_array_get_length(menu);
660 char *setting_cfg_get_keyname_idx(int category_index, int menu_index)
662 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
663 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
664 JsonObject *menu_item = json_array_get_object_element(menu, menu_index);
665 return (char *)json_object_get_string_member(menu_item, "key_name");
669 int setting_cfg_get_itemtype_idx(int category_index, int menu_index)
671 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
672 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
673 JsonObject *menu_item = json_array_get_object_element(menu, menu_index);
674 return json_object_get_int_member(menu_item, "item_type");
678 char *setting_cfg_get_string_field_idx(int category_index, int menu_index, char *field_name)
680 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
681 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
682 JsonObject *menu_item = json_array_get_object_element(menu, menu_index);
684 char *data = (char *)json_object_get_string_member(menu_item, field_name);
685 if (!safeStrCmp(data, "(null)")) { /* pass NULL to ug_args when create setting.cfg. */
692 int setting_cfg_get_int_field_idx(int category_index, int menu_index , char *field_name)
694 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
695 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
696 JsonObject *menu_item = json_array_get_object_element(menu, menu_index);
697 return json_object_get_int_member(menu_item, field_name);
701 char *setting_cfg_get_icon_path_idx(int category_index, int menu_index)
703 return setting_cfg_get_string_field_idx(category_index, menu_index, "icon_path");
707 char *setting_cfg_get_shortcut_appid_idx(int category_index, int menu_index)
709 return setting_cfg_get_string_field_idx(category_index, menu_index, "shortcut_appid");
713 char *setting_cfg_get_icon_path(char *keyname)
716 for (i = 0; i < setting_cfg_get_category_length(); i++) {
717 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
718 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0)
719 return setting_cfg_get_icon_path_idx(i, j);
726 char *setting_cfg_get_ug_args_idx(int category_index, int menu_index)
728 return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_args");
732 char *setting_cfg_get_ug_args(char *keyname)
735 for (i = 0; i < setting_cfg_get_category_length(); i++) {
736 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
737 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0)
738 return setting_cfg_get_ug_args_idx(i, j);
745 char *setting_cfg_get_ugpath_idx(int category_index, int menu_index)
747 return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_path");
751 char *setting_cfg_get_ugpath(char *keyname)
754 for (i = 0; i < setting_cfg_get_category_length(); i++) {
755 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
756 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0)
757 return setting_cfg_get_ugpath_idx(i, j);
764 int setting_cfg_get_pos_idx(int category_index, int menu_index)
766 return setting_cfg_get_int_field_idx(category_index, menu_index, "pos");
770 int setting_cfg_get_pos(char *keyname)
773 for (i = 0; i < setting_cfg_get_category_length(); i++) {
774 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
775 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0)
776 return setting_cfg_get_pos_idx(i, j);
783 void setting_cfg_set_pos_idx(int category_index, int menu_index, int pos)
785 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
786 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
787 JsonObject *menu_item = json_array_get_object_element(menu, menu_index);
788 json_object_remove_member(menu_item, "pos");
789 json_object_set_int_member(menu_item, "pos", pos);
793 void setting_cfg_set_pos(char *keyname, int pos)
796 for (i = 0; i < setting_cfg_get_category_length(); i++) {
797 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
798 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0) {
799 setting_cfg_set_pos_idx(i, j, pos);
808 int setting_cfg_get_last_clicked_idx(int category_index, int menu_index)
810 return setting_cfg_get_int_field_idx(category_index, menu_index, "last_clicked");
814 int setting_cfg_get_last_clicked(char *keyname)
817 for (i = 0; i < setting_cfg_get_category_length(); i++) {
818 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
819 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0)
820 return setting_cfg_get_last_clicked_idx(i, j);
827 void setting_cfg_set_last_clicked_idx(int category_index, int menu_index, int last_clicked)
829 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
830 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
831 JsonObject *menu_item = json_array_get_object_element(menu, menu_index);
832 json_object_remove_member(menu_item, "last_clicked");
833 json_object_set_int_member(menu_item, "last_clicked", last_clicked);
837 void setting_cfg_set_last_clicked(char *keyname, int last_clicked)
840 for (i = 0; i < setting_cfg_get_category_length(); i++) {
841 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
842 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0) {
843 setting_cfg_set_last_clicked_idx(i, j, last_clicked);
852 int setting_cfg_get_click_times_idx(int category_index, int menu_index)
854 return setting_cfg_get_int_field_idx(category_index, menu_index, "click_times");
858 int setting_cfg_get_click_times(char *keyname)
861 for (i = 0; i < setting_cfg_get_category_length(); i++) {
862 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
863 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0)
864 return setting_cfg_get_click_times_idx(i, j);
871 void setting_cfg_set_click_times_idx(int category_index, int menu_index, int click_times)
873 JsonObject *category_obj = json_array_get_object_element(json_node_get_array(root), category_index);
874 JsonArray *menu = json_object_get_array_member(category_obj, "menu");
875 JsonObject *menu_item = json_array_get_object_element(menu, menu_index);
876 json_object_remove_member(menu_item, "click_times");
877 json_object_set_int_member(menu_item, "click_times", click_times);
881 void setting_cfg_set_click_times(char *keyname, int click_times)
884 for (i = 0; i < setting_cfg_get_category_length(); i++) {
885 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
886 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0) {
887 setting_cfg_set_click_times_idx(i, j, click_times);
888 time_t ctime = time(NULL);
889 setting_cfg_set_last_clicked_idx(i, j, (int)ctime);
898 int setting_cfg_get_resetable_flag_idx(int category_index, int menu_index)
900 return setting_cfg_get_int_field_idx(category_index, menu_index,
905 void setting_cfg_add_downloaded_app(char *keyname, char *icon_path, char *ug_args, int pos)
912 for (i = 0; i < setting_cfg_get_category_length(); i++) {
913 if (safeStrCmp(setting_cfg_get_category_name(i), "Downloaded App") == 0) {
914 menu_item = json_node_new(JSON_NODE_OBJECT);
915 object = json_object_new();
916 json_node_take_object(menu_item, object);
917 json_object_set_string_member(object, "key_name", keyname);
918 json_object_set_string_member(object, "icon_path", icon_path);
919 json_object_set_string_member(object, "ug_args", ug_args);
920 json_object_set_int_member(object, "pos", pos);
922 object = json_array_get_object_element(json_node_get_array(root), i);
923 menu = json_object_get_array_member(object, "menu");
924 json_array_add_element(menu, menu_item);
929 void setting_cfg_remove_downloaded_app(char *keyname)
935 for (i = 0; i < setting_cfg_get_category_length(); i++) {
936 if (safeStrCmp(setting_cfg_get_category_name(i), "Downloaded App") == 0) {
937 for (j = 0; j < setting_cfg_get_menu_length(i); j++) {
938 if (safeStrCmp(setting_cfg_get_keyname_idx(i, j), keyname) == 0) {
939 object = json_array_get_object_element(json_node_get_array(root), i);
940 menu = json_object_get_array_member(object, "menu");
941 json_array_remove_element(menu, j);
950 bool is_ug_installed_by_ug_args(void *data)
952 retv_if(!data, TRUE);/*if passing NULL,drawing it */
953 char *ug_args = data;
954 char *path = get_ug_path_from_ug_args(ug_args);
955 int is_installed = ug_is_installed(path);
961 /*other relative function*/
963 char *get_ug_path_from_ug_args(void *data)
965 /*SETTING_TRACE_BEGIN;*/
966 char *p = (char *)data;
967 if (NULL == p || '\0' == p[0]) {
971 char *q = strchr(p, '|');
974 if (q) { /* copy out the content before '|'; eg, ab|cd */
975 path = (char *)calloc(1, q - p + 1);
976 setting_retvm_if(!path, NULL, "calloc failed");
977 safeCopyStr(path, p, q - p);
978 /* redundant handle */
980 } else { /* copy out all the content. eg.abb */
982 path = (char *)calloc(1, safeStrLen(p) + 1);
983 setting_retvm_if(!path, NULL, "calloc failed");
984 safeCopyStr(path, p, safeStrLen(p));
986 /*SETTING_TRACE("get the ug['%s']", path);*/
991 app_control_h get_bundle_from_ug_args(void *data)
993 /*SETTING_TRACE_BEGIN;*/
994 char *p = (char *)data;
995 if (NULL == p || '\0' == p[0]) {
999 char *q = strchr(p, '|');
1000 if (q) {/* (key, value) pairs exit. eg: ug_args = "sevenemail-setting-efl|caller:setting; cmd:main option" */
1003 if (app_control_create(&svc))
1005 int str_len = safeStrLen(p) + 1;
1006 char *v_key = (char *)calloc(1, str_len);
1008 app_control_destroy(svc);
1012 char *v_value = (char *)calloc(1, str_len);
1014 app_control_destroy(svc);
1022 if (q) { /* not the last field */
1023 m = strchr(p, ':'); /* ziduannei */
1025 safeCopyStr(v_key, p, m - p);
1028 safeCopyStr(v_value, m, q - m);
1030 ("To add ('%s', '%s') to bundle data",
1032 app_control_add_extra_data(svc, v_key, v_value);
1035 ("invalid key-value format!!\n");
1036 break; /* end the whole while */
1038 } else { /* the last field */
1040 m = strchr(p, ':'); /* ziduannei */
1042 safeCopyStr(v_key, p, m - p);
1044 safeCopyStr(v_value, m, safeStrLen(m));
1046 app_control_add_extra_data(svc, v_key, v_value);
1049 ("invalid key-value format!!\n");
1051 break; /* end the whole while */
1054 memset(v_key, '\0', str_len);
1055 memset(v_value, '\0', str_len);
1062 } else { /* eg: ug_args = "setting-browser-efl" */
1064 /*SETTING_TRACE("(key, value) pairs not exit");*/
1070 EXPORT_PUBLIC void setting_cfg_dump_basic_info()
1073 bool fileExit = (0 == access(CFG_FILE_PATH, R_OK | W_OK | F_OK));
1074 SETTING_TRACE("%s's exist:%d", CFG_FILE_PATH, fileExit);
1077 memset(&sb, 0, sizeof(struct stat));
1078 int r = stat(CFG_FILE_PATH, &sb);
1080 SETTING_TRACE("ERROR, r:%d", r);
1082 SETTING_TRACE("sb.st_size:%d", sb.st_size);
1088 * @brief helper function for search
1098 EXPORT_PUBLIC Setting_Cfg_Node_T *setting_plugin_search_item_add(char *key_name, char *url, char *icon_path, int item_type, void *data)
1100 Setting_Cfg_Node_T *node = calloc(1, sizeof(Setting_Cfg_Node_T));
1102 if (key_name) node->key_name = strdup(key_name);
1103 if (url) node->ug_args = strdup(url);
1104 if (icon_path) node->icon_path = strdup(icon_path);
1106 node->reset_type = 0;
1107 node->click_times = 0;
1108 node->item_type = item_type;
1110 node->sub_index = NULL;
1116 EXPORT_PUBLIC Setting_Cfg_Node_T *setting_plugin_search_item_subindex_add(char *key_name, char *url, char *icon_path, int item_type, void *data, char *sub_index)
1118 Setting_Cfg_Node_T *node = calloc(1, sizeof(Setting_Cfg_Node_T));
1120 if (key_name) node->key_name = strdup(key_name);
1121 if (url) node->ug_args = strdup(url);
1122 if (icon_path) node->icon_path = strdup(icon_path);
1124 node->reset_type = 0;
1125 node->click_times = 0;
1126 node->item_type = item_type;
1128 if (sub_index) node->sub_index = strdup(sub_index);
1134 EXPORT_PUBLIC Cfg_Item_Type setting_search_type(char *type)
1136 Cfg_Item_Type ret_code = Cfg_Item_Node_Error;
1138 if (!safeStrCmp(type, SEARCH_TYPE_ERROR))
1139 ret_code = Cfg_Item_Node_Error;
1140 else if (!safeStrCmp(type, SEARCH_TYPE_UG_NODE))
1141 ret_code = Cfg_Item_Ug_Node;
1142 else if (!safeStrCmp(type, SEARCH_TYPE_UI_NODE))
1143 ret_code = Cfg_Item_Ui_Node;
1144 else if (!safeStrCmp(type, SEARCH_TYPE_TITLE_NODE))
1145 ret_code = Cfg_Item_Title_Node;
1146 else if (!safeStrCmp(type, SEARCH_TYPE_APP_NODE))
1147 ret_code = Cfg_Item_App_Node;
1148 else if (!safeStrCmp(type, SEARCH_TYPE_VIEW_NODE))
1149 ret_code = Cfg_Item_View_Node;
1150 else if (!safeStrCmp(type, SEARCH_TYPE_APPLAUNCHER_NODE))
1151 ret_code = Cfg_Item_AppLauncher_Node;
1152 else if (!safeStrCmp(type, SEARCH_TYPE_APPLAUNCHER_VIEW_NODE))
1153 ret_code = Cfg_Item_AppLauncher_View_Node;
1154 else if (!safeStrCmp(type, SEARCH_TYPE_UG_NODE_TOGGLE))
1155 ret_code = Cfg_Item_Ug_Node_Toggle;
1156 else if (!safeStrCmp(type, SEARCH_TYPE_UI_NODE_TOGGLE))
1157 ret_code = Cfg_Item_Ui_Node_Toggle;
1158 else if (!safeStrCmp(type, SEARCH_TYPE_APPLAUNCHER_NODE_TOGGLE))
1159 ret_code = Cfg_Item_AppLauncher_Node_Toggle;
1160 else if (!safeStrCmp(type, SEARCH_TYPE_VIEW_NODE_TOGGLE))
1161 ret_code = Cfg_Item_View_Node_Toggle;
1167 /*////////////////////////////////////////////////////////////////////////// */
1169 * @return 0 on success, -1 on error
1172 int wifi_toggle_get_state(Cfg_Item_State *stat, void *data)
1174 SETTING_TRACE_BEGIN;
1177 setting_get_int_slp_key(INT_SLP_SETTING_WIFI_STATUS, &value, &err);
1179 if (value == VCONFKEY_WIFI_OFF)
1180 *stat = Cfg_Item_Off;
1182 *stat = Cfg_Item_On;
1188 int flightmode_toggle_get_state(Cfg_Item_State *stat, void *data)
1190 SETTING_TRACE_BEGIN;
1193 setting_get_bool_slp_key(BOOL_SLP_SETTING_FLIGHT_MODE, &value, &err);
1196 *stat = Cfg_Item_On;
1198 *stat = Cfg_Item_Off;
1205 int bluetooth_toggle_get_state(Cfg_Item_State *stat, void *data)
1207 SETTING_TRACE_BEGIN;
1210 setting_get_int_slp_key(INT_SLP_SETTING_BT_STATUS, &value, &err);
1213 *stat = Cfg_Item_On;
1215 *stat = Cfg_Item_Off;
1222 int drivingmode_toggle_get_state(Cfg_Item_State *stat, void *data)
1224 SETTING_TRACE_BEGIN;
1226 *stat = Cfg_Item_Off;
1229 int ret = vconf_get_bool(VCONFKEY_SETAPPL_DM_DRIVING_MODE, &value);
1231 SETTING_TRACE_ERROR("get vconf failed");
1232 *stat = Cfg_Item_Error;
1236 *stat = (value) ? Cfg_Item_On : Cfg_Item_Off;
1241 int network_restriction_mode_toggle_get_state(Cfg_Item_State *stat, void *data)
1243 SETTING_TRACE_BEGIN;
1246 setting_get_bool_slp_key(BOOL_SLP_SETTING_NET_RESTRICTION_MODE, &value, &err);
1249 *stat = Cfg_Item_On;
1251 *stat = Cfg_Item_Off;
1256 /*////////////////////////////////////////////////////////////////////////// */
1260 int personalmode_toggle_get_state(Cfg_Item_State *stat, void *data)
1262 SETTING_TRACE_BEGIN;
1264 *stat = Cfg_Item_Off;
1267 int ret = vconf_get_bool(VCONFKEY_SETAPPL_PERSONAL_MODE_STATUS_BOOL, &value);
1269 SETTING_TRACE_ERROR("get vconf failed");
1270 *stat = Cfg_Item_Error;
1274 *stat = (value) ? Cfg_Item_On : Cfg_Item_Off;
1278 /*////////////////////////////////////////////////////////////////////////// */
1282 int nfc_toggle_get_state(Cfg_Item_State *stat, void *data)
1284 SETTING_TRACE_BEGIN;
1287 setting_get_bool_slp_key(BOOL_SLP_SETTING_NFC_STATUS, &value, &err);
1290 *stat = Cfg_Item_On;
1292 *stat = Cfg_Item_Off;