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