3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 #include <setting-common-data-slp-setting.h>
18 #include <Elementary.h>
21 #include <openssl/sha.h>
23 #include <sys/types.h>
28 #include <libxml/xmlmemory.h>
29 #include <libxml/parser.h>
30 #include <libxml/tree.h>
33 #define EXPORT_FILE "/opt/data/setting/setting_export.xml"
36 //#include <setting-backup-restore.h>
52 typedef struct VconfNode VconfNode;
55 int key; /** vconf id definded in Setting app */
56 const char* vconf_key; /** vconf string defined in libslp-setting */
57 vconftype type; /** BOOL, INT, STRING */
58 vconfval value; /** variable by union */
59 void (*export)(VconfNode* pnode, xmlNodePtr* root_node); /** method for exporting current state */
60 void (*import)(VconfNode* pnode, xmlNodePtr* root_node); /** method for importing state from cloud */
63 int get_vconf(VconfNode node, VconfNode* result);
65 // export function for each vconf key
66 void export_default(VconfNode* node, xmlNodePtr* root_node)
74 if(node->vconf_key == NULL) return; /* NO DOTHING IF null */
79 SETTING_TRACE("EXPORTING key : %s : %d : %d",node->vconf_key, node->type, node->value.b);
82 get_vconf(*node, &result);
93 SETTING_TRACE("EXPORTING key : %s : %d : %d",node->vconf_key, node->type, node->value.i);
95 get_vconf(*node, &result);
98 SETTING_TRACE(">>(%d)<<",result.value.i);
99 sprintf(arr, "%d", result.value.i);
104 SETTING_TRACE("EXPORTING key : %s : %d : %s",node->vconf_key, node->type, node->value.c);
106 get_vconf(*node, &result);
107 val = result.value.c;
112 xmlNodePtr xmlnode = xmlNewChild(*root_node, NULL, BAD_CAST "config", BAD_CAST val);
113 xmlNewProp(xmlnode, BAD_CAST "key", BAD_CAST node->vconf_key);
114 xmlNewProp(xmlnode, BAD_CAST "type", BAD_CAST type);
115 xmlAddChild(*root_node, xmlnode);
119 static void __tree_walk_exported_file(xmlNodePtr cur,
120 status_handler_fp fp, void* data)
123 xmlNode *cur_node = NULL;
127 // how to get the all size of elements
129 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
130 char* temp = xmlGetProp(cur_node, (const xmlChar *)"key");
131 // count only if key is not NULL
137 for (count=0, cur_node = cur; cur_node;cur_node = cur_node->next) {
138 if (cur_node->type == XML_ELEMENT_NODE) {
140 char* temp = xmlGetProp(cur_node, (const xmlChar *)"key");
143 key = (char *)g_strdup((char*)xmlGetProp(cur_node, (const xmlChar *)"key"));
144 type = (char *)g_strdup((char*) xmlGetProp(cur_node, (const xmlChar *)"type"));
146 SETTING_TRACE(" key=%s type=%s value=%s \n", xmlGetProp(cur_node, (const xmlChar *)"key"),
147 xmlGetProp(cur_node, (const xmlChar *)"type"),
148 xmlNodeGetContent(cur_node));
153 fp(total, count, data);
161 // /opt/data/setting/aaa.xml
162 // import function for each vconf key
163 void import_default(VconfNode* node, xmlNodePtr* root_node)
168 SETTING_TRACE("IMPORTING key : %s : %d : %d",node->vconf_key, node->type, node->value);
171 SETTING_TRACE("IMPORTING key : %s : %d : %d",node->vconf_key, node->type, node->value);
174 SETTING_TRACE("IMPORTING key : %s : %d : %s",node->vconf_key, node->type, node->value);
179 /** bool vconf table */
180 static VconfNode g_btable[] = {
182 {BOOL_SLP_SETTING_POWER_ON_LOCK, VCONFKEY_SETAPPL_STATE_POWER_ON_LOCK_BOOL, eBOOL, {0}, export_default, import_default}, // node[0]
183 {BOOL_SLP_SETTING_SIMPLE_PASSWORD, VCONFKEY_SETAPPL_STATE_SIMPLE_PASSWORD_BOOL, eBOOL, {0}, export_default, import_default}, // node[0]
185 {BOOL_SLP_SETTING_AUTOMATIC_TIME_UPDATE, VCONFKEY_SETAPPL_STATE_AUTOMATIC_TIME_UPDATE_BOOL, eBOOL,{0}, export_default, import_default},
188 {BOOL_SLP_SETTING_TRANSACTION_TRACKING, VCONFKEY_SETAPPL_STATE_TRANSACTION_TRACKING_BOOL, eBOOL,{0}, export_default, import_default},
191 {BOOL_SLP_SETTING_EXPIRY_REMINDER, VCONFKEY_SETAPPL_STATE_EXPIRY_REMINDER_BOOL, eBOOL,{0}, export_default, import_default},
193 //{BOOL_SLP_SETTING_FLIGHT_MODE, VCONFKEY_SETAPPL_FLIGHT_MODE_BOOL, eBOOL,{0}, export_default, import_default},
194 {BOOL_SLP_SETTING_FLIGHT_MODE, VCONFKEY_TELEPHONY_FLIGHT_MODE, eBOOL,{0}, export_default, import_default},
195 {BOOL_SLP_SETTING_DATA_ROAMING, VCONFKEY_SETAPPL_STATE_DATA_ROAMING_BOOL, eBOOL,{0}, export_default, import_default},
196 {BOOL_SLP_SETTING_NFC_STATUS,VCONFKEY_NFC_STATE, eBOOL, {0}, export_default, import_default},
198 {BOOL_SLP_SETTING_USE_PACKET_DATA, VCONFKEY_3G_ENABLE, eBOOL,{0}, export_default, import_default},
199 {BOOL_SLP_SETTING_ACCESSIBILITY_HIGH_CONTRAST, VCONFKEY_SETAPPL_ACCESSIBILITY_HIGH_CONTRAST, eBOOL,{0}, export_default, import_default},
200 {BOOL_SLP_SETTING_ACCESSIBILITY_SCREEN_ZOOM, VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_ZOOM, eBOOL,{0}, export_default, import_default},
201 {BOOL_SLP_SETTING_ACCESSIBILITY_ASSISTIVE_LIGHT, VCONFKEY_SETAPPL_ACCESSIBILITY_TORCH_LIGHT, eBOOL,{0}, export_default, import_default},
202 {BOOL_SLP_SETTING_ACCESSIBILITY_MONO_AUDIO, VCONFKEY_SETAPPL_ACCESSIBILITY_MONO_AUDIO, eBOOL,{0}, export_default, import_default},
203 //{BOOL_SLP_SETTING_ACCESSIBILITY_TURN_OFF_ALL_SOUNDS, VCONFKEY_SETAPPL_TURN_OFF_ALL_SOUNDS_BOOL, eBOOL,{0}, export_default, import_default},
204 {BOOL_SLP_SETTING_ACCESSIBILITY_LED_NOTIFY, VCONFKEY_SETAPPL_ACCESSIBILITY_LED_NOTIFY, eBOOL,{0}, export_default, import_default},
205 {BOOL_SLP_SETTING_ACCESSIBILITY_ACCEPT_CALL, VCONFKEY_CISSAPPL_ANSWERING_KEY_BOOL, eBOOL,{0}, export_default, import_default},
206 {BOOL_SLP_SETTING_ACCESSIBILITY_POWERKEY_END_CALLS, VCONFKEY_CISSAPPL_POWER_KEY_ENDS_CALL_BOOL, eBOOL,{0}, export_default, import_default},
208 //------------------------------------------------------------------------------------------------
209 {SETTING_BOOL_SLP_LIST_MAX, NULL, eBOOL, {0}, export_default, import_default},
213 /** int vconf table */
214 static VconfNode g_itable[] = {
215 {INT_SLP_SETTING_LCD_BRIGHTNESS, VCONFKEY_SETAPPL_LCD_BRIGHTNESS, eINT, {0}, export_default, import_default},
216 {INT_SLP_SETTING_LCD_TIMEOUT_NORMAL,VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL, eINT, {0}, export_default, import_default},
217 {INT_SLP_SETTING_LCD_TIMEOUT_NORMAL_BACKUP,VCONFKEY_LCD_TIMEOUT_NORMAL_BACKUP, eINT, {0}, export_default, import_default},
219 {INT_SLP_SETTING_AUTOMATIC_BRIGHTNESS, VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT, eINT,{0}, export_default, import_default},
221 {INT_SLP_SETTING_SELECT_NETWORK,VCONFKEY_SETAPPL_SELECT_NETWORK_INT, eINT, {0}, export_default, import_default},
222 {INT_SLP_SETTING_NETWORK_MODE,VCONFKEY_SETAPPL_NETWORK_MODE_INT, eINT, {0}, export_default, import_default},
223 {INT_SLP_SETTING_REGIONFORMAT_TIME1224,VCONFKEY_REGIONFORMAT_TIME1224, eINT, {0}, export_default, import_default},
224 {INT_SLP_SETTING_DATE_FORMAT,VCONFKEY_SETAPPL_DATE_FORMAT_INT, eINT, {0}, export_default, import_default},
225 {INT_SLP_SETTING_WEEK_FORMAT,VCONFKEY_SETAPPL_WEEKOFDAY_FORMAT_INT, eINT, {0}, export_default, import_default},
226 /* CALL_ALERT_TYPE */
227 // {INT_SLP_SETTING_CALL_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
228 // {INT_SLP_SETTING_NORMAL_CALL_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
229 // {INT_SLP_SETTING_SILENT_CALL_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
230 // {INT_SLP_SETTING_DRIVING_CALL_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
231 // {INT_SLP_SETTING_MEETING_CALL_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
232 // {INT_SLP_SETTING_OUTDOOR_CALL_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
234 {INT_SLP_SETTING_CALL_ALERT_VIB, VCONFKEY_SETAPPL_CALL_VIBRATION_PATTERN_INT, eINT, {0}, export_default, import_default},
235 // {INT_SLP_SETTING_NORMAL_CALL_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
236 // {INT_SLP_SETTING_SILENT_CALL_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
237 // {INT_SLP_SETTING_DRIVING_CALL_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
238 // {INT_SLP_SETTING_MEETING_CALL_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
239 // {INT_SLP_SETTING_OUTDOOR_CALL_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
242 // {INT_SLP_SETTING_CALL_ALERT_VOLUME, NULL, eINT, {0}, export_default, import_default},
244 // {INT_SLP_SETTING_MSG_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
245 // {INT_SLP_SETTING_NORMAL_MSG_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
246 // {INT_SLP_SETTING_SILENT_MSG_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
247 // {INT_SLP_SETTING_DRIVING_MSG_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
248 // {INT_SLP_SETTING_MEETING_MSG_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
249 // {INT_SLP_SETTING_OUTDOOR_MSG_ALERT_TYPE, NULL, eINT, {0}, export_default, import_default},
250 // /* MSG_ALERT_VIB */
251 // {INT_SLP_SETTING_MSG_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
252 // {INT_SLP_SETTING_NORMAL_MSG_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
253 // {INT_SLP_SETTING_SILENT_MSG_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
254 // {INT_SLP_SETTING_DRIVING_MSG_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
255 // {INT_SLP_SETTING_MEETING_MSG_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
256 // {INT_SLP_SETTING_OUTDOOR_MSG_ALERT_VIB, NULL, eINT, {0}, export_default, import_default},
259 {INT_SLP_SETTING_MSG_ALERT_REPEAT,VCONFKEY_SETAPPL_NOTI_MSG_ALERT_REP_TYPE_INT, eINT, {0}, export_default, import_default},
260 {INT_SLP_SETTING_EMAIL_ALERT_REPEAT,VCONFKEY_SETAPPL_NOTI_EMAIL_ALERT_REP_TYPE_INT, eINT, {0}, export_default, import_default},
263 // {INT_SLP_SETTING_MSG_ALERT_VOLUME, NULL, eINT, {0}, export_default, import_default},
264 // {INT_SLP_SETTING_SYS_TOUCH_SOUND, NULL, eINT, {0}, export_default, import_default},
265 // {INT_SLP_SETTING_SYS_TOUCH_SOUND_VOLUME, NULL, eINT, {0}, export_default, import_default},
266 {INT_SLP_SETTING_FONT_SIZE,VCONFKEY_SETAPPL_FONT_SIZE_INT, eINT, {0}, export_default, import_default},
267 {INT_SLP_SETTING_FONT_TYPE,VCONFKEY_SETAPPL_FONT_TYPE_INT, eINT, {0}, export_default, import_default},
268 {INT_SLP_SETTING_LANG,VCONFKEY_SETAPPL_LANG_INT, eINT, {0}, export_default, import_default},
269 {INT_SLP_SETTING_BT_STATUS,VCONFKEY_BT_STATUS, eINT, {0}, export_default, import_default},
270 {INT_SLP_SETTING_WIFI_STATUS,VCONFKEY_WIFI_STATE, eINT, {0}, export_default, import_default},
271 //{INT_SLP_SETTING_MOBILE_AP_STATUS,VCONFKEY_MOBILE_HOTSPOT_MODE, eINT, {0}, export_default, import_default},
272 {INT_SLP_SETTING_ROAMING_NETWORK,VCONFKEY_SETAPPL_ROAMING_NETWORK_INT, eINT, {0}, export_default, import_default},
273 {INT_SLP_SETTING_USB_MODE,VCONFKEY_SETAPPL_USB_MODE_INT, eINT, {0}, export_default, import_default},
274 #ifdef UNUSED_VCONFKEY
275 {INT_SLP_SETTING_TASKSWITCHER_VIEWTYPE,VCONFKEY_TASKSWITCHER_VIEWTYPE, eINT, {0}, export_default, import_default},
278 {INT_SLP_SETTING_DEFAULT_MEM_WAP,VCONFKEY_SETAPPL_DEFAULT_MEM_WAP_INT, eINT, {0}, export_default, import_default},
279 {INT_SLP_SETTING_DEFAULT_MEM_BLUETOOTH,VCONFKEY_SETAPPL_DEFAULT_MEM_BLUETOOTH_INT, eINT, {0}, export_default, import_default},
280 {INT_SLP_SETTING_DEFAULT_MEM_CAMERA,VCONFKEY_SETAPPL_DEFAULT_MEM_CAMERA_INT, eINT, {0}, export_default, import_default},
281 {INT_SLP_SETTING_DEFAULT_MEM_VOICE_RECORDER,VCONFKEY_SETAPPL_DEFAULT_MEM_VOICE_RECORDER_INT, eINT, {0}, export_default, import_default},
282 {INT_SLP_SETTING_DEFAULT_MEM_FM_RADIO,VCONFKEY_SETAPPL_DEFAULT_MEM_FM_RADIO_INT, eINT, {0}, export_default, import_default},
283 {INT_SLP_SETTING_DEFAULT_MEM_ALL_SHARE,VCONFKEY_SETAPPL_DEFAULT_MEM_ALL_SHARE_INT, eINT, {0}, export_default, import_default},
284 {INT_SLP_SETTING_DEFAULT_MEM_ADOBE_AIR,VCONFKEY_SETAPPL_DEFAULT_MEM_ADOBE_AIR_INT, eINT, {0}, export_default, import_default},
285 {INT_SLP_SETTING_DEFAULT_MEM_DVB_H,VCONFKEY_SETAPPL_DEFAULT_MEM_DVB_H_INT, eINT, {0}, export_default, import_default},
288 {INT_SLP_SETTING_SIM_SLOT,VCONFKEY_TELEPHONY_SIM_SLOT, eINT, {0}, export_default, import_default},
289 {INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT,VCONFKEY_SETAPPL_PHONE_LOCK_ATTEMPTS_LEFT_INT, eINT, {0}, export_default, import_default},
290 {INT_SLP_SETTING_SIM_LOCK_ATTEMPTS_LEFT,VCONFKEY_SETAPPL_SIM_LOCK_ATTEMPTS_LEFT_INT, eINT, {0}, export_default, import_default},
292 // accessibility setting
293 {INT_SLP_SETTING_ACCESSIBILITY_ENABLE_AUTO_ANSWER, VCONFKEY_CISSAPPL_ANSWERING_MODE_INT, eINT,{0}, export_default, import_default},
294 {INT_SLP_SETTING_ACCESSIBILITY_FONT_SIZE, VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, eINT, {0}, export_default, import_default},
295 #if SUPPORT_FONT_STYLE
296 {INT_SLP_SETTING_ACCESSIBILITY_FONT_STYLE,VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_STYLE, eINT, {0}, export_default, import_default},
298 {INT_SLP_SETTING_ACCESSIBILITY_AUTO_ANSWER, VCONFKEY_CISSAPPL_ANSWERING_MODE_TIME_INT, eINT, {0}, export_default, import_default},
299 {INT_SLP_SETTING_ACCESSIBILITY_POWER_KEY_HOLD, VCONFKEY_SETAPPL_ACCESSIBILITY_POWER_KEY_HOLD, eINT, {0}, export_default, import_default},
302 {INT_SLP_SETTING_POWERSAVING_AT, VCONFKEY_SETAPPL_PWRSV_CUSTMODE_AT, eINT, {0}, export_default, import_default},
303 {INT_SLP_SETTING_POWERSAVING_SCREEN_TIMEOUT, VCONFKEY_SETAPPL_PWRSV_CUSTMODE_BLTIME, eINT, {0}, export_default, import_default},
304 {INT_SLP_SETTING_DEVOPTION_BGPROCESS, VCONFKEY_SETAPPL_DEVOPTION_BGPROCESS, eINT, {0}, export_default, import_default},
307 {INT_SLP_SETTING_DATAUSAGE_DATA_EACH_MONTH_INT, VCONFKEY_SETAPPL_DATA_EACH_MONTH_INT, eINT, {0}, export_default, import_default},
308 {SETTING_INT_SLP_LIST_MAX, NULL, eINT, {0}, export_default, import_default},
312 /** string vconf table */
313 static VconfNode g_stable[] = {
314 /* password code - special processing */
315 { STR_SLP_LIST_PHONE_PASSWORD, NULL, eSTRING,{0}, export_default, import_default },
316 { STR_SLP_SETTING_PHONE_LOCK_TIMESTAMP,VCONFKEY_SETAPPL_PHONE_LOCK_TIMESTAMP_STR, eSTRING,{0}, export_default, import_default },
317 { STR_SLP_SETTING_SIM_LOCK_TIMESTAMP,VCONFKEY_SETAPPL_SIM_LOCK_TIMESTAMP_STR, eSTRING,{0}, export_default, import_default },
318 { STR_SLP_SETTING_SELECT_NUM,VCONFKEY_SETAPPL_SELECTED_NUM, eSTRING,{0}, export_default, import_default },
319 { STR_SLP_LIST_MAX, NULL, eSTRING, {0}, export_default, import_default},
326 int sync_adapter_backup_get_data(void **data, unsigned long long *size)
328 char *hello_string = "Hello World";
330 *data = strdup(hello_string);
331 *size = strlen(hello_string);
339 int sync_adapter_restore_set_data(void *data, unsigned long long size)
345 printf("%s: data is %s\n", __func__, (char *)data);
346 printf("%s: size is %lld\n", __func__, size);
354 void setting_import(status_handler_fp fp, void* data)
358 doc = xmlParseFile(EXPORT_FILE);
361 fprintf(stderr,"Document not parsed successfully. \n");
365 cur = xmlDocGetRootElement(doc);
367 fprintf(stderr,"empty document\n");
372 printf("ROOT NODE : %s \n", cur->name);
373 // make sure root node is "settings"
374 if (xmlStrcmp(cur->name, (const xmlChar *) "settingconf")) {
375 SETTING_TRACE("document of the wrong type, root node != settings");
380 cur = cur->xmlChildrenNode;
382 __tree_walk_exported_file(cur, fp, data);
384 /* save tree to file */
386 //xmlSaveFormatFile (docname, doc, 1);
397 * int status_handler(int total, int current, void* data);
399 void setting_export(status_handler_fp fp, void* data)
401 // int sync_adapter_backup_get_data(void **data, unsigned long long *size)
402 xmlDocPtr doc = NULL; /* document pointer */
403 xmlNodePtr root_node = NULL;/* node pointers */
404 //xmlDtdPtr dtd = NULL; /* DTD pointer */
408 doc = xmlNewDoc(BAD_CAST "1.0");
409 root_node = xmlNewNode(NULL, BAD_CAST "settingconf");
410 //assert(doc == NULL);
411 xmlDocSetRootElement(doc, root_node);
413 int icount = sizeof(g_itable)/ sizeof(g_itable[0]);
414 int bcount = sizeof(g_btable)/ sizeof(g_btable[0]);
415 int scount = sizeof(g_stable)/ sizeof(g_stable[0]);
417 int total = icount + bcount + scount;
421 for (i=0;i<SETTING_BOOL_SLP_LIST_MAX;i++) {
422 if (g_btable[i].vconf_key)
424 SETTING_TRACE("exporting bool keys : %s ", g_btable[i].vconf_key );
425 // run export function --> store data into XML
426 g_btable[i].export(&g_btable[i], &root_node);
438 for (j=0;j<STR_SLP_LIST_MAX;j++) {
439 if (g_stable[j].vconf_key)
441 SETTING_TRACE("exporting string keys : %s ", g_stable[j].vconf_key );
442 // run export function --> store data into XML
443 g_stable[j].export(&g_stable[j], &root_node);
446 fp(total, i+j, NULL);
455 for (k=0;k<SETTING_INT_SLP_LIST_MAX;k++) {
456 if (g_itable[k].vconf_key)
458 SETTING_TRACE("exporting int keys : %s ", g_itable[k].vconf_key );
459 // run export function --> store data into XML
460 g_itable[k].export(&g_itable[k], &root_node);
463 fp(total, i+j+k, NULL);
473 // Dumping document to stdio or file
474 // ./new_tree aaa.xml
475 //xmlSaveFormatFileEnc(argc > 1 ? argv[1] : "-", doc, "UTF-8", 1);
478 SETTING_TRACE("doc is NULL ");
480 xmlSaveFormatFileEnc(EXPORT_FILE, doc, "UTF-8", 1);
485 // Free the global variables that may
486 // have been allocated by the parser.
489 // this is to debug memory for regression tests
493 // create xml file buffer
494 // data <- the xml buffer
495 // int sync_adapter_backup_get_data(void **data, unsigned long long *size)
499 int set_vconf(VconfNode node,VconfNode *result)
509 SETTING_TRACE("begin case eBOOL[%s=\"%d\"]", node.vconf_key, node.value.b);
510 ret = vconf_set_bool(node.vconf_key, node.value.b);
511 result->type = eBOOL;
512 result->value.b = node.value.b;
515 SETTING_TRACE("begin case eINT[%s=\"%d\"]", node.vconf_key, node.value.i);
516 ret = vconf_set_int(node.vconf_key, node.value.i);
518 result->value.i = node.value.i;
521 if (node.key == STR_SLP_LIST_PHONE_PASSWORD) {
522 ret = setting_store_init_password(node.value.c);
524 SETTING_TRACE("begin case eSTRING[%s=\"%s\"]", node.vconf_key, node.value.c);
525 ret = vconf_set_str(node.vconf_key, node.value.c);
527 result->type = eSTRING;
528 result->value.c = node.value.c;
531 SETTING_TRACE_ERROR(">>>>>>>>>> node.type is NOT DEFINED");
537 SETTING_TRACE_ERROR(">>>>>>>>>> Failed to set vconf[%s]", node.vconf_key);
539 //SETTING_TRACE("KEY:%d VCONF_KEY=%s TYPE=%d VALUE=%d ", result->key, result->vconf_key, result->type, result->value.i);
544 int get_vconf(VconfNode node, VconfNode* result)
548 char md_result[SHA256_DIGEST_LENGTH];
549 memset(md_result, 0x0, SHA256_DIGEST_LENGTH);
557 ret = vconf_get_bool(node.vconf_key, (int *)(&(node.value.b)));
558 result->type = eBOOL;
559 result->value.b = node.value.b;
562 ret = vconf_get_int(node.vconf_key, &(node.value.i));
564 result->value.i = node.value.i;
567 if (node.key == STR_SLP_LIST_PHONE_PASSWORD)
569 node.value.c = (char*)malloc(sizeof(char) * SHA256_DIGEST_LENGTH);
571 memset(node.value.c, 0x0, SHA256_DIGEST_LENGTH);
573 SETTING_TRACE_ERROR(" malloc filed : eSTRING, node.value.c ");
574 ret = SETTING_RETURN_FAIL;
578 if (setting_read_password(md_result) == 0) {
579 memcpy(node.value.c, md_result, SHA256_DIGEST_LENGTH); /* un-safe */
581 result->type = eSTRING;
582 result->value.c = node.value.c;
583 ret = SETTING_RETURN_SUCCESS;
586 ret = SETTING_RETURN_FAIL;
590 node.value.c = vconf_get_str(node.vconf_key);
591 SETTING_TRACE("string type ---> %s ", node.value.c);
592 result->type = eSTRING;
593 result->value.c = node.value.c;
594 ret = SETTING_RETURN_SUCCESS;
598 SETTING_TRACE_ERROR(">>>>>>>>>>>>>>>>>>>>>>> get vconf ERROR : %s ", node.vconf_key );
604 int setting_set_bool_slp_key(setting_bool_slp_list key, int value, int *err)
606 //SETTING_TRACE_BEGIN;
607 int ret = SETTING_RETURN_FAIL;
610 if (key < 0 || key >= SETTING_BOOL_SLP_LIST_MAX) {
611 *err = SETTING_GENERAL_ERR_WRONG_PARAMETER;
616 g_btable[key].value.b = value;
617 ret = set_vconf(g_btable[key],&result);
619 SETTING_TRACE("setting_set_bool ::: KEY:%d VCONF_KEY=%s TYPE=%d VALUE=%d ", result.key, result.vconf_key, result.type, result.value.b);
623 int setting_get_bool_slp_key(setting_bool_slp_list key, int *value, int *err)
625 //SETTING_TRACE_BEGIN;
626 int ret = SETTING_RETURN_FAIL;
629 if (key < 0 || key >= SETTING_BOOL_SLP_LIST_MAX) {
630 *err = SETTING_GENERAL_ERR_WRONG_PARAMETER;
631 SETTING_TRACE_ERROR(" <<<<<<<< key is invalid >>>>>>>>>>>>> ");
635 ret = get_vconf(g_btable[key], &result);
636 //*value = g_btable[key].value.b;
637 *value = result.value.b;
641 int setting_set_int_slp_key(setting_int_slp_list key, int value, int *err)
643 //SETTING_TRACE_BEGIN;
644 int ret = SETTING_RETURN_FAIL;
647 if (key < 0 || key >= SETTING_INT_SLP_LIST_MAX) {
648 *err = SETTING_GENERAL_ERR_WRONG_PARAMETER;
649 SETTING_TRACE(">>> key is invalid ");
654 g_itable[key].value.i = value;
655 ret = set_vconf(g_itable[key],&result);
657 SETTING_TRACE("setting_set_int ::: KEY:%d VCONF_KEY=%s TYPE=%d VALUE=%d ", result.key, result.vconf_key, result.type, result.value.i);
661 /* return -1: fail cannot use err to check the result, return value instead*/
662 int setting_get_int_slp_key(setting_int_slp_list key, int *value, int *err)
664 //SETTING_TRACE_BEGIN;
665 int ret = SETTING_RETURN_FAIL;
668 if (key < 0 || key >= SETTING_INT_SLP_LIST_MAX) {
669 *err = SETTING_GENERAL_ERR_WRONG_PARAMETER;
674 ret = get_vconf(g_itable[key], &result);
675 //*value = g_itable[key].value.i;
676 *value = result.value.i;
682 int setting_get_string_slp_key(setting_str_slp_list key, char *value, int *err)
684 //SETTING_TRACE_BEGIN;
685 int ret = SETTING_RETURN_FAIL;
688 if (key < 0 || key >= STR_SLP_LIST_MAX || NULL == value) {
689 *err = SETTING_GENERAL_ERR_WRONG_PARAMETER;
693 /** @todo check memory leack when passwork checking */
695 ret = get_vconf(g_stable[key], &result);
699 safeCopyStr(value, result.value.c, strlen(result.value.c));
700 SETTING_TRACE(">>>>>>>> %s <<<<<<<<", value);
701 FREE(result.value.c);
703 SETTING_TRACE("get_vconf is failed");
709 int setting_set_string_slp_key(setting_str_slp_list key, char *value, int *err)
711 int ret = SETTING_RETURN_FAIL;
714 if (key < 0 || key >= STR_SLP_LIST_MAX) {
715 *err = SETTING_GENERAL_ERR_WRONG_PARAMETER;
720 g_stable[key].value.c = value;
721 ret = set_vconf(g_stable[key], &result);
722 g_stable[key].value.c = "";
724 SETTING_TRACE("setting_set_str ::: KEY:%d VCONF_KEY=%s TYPE=%d VALUE=%d ", result.key, result.vconf_key, result.type, result.value.c);
729 /** @todo don't use i18n string directly. */
730 static const setting_lang_entry lang_table[] = {
731 { "auto", "Automatic"},
732 { "ko_KR.UTF-8", "한국어"},
733 { "en_US.UTF-8", "English"},
734 { "zh_CN.UTF-8", "简体中文"},
735 { "zh_HK.UTF-8", "繁體中文(香港)"},
736 { "zh_TW.UTF-8", "繁體中文(台灣)"},
737 { "de_DE.UTF-8", "Deutsch"},
738 { "nl_NL.UTF-8", "Nederlands"},
739 { "es_ES.UTF-8", "Español"},
740 { "pt_PT.UTF-8", "Português"},
741 { "el_GR.UTF-8", "Eλληνικά"},
742 { "it_IT.UTF-8", "Italiano"},
743 { "fr_FR.UTF-8", "Français"},
744 { "tr_TR.UTF-8", "Türkçe"},
745 { "ja_JP.UTF-8", "にほんご"},
746 { "ru_RU.UTF-8", "Россию"},
749 setting_lang_entry* setting_get_language_table()
751 return (setting_lang_entry*)lang_table;
755 #define LANGLIST_FILE_DIR_PATH "/opt/data/setting/"
756 #define LANGLIST_FILE_PATH LANGLIST_FILE_DIR_PATH"langlist.xml"
758 static void _parseLangListXML(char* docname); // internal
759 static void __tree_walk_langlist(xmlNodePtr cur); // internal
761 static Eina_List* s_langlist; // internal
770 _parseLangListXML(LANGLIST_FILE_PATH);
777 Eina_List* setting_get_language_list()
779 if (NULL == s_langlist)
787 int _langlist_destroy()
790 Eina_List *li = s_langlist;
791 setting_lang_entry* node;
793 node = (setting_lang_entry*) eina_list_data_get(li);
796 SETTING_TRACE("destroy nodes : locale : %s title : %s", node->locale, node->title);
797 G_FREE(node->locale);
801 li = eina_list_next(li);
803 s_langlist = eina_list_free(s_langlist); // returns NULL
808 void setting_get_language_list_destroy()
813 static void _parseLangListXML(char* docname)
819 doc = xmlParseFile(docname);
822 fprintf(stderr,"Document not parsed successfully. \n");
826 cur = xmlDocGetRootElement(doc);
828 fprintf(stderr,"empty document\n");
833 printf("ROOT NODE : %s \n", cur->name);
834 // make sure root node is "settings"
835 if (xmlStrcmp(cur->name, (const xmlChar *) "langlist")) {
836 SETTING_TRACE("document of the wrong type, root node != settings");
841 cur = cur->xmlChildrenNode;
842 __tree_walk_langlist(cur);
844 /* save tree to file */
846 //xmlSaveFormatFile (docname, doc, 1);
853 static void __tree_walk_langlist(xmlNodePtr cur)
856 xmlNode *cur_node = NULL;
861 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
862 if (cur_node->type == XML_ELEMENT_NODE) {
864 SETTING_TRACE(" name=%s title=%s number=%s \n", xmlGetProp(cur_node, (const xmlChar *)"id"), xmlGetProp(cur_node, (const xmlChar *)"string"), xmlGetProp(cur_node, (const xmlChar *)"no"));
865 id = (char *)g_strdup((char*)xmlGetProp(cur_node, (const xmlChar *)"id"));
866 string = (char *)g_strdup((char*) xmlGetProp(cur_node, (const xmlChar *)"string"));
867 number = atoi((char*) xmlGetProp(cur_node, (const xmlChar *)"no"));
868 SETTING_TRACE(">>>> locale: %s title: %s", (char*)id, (char*)string);
870 setting_lang_entry* pitem = (setting_lang_entry*)calloc(1, sizeof(setting_lang_entry));
872 pitem->title = string;
873 pitem->number = number;
875 s_langlist = eina_list_append(s_langlist, pitem);
879 //-----------------------------------------------------------------------------------------------
880 //-----------------------------------------------------------------------------------------------
882 //setting_lang_entry*
884 //////////////////////////////////////////////////////////////////////////////////////////
885 int setting_store_init_password(char *in)
889 char md[SHA256_DIGEST_LENGTH] = {0,};
891 int ret = SETTING_RETURN_FAIL;
893 SHA256_Init(&context);
894 SHA256_Update(&context, (char *)in, strlen(in));
895 SHA256_Final((unsigned char *)md, &context);
898 SETTING_TRACE("input: [%s]\n", in);
899 SETTING_TRACE("output: [");
900 for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
901 SETTING_TRACE("%02x", md[i]);
902 SETTING_TRACE("]\n");
905 /* create a file or store a data */
909 fp = fopen(PWD_FILE, "w+");
911 ret_fw = fwrite(md, 1, SHA256_DIGEST_LENGTH, fp);
912 SETTING_TRACE_DEBUG("fwrite() wrote %d chars.", ret_fw);
913 if(ret_fw == SHA256_DIGEST_LENGTH)
917 ret = SETTING_RETURN_SUCCESS;
921 SETTING_TRACE("ERR: pwd file is not exist \n");
927 int setting_read_password(char *md_result)
932 fp = fopen(PWD_FILE, "r");
934 int size = fread(md_result, sizeof(char), SHA256_DIGEST_LENGTH, fp);
935 if (size != SHA256_DIGEST_LENGTH) {
936 SETTING_TRACE_ERROR("fread failed");
940 SETTING_TRACE("ERR: pwd file is not exist \n");
941 return SETTING_RETURN_FAIL;
945 SETTING_TRACE("output from file: [");
946 for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
947 SETTING_TRACE("%02x", md_result[i]);
948 SETTING_TRACE("]\n");
954 int setting_compare_password(char *md_result, const char *in_later)
957 SHA256_CTX context_later;
958 char md_later[SHA256_DIGEST_LENGTH];
959 int ret = SETTING_RETURN_FAIL;
961 SHA256_Init(&context_later);
962 SHA256_Update(&context_later, (char *)in_later, strlen(in_later));
963 SHA256_Final((unsigned char *)md_later, &context_later);
965 SETTING_TRACE(" :[ %25s ]", in_later);
967 if (0 == memcmp(md_later, md_result, SHA256_DIGEST_LENGTH)) {
968 SETTING_TRACE("two passwords are same \n");
971 SETTING_TRACE("two passwords are different \n");
976 void setting_destory_listen_list(Eina_List **listened_list)
978 if (listened_list && *listened_list)
980 Vconf_Change_Node *node = NULL;
981 Eina_List *li = *listened_list;
983 node = (Vconf_Change_Node *) eina_list_data_get(li);
986 //SETTING_TRACE("Deregister callback[%p] of %s", node->cb, node->in_key);
987 if (node->in_key && node->cb) {
988 (void)vconf_ignore_key_changed(node->in_key, node->cb);
992 li = eina_list_next(li);
994 *listened_list = eina_list_free(*listened_list);
998 bool setting_add_listen_node(Eina_List **listened_list,const char *vconf, vconf_callback_fn cb, void *data)
1000 Vconf_Change_Node *node = calloc(1, sizeof(Vconf_Change_Node));
1002 if (node && vconf && cb)
1004 node->in_key = vconf;
1006 node->cb_data = data;
1008 if(0 == vconf_notify_key_changed(vconf, cb, data))
1010 //SETTING_TRACE("Register callback[%p] of %s", node->cb, node->in_key);
1011 *listened_list = eina_list_append(*listened_list, node);
1015 SETTING_TRACE_ERROR("Failed to register callback[%p] of %s", node->cb, node->in_key);
1019 // FREE(node); /* list node will be freed at the destory function */