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>
30 #include <notification.h>
33 int setting_password_simple_check_simple_password(const char *collection);
34 int setting_password_simple_draw_next_simple_password(void *data, int title_index);
36 static int setting_password_simple_create(void *cb);
37 static int setting_password_simple_destroy(void *cb);
38 static int setting_password_simple_update(void *cb);
39 static int setting_password_simple_cleanup(void *cb);
41 setting_view setting_view_password_simple = {
42 .create = setting_password_simple_create,
43 .destroy = setting_password_simple_destroy,
44 .update = setting_password_simple_update,
45 .cleanup = setting_password_simple_cleanup,
49 #define SETTING_SP_TITLE_INDEX_START 0
50 #define SETTING_SP_TITLE_INDEX_MAX 3
51 const char *sp_titles[5] = { PW_ST_ENTER_PW,
59 extern struct _pw_item pw_its[];
61 /* ***************************************************
65 ***************************************************/
67 static Eina_Bool setting_password_simple_click_softkey_cancel_cb(void *data, Elm_Object_Item *it)
71 retvm_if(data == NULL, EINA_FALSE, "[Setting > Password] Data parameter is NULL");
73 SettingPasswordUG *ad = (SettingPasswordUG *) data;
75 if (ad->focus_timer) {
76 ecore_timer_del(ad->focus_timer);
77 ad->focus_timer = NULL;
80 if (ad->imf_handler) {
81 ecore_event_handler_del(ad->imf_handler);
82 ad->imf_handler = NULL;
84 if (ad->imf_context) {
85 ecore_imf_context_del(ad->imf_context);
86 ad->imf_context = NULL;
89 /* send result : Cancel */
91 if (app_control_create(&svc) == 0) {
92 app_control_add_extra_data(svc, "result", "Cancel");
93 ug_send_result(ad->ug, svc);
94 SETTING_TRACE("Send Result : %s\n", "Cancel");
96 app_control_destroy(svc);
98 /* Send destroy request */
99 ug_destroy_me(ad->ug);
104 static void setting_password_simple_add_description(Evas_Object *layout, char *desc)
106 ret_if(!layout || !desc);
107 elm_object_part_text_set(layout, "help.txt", _(desc));
110 static void _copy_chars_from_sp_entries(void *data, char *collection)
112 ret_if(data == NULL || collection == NULL);
114 SettingPasswordUG *ad = (SettingPasswordUG *) data;
116 if (ad->sp_entry1 == NULL || ad->sp_entry2 == NULL ||
117 ad->sp_entry3 == NULL || ad->sp_entry4 == NULL)
120 strncpy(collection, ad->sp_chars, 4);
121 memset(ad->sp_chars, 0x00, 5);
124 /* Verify simple password */
125 static int _handle_step1(void *data, char *collection)
128 retv_if(data == NULL, SETTING_RETURN_FAIL);
130 SettingPasswordUG *ad = (SettingPasswordUG *) data;
134 _copy_chars_from_sp_entries(ad, collection);
136 ret = setting_password_simple_check_simple_password(collection);
137 SETTING_TRACE("ret:%d", ret);
139 SETTING_TRACE_ERROR("Invalid Password formatting")
140 setting_password_simple_draw_next_simple_password(ad, 3);
141 return SETTING_RETURN_FAIL;
144 unsigned int remain_attempt;
145 unsigned int valid_sec;
146 ret = setting_password_check_password(collection, &remain_attempt, &valid_sec);
147 SETTING_TRACE("ret:%d", ret);
148 if (ret != SETTING_RETURN_SUCCESS) {
149 SETTING_TRACE_ERROR("Failed to invoke security_server_chk_pwd")
150 setting_password_simple_draw_next_simple_password(ad, 3);
151 ad->remain_attempt = remain_attempt;
152 ad->valid_sec = valid_sec;
153 return SETTING_PW_ERROR_DO_NOT_MATCH;
157 ecore_imf_context_input_panel_hide(ad->imf_context);
159 if (0 == safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_SIMPLE_PASSWORD")) {
160 setting_get_bool_slp_key(BOOL_SLP_SETTING_POWER_ON_LOCK, &value, &err);
161 SETTING_TRACE_DEBUG("get VCONF POWER_ON_LOCK : %d", value);
164 ret = setting_set_bool_slp_key(BOOL_SLP_SETTING_POWER_ON_LOCK,
165 SETTING_ON_OFF_BTN_ON, &err);
167 ret = setting_set_bool_slp_key(BOOL_SLP_SETTING_POWER_ON_LOCK,
168 SETTING_ON_OFF_BTN_OFF, &err);
171 setting_set_int_slp_key(INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT,
172 PHONE_LOCK_ATTEMPS_MAX, &err);
173 setting_retvm_if(err == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL, "[Error] set value of vconf fail.");
175 /* Correct Password. Send Bundle to caller for status change */
179 if (app_control_create(&svc)) {
180 setting_password_simple_draw_next_simple_password(ad, 3);
181 return SETTING_RETURN_FAIL;
184 app_control_add_extra_data(svc, "result", ad->view_type_string);
186 if (0 == safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_ENTER_LOCK_TYPE"))
187 app_control_add_extra_data(svc, "current", collection);
189 /* reset static variables */
190 memset(collection, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
192 ug_send_result(ad->ug, svc);
193 SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
194 app_control_destroy(svc);
195 /* Send destroy request */
196 ug_destroy_me(ad->ug);
198 return SETTING_RETURN_SUCCESS;
201 /* Set new simple password */
202 static int _handle_step2(void *data, int *step, char *collection1, char *collection2)
205 retv_if(data == NULL, SETTING_RETURN_FAIL);
207 SettingPasswordUG *ad = (SettingPasswordUG *) data;
209 static int simple_sequence = 0;
211 if (*step == 0) { /* Enter new password */
212 _copy_chars_from_sp_entries(ad, collection1);
214 ret = setting_password_simple_check_simple_password(collection1);
216 setting_password_simple_draw_next_simple_password(ad, 1);
217 return SETTING_RETURN_FAIL;
221 setting_password_simple_draw_next_simple_password(ad, 2);
222 } else if (*step == 1) { /* Enter password again */
223 _copy_chars_from_sp_entries(ad, collection2);
225 ret = setting_password_simple_check_simple_password(collection2);
227 setting_password_simple_draw_next_simple_password(ad, 2);
228 return SETTING_RETURN_FAIL;
231 /* compare two input passwords : collection_step1, collection_step2 */
232 if (safeStrNCmp(collection1, collection2, 4) == 0) {
233 ecore_imf_context_input_panel_hide(ad->imf_context);
234 ret = setting_password_set_password(ad->cur_pwd, collection1, ad);
236 if (SETTING_RETURN_SUCCESS == ret) {
240 if (!app_control_create(&svc)) {
241 app_control_add_extra_data(svc, "result", ad->view_type_string);
243 /* reset static variables */
245 /* reset static variables */
246 memset(collection1, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
247 memset(collection2, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
249 ug_send_result(ad->ug, svc);
250 SETTING_TRACE("Send Result : %s\n", ad->view_type_string);
251 app_control_destroy(svc);
252 /* Send destroy request */
253 ug_destroy_me(ad->ug);
254 return SETTING_RETURN_SUCCESS;
257 setting_password_ug_create_popup_notitle_nobtn(ad, _("IDS_ST_POP_NEW_PASSWD_SAVED"), TRUE);
258 } else if (ret == SETTING_PW_ERROR_REUSED) {
259 setting_password_simple_draw_next_simple_password(ad, 1);
260 setting_password_simple_add_description(ad->simple_layout, PW_ERR_REUSED);
262 /* reset static variables */
263 memset(collection1, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
264 memset(collection2, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
265 return SETTING_PW_ERROR_REUSED;
267 setting_password_simple_draw_next_simple_password(ad, 1);
268 char temp[256] = {0,};
269 snprintf(temp, 256, "Unable to save password (%d)", ret);
270 setting_password_ug_create_popup_notitle_nobtn(ad, temp, FALSE);
273 /* reset static variables */
274 memset(collection1, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
275 memset(collection2, 0x00, SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1);
276 return SETTING_PW_ERROR_UNKNOWN;
279 setting_password_simple_draw_next_simple_password(ad, 2);
280 return SETTING_ENTRY_NOT_MATCH_NEW_CONF_PW;
283 return SETTING_RETURN_SUCCESS;
286 static int setting_password_simple_done_simple_password(void *data, int on_locking)
289 retv_if(data == NULL, SETTING_RETURN_FAIL);
291 SettingPasswordUG *ad = (SettingPasswordUG *) data;
295 static char collection_step1[SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1] = {0,};
296 static char collection_step2[SETTING_PW_UG_NORMAL_PASSWORD_MIN_LENGTH + 1] = {0,};
298 switch (ad->view_type) {
299 case SETTING_PW_TYPE_SIMPLE_PASSWORD: {
300 SETTING_TRACE_DEBUG("case SIMPLE_PASSWORD");
301 return _handle_step1(ad, collection_step1);
303 case SETTING_PW_TYPE_SET_SIMPLE_PASSWORD: {
304 SETTING_TRACE_DEBUG("case SET_SIMPLE_PASSWORD");
305 return _handle_step2(ad, &step, collection_step1, collection_step2);
311 return SETTING_RETURN_SUCCESS;
314 static Eina_Bool setting_password_simple_check_4entries(void *data)
317 retv_if(data == NULL, EINA_FALSE);
318 SettingPasswordUG *ad = (SettingPasswordUG *) data;
322 ret = setting_password_simple_done_simple_password(ad, TRUE);
324 memset(ad->sp_chars, 0x00, 5);
326 if (ret == SETTING_RETURN_FAIL) {
327 setting_password_simple_add_description(ad->simple_layout, PW_ST_INCORRECT_PW_TRY_AGAIN);
328 } else if (ret == SETTING_PW_ERROR_DO_NOT_MATCH) {
329 if (0 == safeStrCmp(ad->view_type_string, "SETTING_PW_TYPE_ENTER_LOCK_TYPE")) {
331 setting_password_simple_add_description(ad->simple_layout, PW_ERR_DESC);
334 /** @todo setting_password_ug_check_attemps_left */
335 setting_int_slp_list item_attempts_left;
336 setting_str_slp_list item_lock_timestamp;
337 int attemps_left_max = 5;
338 item_attempts_left = INT_SLP_SETTING_PHONE_LOCK_ATTEMPTS_LEFT;
339 item_lock_timestamp = STR_SLP_SETTING_PHONE_LOCK_TIMESTAMP;
340 attemps_left_max = PHONE_LOCK_ATTEMPS_MAX;
343 int err = SETTING_RETURN_SUCCESS;
344 setting_get_int_slp_key(item_attempts_left, &value, &err);
345 retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE, "[Error] get value of vconf fail.");
347 if (value > 0 && value <= attemps_left_max) {
348 setting_set_int_slp_key(item_attempts_left, value, &err);
349 setting_retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE, "[Error] set value of vconf fail.");
350 char speciliztion[MAX_SPECIALIZITION_LEN] = { 0, };
351 char temp[MAX_SPECIALIZITION_LEN] = {0,};
353 snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPTS_DESC);
355 snprintf(temp, sizeof(temp), "%s. %s.", PW_ERR_DESC, ATTEMPT_DESC);
356 snprintf(speciliztion, sizeof(speciliztion), temp, value);
357 setting_password_simple_add_description(ad->simple_layout, speciliztion);
358 } else if (value == 0) {
359 /* store the lock timestamp */
360 elm_object_focus_set(ad->sp_entry1, EINA_FALSE);
361 time_t cur_time = time(NULL);
362 char cur_timestamp[LOCK_TIMESTAMP_LEN] = { 0, };
363 int ret = snprintf(cur_timestamp, sizeof(cur_timestamp), "%ld", cur_time);
364 retv_if(ret < 0, EINA_FALSE);
365 setting_set_string_slp_key(item_lock_timestamp, cur_timestamp, &err);
366 setting_retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE,
367 "[Error] set value of vconf fail.");
369 setting_set_int_slp_key(item_attempts_left, value, &err);
370 setting_retvm_if(err == SETTING_RETURN_FAIL, EINA_FALSE,
371 "[Error] set value of vconf fail.");
373 ad->disable_item_type = ad->view_type;
375 char temp[MAX_SPECIALIZITION_LEN] = {0,};
376 snprintf(temp, sizeof(temp), PW_ERR_DELAY_DESC, PW_ERR_DELAY_TIME);
377 setting_password_ug_create_popup_notitle_nobtn(ad, temp, TRUE);
379 } else if (ret == SETTING_ENTRY_NOT_MATCH_NEW_CONF_PW) {
380 setting_password_simple_add_description(ad->simple_layout, PW_ST_PW_DO_NOT_MATCH);
382 /* if you have more cases, modify here. */
385 ad->simple_done_timer = NULL;
389 Ecore_IMF_Context *__imf_context_create(void *data)
392 retv_if(data == NULL, NULL);
393 SettingPasswordUG *ad = (SettingPasswordUG *) data;
395 Ecore_IMF_Context *imf_context = NULL;
396 const char *ctx_id = ecore_imf_context_default_id_get();
399 imf_context = ecore_imf_context_add(ctx_id);
401 if (ad->evas && imf_context) {
402 ecore_imf_context_client_window_set(imf_context, (void *)ecore_evas_window_get(ecore_evas_ecore_evas_get(ad->evas)));
403 ecore_imf_context_client_canvas_set(imf_context, ad->evas);
409 static Eina_Bool __imf_event_key_down_cb(void *data, int type, void *event)
412 SettingPasswordUG *ad = (SettingPasswordUG *)data;
413 Ecore_Event_Key *ev = event;
415 char *commit_str = (char *)ev->key;
416 char *digit = (char *)ev->string;
417 SETTING_TRACE_DEBUG("ev->keyname is %s\n", commit_str); /*here you get the Input String from ISE */
419 if (!safeStrCmp(commit_str, "Return"))
421 else if (!safeStrCmp(commit_str, KEY_BACK))
424 if (!safeStrCmp(commit_str, "BackSpace")) {
425 if (ad->sp_focused_num > 0)
426 elm_entry_entry_set(ad->sp_entry[--ad->sp_focused_num], "");
427 if (ad->sp_focused_num < 0)
428 ad->sp_focused_num = 0;
433 if (ad->sp_focused_num >= 4) {
434 SETTING_TRACE_DEBUG("all entries are filled.");
436 } else if (ad->sp_focused_num < 0) {
437 ad->sp_focused_num = 0;
440 SETTING_TRACE_DEBUG("digit is %c", key);
441 if (key >= '0' && key <= '9') {
442 ad->sp_chars[ad->sp_focused_num] = key;
443 elm_entry_entry_set(ad->sp_entry[ad->sp_focused_num], "<align=center>•</align>");
444 ad->sp_focused_num++;
445 if (ad->sp_focused_num == 4)
447 ad->simple_done_timer = ecore_timer_add(0.2, setting_password_simple_check_4entries, ad);
454 void __imf_show_for_simple_password(void *data)
457 ret_if(data == NULL);
458 SettingPasswordUG *ad = (SettingPasswordUG *) data;
460 if (ad->imf_context) {
461 ecore_imf_context_input_panel_show(ad->imf_context);
463 Ecore_IMF_Context *imf_context = NULL;
464 imf_context = __imf_context_create(ad);
466 ad->imf_context = imf_context;
468 ecore_imf_context_reset(imf_context);
469 ecore_imf_context_input_panel_imdata_set(imf_context, (void *)"type=password", 13); /* for password read out with TTS */
470 ecore_imf_context_input_panel_layout_set(imf_context, ECORE_IMF_INPUT_PANEL_LAYOUT_DATETIME);
471 ecore_imf_context_focus_in(imf_context);
472 ad->imf_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __imf_event_key_down_cb, ad);
473 if (!ad->imf_handler)
474 SETTING_TRACE_DEBUG("handler is NULL");
479 static void __enable_imf_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
482 setting_retm_if(data == NULL, "Data parameter is NULL");
483 SettingPasswordUG *ad = (SettingPasswordUG *) data;
485 __imf_show_for_simple_password(ad);
488 static int setting_password_simple_create(void *cb)
492 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
494 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
496 ad->sp_focused_num = 0;
498 /* Create layout : layout/simple_password in setting-theme.edc */
499 ad->simple_layout = elm_layout_add(ad->win_main_layout);
500 elm_layout_file_set(ad->simple_layout, SETTING_THEME_EDJ_NAME, "layout/simple_password");
502 ad->sp_entry1 = elm_entry_add(ad->simple_layout);
503 elm_object_style_set(ad->sp_entry1 , "popup");
504 elm_entry_single_line_set(ad->sp_entry1 , EINA_TRUE);
505 elm_entry_editable_set(ad->sp_entry1 , EINA_FALSE);
506 ad->sp_entry[0] = ad->sp_entry1;
507 elm_object_part_content_set(ad->simple_layout, "entry1", ad->sp_entry1);
509 ad->sp_entry2 = elm_entry_add(ad->simple_layout);
510 elm_object_style_set(ad->sp_entry2 , "popup");
511 elm_entry_single_line_set(ad->sp_entry2 , EINA_TRUE);
512 elm_entry_editable_set(ad->sp_entry2 , EINA_FALSE);
513 ad->sp_entry[1] = ad->sp_entry2;
514 elm_object_part_content_set(ad->simple_layout, "entry2", ad->sp_entry2);
516 ad->sp_entry3 = elm_entry_add(ad->simple_layout);
517 elm_object_style_set(ad->sp_entry3 , "popup");
518 elm_entry_single_line_set(ad->sp_entry3 , EINA_TRUE);
519 elm_entry_editable_set(ad->sp_entry3 , EINA_FALSE);
520 ad->sp_entry[2] = ad->sp_entry3;
521 elm_object_part_content_set(ad->simple_layout, "entry3", ad->sp_entry3);
523 ad->sp_entry4 = elm_entry_add(ad->simple_layout);
524 elm_object_style_set(ad->sp_entry4 , "popup");
525 elm_entry_single_line_set(ad->sp_entry4 , EINA_TRUE);
526 elm_entry_editable_set(ad->sp_entry4 , EINA_FALSE);
527 ad->sp_entry[3] = ad->sp_entry4;
528 elm_object_part_content_set(ad->simple_layout, "entry4", ad->sp_entry4);
530 if (ad->view_type == SETTING_PW_TYPE_SIMPLE_PASSWORD)
531 elm_object_part_text_set(ad->simple_layout, "title.txt", _(sp_titles[3]));
533 elm_object_part_text_set(ad->simple_layout, "title.txt", _(sp_titles[1]));
536 ad->ly_main = setting_create_layout_navi_bar(ad->win_main_layout, ad->win_get, "IDS_ST_BODY_SIMPLE_PASSWORD",
537 _("IDS_ST_BUTTON_BACK"),
539 (setting_call_back_func)setting_password_simple_click_softkey_cancel_cb,
543 &(ad->navi_bar), NULL);
544 evas_object_event_callback_add(ad->sp_entry1, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
545 evas_object_event_callback_add(ad->sp_entry2, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
546 evas_object_event_callback_add(ad->sp_entry3, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
547 evas_object_event_callback_add(ad->sp_entry4, EVAS_CALLBACK_MOUSE_DOWN, __enable_imf_cb, ad);
549 evas_object_show(ad->simple_layout);
551 __imf_show_for_simple_password(ad);
553 setting_view_password_simple.is_create = 1;
556 return SETTING_RETURN_SUCCESS;
559 static int setting_password_simple_destroy(void *cb)
563 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
565 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
567 if (ad->imf_handler) {
568 ecore_event_handler_del(ad->imf_handler);
569 ad->imf_handler = NULL;
571 if (ad->imf_context) {
572 ecore_imf_context_del(ad->imf_context);
573 ad->imf_context = NULL;
576 if (ad->simple_done_timer) {
577 ecore_timer_del(ad->simple_done_timer);
578 ad->simple_done_timer = NULL;
582 evas_object_del(ad->notify);
586 if (ad->ly_main != NULL) {
587 evas_object_del(ad->ly_main);
591 setting_view_password_simple.is_create = 0;
593 return SETTING_RETURN_SUCCESS;
596 static int setting_password_simple_update(void *cb)
600 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
602 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
604 if (ad->ly_main != NULL) {
605 evas_object_show(ad->ly_main);
607 return SETTING_RETURN_SUCCESS;
610 static int setting_password_simple_cleanup(void *cb)
613 retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
615 SettingPasswordUG *ad = (SettingPasswordUG *) cb;
617 if (ad->ly_main != NULL) {
618 evas_object_hide(ad->ly_main);
621 return SETTING_RETURN_SUCCESS;
624 /* ***************************************************
628 ***************************************************/
630 int setting_password_simple_draw_next_simple_password(void *data, int title_index)
633 retvm_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER,
634 "[Setting > Password] Data parameter is NULL");
636 SettingPasswordUG *ad = (SettingPasswordUG *) data;
638 elm_object_part_text_set(ad->simple_layout, "title.txt", _(sp_titles[title_index]));
639 elm_entry_entry_set(ad->sp_entry1, "");
640 elm_entry_entry_set(ad->sp_entry2, "");
641 elm_entry_entry_set(ad->sp_entry3, "");
642 elm_entry_entry_set(ad->sp_entry4, "");
644 memset(ad->sp_chars, 0x00, 5);
645 ad->sp_focused_num = 0;
647 return SETTING_RETURN_SUCCESS;
650 int setting_password_simple_check_simple_password(const char *collection)
652 retv_if(collection == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
654 int sp_len = safeStrLen(collection);
658 SETTING_TRACE_SECURE_DEBUG("collection length is %d", sp_len);
661 return SETTING_RETURN_FAIL;
663 /* check if digit. */
664 for (index = 0; index < sp_len; index++) {
665 temp = (char)(collection[index]);
666 if ((temp < '0') || (temp > '9'))
667 return SETTING_RETURN_FAIL;
669 SETTING_TRACE_SECURE_DEBUG("temp %c", temp);
672 return SETTING_RETURN_SUCCESS;