4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Contact: MyoungJune Park <mj2004.park@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
22 #include <setting-password.h>
23 #include <setting-common-data-slp-setting.h>
24 #include <setting-debug.h>
25 #include <dd-haptic.h>
26 #include <Ecore_IMF.h>
27 #include <Ecore_IMF_Evas.h>
32 #include <notification.h>
35 int setting_password_simple_check_simple_password(const char *collection);
36 int setting_password_simple_draw_next_simple_password(void *data, int title_index);
38 static int setting_password_simple_create(void *cb);
39 static int setting_password_simple_destroy(void *cb);
40 static int setting_password_simple_update(void *cb);
41 static int setting_password_simple_cleanup(void *cb);
43 setting_view setting_view_password_simple = {
44 .create = setting_password_simple_create,
45 .destroy = setting_password_simple_destroy,
46 .update = setting_password_simple_update,
47 .cleanup = setting_password_simple_cleanup,
51 #define SETTING_SP_TITLE_INDEX_START 0
52 #define SETTING_SP_TITLE_INDEX_MAX 3
53 const char *sp_titles[5] = { PW_ST_ENTER_PW,
61 extern struct _pw_item pw_its[];
63 /* ***************************************************
67 ***************************************************/
69 static Eina_Bool setting_password_simple_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
73 retvm_if(data == NULL, EINA_FALSE, "[Setting > Password] Data parameter is NULL");
75 SettingPasswordUG *ad = (SettingPasswordUG *) data;
77 if (ad->focus_timer) {
78 ecore_timer_del(ad->focus_timer);
79 ad->focus_timer = NULL;
82 if (ad->imf_handler) {
83 ecore_event_handler_del(ad->imf_handler);
84 ad->imf_handler = NULL;
86 if (ad->imf_context) {
87 ecore_imf_context_del(ad->imf_context);
88 ad->imf_context = NULL;
91 /* send result : Cancel */
93 if (app_control_create(&svc) == 0) {
94 app_control_add_extra_data(svc, "result", "Cancel");
95 ug_send_result(ad->ug, svc);
96 SETTING_TRACE("Send Result : %s\n", "Cancel");
98 app_control_destroy(svc);
100 /* Send destroy request */
101 ug_destroy_me(ad->ug);
106 static void setting_password_simple_add_description(Evas_Object *layout, char *desc)
108 ret_if(!layout || !desc);
109 elm_object_part_text_set(layout, "help.txt", _(desc));
112 static void _copy_chars_from_sp_entries(void *data, char *collection)
114 ret_if(data == NULL || collection == NULL);
116 SettingPasswordUG *ad = (SettingPasswordUG *) data;
118 if (ad->sp_entry1 == NULL || ad->sp_entry2 == NULL ||
119 ad->sp_entry3 == NULL || ad->sp_entry4 == NULL)
122 strncpy(collection, ad->sp_chars, 4);
123 memset(ad->sp_chars, 0x00, 5);
126 /* Verify simple password */
127 static int _handle_step1(void *data, char *collection)
130 retv_if(data == NULL, SETTING_RETURN_FAIL);
132 SettingPasswordUG *ad = (SettingPasswordUG *) data;
136 _copy_chars_from_sp_entries(ad, collection);
138 ret = setting_password_simple_check_simple_password(collection);
139 SETTING_TRACE("ret:%d", ret);
141 SETTING_TRACE_ERROR("Invalid Password formatting")
142 setting_password_simple_draw_next_simple_password(ad, 3);
143 return SETTING_RETURN_FAIL;
146 unsigned int remain_attempt;
147 unsigned int valid_sec;
148 ret = setting_password_check_password(collection, &remain_attempt, &valid_sec);
149 SETTING_TRACE("ret:%d", ret);
150 if (ret != SETTING_RETURN_SUCCESS) {
151 SETTING_TRACE_ERROR("Failed to invoke security_server_chk_pwd")
152 setting_password_simple_draw_next_simple_password(ad, 3);
153 ad->remain_attempt = remain_attempt;
154 ad->valid_sec = valid_sec;
155 return SETTING_PW_ERROR_DO_NOT_MATCH;
159 ecore_imf_context_input_panel_hide(ad->imf_context);
161 if (0 == safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_SIMPLE_PASSWORD")) {
162 setting_get_bool_slp_key(BOOL_SLP_SETTING_POWER_ON_LOCK, &value, &err);
163 SETTING_TRACE_DEBUG("get VCONF POWER_ON_LOCK : %d", value);
166 ret = setting_set_bool_slp_key(BOOL_SLP_SETTING_POWER_ON_LOCK,
167 SETTING_ON_OFF_BTN_ON, &err);
169 ret = setting_set_bool_slp_key(BOOL_SLP_SETTING_POWER_ON_LOCK,
170 SETTING_ON_OFF_BTN_OFF, &err);
173 setting_set_int_slp_key(INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT,
174 PHONE_LOCK_ATTEMPS_MAX, &err);
175 setting_retvm_if(err == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "[Error] set value of vconf fail.");
177 /* Correct Password. Send Bundle to caller for status change */
181 if (app_control_create(&svc)) {
182 setting_password_simple_draw_next_simple_password(ad, 3);
183 return SETTING_RETURN_FAIL;
186 app_control_add_extra_data(svc, "result", ad->view_type_string);
188 if (0 == safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_ENTER_LOCK_TYPE"))
189 app_control_add_extra_data(svc, "current", collection);
191 /* reset static variables */
192 memset(collection, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
194 ug_send_result(ad->ug, svc);
195 SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
196 app_control_destroy(svc);
197 /* Send destroy request */
198 ug_destroy_me(ad->ug);
200 return SETTING_RETURN_SUCCESS;
203 /* Set new simple password */
204 static int _handle_step2(void *data, int *step, char *collection1, char *collection2)
207 retv_if(data == NULL, SETTING_RETURN_FAIL);
209 SettingPasswordUG *ad = (SettingPasswordUG *) data;
211 static int simple_sequence = 0;
213 if (*step == 0) { /* Enter new password */
214 _copy_chars_from_sp_entries(ad, collection1);
216 ret = setting_password_simple_check_simple_password(collection1);
218 setting_password_simple_draw_next_simple_password(ad, 1);
219 return SETTING_RETURN_FAIL;
223 setting_password_simple_draw_next_simple_password(ad, 2);
224 } else if (*step == 1) { /* Enter password again */
225 _copy_chars_from_sp_entries(ad, collection2);
227 ret = setting_password_simple_check_simple_password(collection2);
229 setting_password_simple_draw_next_simple_password(ad, 2);
230 return SETTING_RETURN_FAIL;
233 /* compare two input passwords : collection_step1, collection_step2 */
234 if (safeStrNCmp(collection1, collection2, 4) == 0) {
235 ecore_imf_context_input_panel_hide(ad->imf_context);
236 ret = setting_password_set_password(ad->cur_pwd, collection1, ad);
238 if (SETTING_RETURN_SUCCESS == ret) {
242 if (!app_control_create(&svc)) {
243 app_control_add_extra_data(svc, "result", ad->view_type_string);
245 /* reset static variables */
247 /* reset static variables */
248 memset(collection1, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
249 memset(collection2, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
251 ug_send_result(ad->ug, svc);
252 SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
253 app_control_destroy(svc);
254 /* Send destroy request */
255 ug_destroy_me(ad->ug);
256 return SETTING_RETURN_SUCCESS;
259 setting_password_ug_create_popup_notitle_nobtn(ad, _("IDS_ST_POP_NEW_PASSWD_SAVED"), TRUE);
260 } else if (ret == SETTING_PW_ERROR_REUSED) {
261 setting_password_simple_draw_next_simple_password(ad, 1);
262 setting_password_simple_add_description(ad->simple_layout, PW_ERR_REUSED);
264 /* reset static variables */
265 memset(collection1, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
266 memset(collection2, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
267 return SETTING_PW_ERROR_REUSED;
269 setting_password_simple_draw_next_simple_password(ad, 1);
270 char temp[256] = {0,};
271 snprintf(temp, 256, "Unable to save password (%d)", ret);
272 setting_password_ug_create_popup_notitle_nobtn(ad, temp, FALSE);
275 /* reset static variables */
276 memset(collection1, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
277 memset(collection2, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
278 return SETTING_PW_ERROR_UNKNOWN;
281 setting_password_simple_draw_next_simple_password(ad, 2);
282 return SETTING_ENTRY_NOT_MATCH_NEW_CONF_PW;
285 return SETTING_RETURN_SUCCESS;
288 static int setting_password_simple_done_simple_password(void *data, int on_locking)
291 retv_if(data == NULL, SETTING_RETURN_FAIL);
293 SettingPasswordUG *ad = (SettingPasswordUG *) data;
297 static char collection_step1[SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1] = {0,};
298 static char collection_step2[SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1] = {0,};
300 switch (ad->view_type) {
301 case SETTING_PW_TYPE_SIMPLE_PASSWORD: {
302 SETTING_TRACE_DEBUG("case SIMPLE_PASSWORD");
303 return _handle_step1(ad, collection_step1);
305 case SETTING_PW_TYPE_SET_SIMPLE_PASSWORD: {
306 SETTING_TRACE_DEBUG("case SET_SIMPLE_PASSWORD");
307 return _handle_step2(ad, &step, collection_step1, collection_step2);
313 return SETTING_RETURN_SUCCESS;
316 static Eina_Bool setting_password_simple_check_4entries(void *data)
319 retv_if(data == NULL, EINA_FALSE);
320 SettingPasswordUG *ad = (SettingPasswordUG *) data;
324 ret = setting_password_simple_done_simple_password(ad, TRUE);
326 memset(ad->sp_chars, 0x00, 5);
328 if (ret == SETTING_RETURN_FAIL) {
329 setting_password_simple_add_description(ad->simple_layout, PW_ST_INCORRECT_PW_TRY_AGAIN);
330 } else if (ret == SETTING_PW_ERROR_DO_NOT_MATCH) {
331 if (0 == safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_ENTER_LOCK_TYPE")) {
333 setting_password_simple_add_description(ad->simple_layout, PW_ERR_DESC);
336 /** @todo setting_password_ug_check_attemps_left */
337 setting_int_slp_list item_attempts_left;
338 setting_str_slp_list item_lock_timestamp;
339 int attemps_left_max = 5;
340 item_attempts_left = INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT;
341 item_lock_timestamp = STR_SLP_SETTING_PHONE_LOCK_TIMESTAMP;
342 attemps_left_max = PHONE_LOCK_ATTEMPS_MAX;
345 int err = SETTING_RETURN_SUCCESS;
346 setting_get_int_slp_key(item_attempts_left, &value, &err);
347 retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE, "[Error] get value of vconf fail.");
349 if (value > 0 && value <= attemps_left_max) {
350 setting_set_int_slp_key(item_attempts_left, value, &err);
351 setting_retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE, "[Error] set value of vconf fail.");
352 char speciliztion[MAX_SPECIALIZITION_LEN] = { 0, };
353 char temp[MAX_SPECIALIZITION_LEN] = {0,};
355 snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPTS_DESC);
357 snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPT_DESC);
358 snprintf(speciliztion, sizeof(speciliztion), temp, value);
359 setting_password_simple_add_description(ad->simple_layout, speciliztion);
360 } else if (value == 0) {
361 /* store the lock timestamp */
362 elm_object_focus_set(ad->sp_entry1, EINA_FALSE);
363 time_t cur_time = time(NULL);
364 char cur_timestamp[LOCK_TIMESTAMP_LEN] = { 0, };
365 int ret = snprintf(cur_timestamp, sizeof(cur_timestamp), "%ld", cur_time);
366 retv_if(ret < 0, EINA_FALSE);
367 setting_set_string_slp_key(item_lock_timestamp, cur_timestamp, &err);
368 setting_retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE,
369 "[Error] set value of vconf fail.");
371 setting_set_int_slp_key(item_attempts_left, value, &err);
372 setting_retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE,
373 "[Error] set value of vconf fail.");
375 ad->disable_item_type = ad->view_type;
377 char temp[MAX_SPECIALIZITION_LEN] = {0,};
378 snprintf(temp, sizeof(temp), PW_ERR_DELAY_DESC, PW_ERR_DELAY_TIME);
379 setting_password_ug_create_popup_notitle_nobtn(ad, temp, TRUE);
381 } else if (ret == SETTING_ENTRY_NOT_MATCH_NEW_CONF_PW) {
382 setting_password_simple_add_description(ad->simple_layout, PW_ST_PW_DO_NOT_MATCH);
384 /* if you have more cases, modify here. */
387 ad->simple_done_timer = NULL;
391 Ecore_IMF_Context *__imf_context_create(void *data)
394 retv_if(data == NULL, NULL);
395 SettingPasswordUG *ad = (SettingPasswordUG *) data;
397 Ecore_IMF_Context *imf_context = NULL;
398 const char *ctx_id = ecore_imf_context_default_id_get();
401 imf_context = ecore_imf_context_add(ctx_id);
403 if (ad->evas && imf_context) {
404 ecore_imf_context_client_window_set(imf_context, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(ad->evas)));
405 ecore_imf_context_client_canvas_set(imf_context, ad->evas);
411 static Eina_Bool __imf_event_key_down_cb(void *data, int type, void *event)
414 SettingPasswordUG *ad = (SettingPasswordUG *)data;
415 Ecore_Event_Key *ev = event;
417 char *commit_str = (char *)ev->key;
418 char *digit = (char *)ev->string;
419 SETTING_TRACE_DEBUG("ev->keyname is %s\n", commit_str); /*here you get the Input String from ISE */
421 if (!safeStrCmp(commit_str, "Return"))
423 else if (!safeStrCmp(commit_str, "XF86Back"))
426 if (!safeStrCmp(commit_str, "BackSpace")) {
427 if (ad->sp_focused_num > 0)
428 elm_entry_entry_set(ad->sp_entry[--ad->sp_focused_num], "");
429 if (ad->sp_focused_num < 0)
430 ad->sp_focused_num = 0;
435 if (ad->sp_focused_num >= 4) {
436 SETTING_TRACE_DEBUG("all entries are filled.");
438 } else if (ad->sp_focused_num < 0) {
439 ad->sp_focused_num = 0;
442 SETTING_TRACE_DEBUG("digit is %c", key);
443 if (key >= '0' && key <= '9') {
444 ad->sp_chars[ad->sp_focused_num] = key;
445 elm_entry_entry_set(ad->sp_entry[ad->sp_focused_num], "<align=center>•</align>");
446 ad->sp_focused_num++;
447 if (ad->sp_focused_num == 4)
449 ad->simple_done_timer = ecore_timer_add(0.2, setting_password_simple_check_4entries, ad);
456 void __imf_show_for_simple_password(void *data)
459 ret_if(data == NULL);
460 SettingPasswordUG *ad = (SettingPasswordUG *) data;
462 if (ad->imf_context) {
463 ecore_imf_context_input_panel_show(ad->imf_context);
465 Ecore_IMF_Context *imf_context = NULL;
466 imf_context = __imf_context_create(ad);
468 ad->imf_context = imf_context;
470 ecore_imf_context_reset(imf_context);
471 ecore_imf_context_input_panel_imdata_set(imf_context, (void *)"type=password", 13); /* for password read out with TTS */
472 ecore_imf_context_input_panel_layout_set(imf_context, ECORE_IMF_INPUT_PANEL_LAYOUT_DATETIME);
473 ecore_imf_context_input_panel_return_key_disabled_set(imf_context, EINA_TRUE);
474 ecore_imf_context_focus_in(imf_context);
475 ad->imf_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __imf_event_key_down_cb, ad);
476 if (!ad->imf_handler)
477 SETTING_TRACE_DEBUG("handler is NULL");
482 static void __enable_imf_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
485 setting_retm_if(data == NULL, "Data parameter is NULL");
486 SettingPasswordUG *ad = (SettingPasswordUG *) data;
488 __imf_show_for_simple_password(ad);
491 static int setting_password_simple_create(void *cb)
495 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
497 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
499 ad->sp_focused_num = 0;
501 /* Create layout : layout/simple_password in setting-theme.edc */
502 ad->simple_layout = elm_layout_add(ad->win_main_layout);
503 elm_layout_file_set(ad->simple_layout, SETTING_THEME_EDJ_NAME, "layout/simple_password");
505 ad->sp_entry1 = elm_entry_add(ad->simple_layout);
506 elm_object_style_set(ad->sp_entry1 , "popup");
507 elm_entry_single_line_set(ad->sp_entry1 , EINA_TRUE);
508 elm_entry_editable_set(ad->sp_entry1 , EINA_FALSE);
509 ad->sp_entry[0] = ad->sp_entry1;
510 elm_object_part_content_set(ad->simple_layout, "entry1", ad->sp_entry1);
512 ad->sp_entry2 = elm_entry_add(ad->simple_layout);
513 elm_object_style_set(ad->sp_entry2 , "popup");
514 elm_entry_single_line_set(ad->sp_entry2 , EINA_TRUE);
515 elm_entry_editable_set(ad->sp_entry2 , EINA_FALSE);
516 ad->sp_entry[1] = ad->sp_entry2;
517 elm_object_part_content_set(ad->simple_layout, "entry2", ad->sp_entry2);
519 ad->sp_entry3 = elm_entry_add(ad->simple_layout);
520 elm_object_style_set(ad->sp_entry3 , "popup");
521 elm_entry_single_line_set(ad->sp_entry3 , EINA_TRUE);
522 elm_entry_editable_set(ad->sp_entry3 , EINA_FALSE);
523 ad->sp_entry[2] = ad->sp_entry3;
524 elm_object_part_content_set(ad->simple_layout, "entry3", ad->sp_entry3);
526 ad->sp_entry4 = elm_entry_add(ad->simple_layout);
527 elm_object_style_set(ad->sp_entry4 , "popup");
528 elm_entry_single_line_set(ad->sp_entry4 , EINA_TRUE);
529 elm_entry_editable_set(ad->sp_entry4 , EINA_FALSE);
530 ad->sp_entry[3] = ad->sp_entry4;
531 elm_object_part_content_set(ad->simple_layout, "entry4", ad->sp_entry4);
533 if (ad->view_type == SETTING_PW_TYPE_SIMPLE_PASSWORD)
534 elm_object_part_text_set(ad->simple_layout, "title.txt", _(sp_titles[3]));
536 elm_object_part_text_set(ad->simple_layout, "title.txt", _(sp_titles[1]));
539 ad->ly_main = setting_create_layout_navi_bar(ad->win_main_layout, ad->win_get, "IDS_ST_BODY_SIMPLE_PASSWORD",
540 _("IDS_ST_BUTTON_BACK"),
541 (setting_call_back_func)setting_password_simple_click_softkey_cancel_cb,
544 &(ad->navi_bar), NULL);
545 evas_object_event_callback_add(ad->sp_entry1, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
546 evas_object_event_callback_add(ad->sp_entry2, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
547 evas_object_event_callback_add(ad->sp_entry3, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
548 evas_object_event_callback_add(ad->sp_entry4, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
550 evas_object_show(ad->simple_layout);
552 __imf_show_for_simple_password(ad);
554 setting_view_password_simple.is_create = 1;
557 return SETTING_RETURN_SUCCESS;
560 static int setting_password_simple_destroy(void *cb)
564 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
566 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
568 if (ad->imf_handler) {
569 ecore_event_handler_del(ad->imf_handler);
570 ad->imf_handler = NULL;
572 if (ad->imf_context) {
573 ecore_imf_context_del(ad->imf_context);
574 ad->imf_context = NULL;
577 if (ad->simple_done_timer) {
578 ecore_timer_del(ad->simple_done_timer);
579 ad->simple_done_timer = NULL;
583 evas_object_del(ad->notify);
587 if (ad->ly_main != NULL) {
588 evas_object_del(ad->ly_main);
592 setting_view_password_simple.is_create = 0;
594 return SETTING_RETURN_SUCCESS;
597 static int setting_password_simple_update(void *cb)
601 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
603 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
605 if (ad->ly_main != NULL) {
606 evas_object_show(ad->ly_main);
608 return SETTING_RETURN_SUCCESS;
611 static int setting_password_simple_cleanup(void *cb)
614 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
616 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
618 if (ad->ly_main != NULL) {
619 evas_object_hide(ad->ly_main);
622 return SETTING_RETURN_SUCCESS;
625 /* ***************************************************
629 ***************************************************/
631 int setting_password_simple_draw_next_simple_password(void *data, int title_index)
634 retvm_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER,
635 "[Setting > Password] Data parameter is NULL");
637 SettingPasswordUG *ad = (SettingPasswordUG *) data;
639 elm_object_part_text_set(ad->simple_layout, "title.txt", _(sp_titles[title_index]));
640 elm_entry_entry_set(ad->sp_entry1, "");
641 elm_entry_entry_set(ad->sp_entry2, "");
642 elm_entry_entry_set(ad->sp_entry3, "");
643 elm_entry_entry_set(ad->sp_entry4, "");
645 memset(ad->sp_chars, 0x00, 5);
646 ad->sp_focused_num = 0;
648 return SETTING_RETURN_SUCCESS;
651 int setting_password_simple_check_simple_password(const char *collection)
653 retv_if(collection == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
655 int sp_len = safeStrLen(collection);
659 SETTING_TRACE_SECURE_DEBUG("collection length is %d", sp_len);
662 return SETTING_RETURN_FAIL;
664 /* check if digit. */
665 for (index = 0; index < sp_len; index++) {
666 temp = (char)(collection[index]);
667 if ((temp < '0') || (temp > '9'))
668 return SETTING_RETURN_FAIL;
670 SETTING_TRACE_SECURE_DEBUG("temp %c", temp);
673 return SETTING_RETURN_SUCCESS;