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>
29 #define CFG_FILE_DIR_PATH "/opt/data/setting/"
30 #define CFG_FILE_PATH CFG_FILE_DIR_PATH"setting.cfg"
33 JsonNode* root; /* category_list */
35 char* setting_cfg_get_path()
40 int setting_cfg_file_write( JsonNode * node );
42 #define __create_an_item(item_name, icon_path, ug_args, defaultPos, is_resetable) do\
44 if (!is_ug_installed_by_ug_args(ug_args)) break;\
45 menu_item = json_node_new(JSON_NODE_OBJECT); \
46 object = json_object_new(); \
47 json_node_take_object(menu_item, object); \
48 json_object_set_string_member(object, "key_name", item_name); \
49 json_object_set_string_member(object, "icon_path", icon_path); \
50 json_object_set_string_member(object, "ug_args", ug_args); \
51 json_object_set_int_member(object, "pos", defaultPos); \
52 json_object_set_int_member(object, "click_times", 0); \
53 json_object_set_int_member(object, "is_resetable", is_resetable); \
54 json_array_add_element(menu, menu_item); \
57 #define __create_an_item_by_pkg(item_name, pkg_name, ug_args, defaultPos, is_resetable) do\
59 if (!is_ug_installed_by_ug_args(ug_args)) break;\
60 menu_item = json_node_new(JSON_NODE_OBJECT); \
61 object = json_object_new(); \
62 char* __temp_##item_name = get_icon_path(pkg_name); \
63 json_node_take_object(menu_item, object); \
64 json_object_set_string_member(object, "key_name", item_name); \
65 json_object_set_string_member(object, "icon_path", __temp_##item_name); \
66 json_object_set_string_member(object, "ug_args", ug_args); \
67 json_object_set_int_member(object, "pos", defaultPos); \
68 json_object_set_int_member(object, "click_times", 0); \
69 json_object_set_int_member(object, "is_resetable", is_resetable); \
70 json_array_add_element(menu, menu_item); \
71 free(__temp_##item_name); __temp_##item_name = NULL; \
75 #define __create_a_menu(menu_name)\
77 category = json_node_new( JSON_NODE_OBJECT );\
78 object = json_object_new();\
79 json_node_take_object ( category, object );\
80 json_object_set_string_member( object, "name", menu_name );\
81 menu = json_array_new();\
82 json_object_set_array_member( object, "menu", menu );\
83 json_array_add_element( json_node_get_array( category_list ), category );\
86 void setting_cfg_print( void )
88 JsonNode * node = root;
90 JsonGenerator *generator = json_generator_new ();
91 g_object_set( generator, "pretty", TRUE, NULL );
92 json_generator_set_root ( generator, node );
93 gchar *data = json_generator_to_data ( generator, NULL );
94 SETTING_TRACE( "%s", (char *)data );
97 g_object_unref(generator);
100 /* create config file from scratch */
101 int setting_cfg_create(void)
103 JsonNode *category_list, *category, *menu_item;
108 category_list = json_node_new (JSON_NODE_ARRAY);
109 json_node_take_array ( category_list, json_array_new () );
112 __create_a_menu(KeyStr_Connectivity);
114 __create_an_item(KeyStr_FlightMode, IMG_FlightMode, NULL, Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
115 __create_an_item(KeyStr_WiFi, IMG_WiFi, "wifi-efl-UG", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
116 __create_an_item(KeyStr_MobileAP, IMG_MobileAP, "setting-mobile-ap-ug", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
117 __create_an_item(KeyStr_Location, IMG_Location, "setting-location-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
118 __create_an_item(KeyStr_Network, IMG_Network, "setting-network-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
119 __create_an_item(KeyStr_Bluetooth, IMG_Bluetooth, "setting-bluetooth-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
120 __create_an_item(KeyStr_NFC, IMG_NFC, "setting-nfc-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
122 #if SUPPORT_DATA_USAGE
123 __create_an_item(KeyStr_DataUsage, IMG_DataUsage, "setting-datausage-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
126 #if SUPPORT_WIFI_DIRECT
127 __create_an_item(KeyStr_WiFiDirect, IMG_WiFiDirect, "setting-wifidirect-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
130 #if SUPPORT_ALLSHARECAST
131 // Allshare Cast -- Here
132 __create_an_item(KeyStr_AllShareCast, IMG_AllShareCast, "setting-allshare-cast-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
137 __create_an_item(KeyStr_NearbyDevices, IMG_AllShare, "setting-allshare-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
140 if ( ! is_slp_binary()) {
141 __create_an_item(KeyStr_KeisOverWifi, IMG_KeisOverWifi, "kies-via-wifi", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
144 if ( ! is_slp_binary()) {
145 __create_an_item(KeyStr_Synchronise, IMG_Synchronise, "setting-synchronise-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
149 __create_a_menu(KeyStr_System);
152 __create_an_item(KeyStr_EventsNotifications, IMG_EventsNotifications, "setting-phone-efl|viewtype:notification", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
155 #if SUPPORT_WALLPAPER
156 /* kinds of wallpaper version.. */
157 __create_an_item(KeyStr_Wallpaper, IMG_Wallpaper, "setting-display-efl|viewtype:wallpaper", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
160 __create_an_item(KeyStr_Sounds, IMG_Sounds, "setting-profile-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
162 #if SUPPOR_SEPARATE_BRIGHTNESS
163 __create_an_item(KeyStr_Brightness, IMG_Brightness, "setting-display-efl|viewtype:brightness", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
166 __create_an_item(KeyStr_Security, IMG_Security, "setting-security-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
168 #if SUPPORT_POWERSAVING
169 __create_an_item(KeyStr_Powersaving, IMG_Powersaving, "setting-powersaving-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
173 __create_an_item(KeyStr_Motions, IMG_Motion, "setting-motion-efl|viewtype:motions", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
176 #if SUPPORT_ACCESSIBILITY
177 __create_an_item(KeyStr_Accessibility, IMG_Accessibility, "setting-accessibility-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
181 __create_an_item(KeyStr_Font, IMG_Font, "setting-font-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
184 __create_an_item(KeyStr_Display, IMG_Dispaly, "setting-display-efl|viewtype:main", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
185 #if SUPPORT_MENUSCREEN
186 __create_an_item(KeyStr_Menuscreen, IMG_Menuscreen, "setting-homescreen-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
188 __create_an_item(KeyStr_Landscape, IMG_Landscape, NULL, Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
189 __create_an_item(KeyStr_DateTime, IMG_DateTime, "setting-time-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
190 __create_an_item(KeyStr_LanguageRegion, IMG_DisplayLanguage, "setting-phone-efl|viewtype:language", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
191 __create_an_item(KeyStr_KeyboradLanguage, IMG_KeyboradLanguage, "isfsetting-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
193 #if SUPPORT_VOICEINOUT
194 __create_an_item(KeyStr_VoiceInOut, IMG_VoiceInOut, "setting-voice-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
196 __create_an_item(keystr_Drivingmode, IMG_DrivingMode, "setting-drivingmode-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
198 __create_an_item(KeyStr_Storage, IMG_DefaultIcon, "setting-storage-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
200 __create_an_item(KeyStr_ManageApps, IMG_MANAGE_APPS, "setting-manage-applications-efl|viewtype:manage-applications", Cfg_Item_Pos_Level1,
203 __create_an_item(KeyStr_WebApps, IMG_Web_Apps, "webapp-common-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
205 #if SUPPORT_CERTIFICATES
206 __create_an_item(KeyStr_CertUI, IMG_MANAGE_APPS, "setting-manage-certificates-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
209 __create_an_item(KeyStr_Memory, IMG_Memory, "setting-memory-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
210 __create_an_item(KeyStr_Reset, IMG_Reset, "setting-reset-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
211 __create_an_item(KeyStr_DeveloperOption, IMG_USBconnection, "setting-developeroption-efl|viewtype:usb", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
212 __create_an_item(KeyStr_AboutPhone, IMG_AboutPhone, "setting-about-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
215 __create_a_menu(KeyStr_Applications);
217 __create_an_item(KeyStr_Accounts, IMG_Accounts, "setting-myaccount-efl|mode:account_list", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
218 __create_an_item(KeyStr_Call, IMG_Call, "setting-call-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
219 __create_an_item(KeyStr_Messages, IMG_Messages, "msg-setting-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
220 __create_an_item(KeyStr_Email, IMG_Email, "email-setting-efl|VIEW_TYPE:main-view", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
221 __create_an_item(KeyStr_Contacts, IMG_Contacts, "contacts-settings-efl|request_type:71", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
223 __create_an_item(KeyStr_Calendar, IMG_Calendar, "calendar-settings-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
225 __create_an_item(KeyStr_Gallery, IMG_Gallery, "setting-gallery-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
226 __create_an_item(KeyStr_VoiceRecorder, IMG_VoiceRecorder, "setting-voicerecorder-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
230 __create_an_item_by_pkg(KeyStr_FMRadio, "com.samsung.fm-radio", "setting-fmradio-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
231 SETTING_TRACE_DEBUG("Added FMRadio");
240 __create_an_item_by_pkg(KeyStr_NFC, "com.samsung.nfc-app", "setting-nfc-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
244 __create_a_menu(KeyStr_DownloadedAPPs);
247 int ret = setting_cfg_file_write( category_list );
249 json_node_free( category_list );
256 int setting_cfg_file_read( void )
259 if (access( CFG_FILE_PATH, R_OK|F_OK ) !=0 )
261 SETTING_TRACE("file [%s] not legal, need to check your file-system.[%s:%d]\n", CFG_FILE_PATH, __FILE__, __LINE__);
262 //return Cfg_Error_Type_FilePermissionDenied;
266 parser = json_parser_new (); /* to be freed on exit */
269 GError *error = NULL;
270 gboolean ret = json_parser_load_from_file( parser, CFG_FILE_PATH, &error );
276 SETTING_TRACE_ERROR("error->message:%s", (char*)(error->message));
278 /* The file is existing and can be accessed normally, but it was
279 * loaded failed as a json script, it means setting.cfg is
280 * damaged(not the normal formatting ), we need to remove
281 * the file and recreate in next running time*/
282 SETTING_TRACE_ERROR("The file[%s] is existing and can be accessed "\
283 "normally, but it was loaded failed as a json "\
284 "script, it means setting.cfg is damaged (the "\
285 "formatting ia abnormal), we need to remove the"\
286 " file and recreate in next running time!",
289 SETTING_TRACE("Trying to removing the damaged file.");
290 if (remove(CFG_FILE_PATH) != 0)
292 SETTING_TRACE_ERROR("Error to remove the damaged file");
296 if( FALSE == setting_cfg_create() )
298 SETTING_TRACE_ERROR("Error to create a new config file");
301 /*if the failed is caused by reading the file recursively invoking */
302 return setting_cfg_file_read();
307 root = json_parser_get_root( parser ); /* to be freed on exit*/
312 * @brief dump JSON to file
314 int setting_cfg_file_write( JsonNode * node )
316 GError *error = NULL;
317 JsonGenerator *generator = json_generator_new ();
318 json_generator_set_root ( generator, node );
319 g_object_set( generator, "pretty", TRUE, NULL ); //write file in indent format
320 gboolean ret = json_generator_to_file( generator, CFG_FILE_PATH, &error );
321 g_object_unref(generator);
323 /* ***BEGIN*** DAC black screen SAMSUNG 2010/8/9 add
325 *chown -R inhouse:inhouse /home/inhouse/setting.cfg
329 SETTING_TRACE_ERROR("Error writing file %s!", CFG_FILE_PATH );
335 /* public functions */
337 int setting_cfg_init( void )
344 if (access( CFG_FILE_DIR_PATH, R_OK|W_OK|F_OK ) !=0 )
346 SETTING_TRACE_ERROR("dir [%s] not legal, need to check your file-system.[%s:%d]\n", CFG_FILE_DIR_PATH, __FILE__, __LINE__);
347 return Cfg_Error_Type_DirPermissionDenied;
349 if( stat(CFG_FILE_DIR_PATH, &st) != 0)/* to make more stable */
351 /* if (0 != system("sudo mkdir /opt/data/setting/")); */
352 /* if (EINA_TRUE != ecore_file_mkpath(CFG_FILE_DIR_PATH)); */
353 if (EINA_TRUE != ecore_file_mkdir(CFG_FILE_DIR_PATH));
356 return Cfg_Error_Type_Mkdir_Failed;
360 if( stat(CFG_FILE_PATH, &st) != 0)
362 SETTING_TRACE_ERROR("Config file doesn't exist. Create it!");
363 if( FALSE == setting_cfg_create() )
365 /* perror("setting_cfg_create"); */
366 return Cfg_Error_Type_CreateCfg_Failed;
368 stat(CFG_FILE_PATH, &st);
370 /* ***BEGIN*** error handle(caused by unstable file system) SAMSUNG 2010/9/10 add*/
371 else if (0 == st.st_size ||
372 0 != access( CFG_FILE_PATH, R_OK|F_OK ))
374 SETTING_TRACE("the %s is 0 Byte, we need to recreate it.", CFG_FILE_PATH);
375 /* delete the file */
376 if (remove(CFG_FILE_PATH) != 0)
379 return Cfg_Error_Type_RemoveCfg_Failed;
381 if( FALSE == setting_cfg_create() )
383 /* perror("setting_cfg_create"); */
384 return Cfg_Error_Type_CreateCfg_Failed;
388 /* ****END**** error handle(caused by unstable file system) SAMSUNG 2010/9/10 add
389 * cfg file exists but invalid -> re-create
390 * load file into parser
392 if( FALSE == setting_cfg_file_read() )
394 /* remove current setting file */
395 if (remove(CFG_FILE_PATH) != 0)
397 /* perror("remove"); */
398 return Cfg_Error_Type_RemoveCfg_Failed;
400 return Cfg_Error_Type_ReadCfg_Failed;
403 return Cfg_Error_Type_Sucess;
407 int setting_cfg_init( void )
411 if (!access(CFG_FILE_PATH, R_OK|W_OK|F_OK )) { // succeed to access
412 if(!setting_cfg_file_read()) { // return FALSE
413 if (remove(CFG_FILE_PATH)) {
414 return Cfg_Error_Type_RemoveCfg_Failed;
416 return Cfg_Error_Type_ReadCfg_Failed;
419 return Cfg_Error_Type_Sucess;
420 } else { // fail to access
422 // file non-existing case
424 SETTING_TRACE_ERROR("non-existing file/dir");
425 ecore_file_mkdir(CFG_FILE_DIR_PATH);
426 if (!setting_cfg_create()) { // return FALSE
427 SETTING_TRACE_ERROR("Error to create a new config file");
428 return Cfg_Error_Type_CreateCfg_Failed;
430 if(!setting_cfg_file_read() ) { // return FALSE
431 if (remove(CFG_FILE_PATH)) {
432 return Cfg_Error_Type_RemoveCfg_Failed;
434 return Cfg_Error_Type_ReadCfg_Failed;
437 return Cfg_Error_Type_Sucess;
442 return Cfg_Error_Type_DirPermissionDenied;
447 void setting_cfg_exit( void )
449 json_node_free(root);
450 g_object_unref (parser);
453 int setting_cfg_file_update( void )
455 if (access( CFG_FILE_PATH, W_OK|F_OK ) !=0 )
459 return setting_cfg_file_write( root );
462 int setting_cfg_get_category_length( void )
464 return json_array_get_length( json_node_get_array( root ) );
467 char* setting_cfg_get_category_name( int category_index )
469 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
470 return (char*)json_object_get_string_member( category_obj, "name" );
473 int setting_cfg_get_menu_length( int category_index )
475 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
476 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
477 return json_array_get_length( menu );
480 char * setting_cfg_get_keyname_idx( int category_index, int menu_index )
482 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
483 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
484 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
485 return (char*)json_object_get_string_member( menu_item, "key_name" );
488 char * setting_cfg_get_string_field_idx( int category_index, int menu_index, char *field_name)
490 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
491 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
492 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
494 char *data = (char *)json_object_get_string_member( menu_item, field_name );
495 if (!safeStrCmp(data, "(null)"))/* pass NULL to ug_args when create setting.cfg. */
502 int setting_cfg_get_int_field_idx( int category_index, int menu_index , char *field_name)
504 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
505 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
506 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
507 return json_object_get_int_member( menu_item, field_name );
510 char * setting_cfg_get_icon_path_idx( int category_index, int menu_index )
512 return setting_cfg_get_string_field_idx(category_index, menu_index, "icon_path");
515 char * setting_cfg_get_ug_args_idx( int category_index, int menu_index )
517 return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_args");
520 char * setting_cfg_get_ugpath_idx( int category_index, int menu_index )
522 return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_path");
525 char * setting_cfg_get_ugpath( char * keyname )
528 for( i = 0; i < setting_cfg_get_category_length(); i++ )
530 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
532 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
533 return setting_cfg_get_ugpath_idx( i, j );
539 int setting_cfg_get_pos_idx( int category_index, int menu_index )
541 return setting_cfg_get_int_field_idx(category_index, menu_index, "pos");
544 int setting_cfg_get_pos( char * keyname )
547 for( i = 0; i < setting_cfg_get_category_length(); i++ )
549 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
551 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
552 return setting_cfg_get_pos_idx( i, j );
558 void setting_cfg_set_pos_idx( int category_index, int menu_index, int pos )
560 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
561 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
562 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
563 json_object_remove_member( menu_item, "pos" );
564 json_object_set_int_member( menu_item, "pos", pos );
567 void setting_cfg_set_pos( char * keyname, int pos )
570 for( i = 0; i < setting_cfg_get_category_length(); i++ )
572 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
574 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
576 setting_cfg_set_pos_idx( i, j, pos );
584 int setting_cfg_get_click_times_idx( int category_index, int menu_index )
586 return setting_cfg_get_int_field_idx(category_index, menu_index, "click_times");
589 int setting_cfg_get_click_times( char * keyname )
592 for( i = 0; i < setting_cfg_get_category_length(); i++ )
594 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
596 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
597 return setting_cfg_get_click_times_idx( i, j );
603 void setting_cfg_set_click_times_idx( int category_index, int menu_index, int click_times )
605 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
606 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
607 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
608 json_object_remove_member( menu_item, "click_times" );
609 json_object_set_int_member( menu_item, "click_times", click_times );
612 void setting_cfg_set_click_times( char * keyname, int click_times )
615 for( i = 0; i < setting_cfg_get_category_length(); i++ )
617 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
619 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
621 setting_cfg_set_click_times_idx( i, j, click_times );
629 int setting_cfg_get_resetable_flag_idx(int category_index, int menu_index)
631 return setting_cfg_get_int_field_idx(category_index, menu_index,
635 void setting_cfg_add_downloaded_app( char *keyname, char *icon_path, char *ug_args, int pos)
642 for( i=0; i<setting_cfg_get_category_length(); i++ )
644 if( safeStrCmp( setting_cfg_get_category_name(i), "Downloaded App" ) == 0 )
646 menu_item = json_node_new( JSON_NODE_OBJECT );
647 object = json_object_new();
648 json_node_take_object ( menu_item, object );
649 json_object_set_string_member( object, "key_name", keyname );
650 json_object_set_string_member( object, "icon_path", icon_path );
651 json_object_set_string_member( object, "ug_args", ug_args );
652 json_object_set_int_member( object, "pos", pos );
654 object = json_array_get_object_element( json_node_get_array( root ), i );
655 menu = json_object_get_array_member( object, "menu" );
656 json_array_add_element( menu, menu_item );
661 void setting_cfg_remove_downloaded_app( char * keyname )
667 for( i = 0; i < setting_cfg_get_category_length(); i++ )
669 if( safeStrCmp( setting_cfg_get_category_name(i), "Downloaded App" ) == 0 )
671 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
673 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
675 object = json_array_get_object_element( json_node_get_array( root ), i );
676 menu = json_object_get_array_member( object, "menu" );
677 json_array_remove_element( menu, j );
685 bool is_ug_installed_by_ug_args(void *data)
687 retv_if(!data, TRUE);//if passing NULL,drawing it
688 char* ug_args = data;
689 char *ug_name = get_ug_path_from_ug_args(ug_args);
691 char ug_file_opt[PATH_MAX];
692 if (snprintf(ug_file_opt, PATH_MAX, "%s/libug-%s.so", SETTING_UG_PATH, ug_name) < 0)
696 bool result_opt = false;
698 if(stat(ug_file_opt, &st) == 0) {
701 SETTING_TRACE_ERROR(" %s is *NOT* present\n", ug_file_opt);
705 //-------------------------------------------------------------------------------------
706 char ug_file_usr[PATH_MAX];
707 bool result_usr = false;
708 if (snprintf(ug_file_usr, PATH_MAX, "%s/libug-%s.so", SETTING_UG_PATH_USR, ug_name) < 0)
711 if(stat(ug_file_usr, &st) == 0) {
714 SETTING_TRACE_ERROR(" %s is *NOT* present\n", ug_file_usr);
718 // false & false --> false
719 // true & false --> true
720 // false & true --> true
721 // true & true --> true
723 return (result_usr || result_opt);
726 /*other relative function*/
727 char *get_ug_path_from_ug_args(void *data)
729 /*SETTING_TRACE_BEGIN;*/
730 char *p = (char *)data;
731 if (NULL == p || '\0' == p[0]) {
735 char *q = strchr(p, '|');
738 if (q) { /* copy out the content before '|'; eg, ab|cd */
739 path = (char *)calloc(1, q - p + 1);
740 setting_retvm_if(!path, NULL, "calloc failed");
741 safeCopyStr(path, p, q - p);
742 /* redundant handle */
744 } else { /* copy out all the content. eg.abb */
746 path = (char *)calloc(1, safeStrLen(p) + 1);
747 setting_retvm_if(!path, NULL, "calloc failed");
748 safeCopyStr(path, p, safeStrLen(p));
750 /*SETTING_TRACE("get the ug['%s']", path);*/
754 service_h get_bundle_from_ug_args(void *data)
756 /*SETTING_TRACE_BEGIN;*/
757 char *p = (char *)data;
758 if (NULL == p || '\0' == p[0]) {
762 char *q = strchr(p, '|');
763 if (q) { /* (key, value) pairs exit. eg: ug_args = "sevenemail-setting-efl|caller:setting; cmd:main option" */
766 if (service_create(&svc))
768 int str_len = safeStrLen(p) + 1;
769 char *v_key = (char *)calloc(1, str_len);
771 service_destroy(svc);
775 char *v_value = (char *)calloc(1, str_len);
777 service_destroy(svc);
785 if (q) { /* not the last field */
786 m = strchr(p, ':'); /* ziduannei */
788 safeCopyStr(v_key, p, m - p);
791 safeCopyStr(v_value, m, q - m);
793 ("To add ('%s', '%s') to bundle data",
795 service_add_extra_data(svc, v_key, v_value);
798 ("invalid key-value format!!\n");
799 break; /* end the whole while */
801 } else { /* the last field */
803 m = strchr(p, ':'); /* ziduannei */
805 safeCopyStr(v_key, p, m - p);
807 safeCopyStr(v_value, m, safeStrLen(m));
809 service_add_extra_data(svc, v_key, v_value);
812 ("invalid key-value format!!\n");
814 break; /* end the whole while */
817 memset(v_key, '\0', str_len);
818 memset(v_value, '\0', str_len);
825 } else { /* eg: ug_args = "setting-browser-efl" */
827 /*SETTING_TRACE("(key, value) pairs not exit");*/