1.Limit the max length of Network connection profile
[apps/core/preloaded/settings.git] / setting-common / src / setting-cfg.c
1 /*
2  * setting
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
5  *
6  * Contact: MyoungJune Park <mj2004.park@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 #include <setting-cfg.h>
23 #include <setting-debug.h>
24 #include <stdio.h>
25 #include <Elementary.h>
26 #include <setting-common-general-func.h>
27 #include <unistd.h>
28
29 #define CFG_FILE_DIR_PATH       "/opt/data/setting/"
30 #define CFG_FILE_PATH           CFG_FILE_DIR_PATH"setting.cfg"
31
32 JsonParser* parser;
33 JsonNode*   root; /* category_list */
34
35 char* setting_cfg_get_path()
36 {
37         return CFG_FILE_PATH;
38 }
39
40 int setting_cfg_file_write( JsonNode * node );
41
42 #define __create_an_item(item_name, icon_path, ug_args, defaultPos, is_resetable) do\
43 {\
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); \
55 } while(0);\
56
57 #define __create_an_item_by_pkg(item_name, pkg_name, ug_args, defaultPos, is_resetable) do\
58 {\
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; \
72 } while(0);\
73
74
75 #define __create_a_menu(menu_name)\
76 {\
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 );\
84 }
85
86 void setting_cfg_print( void )
87 {
88         JsonNode * node = root;
89
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 );
95
96         g_free(data);
97         g_object_unref(generator);
98 }
99
100 /* create config file from scratch */
101 int setting_cfg_create(void)
102 {
103         JsonNode *category_list, *category, *menu_item;
104         JsonArray *menu;
105         JsonObject *object;
106
107         /* Category list */
108         category_list = json_node_new (JSON_NODE_ARRAY);
109         json_node_take_array ( category_list, json_array_new () );
110
111         /* Connectivity */
112         __create_a_menu(KeyStr_Connectivity);
113
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_Location, IMG_Location, "setting-location-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
117         __create_an_item(KeyStr_Network, IMG_Network, "setting-network-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
118         __create_an_item(KeyStr_Bluetooth, IMG_Bluetooth, "setting-bluetooth-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
119         __create_an_item(KeyStr_NFC, IMG_NFC, "setting-nfc-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
120
121 #if SUPPORT_DATA_USAGE
122         __create_an_item(KeyStr_DataUsage, IMG_DataUsage, "setting-datausage-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
123 #endif
124
125 #if SUPPORT_WIFI_DIRECT
126         __create_an_item(KeyStr_WiFiDirect, IMG_WiFiDirect, "setting-wifidirect-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
127 #endif
128
129         /* System */
130         __create_a_menu(KeyStr_System);
131         /* a new group..        */
132
133         // Wallpaper -- here
134 #if SUPPORT_WALLPAPER
135         /* kinds of wallpaper version.. */
136         __create_an_item(KeyStr_Wallpaper, IMG_Wallpaper, "setting-display-efl|viewtype:wallpaper", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
137 #endif
138
139         __create_an_item(KeyStr_Sounds, IMG_Sounds, "setting-profile-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
140
141 #if SUPPOR_SEPARATE_BRIGHTNESS
142         __create_an_item(KeyStr_Brightness, IMG_Brightness, "setting-display-efl|viewtype:brightness", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
143 #endif
144
145 #if SUPPORT_SECURITY
146         __create_an_item(KeyStr_Security, IMG_Security, "setting-security-efl", Cfg_Item_Pos_Level0, Cfg_Item_Resetable);
147 #endif
148
149 #if SUPPORT_POWERSAVING
150         __create_an_item(KeyStr_Powersaving, IMG_Powersaving, "setting-powersaving-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
151 #endif
152
153 #if SUPPORT_MOTIONS
154         __create_an_item(KeyStr_Motions, IMG_Motion, "setting-motion-efl|viewtype:motions", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
155 #endif
156
157 #if SUPPORT_ACCESSIBILITY
158         __create_an_item(KeyStr_Accessibility, IMG_Accessibility, "setting-accessibility-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
159 #endif
160
161 #if SUPPORT_FONT
162         __create_an_item(KeyStr_Font, IMG_Font, "setting-font-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
163 #endif
164
165         __create_an_item(KeyStr_Display, IMG_Dispaly, "setting-display-efl|viewtype:main", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
166 #if SUPPORT_MENUSCREEN
167         __create_an_item(KeyStr_Menuscreen, IMG_Menuscreen, "setting-homescreen-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
168 #endif
169         __create_an_item(KeyStr_Landscape, IMG_Landscape, NULL, Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
170         __create_an_item(KeyStr_DateTime, IMG_DateTime, "setting-time-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
171         __create_an_item(KeyStr_LanguageRegion, IMG_DisplayLanguage, "setting-phone-efl|viewtype:language", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
172         __create_an_item(KeyStr_KeyboradLanguage, IMG_KeyboradLanguage, "isfsetting-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
173
174 #if SUPPORT_STORAGE
175         __create_an_item(KeyStr_Storage, IMG_DefaultIcon, "setting-storage-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
176 #endif
177         __create_an_item(KeyStr_ManageApps, IMG_MANAGE_APPS, "setting-manage-applications-efl|viewtype:manage-applications", Cfg_Item_Pos_Level1,
178                             Cfg_Item_Resetable);
179
180         __create_an_item(KeyStr_WebApps, IMG_Web_Apps, "webapp-common-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
181
182 #if SUPPORT_CERTIFICATES
183         __create_an_item(KeyStr_CertUI, IMG_MANAGE_APPS, "setting-manage-certificates-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
184 #endif
185
186         __create_an_item(KeyStr_Memory, IMG_Memory, "setting-memory-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
187         __create_an_item(KeyStr_Reset, IMG_Reset, "setting-reset-efl", Cfg_Item_Pos_Level1, Cfg_Item_unResetable);
188         __create_an_item(KeyStr_DeveloperOption, IMG_USBconnection, "setting-developeroption-efl|viewtype:usb", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
189         __create_an_item(KeyStr_AboutPhone, IMG_AboutPhone, "setting-about-efl", Cfg_Item_Pos_Level1, Cfg_Item_Resetable);
190
191         /* Applications */
192         __create_a_menu(KeyStr_Applications);
193
194         __create_an_item(KeyStr_Call, IMG_Call, "setting-call-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
195         __create_an_item(KeyStr_Messages, IMG_Messages, "msg-setting-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
196         __create_an_item(KeyStr_Email, IMG_Email, "email-setting-efl|VIEW_TYPE:main-view", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
197         __create_an_item(KeyStr_Contacts, IMG_Contacts, "contacts-settings-efl|request_type:71", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
198
199         __create_an_item(KeyStr_Calendar, IMG_Calendar, "calendar-settings-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
200
201         __create_an_item(KeyStr_Gallery, IMG_Gallery, "setting-gallery-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
202         __create_an_item(KeyStr_VoiceRecorder, IMG_VoiceRecorder, "setting-voicerecorder-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
203
204 #if SUPPORT_FMradio
205         // FMradio setting
206         __create_an_item_by_pkg(KeyStr_FMRadio, "com.samsung.fm-radio", "setting-fmradio-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
207         SETTING_TRACE_DEBUG("Added FMRadio");
208 #endif
209
210
211
212
213
214
215 #if DISABLED_CODE
216         __create_an_item_by_pkg(KeyStr_NFC, "com.samsung.nfc-app", "setting-nfc-efl", Cfg_Item_Pos_Level0, Cfg_Item_unResetable);
217 #endif
218
219         /* Downloaded App */
220         __create_a_menu(KeyStr_DownloadedAPPs);
221
222         /* write to file */
223         int ret = setting_cfg_file_write( category_list );
224
225         json_node_free( category_list );
226
227         return ret;
228 }
229
230
231 /* load file */
232 int setting_cfg_file_read( void )
233 {
234 #if DISABLED_CODE
235         if (access( CFG_FILE_PATH, R_OK|F_OK ) !=0 )
236         {
237                 SETTING_TRACE("file [%s] not legal, need to check your file-system.[%s:%d]\n", CFG_FILE_PATH, __FILE__, __LINE__);
238                 //return Cfg_Error_Type_FilePermissionDenied;
239                 return FALSE;
240         }
241 #endif
242         parser = json_parser_new (); /* to be freed on exit */
243
244         /* file -> parser */
245         GError *error = NULL;
246         gboolean ret = json_parser_load_from_file( parser, CFG_FILE_PATH, &error );
247
248         if( FALSE == ret )
249         {
250                 return FALSE;
251 #if DISABLED_CODE
252                 SETTING_TRACE_ERROR("error->message:%s", (char*)(error->message));
253
254         /* The file is existing and can be accessed normally, but it was
255          * loaded failed as a json script, it means setting.cfg is
256          * damaged(not the normal formatting ), we need to remove
257          * the file and recreate in next running time*/
258                 SETTING_TRACE_ERROR("The file[%s] is existing and can be accessed "\
259                             "normally, but it was loaded failed as a json "\
260                             "script, it means setting.cfg is damaged (the "\
261                             "formatting ia abnormal), we need to remove the"\
262                             " file and recreate in next running time!",
263                             CFG_FILE_PATH);
264
265         SETTING_TRACE("Trying to removing the damaged file.");
266         if (remove(CFG_FILE_PATH) != 0)
267         {
268             SETTING_TRACE_ERROR("Error to remove the damaged file");
269             return FALSE;
270         }
271
272         if( FALSE == setting_cfg_create() )
273         {
274             SETTING_TRACE_ERROR("Error to create a new config file");
275             return FALSE;
276         }
277         /*if the failed is  caused by reading the file recursively invoking */
278         return setting_cfg_file_read();
279 #endif
280         }
281
282         /* parser -> root */
283         root = json_parser_get_root( parser ); /* to be freed on exit*/
284         return TRUE;
285 }
286
287 /**
288 * @brief dump JSON to file
289 */
290 int setting_cfg_file_write( JsonNode * node )
291 {
292         GError *error = NULL;
293         JsonGenerator *generator = json_generator_new ();
294         json_generator_set_root ( generator, node );
295         g_object_set( generator, "pretty", TRUE, NULL ); //write file in indent format
296         gboolean ret = json_generator_to_file( generator, CFG_FILE_PATH, &error );
297         g_object_unref(generator);
298
299         /* ***BEGIN***  DAC black screen SAMSUNG 2010/8/9 add
300          *add read permission
301          *chown -R inhouse:inhouse /home/inhouse/setting.cfg
302          */
303         if( FALSE == ret )
304         {
305                 SETTING_TRACE_ERROR("Error writing file %s!", CFG_FILE_PATH );
306                 return FALSE;
307         }
308         return TRUE;
309 }
310
311 /*   public functions  */
312 #if DISABLED_CODE
313 int setting_cfg_init( void )
314 {
315         g_type_init ();
316
317         struct stat st;
318         //int ret = -1;
319
320         if (access( CFG_FILE_DIR_PATH, R_OK|W_OK|F_OK ) !=0 )
321     {
322                 SETTING_TRACE_ERROR("dir [%s] not legal, need to check your file-system.[%s:%d]\n", CFG_FILE_DIR_PATH, __FILE__, __LINE__);
323         return Cfg_Error_Type_DirPermissionDenied;
324     }
325         if( stat(CFG_FILE_DIR_PATH, &st) != 0)/* to make more stable */
326         {
327                 /* if (0 != system("sudo mkdir /opt/data/setting/")); */
328                 /* if (EINA_TRUE != ecore_file_mkpath(CFG_FILE_DIR_PATH)); */
329                 if (EINA_TRUE != ecore_file_mkdir(CFG_FILE_DIR_PATH));
330                 {
331                         perror("mkdir");
332                         return Cfg_Error_Type_Mkdir_Failed;
333                 }
334         }
335
336         if( stat(CFG_FILE_PATH, &st) != 0)
337         {
338                 SETTING_TRACE_ERROR("Config file doesn't exist. Create it!");
339                 if(     FALSE == setting_cfg_create() )
340                 {
341                         /* perror("setting_cfg_create"); */
342                         return Cfg_Error_Type_CreateCfg_Failed;
343                 }
344                 stat(CFG_FILE_PATH, &st);
345         }
346         /* ***BEGIN***  error handle(caused by unstable file system) SAMSUNG 2010/9/10 add*/
347         else if (0 == st.st_size ||
348              0 != access( CFG_FILE_PATH, R_OK|F_OK ))
349         {
350                 SETTING_TRACE("the %s is 0 Byte, we need to recreate it.", CFG_FILE_PATH);
351                 /* delete the file */
352                 if (remove(CFG_FILE_PATH) != 0)
353                 {
354                         perror("remove");
355                         return Cfg_Error_Type_RemoveCfg_Failed;
356                 }
357                 if(     FALSE == setting_cfg_create() )
358                 {
359                         /* perror("setting_cfg_create"); */
360                         return Cfg_Error_Type_CreateCfg_Failed;
361                 }
362
363         }
364         /* ****END****  error handle(caused by unstable  file system) SAMSUNG 2010/9/10 add
365          * cfg file exists but invalid -> re-create
366          * load file into parser
367          */
368         if( FALSE == setting_cfg_file_read() )
369         {
370                 /* remove current setting file */
371                 if (remove(CFG_FILE_PATH) != 0)
372                 {
373                         /* perror("remove"); */
374                         return Cfg_Error_Type_RemoveCfg_Failed;
375                 }
376                 return Cfg_Error_Type_ReadCfg_Failed;
377         }
378
379         return Cfg_Error_Type_Sucess;
380 }
381 #endif
382
383 int setting_cfg_init( void )
384 {
385         g_type_init ();
386
387         if (!access(CFG_FILE_PATH, R_OK|W_OK|F_OK )) { // succeed to access
388                 if(!setting_cfg_file_read()) { // return FALSE
389                         if (remove(CFG_FILE_PATH)) {
390                                 return Cfg_Error_Type_RemoveCfg_Failed;
391                         }
392                         return Cfg_Error_Type_ReadCfg_Failed;
393                 }
394
395                 return Cfg_Error_Type_Sucess;
396         } else { // fail to access
397                 switch (errno) {
398                         // file non-existing case
399                         case ENOENT:
400                                 SETTING_TRACE_ERROR("non-existing file/dir");
401                                 ecore_file_mkdir(CFG_FILE_DIR_PATH);
402                                 if (!setting_cfg_create()) { // return FALSE
403                                         SETTING_TRACE_ERROR("Error to create a new config file");
404                                         return Cfg_Error_Type_CreateCfg_Failed;
405                                 }
406                                 if(!setting_cfg_file_read() ) { // return FALSE
407                                         if (remove(CFG_FILE_PATH)) {
408                                                 return Cfg_Error_Type_RemoveCfg_Failed;
409                                         }
410                                         return Cfg_Error_Type_ReadCfg_Failed;
411                                 }
412
413                                 return Cfg_Error_Type_Sucess;
414                         // other cases
415                         case EACCES:
416                         case EROFS:
417                         default:
418                                 return Cfg_Error_Type_DirPermissionDenied;
419                 }
420         }
421 }
422
423 void setting_cfg_exit( void )
424 {
425         json_node_free(root);
426         g_object_unref (parser);
427 }
428
429 int setting_cfg_file_update( void )
430 {
431         if (access( CFG_FILE_PATH, W_OK|F_OK ) !=0 )
432         {
433                 return FALSE;
434         }
435         return setting_cfg_file_write( root );
436 }
437
438 int setting_cfg_get_category_length( void )
439 {
440         return json_array_get_length( json_node_get_array( root ) );
441 }
442
443 char* setting_cfg_get_category_name( int category_index )
444 {
445         JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
446         return (char*)json_object_get_string_member( category_obj, "name" );
447 }
448
449 int setting_cfg_get_menu_length( int category_index )
450 {
451         JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
452         JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
453         return json_array_get_length( menu );
454 }
455
456 char * setting_cfg_get_keyname_idx( int category_index, int menu_index )
457 {
458         JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
459         JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
460         JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
461         return (char*)json_object_get_string_member( menu_item, "key_name" );
462 }
463
464 char * setting_cfg_get_string_field_idx( int category_index, int menu_index, char *field_name)
465 {
466         JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
467         JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
468         JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
469
470         char *data = (char *)json_object_get_string_member( menu_item, field_name );
471         if (!safeStrCmp(data, "(null)"))/* pass NULL to ug_args when create setting.cfg. */
472         {
473                 return NULL;
474         }
475         return data;
476 }
477
478 int setting_cfg_get_int_field_idx( int category_index, int menu_index , char *field_name)
479 {
480         JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
481         JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
482         JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
483         return json_object_get_int_member( menu_item, field_name );
484 }
485
486 char * setting_cfg_get_icon_path_idx( int category_index, int menu_index )
487 {
488         return setting_cfg_get_string_field_idx(category_index, menu_index, "icon_path");
489 }
490
491 char * setting_cfg_get_ug_args_idx( int category_index, int menu_index )
492 {
493         return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_args");
494 }
495
496 char * setting_cfg_get_ugpath_idx( int category_index, int menu_index )
497 {
498         return setting_cfg_get_string_field_idx(category_index, menu_index, "ug_path");
499 }
500
501 char * setting_cfg_get_ugpath( char * keyname )
502 {
503         int i, j;
504         for( i = 0; i < setting_cfg_get_category_length(); i++ )
505         {
506                 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
507                 {
508                         if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
509                                 return setting_cfg_get_ugpath_idx( i, j );
510                 }
511         }
512         return NULL;
513 }
514
515 int setting_cfg_get_pos_idx( int category_index, int menu_index )
516 {
517         return setting_cfg_get_int_field_idx(category_index, menu_index, "pos");
518 }
519
520 int setting_cfg_get_pos( char * keyname )
521 {
522         int i, j;
523         for( i = 0; i < setting_cfg_get_category_length(); i++ )
524         {
525                 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
526                 {
527                         if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
528                                 return setting_cfg_get_pos_idx( i, j );
529                 }
530         }
531         return 0;
532 }
533
534 void setting_cfg_set_pos_idx( int category_index, int menu_index, int pos )
535 {
536         JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
537         JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
538         JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
539         json_object_remove_member( menu_item, "pos" );
540         json_object_set_int_member( menu_item, "pos", pos );
541 }
542
543 void setting_cfg_set_pos( char * keyname, int pos )
544 {
545         int i, j;
546         for( i = 0; i < setting_cfg_get_category_length(); i++ )
547         {
548                 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
549                 {
550                         if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
551                         {
552                                 setting_cfg_set_pos_idx( i, j, pos );
553                                 return ;
554                         }
555                 }
556         }
557
558 }
559
560 int setting_cfg_get_click_times_idx( int category_index, int menu_index )
561 {
562         return setting_cfg_get_int_field_idx(category_index, menu_index, "click_times");
563 }
564
565 int setting_cfg_get_click_times( char * keyname )
566 {
567         int i, j;
568         for( i = 0; i < setting_cfg_get_category_length(); i++ )
569         {
570                 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
571                 {
572                         if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
573                                 return setting_cfg_get_click_times_idx( i, j );
574                 }
575         }
576         return 0;
577 }
578
579 void setting_cfg_set_click_times_idx( int category_index, int menu_index, int click_times )
580 {
581         JsonObject * category_obj = json_array_get_object_element( json_node_get_array( root ), category_index );
582         JsonArray * menu = json_object_get_array_member( category_obj, "menu" );
583         JsonObject * menu_item = json_array_get_object_element( menu, menu_index );
584         json_object_remove_member( menu_item, "click_times" );
585         json_object_set_int_member( menu_item, "click_times", click_times );
586 }
587
588 void setting_cfg_set_click_times( char * keyname, int click_times )
589 {
590         int i, j;
591         for( i = 0; i < setting_cfg_get_category_length(); i++ )
592         {
593                 for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
594                 {
595                         if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
596                         {
597                                 setting_cfg_set_click_times_idx( i, j, click_times );
598                                 return ;
599                         }
600                 }
601         }
602
603 }
604
605 int setting_cfg_get_resetable_flag_idx(int category_index, int menu_index)
606 {
607         return setting_cfg_get_int_field_idx(category_index, menu_index,
608                                              "is_resetable");
609 }
610
611 void setting_cfg_add_downloaded_app( char *keyname, char *icon_path, char *ug_args, int pos)
612 {
613         int i;
614         JsonNode *menu_item;
615         JsonObject *object;
616         JsonArray *menu;
617
618         for( i=0; i<setting_cfg_get_category_length(); i++ )
619         {
620                 if( safeStrCmp( setting_cfg_get_category_name(i), "Downloaded App" ) == 0 )
621                 {
622                         menu_item = json_node_new( JSON_NODE_OBJECT );
623                         object = json_object_new();
624                         json_node_take_object ( menu_item, object );
625                         json_object_set_string_member( object, "key_name", keyname );
626                         json_object_set_string_member( object, "icon_path", icon_path );
627                         json_object_set_string_member( object, "ug_args", ug_args );
628                         json_object_set_int_member( object, "pos", pos );
629
630                         object = json_array_get_object_element( json_node_get_array( root ), i );
631                         menu = json_object_get_array_member( object, "menu" );
632                         json_array_add_element( menu, menu_item );
633                 }
634         }
635 }
636
637 void setting_cfg_remove_downloaded_app( char * keyname )
638 {
639         int i, j;
640         JsonObject *object;
641         JsonArray *menu;
642
643         for( i = 0; i < setting_cfg_get_category_length(); i++ )
644         {
645                 if( safeStrCmp( setting_cfg_get_category_name(i), "Downloaded App" ) == 0 )
646                 {
647                         for( j = 0; j < setting_cfg_get_menu_length( i ); j++ )
648                         {
649                                 if( safeStrCmp( setting_cfg_get_keyname_idx( i, j ), keyname ) == 0 )
650                                 {
651                                         object = json_array_get_object_element( json_node_get_array( root ), i );
652                                         menu = json_object_get_array_member( object, "menu" );
653                                         json_array_remove_element( menu, j );
654                                         return ;
655                                 }
656                         }
657                 }
658         }
659 }
660
661 bool is_ug_installed_by_ug_args(void *data)
662 {
663         retv_if(!data, TRUE);//if passing NULL,drawing it
664         char* ug_args = data;
665         char *ug_name = get_ug_path_from_ug_args(ug_args);
666
667         //1.first do exist-checking in /opt/ug/lib
668         char ug_file[PATH_MAX + 1];
669         snprintf(ug_file, PATH_MAX, "%s/libug-%s.so", SETTING_UG_PATH, ug_name);
670         struct stat st;
671         if(stat(ug_file, &st) != 0) { 
672
673                 //2.if it does not exit in /opt/ug/lib, then do exist-checking in /usr/ug/lib
674                 memset(ug_file, 0x00, PATH_MAX + 1);
675                 snprintf(ug_file, PATH_MAX, "%s/libug-%s.so", SETTING_UG_PATH_USR, ug_name);
676                 if(stat(ug_file, &st) != 0) {
677                         //both not exist,skip it
678                         SETTING_TRACE_ERROR(" libug-%s.so is *NOT* present, so skip it..\n", ug_name);
679                         return FALSE;
680                 }
681         }
682
683         return TRUE;
684 }
685
686 /*other relative function*/
687 char *get_ug_path_from_ug_args(void *data)
688 {
689         /*SETTING_TRACE_BEGIN;*/
690         char *p = (char *)data;
691         if (NULL == p || '\0' == p[0]) {
692                 return NULL;
693         }
694
695         char *q = strchr(p, '|');
696         char *path = NULL;
697
698         if (q) {                /* copy out the content before '|'; eg, ab|cd */
699                 path = (char *)calloc(1, q - p + 1);
700                 setting_retvm_if(!path, NULL, "calloc failed");
701                 safeCopyStr(path, p, q - p);
702                 /* redundant handle */
703                 path[q - p] = '\0';
704         } else {                /* copy out all the content. eg.abb */
705
706                 path = (char *)calloc(1, safeStrLen(p) + 1);
707                 setting_retvm_if(!path, NULL, "calloc failed");
708                 safeCopyStr(path, p, safeStrLen(p));
709         }
710         /*SETTING_TRACE("get the ug['%s']", path);*/
711         return path;
712 }
713
714 service_h get_bundle_from_ug_args(void *data)
715 {
716         /*SETTING_TRACE_BEGIN;*/
717         char *p = (char *)data;
718         if (NULL == p || '\0' == p[0]) {
719                 return NULL;
720         }
721         char *m = NULL;
722         char *q = strchr(p, '|');
723         if (q) {                /* (key, value) pairs exit. eg: ug_args = "sevenemail-setting-efl|caller:setting; cmd:main option" */
724                 /* alloc data */
725                 service_h svc;
726                 if (service_create(&svc))
727                         return NULL;
728                 int str_len = safeStrLen(p) + 1;
729                 char *v_key = (char *)calloc(1, str_len);
730                 if (!v_key) {
731                         service_destroy(svc);
732                         return NULL;
733                 }
734
735                 char *v_value = (char *)calloc(1, str_len);
736                 if (!v_value) {
737                         service_destroy(svc);
738                         FREE(v_key);
739                         return NULL;
740                 }
741
742                 p = ++q;
743                 while (p) {
744                         q = strchr(p, ';');
745                         if (q) {        /* not the last field */
746                                 m = strchr(p, ':');     /* ziduannei */
747                                 if (m) {
748                                         safeCopyStr(v_key, p, m - p);
749
750                                         ++m;
751                                         safeCopyStr(v_value, m, q - m);
752                                         SETTING_TRACE
753                                             ("To add ('%s', '%s') to bundle data",
754                                              v_key, v_value);
755                                         service_add_extra_data(svc, v_key, v_value);
756                                 } else {
757                                         SETTING_TRACE_ERROR
758                                             ("invalid key-value format!!\n");
759                                         break;  /* end the whole while */
760                                 }
761                         } else {        /* the last field */
762
763                                 m = strchr(p, ':');     /* ziduannei */
764                                 if (m) {
765                                         safeCopyStr(v_key, p, m - p);
766                                         ++m;
767                                         safeCopyStr(v_value, m, safeStrLen(m));
768
769                                         service_add_extra_data(svc, v_key, v_value);
770                                 } else {
771                                         SETTING_TRACE_ERROR
772                                             ("invalid key-value format!!\n");
773                                 }
774                                 break;  /* end the whole while */
775                         }
776
777                         memset(v_key, '\0', str_len);
778                         memset(v_value, '\0', str_len);
779                         p = ++q;
780                 }
781
782                 FREE(v_key);
783                 FREE(v_value);
784                 return svc;
785         } else {                /* eg: ug_args = "setting-browser-efl" */
786
787                 /*SETTING_TRACE("(key, value) pairs not exit");*/
788                 return NULL;
789         }
790
791 }
792