6c538fbb485f76241d4fe62a0148f36c8c92421e
[apps/core/preloaded/settings.git] / setting-phone / src / setting-phone-region-format.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 #include <setting-phone-region-format.h>
22
23 #define MAX_REGION_STRLEN 256
24
25 static int setting_phone_region_format_create(void *cb);
26 static int setting_phone_region_format_destroy(void *cb);
27 static int setting_phone_region_format_cleanup(void *cb);
28
29 setting_view setting_view_phone_region_format = {
30         .create = setting_phone_region_format_create,
31         .destroy = setting_phone_region_format_destroy,
32         .update = NULL,
33         .cleanup = setting_phone_region_format_cleanup,
34 };
35
36 static char *__region_format_vconf_str_get();
37 static Eina_Bool __region_animator_cb(void *data);
38 static void __region_genlist_create(void *data);
39 static Eina_Bool __region_genlist_update(void *data);
40 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info);
41
42 static int setting_phone_region_format_get_region_fmt(char *list[],
43                                                       int item_idx[],
44                                                       /*[OUT]*/ char *region_keyStr[],
45                                                       int *region_num)
46 {
47         const char *loc_list = NULL;
48         int loc_count = 0;
49         UChar lang[LANGUAGE_STR_LEN] = { 0, };
50         UChar country[COUNTRY_STR_LEN] = { 0, };
51         UChar variant[SETTING_STR_SLP_LEN] = { 0, };
52         UChar displayname[SETTING_STR_SLP_LEN] = { 0, };
53         const char *localeID = NULL;
54         UErrorCode language_status = U_ZERO_ERROR;
55         UErrorCode country_status = U_ZERO_ERROR;
56         UErrorCode variant_status = U_ZERO_ERROR;
57         UErrorCode displayname_status = U_ZERO_ERROR;
58
59         int tmp_region_num = 0;
60         *region_num = 0;
61
62         char *str_lang = NULL;
63         char *str_country = NULL;
64         char *str_variant = NULL;
65         char *str_displayname = NULL;
66         Eina_List *region_list = NULL;
67
68         loc_count = uloc_countAvailable();
69
70         int i = 0;
71         localeID = uloc_getDefault();
72         SETTING_TRACE("localeID = %s", localeID);
73
74         for (; i < loc_count; i++) {
75                 if (tmp_region_num >= REGION_ITEM_MAX)
76                         break;
77
78                 loc_list = uloc_getAvailable(i);
79
80                 /* SETTING_TRACE("loc_list = %s", loc_list); */
81                 uloc_getDisplayLanguage(loc_list, localeID, lang, LANGUAGE_STR_LEN, &language_status);
82                 if (U_FAILURE(language_status)) {
83                         SETTING_TRACE_ERROR("language_status got an error %s:%d ", language_status,language_status);
84                         language_status = U_ZERO_ERROR;   /* set the value to the initial value */
85                 }
86
87                 uloc_getDisplayCountry(loc_list, localeID, country, COUNTRY_STR_LEN, &country_status);
88                 if (U_FAILURE(country_status)) {
89                         SETTING_TRACE_ERROR("country_status got an error %s:%d ", country, country_status);
90                         country_status = U_ZERO_ERROR;  /* set the value to the initial value */
91                 }
92
93                 uloc_getDisplayVariant(loc_list, localeID, variant, SETTING_STR_SLP_LEN, &variant_status);
94                 if (U_FAILURE(variant_status)) {
95                         SETTING_TRACE_ERROR("variant_status got an error %s:%d ", variant, variant_status);
96                         variant_status = U_ZERO_ERROR;  /* set the value to the initial value */
97                 }
98
99                 uloc_getDisplayName(loc_list, localeID, displayname, SETTING_STR_SLP_LEN, &displayname_status);
100                 if (U_FAILURE(displayname_status)) {
101                         SETTING_TRACE_ERROR("displayname_status got an error %s:%d ", displayname, displayname_status);
102                         displayname_status = U_ZERO_ERROR;      /* set the value to the initial value */
103                 }
104
105                 str_lang = setting_phone_lang_str_to_utf8(lang);
106                 str_country = setting_phone_lang_str_to_utf8(country);
107                 str_variant = setting_phone_lang_str_to_utf8(variant);
108                 str_displayname = setting_phone_lang_str_to_utf8(displayname);
109
110                 /*  filter which has variant */
111                 if (str_lang != NULL && str_country != NULL
112                     && safeStrLen(str_country) > 1 && safeStrLen(str_variant) == 0) {
113                         Setting_Region_Table *item_data = (Setting_Region_Table *) calloc(1, sizeof(Setting_Region_Table));
114                         //setting_retvm_if(item_data == NULL, -1, "calloc failed")
115
116                         if(item_data == NULL) {
117                                 SETTING_TRACE_ERROR("calloc failed");
118                                 FREE(str_lang);
119                                 FREE(str_country);
120                                 FREE(str_variant);
121                                 FREE(str_displayname);
122                                 return -1;
123                         }
124
125                         item_data->desc = (char *)g_strdup(str_displayname);
126                         item_data->key = (char *)g_strdup(loc_list);
127                         region_list = eina_list_append(region_list, item_data);
128                         tmp_region_num++;
129                 }
130
131                 FREE(str_lang);
132                 FREE(str_country);
133                 FREE(str_variant);
134                 FREE(str_displayname);
135         }
136
137         region_list = eina_list_sort(region_list, eina_list_count(region_list),
138                                      setting_phone_region_format_compare_cb);
139
140         Eina_List *iter = NULL;
141         Setting_Region_Table *item_data = NULL;
142         i = 0;
143         EINA_LIST_FOREACH(region_list, iter, item_data) {
144                 if (item_data) {
145                         list[i] = (char *)g_strdup(item_data->desc);
146                         item_idx[i] = i;
147                         region_keyStr[i] = (char *)g_strdup(item_data->key);
148                         free(item_data);
149                         item_data = NULL;
150                         i++;
151                 }
152         }
153
154         eina_list_free(region_list);
155         SETTING_TRACE("region_num = %d", tmp_region_num);
156         *region_num = tmp_region_num;
157         return 0;
158 }
159
160 static char *__region_format_vconf_str_get()
161 {
162         SETTING_TRACE_BEGIN;
163         char *tempstr = vconf_get_str(VCONFKEY_REGIONFORMAT);
164         setting_retvm_if(NULL == tempstr, NULL, "NULL == tempstr");
165
166         char *str_region = NULL;
167         char* p = strchr(tempstr, '.');
168
169         int len = safeStrLen(tempstr) - safeStrLen(".UTF-8");
170         if (p) {
171                 if (len > 0) {
172                         str_region = strndup(tempstr, len);     //.UTF8 => 5
173                 } else {
174                         str_region = (char *)g_strdup(tempstr);
175                         SETTING_TRACE_ERROR("region format vconf stored error");
176                 }
177         } else  {
178                 str_region = (char *)g_strdup("en_US");
179         }
180
181         FREE(tempstr);
182         return str_region;
183 }
184
185 static Eina_Bool __region_animator_cb(void *data)
186 {
187         //SETTING_TRACE_BEGIN;
188         setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
189         SettingPhoneUG *ad = (SettingPhoneUG *) data;
190
191         Setting_GenGroupItem_Data *item_data = NULL;
192         if (ad->gl_region_cur_index >=  ad->region_num) {
193                 if (ad->animator) {
194                         ecore_animator_del(ad->animator);
195                         ad->animator = NULL;
196                 }
197                 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
198                 if (ad->pop_progress) {
199                         SETTING_TRACE("To delete ad->pop_progress");
200                         evas_object_del(ad->pop_progress);
201                         ad->pop_progress = NULL;
202                 }
203
204                 if (ad->selected_item) {
205                         //show the last item
206                         elm_genlist_item_show(ad->selected_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
207                 }
208                 ad->prev_region = ad->selected_region_idx;
209
210                 Elm_Object_Item *item = NULL;
211                 item = elm_genlist_item_append(ad->gl_region, &itc_bottom_seperator, NULL, NULL,
212                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
213                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
214                 return ECORE_CALLBACK_CANCEL;
215         }
216
217         int i = ad->gl_region_cur_index++;
218         if (isEmptyStr(ad->search_text) || is_substr_ncase(ad->region_desc[i], ad->search_text)) {
219                 item_data =
220                         setting_create_Gendial_field_1radio(ad->gl_region,
221                                                 &(ad->itc_1text_1icon_2),
222                                                 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
223                                                 ad->chk_region,
224                                                 SWALLOW_Type_1RADIO,
225                                                 ad->chk_region,
226                                                 ad->region_index[i],
227                                                 ad->region_desc[i]/* HERE */, NULL);
228
229                 if (item_data) {
230                         item_data->userdata = ad;
231                 } else {
232                         SETTING_TRACE_ERROR("item_data is NULL");
233                 }
234
235                 if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
236                         ad->selected_region_idx = i;
237                         if (item_data) ad->selected_item = item_data->item;
238                 }
239         }
240
241         return ECORE_CALLBACK_RENEW;
242
243 }
244
245 static void __region_genlist_create(void *data)
246 {
247         SETTING_TRACE_BEGIN;
248         setting_retm_if(NULL == data, "data is NULL");
249         SettingPhoneUG *ad = (SettingPhoneUG *) data;
250
251         if (ad->pop_progress) {
252                 evas_object_del(ad->pop_progress);
253                 ad->pop_progress = NULL;
254         }
255         ad->pop_progress = setting_create_popup_with_progressbar(ad, ad->win_get,
256                                  "pending_list",
257                                  NULL, NULL, NULL, 0, TRUE, TRUE);
258
259         elm_genlist_clear(ad->gl_region);
260         G_FREE(ad->region_vconf_str);
261         ad->region_vconf_str = __region_format_vconf_str_get();
262
263         Elm_Object_Item *item = NULL;
264         item = elm_genlist_item_append(ad->gl_region, &(ad->itc_seperator), NULL, NULL,
265                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
266         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
267
268         Setting_GenGroupItem_Data *item_data = NULL;
269         ad->gl_region_index = 0;
270         ad->selected_item = NULL;
271         ad->selected_region_idx = -1;
272
273         int i = 0;
274         for (; i < ad->region_num; i++) {
275                 if (ad->gl_region_index >
276                       SETTING_PHONE_REGION_FORMAT_ANIMATOR_START_INDEX) {
277                         break;
278                 }
279
280                 if (isEmptyStr(ad->search_text) ||
281                       is_substr_ncase(ad->region_desc[i], ad->search_text)) {
282                         item_data =
283                                 setting_create_Gendial_field_1radio(ad->gl_region,
284                                                 &(ad->itc_1text_1icon_2),
285                                                 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
286                                                 ad->chk_region,
287                                                 SWALLOW_Type_1RADIO,
288                                                 ad->chk_region,
289                                                 ad->region_index[i],
290                                                 ad->region_desc[i], NULL);
291                         if (item_data) {
292                                 item_data->userdata = ad;
293                         } else {
294                                 SETTING_TRACE_ERROR("item_data is NULL");
295                         }
296
297                         if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
298                                 ad->selected_region_idx = i;
299                                 if (item_data) {
300                                         ad->selected_item = item_data->item;
301                                 }
302                         }
303                         ad->gl_region_index++;
304                 }
305         }
306         ad->gl_region_cur_index = i;
307
308         if (ad->selected_region_idx > -1) {
309                 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
310                 ad->prev_region = ad->selected_region_idx;
311         }
312         if (ad->gl_region_cur_index < ad->region_num &&
313              ad->gl_region_index > SETTING_PHONE_REGION_FORMAT_ANIMATOR_START_INDEX) {
314                 //to continue adding items using animator
315                 SETTING_TRACE("to continue adding items using animator");
316                 if (ad->animator) {
317                         ecore_animator_del(ad->animator);
318                         ad->animator = NULL;
319                 }
320
321                 ad->animator = ecore_animator_add(__region_animator_cb, ad);
322         }
323         else {//had finished adding items
324                 SETTING_TRACE("had finished adding items");
325                 if(ad->selected_item) {
326                         //show the selected_item item
327                         elm_genlist_item_show(ad->selected_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
328                 }
329                 if (ad->pop_progress) {
330                         SETTING_TRACE("To delete ad->pop_progress");
331                         evas_object_del(ad->pop_progress);
332                         ad->pop_progress = NULL;
333                 }
334         }
335 }
336
337 static Eina_Bool __region_genlist_update(void *data)
338 {
339         SETTING_TRACE_BEGIN;
340         setting_retvm_if(NULL == data, ECORE_CALLBACK_CANCEL, "data is NULL");
341         SettingPhoneUG *ad = (SettingPhoneUG *) data;
342
343         elm_genlist_clear(ad->gl_region);
344         G_FREE(ad->region_vconf_str);
345         ad->region_vconf_str = __region_format_vconf_str_get();
346
347         Setting_GenGroupItem_Data *item_data = NULL;
348         ad->selected_region_idx = -1;
349
350         int i = 0;
351         for (; i < ad->region_num; i++) {
352                 if (isEmptyStr(ad->search_text) ||
353                       is_substr_ncase(ad->region_desc[i], ad->search_text)) {
354                         item_data =
355                                 setting_create_Gendial_field_1radio(ad->gl_region,
356                                                 &(ad->itc_1text_1icon_2),
357                                                 setting_phone_region_format_mouse_up_Gendial_list_radio_cb,
358                                                 ad->chk_region,
359                                                 SWALLOW_Type_1RADIO,
360                                                 ad->chk_region,
361                                                 ad->region_index[i],
362                                                 ad->region_desc[i], NULL);
363                         if (item_data) {
364                                 item_data->userdata = ad;
365                         } else {
366                                 SETTING_TRACE_ERROR("item_data is NULL");
367                         }
368
369                         if (!safeStrCmp(ad->region_vconf_str, ad->region_keyStr[i])) {
370                                 ad->selected_region_idx = i;
371                         }
372                 }
373         }
374
375         if (ad->selected_region_idx > -1) {
376                 elm_radio_value_set(ad->chk_region, ad->selected_region_idx);
377         }
378
379         ad->search_idler = NULL;
380         return ECORE_CALLBACK_CANCEL;
381 }
382
383 static void __searchbar_changed_cb(void *data, Evas_Object *obj, void *event_info)
384 {
385         SETTING_TRACE_BEGIN;
386         setting_retm_if(data == NULL, "Data parameter is NULL");
387         SettingPhoneUG *ad = (SettingPhoneUG *)data;
388         setting_searchbar_redraw(ad, ad->search_bar, ad->search_text,
389                                  &(ad->search_idler),
390                                  __region_genlist_update);
391 }
392
393 /* ***************************************************
394  *
395  *basic func
396  *
397  ***************************************************/
398
399 static int setting_phone_region_format_create(void *cb)
400 {
401         SETTING_TRACE_BEGIN;
402         /* error check */
403         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
404
405         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
406         Evas_Object *sub_layout = elm_layout_add(ad->navi_bar);
407         elm_layout_theme_set(sub_layout, "layout", "application", "searchbar_base");
408         elm_object_signal_emit(sub_layout, "elm,state,show,searchbar", "elm");
409
410         setting_push_layout_navi_bar(_("IDS_ST_BODY_REGION"),
411                                      _("IDS_COM_BODY_BACK"),
412                                      NULL,
413                                      NULL,
414                                      setting_phone_region_format_click_softkey_cancel_cb,
415                                      NULL,
416                                      NULL, ad, sub_layout, ad->navi_bar, NULL);
417
418         ad->gl_region = elm_genlist_add(ad->navi_bar);
419         elm_object_style_set(ad->gl_region, "dialogue");
420
421         ad->chk_region = elm_radio_add(ad->gl_region);
422         elm_radio_state_value_set(ad->chk_region, -1);
423         elm_radio_value_set(ad->chk_region, -1);
424
425         int ret = setting_phone_region_format_get_region_fmt(ad->region_desc,
426                                                              ad->region_index,
427                                                              ad->region_keyStr,
428                                                              &ad->region_num);
429         if (ret != 0) {
430                 SETTING_TRACE_ERROR("get region format list failed");
431         }
432
433         ad->prev_region = 0;
434         memset(ad->search_text, '\0', MAX_SEARCH_STR_LEN + 1);
435
436         __region_genlist_create(ad);
437
438         ad->search_bar = setting_create_searchbar(ad, sub_layout, __searchbar_changed_cb, NULL);
439
440         elm_object_part_content_set(sub_layout, "elm.swallow.content", ad->gl_region);
441
442         setting_view_phone_region_format.is_create = 1;
443
444         return SETTING_RETURN_SUCCESS;
445 }
446
447 static int setting_phone_region_format_destroy(void *cb)
448 {
449         SETTING_TRACE_BEGIN;
450         /* error check */
451         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
452         SettingPhoneUG *ad = (SettingPhoneUG *) cb;
453
454         /*  FIXED : destroy only if it was created. */
455         if (setting_view_phone_region_format.is_create) {
456                 if (ad->gl_region!= NULL) {
457                         elm_genlist_clear(ad->gl_region);
458                         evas_object_del(ad->gl_region);
459                         ad->gl_region = NULL;
460                 }
461                 if (ad->search_idler) {
462                         ecore_idler_del(ad->search_idler);
463                         ad->search_idler = NULL;
464                 }
465                 if (ad->animator)
466                 {
467                         ecore_animator_del(ad->animator);
468                         ad->animator = NULL;
469                 }
470                 if (ad->popup) {
471                         evas_object_del(ad->popup);
472                         ad->popup = NULL;
473                 }
474                 if (ad->pop_progress) {
475                         evas_object_del(ad->pop_progress);
476                         ad->pop_progress = NULL;
477                 }
478
479                 elm_naviframe_item_pop(ad->navi_bar);
480                 setting_view_phone_region_format.is_create = 0;
481         }
482
483         return SETTING_RETURN_SUCCESS;
484 }
485
486 static int setting_phone_region_format_cleanup(void *cb)
487 {
488         SETTING_TRACE_BEGIN;
489         /* error check */
490         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
491         setting_phone_region_format_destroy(cb);
492         return SETTING_RETURN_SUCCESS;
493 }
494
495 static void
496 setting_phone_region_format_click_softkey_cancel_cb(void *data,
497                                                     Evas_Object *obj,
498                                                     void *event_info)
499 {
500         SETTING_TRACE_BEGIN;
501         retm_if(data == NULL, "Data parameter is NULL");
502         SettingPhoneUG *ad = (SettingPhoneUG *) data;
503         setting_view_change(&setting_view_phone_region_format,
504                             &setting_view_phone_language_region, ad);
505 }
506
507 static void
508 setting_phone_region_format_mouse_up_Gendial_list_radio_cb(void *data,
509                                                            Evas_Object *obj,
510                                                            void *event_info)
511 {
512         SETTING_TRACE_BEGIN;
513         setting_retm_if(data == NULL, "Data parameter is NULL");
514         setting_retm_if(event_info == NULL,
515                         "Invalid argument: event info is NULL");
516
517         Evas_Object *radio = (Evas_Object *) data;
518         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
519         elm_genlist_item_selected_set(item, 0);
520         Setting_GenGroupItem_Data *list_item =
521             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
522         SettingPhoneUG *ad = (SettingPhoneUG *) list_item->userdata;
523
524         if (ad->popup) {
525                 return;
526         }
527
528         SETTING_TRACE("region_keyStr = %s",
529                       ad->region_keyStr[list_item->chk_status]);
530         /*  if not change, return */
531         if (ad->prev_region == list_item->chk_status) {
532                 return;
533         }
534         elm_radio_value_set(radio, list_item->chk_status);
535
536         setting_phone_region_format_close_popup_ex(ad);
537 }
538
539 static void setting_phone_region_format_close_popup_ex(void *data)
540 {
541         SETTING_TRACE_BEGIN;
542         setting_retm_if(data == NULL, "Data parameter is NULL");
543         SettingPhoneUG *ad = (SettingPhoneUG *) data;
544
545         char *msg =
546             "IDS_ST_BODY_CHANGING_REGION_WILL_CLOSE_ALL_APPLICATIONS_AND_UNSAVED_DATA_WILL_BE_LOST_CONTINUE_Q";
547         ad->popup_cb = setting_phone_region_format_exit_cb_ex;
548         ad->popup = setting_create_popup_with_btn(ad, ad->win_get, NULL,
549                                          _(msg), ad->popup_cb, 0, 2,
550                                          _("IDS_COM_SK_YES"), _("IDS_COM_SK_NO"));
551 }
552
553
554 static void
555 setting_phone_region_format_exit_cb_ex(void *data, Evas_Object *obj,
556                                        void *event_info)
557 {
558         SETTING_TRACE_BEGIN;
559         setting_retm_if(data == NULL, "Data parameter is NULL");
560         SettingPhoneUG *ad = (SettingPhoneUG *) data;
561
562         switch (btn_type(obj)) {
563         case POPUP_RESPONSE_OK:
564                 {
565                         ad->prev_region = elm_radio_value_get(ad->chk_region);
566                         SETTING_TRACE("cur_chk_region = %d", ad->prev_region);
567
568                         char region[MAX_REGION_STRLEN];
569                         memset(region, 0x00, MAX_REGION_STRLEN);
570                         snprintf(region, MAX_REGION_STRLEN, "%s.UTF-8", ad->region_keyStr[ad->prev_region]);
571
572                         int ret =
573                             setting_phone_region_format_set_dateformat
574                             (ad->region_keyStr[ad->prev_region], ad);
575                         setting_retm_if(ret == SETTING_RETURN_FAIL,
576                                         "[Error] set date format fail");
577
578                         ret =
579                             vconf_set_str(VCONFKEY_REGIONFORMAT,region);
580                         setting_retm_if(ret != 0,
581                                         "[Error] set value of VCONFKEY_REGIONFORMAT fail");
582
583                         /* after lang-change, go back to the previous page*/
584                         setting_view_change(&setting_view_phone_region_format ,
585                                                                 &setting_view_phone_language_region, ad);
586
587                         break;
588                 }
589         case POPUP_RESPONSE_CANCEL:
590                 {
591                         elm_radio_value_set(ad->chk_region, ad->prev_region);
592                         if (ad->popup) {
593                                 evas_object_del(ad->popup);
594                                 ad->popup = NULL;
595                         }
596                         return;
597                 }
598         default:
599                 {
600                         if (ad->popup) {
601                                 evas_object_del(ad->popup);
602                                 ad->popup = NULL;
603                         }
604                         return;
605                 }
606         }
607
608         if (ad->popup) {
609                 evas_object_del(ad->popup);
610                 ad->popup = NULL;
611         }
612         /* elm_exit(); */
613 }
614
615 static int
616 setting_phone_region_format_compare_cb(const void *d1, const void *d2)
617 {
618         Setting_Region_Table *r1 = (Setting_Region_Table *) d1;
619         Setting_Region_Table *r2 = (Setting_Region_Table *) d2;
620         return safeStrCmp(r1->desc, r2->desc);
621 }
622
623 static int setting_phone_region_format_set_dateformat(const char *region,
624                                                       void *data)
625 {
626         /* SETTING_TRACE_BEGIN; */
627         setting_retvm_if(!region, SETTING_RETURN_FAIL,
628                          "region parameter is NULL");
629         setting_retvm_if(data == NULL, SETTING_RETURN_FAIL,
630                          "Data parameter is NULL");
631
632         SettingPhoneUG *ad = (SettingPhoneUG *) data;
633
634         char *ret_str = NULL;
635         UChar *uret = NULL;
636         UChar customSkeleton[SETTING_STR_SLP_LEN] = { 0, };
637         UErrorCode status = U_ZERO_ERROR;
638
639         UChar bestPattern[SETTING_STR_SLP_LEN] = { 0, };
640         char bestPatternString[SETTING_STR_SLP_LEN] = { 0, };
641         char *skeleton = DATA_FORMAT_SKELETON;
642
643         uret = u_uastrncpy(customSkeleton, skeleton, safeStrLen(skeleton));
644         setting_retvm_if(!uret, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
645
646         if (ad->pattern_generator == NULL
647             || safeStrCmp(region, ad->prev_locale) != 0) {
648                 if (ad->pattern_generator != NULL) {
649                         udatpg_close(ad->pattern_generator);
650                         ad->pattern_generator = NULL;
651                 }
652                 ad->pattern_generator = udatpg_open(region, &status);
653         }
654
655         int32_t bestPatternCapacity =
656             (int32_t) (sizeof(bestPattern) / sizeof((bestPattern)[0]));
657         (void)udatpg_getBestPattern(ad->pattern_generator, customSkeleton,
658                                     u_strlen(customSkeleton), bestPattern,
659                                     bestPatternCapacity, &status);
660
661         ret_str = u_austrcpy(bestPatternString, bestPattern);
662         setting_retvm_if(!ret_str, SETTING_RETURN_FAIL, "u_uastrncpy is fail");
663         /* SETTING_TRACE("bestPatternString : %s, bestPatternLength: %d", bestPatternString, bestPatternLength); */
664
665         int i = 0;
666         int j = 0;
667         int len = safeStrLen(bestPatternString);
668         char region_format[len];
669         /*  only save 'y', 'M', 'd' charactor */
670         for (; i < len; i++) {
671                 if (bestPatternString[i] == 'y' || bestPatternString[i] == 'M'
672                     || bestPatternString[i] == 'd') {
673                         region_format[j++] = bestPatternString[i];
674                 }
675         }
676         region_format[len] = '\0';
677
678         char *date_format_str[DATA_FORMAT_CATEGORY_NUM] = {
679                         "dMy", "Mdy", "yMd", "ydM" };
680         int date_format_vconf_value = DATA_FORMAT_DEFAULT;      /*  default is "Mdy" */
681         for (i = 0; i < DATA_FORMAT_CATEGORY_NUM; i++) {
682                 if (!safeStrCmp(region_format, date_format_str[i])) {
683                         date_format_vconf_value = i;
684                 }
685         }
686         SETTING_TRACE("bestPatternString : %s, format: %s, index: %d",
687                       bestPatternString, region_format,
688                       date_format_vconf_value);
689
690         int err = SETTING_RETURN_SUCCESS;
691         setting_set_int_slp_key(INT_SLP_SETTING_DATE_FORMAT,
692                                 date_format_vconf_value, &err);
693         setting_retvm_if(err == SETTING_RETURN_FAIL, SETTING_RETURN_FAIL,
694                          "set vconf fail");
695         G_FREE(ad->prev_locale);
696         ad->prev_locale = (char *)g_strdup(region);
697         return SETTING_RETURN_SUCCESS;
698 }