2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <setting-cfg.h>
20 #include <setting-debug.h>
22 #include <Elementary.h>
23 #include <setting-common-general-func.h>
25 #include <vconf-keys.h>
27 #define CFG_FILE_DIR_PATH "/opt/data/setting/"
28 #define CFG_FILE_PATH CFG_FILE_DIR_PATH"setting.cfg"
31 JsonNode* root; /* category_list */
33 int setting_cfg_file_write( JsonNode * node );
35 #define __create_an_item(item_name, icon_path, ug_args, defaultPos, is_resetable)\
37 menu_item = json_node_new(JSON_NODE_OBJECT); \
38 object = json_object_new(); \
39 json_node_take_object(menu_item, object); \
40 json_object_set_string_member(object, "key_name", item_name); \
41 json_object_set_string_member(object, "icon_path", icon_path); \
42 json_object_set_string_member(object, "ug_args", ug_args); \
43 json_object_set_int_member(object, "pos", defaultPos); \
44 json_object_set_int_member(object, "click_times", 0); \
45 json_object_set_int_member(object, "is_resetable", is_resetable); \
46 json_array_add_element(menu, menu_item); \
49 #define __create_an_item_by_pkg(item_name, pkg_name, ug_args, defaultPos, is_resetable)\
51 menu_item = json_node_new(JSON_NODE_OBJECT); \
52 object = json_object_new(); \
53 char* __temp_##item_name = get_icon_path(pkg_name); \
54 json_node_take_object(menu_item, object); \
55 json_object_set_string_member(object, "key_name", item_name); \
56 json_object_set_string_member(object, "icon_path", __temp_##item_name); \
57 json_object_set_string_member(object, "ug_args", ug_args); \
58 json_object_set_int_member(object, "pos", defaultPos); \
59 json_object_set_int_member(object, "click_times", 0); \
60 json_object_set_int_member(object, "is_resetable", is_resetable); \
61 json_array_add_element(menu, menu_item); \
62 free(__temp_##item_name); __temp_##item_name = NULL; \
66 #define __create_a_menu(menu_name)\
68 category = json_node_new( JSON_NODE_OBJECT );\
69 object = json_object_new();\
70 json_node_take_object ( category, object );\
71 json_object_set_string_member( object, "name", menu_name );\
72 menu = json_array_new();\
73 json_object_set_array_member( object, "menu", menu );\
74 json_array_add_element( json_node_get_array( category_list ), category );\
77 void setting_cfg_print( void )
79 JsonNode * node = root;
81 JsonGenerator *generator = json_generator_new ();
82 g_object_set( generator, "pretty", TRUE, NULL );
83 json_generator_set_root ( generator, node );
84 gchar *data = json_generator_to_data ( generator, NULL );
85 SETTING_TRACE( "%s", (char *)data );
88 g_object_unref(generator);
91 /* create config file from scratch */
92 int setting_cfg_create(void)
94 JsonNode *category_list, *category, *menu_item;
102 category_list = json_node_new (JSON_NODE_ARRAY);
103 json_node_take_array ( category_list, json_array_new () );
106 __create_a_menu(KeyStr_Connectivity);
107 __create_an_item(KeyStr_WiFi, IMG_WiFi, "wifi-efl-UG", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
109 ret = vconf_get_bool(VCONFKEY_NFC_FEATURE, &support_nfc);
110 if((ret != -1) && (support_nfc == 1))
111 __create_an_item(KeyStr_NFC, IMG_NFC, "setting-nfc-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
113 __create_an_item(KeyStr_Location, IMG_Location, "setting-location-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
114 __create_an_item(KeyStr_DataRoaming, IMG_DataRoaming, NULL, Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
116 __create_an_item(KeyStr_WiFiDirect, IMG_WiFiDirect, "setting-wifidirect-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
118 __create_an_item(KeyStr_USBconnection, IMG_USBconnection, "setting-connectivity-efl|viewtype:usb", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
121 __create_a_menu(KeyStr_System);
124 __create_an_item(KeyStr_Sounds, IMG_Sounds, "setting-profile-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
125 /* kinds of wallpaper version.. */
126 __create_an_item(KeyStr_Wallpaper, IMG_Wallpaper, "setting-display-efl|viewtype:wallpaper", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
129 __create_an_item(KeyStr_Display, IMG_Dispaly, "setting-display-efl|viewtype:main", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
132 __create_an_item(KeyStr_DateTime, IMG_DateTime, "setting-time-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
135 __create_an_item(KeyStr_LanguageRegion, IMG_DisplayLanguage, "setting-phone-efl|viewtype:language", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
136 __create_an_item(KeyStr_KeyboradLanguage, IMG_KeyboradLanguage, "isfsetting-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
138 __create_an_item(KeyStr_EventsNotifications, IMG_EventsNotifications, "setting-phone-efl|viewtype:notification", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
139 __create_an_item(KeyStr_Memory, IMG_Memory, "setting-memory-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
140 __create_an_item(KeyStr_Reset, IMG_Reset, "setting-reset-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
141 __create_an_item(KeyStr_AboutPhone, IMG_AboutPhone, "setting-about-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
144 __create_a_menu(KeyStr_Applications);
146 __create_an_item_by_pkg(KeyStr_Call, "org.tizen.phone", "setting-call-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
147 __create_an_item_by_pkg(KeyStr_Messages, "org.tizen.message", "msg-setting-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
148 __create_an_item_by_pkg(KeyStr_Contacts, "org.tizen.contacts", "contacts-settings-efl|request_type:71", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
150 __create_an_item_by_pkg(KeyStr_Calendar, "org.tizen.efl-calendar", "calendar-settings-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
152 __create_an_item_by_pkg(KeyStr_Gallery, "org.tizen.gallery", "setting-gallery-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
156 __create_a_menu(KeyStr_DownloadedAPPs);
158 __create_an_item(KeyStr_ManageApps, IMG_MANAGE_APPS, "setting-manage-applications-efl|viewtype:manage-applications", Cfg_Item_Pos_Level1,
163 ret = setting_cfg_file_write( category_list );
165 json_node_free( category_list );
172 int setting_cfg_file_read( void )
174 parser = json_parser_new (); /* to be freed on exit */
177 GError *error = NULL;
178 gboolean ret = json_parser_load_from_file( parser, CFG_FILE_PATH, &error );
182 SETTING_TRACE_ERROR("error->message:%s", (char*)(error->message));
184 /* The file is existing and can be accessed normally, but it was
185 * loaded failed as a json script, it means setting.cfg is
186 * damaged(not the normal formatting ), we need to remove
187 * the file and recreate in next running time*/
188 SETTING_TRACE_ERROR("The file[%s] is existing and can be accessed "\
189 "normally, but it was loaded failed as a json "\
190 "script, it means setting.cfg is damaged (the "\
191 "formatting ia abnormal), we need to remove the"\
192 " file and recreate in next running time!",
195 SETTING_TRACE("Trying to removing the damaged file.");
196 if (remove(CFG_FILE_PATH) != 0)
198 SETTING_TRACE_ERROR("Error to remove the damaged file");
202 if( FALSE == setting_cfg_create() )
204 SETTING_TRACE_ERROR("Error to create a new config file");
207 /*if the failed is caused by reading the file recursively invoking */
208 return setting_cfg_file_read();
213 root = json_parser_get_root( parser ); /* to be freed on exit*/
218 * @brief dump JSON to file
220 int setting_cfg_file_write( JsonNode * node )
222 GError *error = NULL;
223 JsonGenerator *generator = json_generator_new ();
224 json_generator_set_root ( generator, node );
225 g_object_set( generator, "pretty", TRUE, NULL ); //write file in indent format
226 gboolean ret = json_generator_to_file( generator, CFG_FILE_PATH, &error );
227 g_object_unref(generator);
229 /* ***BEGIN*** DAC black screen SAMSUNG 2010/8/9 add
231 *chown -R inhouse:inhouse /home/inhouse/setting.cfg
235 SETTING_TRACE_ERROR("Error writing file %s!", CFG_FILE_PATH );
241 /* public functions */
242 int setting_cfg_init( void )
249 if (access( CFG_FILE_DIR_PATH, R_OK|W_OK|F_OK ) !=0 )
251 SETTING_TRACE_ERROR("dir [%s] not legal, need to check your file-system.[%s:%d]\n", CFG_FILE_DIR_PATH, __FILE__, __LINE__);
252 return Cfg_Error_Type_DirPermissionDenied;
254 if( stat(CFG_FILE_DIR_PATH, &st) != 0)/* to make more stable */
256 /* if (0 != system("sudo mkdir /opt/data/setting/")); */
257 /* if (EINA_TRUE != ecore_file_mkpath(CFG_FILE_DIR_PATH)); */
258 if (EINA_TRUE != ecore_file_mkdir(CFG_FILE_DIR_PATH));
261 return Cfg_Error_Type_Mkdir_Failed;
265 if( stat(CFG_FILE_PATH, &st) != 0)
267 SETTING_TRACE_ERROR("Config file doesn't exist. Create it!");
268 if( FALSE == setting_cfg_create() )
270 /* perror("setting_cfg_create"); */
271 return Cfg_Error_Type_CreateCfg_Failed;
273 stat(CFG_FILE_PATH, &st);
275 /* ***BEGIN*** error handle(caused by unstable file system) SAMSUNG 2010/9/10 add*/
276 else if (0 == st.st_size ||
277 0 != access( CFG_FILE_PATH, R_OK|F_OK ))
279 SETTING_TRACE("the %s is 0 Byte, we need to recreate it.", CFG_FILE_PATH);
280 /* delete the file */
281 if (remove(CFG_FILE_PATH) != 0)
284 return Cfg_Error_Type_RemoveCfg_Failed;
286 if( FALSE == setting_cfg_create() )
288 /* perror("setting_cfg_create"); */
289 return Cfg_Error_Type_CreateCfg_Failed;
293 /* ****END**** error handle(caused by unstable file system) SAMSUNG 2010/9/10 add
294 * cfg file exists but invalid -> re-create
295 * load file into parser
297 if( FALSE == setting_cfg_file_read() )
299 /* remove current setting file */
300 if (remove(CFG_FILE_PATH) != 0)
302 /* perror("remove"); */
303 return Cfg_Error_Type_RemoveCfg_Failed;
305 return Cfg_Error_Type_ReadCfg_Failed;
308 return Cfg_Error_Type_Sucess;
311 void setting_cfg_exit( void )
313 json_node_free(root);
314 g_object_unref (parser);
317 int setting_cfg_file_update( void )
319 if (access( CFG_FILE_PATH, W_OK|F_OK ) !=0 )
323 return setting_cfg_file_write( root );
326 int setting_cfg_get_category_length( void )
328 return json_array_get_length( json_node_get_array( root ) );
331 char* setting_cfg_get_category_name( int category_index )
333 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
334 return (char*)json_object_get_string_member( category_obj, "name" );
337 int setting_cfg_get_menu_length( int category_index )
339 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
340 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
341 return json_array_get_length( menu );
344 char * setting_cfg_get_keyname_idx( int category_index, int menu_index )
346 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
347 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
348 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
349 return (char*)json_object_get_string_member( menu_item, "key_name" );
352 char * setting_cfg_get_string_field_idx( int category_index, int menu_index, char *field_name)
354 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
355 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
356 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
358 char *data = (char *)json_object_get_string_member( menu_item, field_name );
359 if (!safeStrCmp(data, "(null)"))/* pass NULL to ug_args when create setting.cfg. */
366 int setting_cfg_get_int_field_idx( int category_index, int menu_index , char *field_name)
368 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
369 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
370 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
371 return json_object_get_int_member( menu_item, field_name );
374 char * setting_cfg_get_icon_path_idx( int category_index, int menu_index )
376 return setting_cfg_get_string_field_idx(category_index, menu_index, "icon_path");
379 char * setting_cfg_get_ug_args_idx( int category_index, int menu_index )
381 return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_args");
384 char * setting_cfg_get_ugpath_idx( int category_index, int menu_index )
386 return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_path");
389 char * setting_cfg_get_ugpath( char * keyname )
392 for( i = 0; i < setting_cfg_get_category_length(); i++ )
394 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
396 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
397 return setting_cfg_get_ugpath_idx( i, j );
403 int setting_cfg_get_pos_idx( int category_index, int menu_index )
405 return setting_cfg_get_int_field_idx(category_index, menu_index, "pos");
408 int setting_cfg_get_pos( char * keyname )
411 for( i = 0; i < setting_cfg_get_category_length(); i++ )
413 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
415 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
416 return setting_cfg_get_pos_idx( i, j );
422 void setting_cfg_set_pos_idx( int category_index, int menu_index, int pos )
424 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
425 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
426 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
427 json_object_remove_member( menu_item, "pos" );
428 json_object_set_int_member( menu_item, "pos", pos );
431 void setting_cfg_set_pos( char * keyname, int pos )
434 for( i = 0; i < setting_cfg_get_category_length(); i++ )
436 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
438 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
440 setting_cfg_set_pos_idx( i, j, pos );
448 int setting_cfg_get_click_times_idx( int category_index, int menu_index )
450 return setting_cfg_get_int_field_idx(category_index, menu_index, "click_times");
453 int setting_cfg_get_click_times( char * keyname )
456 for( i = 0; i < setting_cfg_get_category_length(); i++ )
458 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
460 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
461 return setting_cfg_get_click_times_idx( i, j );
467 void setting_cfg_set_click_times_idx( int category_index, int menu_index, int click_times )
469 JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
470 JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
471 JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
472 json_object_remove_member( menu_item, "click_times" );
473 json_object_set_int_member( menu_item, "click_times", click_times );
476 void setting_cfg_set_click_times( char * keyname, int click_times )
479 for( i = 0; i < setting_cfg_get_category_length(); i++ )
481 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
483 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
485 setting_cfg_set_click_times_idx( i, j, click_times );
493 int setting_cfg_get_resetable_flag_idx(int category_index, int menu_index)
495 return setting_cfg_get_int_field_idx(category_index, menu_index,
499 void setting_cfg_add_downloaded_app( char *keyname, char *icon_path, char *ug_args, int pos)
506 for( i=0; i<setting_cfg_get_category_length(); i++ )
508 if( safeStrCmp( setting_cfg_get_category_name(i), "Downloaded App" ) == 0 )
510 menu_item = json_node_new( JSON_NODE_OBJECT );
511 object = json_object_new();
512 json_node_take_object ( menu_item, object );
513 json_object_set_string_member( object, "key_name", keyname );
514 json_object_set_string_member( object, "icon_path", icon_path );
515 json_object_set_string_member( object, "ug_args", ug_args );
516 json_object_set_int_member( object, "pos", pos );
518 object = json_array_get_object_element( json_node_get_array( root ), i );
519 menu = json_object_get_array_member( object, "menu" );
520 json_array_add_element( menu, menu_item );
525 void setting_cfg_remove_downloaded_app( char * keyname )
531 for( i = 0; i < setting_cfg_get_category_length(); i++ )
533 if( safeStrCmp( setting_cfg_get_category_name(i), "Downloaded App" ) == 0 )
535 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
537 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
539 object = json_array_get_object_element( json_node_get_array( root ), i );
540 menu = json_object_get_array_member( object, "menu" );
541 json_array_remove_element( menu, j );
549 /*other relative function*/
550 char *get_ug_path_from_ug_args(void *data)
552 /*SETTING_TRACE_BEGIN;*/
553 char *p = (char *)data;
554 if (NULL == p || '\0' == p[0]) {
558 char *q = strchr(p, '|');
561 if (q) { /* copy out the content before '|'; eg, ab|cd */
562 path = (char *)calloc(1, q - p + 1);
563 setting_retvm_if(!path, NULL, "calloc failed");
564 safeCopyStr(path, p, q - p);
565 /* redundant handle */
567 } else { /* copy out all the content. eg.abb */
569 path = (char *)calloc(1, safeStrLen(p) + 1);
570 setting_retvm_if(!path, NULL, "calloc failed");
571 safeCopyStr(path, p, safeStrLen(p));
573 /*SETTING_TRACE("get the ug['%s']", path);*/
577 bundle *get_bundle_from_ug_args(void *data)
579 /*SETTING_TRACE_BEGIN;*/
580 char *p = (char *)data;
581 if (NULL == p || '\0' == p[0]) {
585 char *q = strchr(p, '|');
586 if (q) { /* (key, value) pairs exit. eg: ug_args = "sevenemail-setting-efl|caller:setting; cmd:main option" */
588 bundle *b = bundle_create();
591 int str_len = safeStrLen(p) + 1;
592 char *v_key = (char *)calloc(1, str_len);
598 char *v_value = (char *)calloc(1, str_len);
608 if (q) { /* not the last field */
609 m = strchr(p, ':'); /* ziduannei */
611 safeCopyStr(v_key, p, m - p);
614 safeCopyStr(v_value, m, q - m);
616 ("To add ('%s', '%s') to bundle data",
618 bundle_add(b, v_key, v_value);
621 ("invalid key-value format!!\n");
622 break; /* end the whole while */
624 } else { /* the last field */
626 m = strchr(p, ':'); /* ziduannei */
628 safeCopyStr(v_key, p, m - p);
630 safeCopyStr(v_value, m, safeStrLen(m));
632 ("To add ('%s', '%s') to bundle data",
635 bundle_add(b, v_key, v_value);
638 ("invalid key-value format!!\n");
640 break; /* end the whole while */
643 memset(v_key, '\0', str_len);
644 memset(v_value, '\0', str_len);
651 } else { /* eg: ug_args = "setting-browser-efl" */
653 /*SETTING_TRACE("(key, value) pairs not exit");*/