apply FSL(Flora Software License)
[apps/core/preloaded/settings.git] / setting-network / src / setting-network-connection-create.c
1 /*
2   * Copyright 2012  Samsung Electronics Co., Ltd
3   *
4   * Licensed under the Flora License, Version 1.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *     http://www.tizenopensource.org/license
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16
17
18 #include <setting-network-connection-create.h>
19
20 static int setting_network_connection_create(void *cb);
21 static int setting_network_connection_destroy(void *cb);
22 static int setting_network_connection_update(void *cb);
23 static int setting_network_connection_cleanup(void *cb);
24
25 setting_view setting_view_network_connection_create = {
26         .create = setting_network_connection_create,
27         .destroy = setting_network_connection_destroy,
28         .update = setting_network_connection_update,
29         .cleanup = setting_network_connection_cleanup,
30 };
31
32 SettingNetworkUG *g_networkUG = NULL;
33 #define SUPPORT_EXPANDABLE_AUTHTYPE 1
34
35 /* ***************************************************
36  *
37  *basic func
38  *
39  ***************************************************/
40
41 static void
42 __network_connection_gl_mouse_up(void *data, Evas *e, Evas_Object *obj,
43                                  void *event)
44 {
45         ret_if(!data);
46         SettingNetworkUG *ad = (SettingNetworkUG *) data;
47
48         if (ad->data_acs_name) {
49                 setting_hide_input_pannel_cb(ad->data_acs_name->eo_check);
50         }
51         if (ad->data_user_name) {
52                 setting_hide_input_pannel_cb(ad->data_user_name->eo_check);
53         }
54         if (ad->data_pwd) {
55                 setting_hide_input_pannel_cb(ad->data_pwd->eo_check);
56         }
57         if (ad->data_pxy_addr) {
58                 setting_hide_input_pannel_cb(ad->data_pxy_addr->eo_check);
59         }
60         if (ad->data_pxy_port) {
61                 setting_hide_input_pannel_cb(ad->data_pxy_port->eo_check);
62         }
63         if (ad->data_hm_url) {
64                 setting_hide_input_pannel_cb(ad->data_hm_url->eo_check);
65         }
66
67 }
68
69 void __sub_list_rd_change(void *data, Evas_Object *obj, void *event_info)
70 {
71         SETTING_TRACE_BEGIN;
72         retm_if(data == NULL, "Data parameter is NULL");
73         Setting_GenGroupItem_Data *list_item =
74             (Setting_GenGroupItem_Data *) data;
75         list_item->chk_status = elm_radio_value_get(obj);       /*  for update */
76
77         Elm_Object_Item *subItem = list_item->item;
78         Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subItem);
79
80         Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subItem);    /* subItem data */
81         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
82
83         ret_if(NULL == data_subItem || NULL == data_parentItem);
84
85         data_parentItem->sub_desc = (char *)g_strdup(_(data_subItem->keyStr));
86         elm_object_item_data_set(data_parentItem->item, data_parentItem);
87         elm_genlist_item_update(data_parentItem->item);
88         setting_network_edit_connection_display_auth_type
89             (data_parentItem->userdata, list_item->chk_status);
90 }
91
92 void __sub_list_sel_cb(void *data, Evas_Object *obj, void *event_info)
93 {
94         SETTING_TRACE_BEGIN;
95         /* error check */
96         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
97         Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
98         Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subitem);
99         elm_genlist_item_selected_set(subitem, 0);
100         Setting_GenGroupItem_Data *data_subItem =
101             elm_object_item_data_get(subitem);
102         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
103         ret_if(NULL == data_subItem || NULL == data_parentItem);
104
105         elm_radio_value_set(data_subItem->rgd, data_subItem->chk_status);
106
107         data_parentItem->sub_desc = (char *)g_strdup(_(data_subItem->keyStr));
108         elm_object_item_data_set(data_parentItem->item, data_parentItem);
109         elm_genlist_item_update(data_parentItem->item);
110         setting_network_edit_connection_display_auth_type(data,
111                                                           data_subItem->chk_status);
112 }
113
114 static void __setting_network_connection_exp_cb(void *data, Evas_Object *obj,
115                                                 void *event_info)
116 {
117         ret_if(NULL == data || NULL == event_info);
118         SETTING_TRACE_BEGIN;
119         SettingNetworkUG *ad = (SettingNetworkUG *) data;
120         Elm_Object_Item *parentItem = event_info;       /* parent item */
121         Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem);      /* parent data */
122         Evas_Object *scroller = elm_object_item_widget_get(parentItem);
123
124         Evas_Object *rgd;
125         if (data_parentItem == ad->data_auth_type) {
126                 rgd = elm_radio_add(scroller);
127                 elm_radio_value_set(rgd, -1);
128
129                 setting_create_Gendial_exp_sub_field(scroller,
130                                                      &(ad->itc_1icon_1text_sub),
131                                                      __sub_list_sel_cb, ad,
132                                                      parentItem,
133                                                      SWALLOW_Type_1RADIO, rgd,
134                                                      NET_PDP_AUTH_PAP,
135                                                      "IDS_IDLE_BODY_NORMAL",
136                                                      __sub_list_rd_change);
137
138                 setting_create_Gendial_exp_sub_field(scroller,
139                                                      &(ad->itc_1icon_1text_sub),
140                                                      __sub_list_sel_cb, ad,
141                                                      parentItem,
142                                                      SWALLOW_Type_1RADIO, rgd,
143                                                      NET_PDP_AUTH_CHAP,
144                                                      "IDS_ST_BODY_SECURE",
145                                                      __sub_list_rd_change);
146
147                 setting_create_Gendial_exp_sub_field(scroller,
148                                                      &(ad->itc_1icon_1text_sub),
149                                                      __sub_list_sel_cb, ad,
150                                                      parentItem,
151                                                      SWALLOW_Type_1RADIO, rgd,
152                                                      NET_PDP_AUTH_NONE,
153                                                      "IDS_COM_BODY_NONE",
154                                                      __sub_list_rd_change);
155
156                 elm_radio_value_set(rgd, ad->chkType);
157         }
158 }
159
160 static int setting_network_connection_create(void *cb)
161 {
162         SETTING_TRACE_BEGIN;
163         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
164
165         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
166
167         setting_retvm_if(NET_SERVICE_INTERNET != ad->con_type,
168                         SETTING_GENERAL_ERR_WRONG_PARAMETER,
169                         "Invalid connection type[%d]", ad->con_type)
170
171         const char *title = NULL;
172         if (ad->con_type == NET_SERVICE_INTERNET) {
173                 title = _("IDS_ST_BODY_INTERNET_CONNECTION");
174         }
175
176         Evas_Object *scroller = elm_genlist_add(ad->win_main_layout);
177         retvm_if(scroller == NULL, SETTING_DRAW_ERR_FAIL_SCROLLER,
178                  "Cannot set scroller object  as contento of layout");
179         elm_genlist_clear(scroller);    /* first to clear list */
180
181         /*  Enabling illume notification property for window */
182         elm_win_conformant_set(ad->win_main_layout, 1);
183         Evas_Object *conformant = elm_conformant_add(ad->win_main_layout);
184         elm_object_style_set(conformant, "internal_layout");    /*  By Kollus. 2011-01-04 */
185         evas_object_show(conformant);
186         elm_object_content_set(conformant, scroller);
187
188         ad->navi_it = setting_create_navi_bar_top_buttons((char *)title,
189                                            _("IDS_COM_SK_CANCEL"),
190                                            _("IDS_COM_SK_DONE"), NULL,
191                                            setting_network_edit_connection_click_softkey_cancel_cb,
192                                            setting_network_edit_connection_click_softkey_save_cb,
193                                            NULL, ad, conformant, ad->navi_bar);
194         retv_if(!ad->navi_it, SETTING_RETURN_FAIL);
195         ad->has_form_changed  = FALSE;
196
197         setting_enable_expandable_genlist(scroller, ad,
198                                           __setting_network_connection_exp_cb,
199                                           NULL);
200         evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP,
201                                        __network_connection_gl_mouse_up, ad);
202
203         ad->ed_acs_name_desc = NULL;
204         ad->ed_user_name_desc = NULL;
205         ad->ed_pwd_desc = NULL;
206         ad->ed_pxy_addr_desc = NULL;
207         ad->ed_pxy_port_desc = NULL;
208         ad->ed_hm_url_desc = NULL;
209         ad->chkType = NET_PDP_AUTH_NONE;
210
211         /* other intializes */
212         ad->data_hm_url = NULL;
213         ad->data_pwd = NULL;
214         ad->data_user_name = NULL;
215
216         if (NULL == ad->prof_list)
217         {
218                 int err = net_get_profile_list(NET_DEVICE_CELLULAR, &(ad->prof_list), &(ad->prof_count));
219                 if (err != NET_ERR_NONE) {
220                         SETTING_TRACE_DEBUG
221                             ("%s*** [ERR] Internet net_get_app_profile_id. err=%d ***%s",
222                              SETTING_FONT_RED, err, SETTING_FONT_BLACK);
223                 }
224
225         }
226
227         ad->prof_sel_idx = SETTING_ADD_PROFILE_INDEX;//need add new configuration
228         if (ad->prof_list)
229         {
230                 int ci = 0;
231                 for(ci = 0;ci < ad->prof_count;ci++){
232                         SETTING_TRACE_DEBUG("profList[%d].ProfileName:%s", ci,ad->prof_list[ci].ProfileName);
233                         SETTING_TRACE_DEBUG("profList[%d].profile_type:%d", ci, ad->prof_list[ci].profile_type);
234                         if(NET_DEVICE_CELLULAR == ad->prof_list[ci].profile_type) {
235                                 if (ad->con_type == ad->prof_list[ci].ProfileInfo.Pdp.ServiceType)
236                                 {
237                                         ad->prof_sel_idx = ci;
238                                         break;
239                                 }
240                         }
241                 }
242         }
243         SETTING_TRACE("ad->prof_sel_idx:%d", ad->prof_sel_idx);
244         char ProxyAddr[NET_PROXY_LEN_MAX+1] = {0,};
245         if (SETTING_ADD_PROFILE_INDEX != ad->prof_sel_idx)//found sucessfully
246         {
247                 /* load access name */
248                 ad->ed_acs_name_desc = ad->prof_list[ad->prof_sel_idx].ProfileInfo.Pdp.Apn;
249                 ad->ed_user_name_desc =
250                     ad->prof_list[ad->prof_sel_idx].ProfileInfo.Pdp.AuthInfo.UserName;
251                 ad->chkType =
252                     ad->prof_list[ad->prof_sel_idx].ProfileInfo.Pdp.AuthInfo.AuthType;
253                 ad->ed_pwd_desc =
254                     ad->prof_list[ad->prof_sel_idx].ProfileInfo.Pdp.AuthInfo.Password;
255
256                 char *full_addr;
257                 char *addr;
258                 char *port;
259                 //Fix the Port 'NULL' issue when enter connection view repeatly..
260                 full_addr = safeCopyStr(ProxyAddr, ad->prof_list[ad->prof_sel_idx].ProfileInfo.Pdp.net_info.ProxyAddr, NET_PROXY_LEN_MAX);
261                 addr = strsep(&full_addr, ":");
262                 port = strsep(&full_addr, ":");
263                 ad->ed_pxy_addr_desc = addr;
264                 ad->ed_pxy_port_desc = port;
265         }
266
267         Elm_Object_Item *item;
268
269         item =
270             elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
271                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
272         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
273         ad->data_acs_name =
274             setting_create_Gendial_field_def(scroller,
275                                              &(ad->itc_variable_height), NULL,
276                                              NULL, SWALLOW_Type_LAYOUT_ENTRY,
277                                              NULL, NULL, 0,
278                                              "IDS_ST_BODY_ACCESS_NAME",
279                                              (char *)ad->ed_acs_name_desc,
280                                              setting_network_connection_entry_changed_cb);
281         if (ad->data_acs_name) {
282                 ad->data_acs_name->userdata = ad;
283         } else {
284                 SETTING_TRACE_ERROR("ad->data_acs_name is NULL");
285         }
286
287 #if !SUPPORT_EXPANDABLE_AUTHTYPE
288         (void)setting_create_Gendial_field_titleItem(scroller,
289                                                      &(ad->itc_group_item),
290                                                      "IDS_ST_BODY_AUTH_TYPE",
291                                                      NULL);
292         ad->chk_type = elm_radio_add(scroller);
293         elm_radio_state_value_set(ad->chk_type, -1);
294
295         ad->data_type_nor =
296             setting_create_Gendial_field_1radio(scroller,
297                                                 &(ad->itc_1text_1icon_2),
298                                                 setting_network_connection_mouse_up_Gendial_list_radio_cb,
299                                                 ad->chk_type,
300                                                 SWALLOW_Type_1RADIO,
301                                                 ad->chk_type, NET_PDP_AUTH_PAP,
302                                                 "IDS_IDLE_BODY_NORMAL",
303                                                 setting_network_edit_connection_chk_changed);
304         if (ad->data_type_nor) {
305                 ad->data_type_nor->userdata = ad;
306         } else {
307                 SETTING_TRACE_ERROR("ad->data_type_nor is NULL");
308         }
309
310         ad->data_type_sec =
311             setting_create_Gendial_field_1radio(scroller,
312                                                 &(ad->itc_1text_1icon_2),
313                                                 setting_network_connection_mouse_up_Gendial_list_radio_cb,
314                                                 ad->chk_type,
315                                                 SWALLOW_Type_1RADIO,
316                                                 ad->chk_type, NET_PDP_AUTH_CHAP,
317                                                 "IDS_ST_BODY_SECURE",
318                                                 setting_network_edit_connection_chk_changed);
319         if (ad->data_type_sec) {
320                 ad->data_type_sec->userdata = ad;
321         } else {
322                 SETTING_TRACE_ERROR("ad->data_type_sec is NULL");
323         }
324
325         ad->data_type_none =
326             setting_create_Gendial_field_1radio(scroller,
327                                                 &(ad->itc_1text_1icon_2),
328                                                 setting_network_connection_mouse_up_Gendial_list_radio_cb,
329                                                 ad->chk_type,
330                                                 SWALLOW_Type_1RADIO,
331                                                 ad->chk_type, NET_PDP_AUTH_NONE,
332                                                 "IDS_COM_BODY_NONE",
333                                                 setting_network_edit_connection_chk_changed);
334         if (ad->data_type_none) {
335                 ad->data_type_none->userdata = ad;
336         } else {
337                 SETTING_TRACE_ERROR("ad->data_type_none is NULL");
338         }
339
340         elm_radio_value_set(ad->chk_type, ad->chkType);
341
342         ad->item_above_user_name = item =
343             elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
344                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
345         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
346 #else
347         item =
348             elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
349                                     ELM_GENLIST_ITEM_GROUP, NULL, NULL);
350         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
351         char *auth_type_desc = NULL;
352         switch (ad->chkType) {
353         case NET_PDP_AUTH_PAP:
354                 auth_type_desc = _("IDS_IDLE_BODY_NORMAL");
355                 break;
356         case NET_PDP_AUTH_CHAP:
357                 auth_type_desc = _("IDS_ST_BODY_SECURE");
358                 break;
359         case NET_PDP_AUTH_NONE:
360                 auth_type_desc = _("IDS_COM_BODY_NONE");
361                 break;
362         default:
363                 ad->chkType = NET_PDP_AUTH_NONE;
364                 auth_type_desc = _("IDS_COM_BODY_NONE");
365                 break;
366         }
367         ad->data_auth_type =
368             setting_create_Gendial_exp_parent_field(scroller,
369                                                     &(ad->itc_2text_3_parent),
370                                                     NULL, NULL,
371                                                     SWALLOW_Type_INVALID,
372                                                     "IDS_ST_BODY_AUTH_TYPE",
373                                                     auth_type_desc);
374         /* ad->data_auth_type->int_slp_setting_binded = INT_SLP_SETTING_INVALID; */
375         if (ad->data_auth_type) {
376                 ad->data_auth_type->userdata = ad;
377         } else {
378                 SETTING_TRACE_ERROR("ad->data_auth_type is NULL");
379         }
380
381         ad->item_above_user_name = item =
382             elm_genlist_item_append(scroller, &(ad->itc_seperator), NULL, NULL,
383                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
384         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
385 #endif
386         ad->is_show_user = 0;
387         if (NET_PDP_AUTH_NONE != ad->chkType) {
388                 ad->data_user_name =
389                     setting_create_Gendial_field_def(scroller,
390                                                      &(ad->itc_variable_height),
391                                                      NULL, NULL,
392                                                      SWALLOW_Type_LAYOUT_ENTRY,
393                                                      NULL, NULL, 0,
394                                                      "IDS_COM_BODY_USER_NAME",
395                                                      (char *)
396                                                      ad->ed_user_name_desc,
397                                                      setting_network_connection_entry_changed_cb);
398                 if (ad->data_user_name) {
399                         ad->data_user_name->userdata = ad;
400                 } else {
401                         SETTING_TRACE_ERROR("ad->data_user_name is NULL");
402                 }
403
404                 ad->data_pwd =
405                     setting_create_Gendial_field_def(scroller,
406                                                      &(ad->itc_variable_height),
407                                                      NULL, NULL,
408                                                      SWALLOW_Type_LAYOUT_ENTRY,
409                                                      NULL, NULL, 0,
410                                                      "IDS_COM_BODY_PASSWORD",
411                                                      (char *)ad->ed_pwd_desc,
412                                                      setting_network_connection_entry_changed_cb);
413                 if (ad->data_pwd) {
414                         ad->data_pwd->userdata = ad;
415                         ad->is_show_user = 1;
416                         ad->data_pwd->isPasswordFlag = TRUE;
417                 } else {
418                         SETTING_TRACE_ERROR("ad->data_pwd is NULL");
419                 }
420
421                 ad->item_above_proxy_add = item =
422                     elm_genlist_item_append(scroller, &(ad->itc_seperator),
423                                             NULL, NULL, ELM_GENLIST_ITEM_NONE,
424                                             NULL, NULL);
425                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
426         }
427
428         ad->data_pxy_addr =
429             setting_create_Gendial_field_def(scroller,
430                                              &(ad->itc_variable_height), NULL,
431                                              NULL, SWALLOW_Type_LAYOUT_ENTRY,
432                                              NULL, NULL, 0,
433                                              "IDS_ST_BODY_CONNECTIONSETTINGS_PROXY_ADDRESS",
434                                              (char *)ad->ed_pxy_addr_desc,
435                                              setting_network_connection_entry_changed_cb);
436         if (ad->data_pxy_addr) {
437                 ad->data_pxy_addr->userdata = ad;
438                 ad->data_pxy_addr->input_type = ELM_INPUT_PANEL_LAYOUT_IP;
439         } else {
440                 SETTING_TRACE_ERROR("ad->data_pxy_addr is NULL");
441         }
442
443         ad->data_pxy_port =
444             setting_create_Gendial_field_def(scroller,
445                                              &(ad->itc_variable_height), NULL,
446                                              NULL, SWALLOW_Type_LAYOUT_ENTRY,
447                                              NULL, NULL, 0,
448                                              "IDS_ST_BODY_PROXY_PORT",
449                                              (char *)ad->ed_pxy_port_desc,
450                                              setting_network_connection_entry_changed_cb);
451         if (ad->data_pxy_port) {
452                 ad->data_pxy_port->userdata = ad;
453                 ad->data_pxy_port->input_type = ELM_INPUT_PANEL_LAYOUT_NUMBERONLY;
454         } else {
455                 SETTING_TRACE_ERROR("ad->data_pxy_port is NULL");
456         }
457
458         setting_view_network_connection_create.is_create = 1;
459         ad->scl_edit = scroller;
460
461         return SETTING_RETURN_SUCCESS;
462 }
463
464 static int setting_network_connection_destroy(void *cb)
465 {
466         SETTING_TRACE_BEGIN;
467         /* error check */
468         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
469
470         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
471
472         elm_naviframe_item_pop(ad->navi_bar);
473         setting_view_network_connection_create.is_create = 0;
474         return SETTING_RETURN_SUCCESS;
475 }
476
477 static int setting_network_connection_update(void *cb)
478 {
479         SETTING_TRACE_BEGIN;
480         return SETTING_RETURN_SUCCESS;
481 }
482
483 static int setting_network_connection_cleanup(void *cb)
484 {
485         return setting_network_connection_destroy(cb);
486 }
487
488 /* ***************************************************
489  *
490  *general func
491  *
492  ***************************************************/
493
494 static int setting_network_edit_connection_save_connection(void *data)
495 {
496         SETTING_TRACE_BEGIN;
497         /* error check */
498         retv_if(data == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
499
500         SettingNetworkUG *ad = (SettingNetworkUG *) data;
501         const char *acs_name = NULL;
502         const char *usr_name = NULL;
503         const char *pwd = NULL;
504         const char *addr = NULL;
505         const char *port = NULL;
506         const char *home = NULL;
507
508         if (ad->data_acs_name)
509                 acs_name = ad->data_acs_name->sub_desc;
510         if (ad->data_user_name)
511                 usr_name = ad->data_user_name->sub_desc;
512         if (ad->data_pwd)
513                 pwd = ad->data_pwd->sub_desc;
514         if (ad->data_pxy_addr)
515                 addr = ad->data_pxy_addr->sub_desc;
516         if (ad->data_pxy_port)
517                 port = ad->data_pxy_port->sub_desc;
518
519         if (!acs_name)
520                 acs_name = "";
521         if (!usr_name)
522                 usr_name = "";
523         if (!pwd)
524                 pwd = "";
525         if (!addr)
526                 addr = "";
527         if (!port)
528                 port = "";
529         SETTING_TRACE("acs_name:%s", acs_name);
530         SETTING_TRACE("usr_name:%s", usr_name);
531         SETTING_TRACE("pwd:%s", pwd);
532
533         SETTING_TRACE("addr:%s", addr);
534         SETTING_TRACE("port:%s", port);
535         SETTING_TRACE("home:%s", home);
536
537         char sz_text[NET_PROXY_LEN_MAX + 1] = { 0, };
538         int type;
539         int ret = SETTING_RETURN_SUCCESS;
540         int err;
541
542         net_profile_info_t *con_info = NULL;
543         if (ad->prof_sel_idx != SETTING_ADD_PROFILE_INDEX) {
544                 con_info = &(ad->prof_list[ad->prof_sel_idx]);
545         } else {
546                 con_info = (net_profile_info_t *)calloc(1, sizeof(net_profile_info_t));
547         }
548
549         /* save access name */
550         if (!safeStrCmp(acs_name, "")) {
551                 setting_create_popup_without_title(ad, ad->win_get,
552                                                   _
553                                                   ("Please input access name !"));
554                 return SETTING_DNET_RETURN_NULL_ACCESS_NAME;
555         } else {
556                 safeCopyStr(con_info->ProfileInfo.Pdp.Apn, acs_name,
557                             NET_PDP_APN_LEN_MAX);
558         }
559
560         /* save auth type */
561         type = ad->chkType;
562
563         switch (type) {
564         case NET_PDP_AUTH_PAP:  /*  Normal */
565
566                 con_info->ProfileInfo.Pdp.AuthInfo.AuthType =
567                     NET_PDP_AUTH_PAP;
568
569                 break;
570
571         case NET_PDP_AUTH_CHAP: /*  Secure */
572
573                 con_info->ProfileInfo.Pdp.AuthInfo.AuthType =
574                     NET_PDP_AUTH_CHAP;
575
576                 break;
577
578         case NET_PDP_AUTH_NONE: /*  None */
579
580                 con_info->ProfileInfo.Pdp.AuthInfo.AuthType =
581                     NET_PDP_AUTH_NONE;
582
583                 break;
584         default:
585                 /* do nothing*/
586                 break;
587         }
588
589         /* save user name */
590         if (!safeStrCmp(usr_name, "")
591             && NET_PDP_AUTH_NONE != type) {
592                 setting_create_popup_without_title(ad, ad->win_get,
593                                                   _
594                                                   ("Please input User name !"));
595                 return SETTING_DNET_RETURN_NULL_USER_NAME;
596         } else {
597                 safeCopyStr(con_info->ProfileInfo.Pdp.AuthInfo.UserName,
598                             usr_name, NET_PDP_AUTH_USERNAME_LEN_MAX - 1);
599         }
600         /* save password */
601         if (!safeStrCmp(pwd, "")
602             && NET_PDP_AUTH_NONE != type) {
603                 setting_create_popup_without_title(ad, ad->win_get,
604                                                   _("IDS_ST_BODY_ENTER_PASSWORD"));
605                 return SETTING_DNET_RETURN_NULL_PASSWORD;
606         } else {
607                 safeCopyStr(con_info->ProfileInfo.Pdp.AuthInfo.Password, pwd,
608                             NET_PDP_AUTH_PASSWORD_LEN_MAX - 1);
609         }
610
611         /* save proxy addr */
612         if (!safeStrCmp(addr, "")) {
613                 ret = SETTING_DNET_RETURN_NULL_PROXY_ADDR;
614         } else if (!is_ip_string(addr)) {
615                 setting_create_popup_without_title(ad, ad->win_get,
616                                                   _("IDS_ST_HEADER_INCORRECT_PROXY_ADDRESS"));
617                 return SETTING_DNET_RETURN_INVALID_PROXY_ADDR;
618         }
619         /* check proxy port */
620         if (!safeStrCmp(port, "")) {
621                 ret = SETTING_DNET_RETURN_NULL_PROXY_PORT;
622         }
623
624         if (!safeStrCmp(addr, "") && !safeStrCmp(port, "")) {
625                 memset(con_info->ProfileInfo.Pdp.net_info.ProxyAddr, 0,
626                        sizeof(con_info->ProfileInfo.Pdp.net_info.ProxyAddr));
627         } else {
628                 ret = snprintf(sz_text, sizeof(sz_text), "%s:%s", addr, port);
629                 retv_if(ret < 0, SETTING_DNET_RETURN_ERR);
630                 safeCopyStr(con_info->ProfileInfo.Pdp.net_info.ProxyAddr, sz_text,
631                             NET_PROXY_LEN_MAX);
632         }
633
634         SETTING_TRACE("ad->con_type:%d", ad->con_type);
635         /* save connection */
636         if (ad->prof_sel_idx == SETTING_ADD_PROFILE_INDEX) {
637                 /* add connection */
638                 if (ad->con_type == NET_SERVICE_INTERNET) {     /* Internet Connection */
639                         safeCopyStr(con_info->ProfileName,
640                                     "Internet connection",
641                                     strlen("Internet connection"));
642                 }
643                 /** Specifies a protocol type */
644
645                 /** network information */
646                 con_info->ProfileInfo.Pdp.ServiceType = ad->con_type;
647
648                 con_info->profile_type = NET_DEVICE_CELLULAR;
649                 con_info->ProfileState = NET_STATE_TYPE_UNKNOWN;
650                 con_info->ProfileInfo.Pdp.ProtocolType = NET_PDP_TYPE_GPRS;
651
652                 err = net_add_profile(ad->con_type, con_info);
653                 if (err != NET_ERR_NONE) {
654                         SETTING_TRACE_DEBUG
655                             ("%s*** [ERR] net_add_profile. err=%d ***%s",
656                              SETTING_FONT_RED, err, SETTING_FONT_BLACK);
657                         ret = SETTING_DNET_RETURN_ERR;
658                         setting_create_popup_without_title(ad, ad->win_get,
659                                                           _
660                                                           ("Failed to invoke net_add_profile()"));
661                         return ret;
662                 }
663                 FREE(con_info);
664         } else {
665                 err = net_modify_profile(con_info->ProfileName, con_info);
666                 if (err != NET_ERR_NONE) {
667                         SETTING_TRACE_DEBUG
668                             ("%s*** [ERR] net_modify_profile. err=%d ***%s",
669                              SETTING_FONT_RED, err, SETTING_FONT_BLACK);
670                         ret = SETTING_DNET_RETURN_ERR;
671                 }
672         }
673         return ret;
674 }
675
676 /* ***************************************************
677  *
678  *call back func
679  *
680  ***************************************************/
681
682 static void
683 setting_network_edit_connection_click_softkey_save_cb(void *data,
684                                                       Evas_Object *obj,
685                                                       void *event_info)
686 {
687         SETTING_TRACE_BEGIN;
688         /* error check */
689         retm_if(data == NULL, "Data parameter is NULL");
690
691         SettingNetworkUG *ad = (SettingNetworkUG *) data;
692
693         int ret = setting_network_edit_connection_save_connection(ad);
694         /* need special handle */
695         if (SETTING_DNET_RETURN_NULL_ACCESS_NAME == ret
696             || SETTING_DNET_RETURN_NULL_USER_NAME == ret
697             || SETTING_DNET_RETURN_NULL_PASSWORD == ret
698             || SETTING_DNET_RETURN_INVALID_PROXY_ADDR == ret) {
699                 return;
700         }
701         if (ret != SETTING_RETURN_SUCCESS) {
702                 SETTING_TRACE_DEBUG
703                     ("%s*** [ERR] setting_network_edit_connection_save_connection ***%s",
704                      SETTING_FONT_RED, SETTING_FONT_BLACK);
705         }
706
707         setting_network_popup_create(ad, _("Saved!"), FALSE);
708         setting_view_change(&setting_view_network_connection_create,
709                             &setting_view_network_main, ad);
710 }
711
712 static void
713 setting_network_edit_connection_click_softkey_cancel_cb(void *data,
714                                                         Evas_Object *obj,
715                                                         void *event_info)
716 {
717         SETTING_TRACE_BEGIN;
718         /* error check */
719         retm_if(data == NULL, "Data parameter is NULL");
720
721         SettingNetworkUG *ad = (SettingNetworkUG *) data;
722         setting_view_change(&setting_view_network_connection_create,
723                             &setting_view_network_main, ad);
724 }
725
726 static void _gl_Gendial_sel(void *data, Evas_Object *obj, void *event_info)
727 {
728         /* SETTING_TRACE_BEGIN; */
729         retm_if(event_info == NULL, "Invalid argument: event info is NULL");
730         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
731         elm_genlist_item_selected_set(item, 0);
732         return;
733 }
734
735 static void setting_network_connection_check_entry_empty(SettingNetworkUG *ad)
736 {
737         SETTING_TRACE_BEGIN;
738         if(!ad->has_form_changed ) return;
739         const char *entry_str = NULL;
740         bool isFoundEmptyEntry = FALSE;
741
742         do {
743                 if (ad->data_acs_name) {
744                         entry_str = ad->data_acs_name->sub_desc;
745
746                         if (NULL == entry_str || '\0' == entry_str[0]) {
747                                 isFoundEmptyEntry = TRUE;
748                                 break;
749                         }
750
751                 }
752                 if(ad->chkType != NET_PDP_AUTH_NONE)
753                 {
754                         if (ad->data_user_name) {
755                                 entry_str = ad->data_user_name->sub_desc;
756
757                                 if (NULL == entry_str || '\0' == entry_str[0]) {
758                                         isFoundEmptyEntry = TRUE;
759                                         break;
760                                 }
761                         }
762                         if (ad->data_pwd) {
763                                 entry_str = ad->data_pwd->sub_desc;
764                                 if (NULL == entry_str || '\0' == entry_str[0]) {
765                                         isFoundEmptyEntry = TRUE;
766                                         break;
767                                 }
768                         }
769                 }
770                 if (ad->data_hm_url) {
771                         entry_str = ad->data_hm_url->sub_desc;
772                         if (NULL == entry_str || '\0' == entry_str[0]) {
773                                 isFoundEmptyEntry = TRUE;
774                                 break;
775                         }
776                 }
777         } while (0);
778
779         Evas_Object *done_btn = elm_object_item_part_content_get(ad->navi_it, "title_right_btn");
780         if (isFoundEmptyEntry) {
781                 if (!evas_object_pass_events_get(done_btn)) {//it had not yet been disabled
782                         setting_disable_evas_object(done_btn);
783                         setting_dim_evas_object(done_btn, TRUE);
784                 }
785                 else
786                 {
787                     //do nothing..if invoke setting_dim_evas_object many times, the done button will be dimer until it cannot be see.
788                     //refer to the API of setting_dim_evas_object(). The API is supplied by Setting itself, winset doesn't support until now as I now.
789                 }
790         } else {
791                 setting_enable_evas_object(done_btn);
792                 setting_undo_dim_evas_object(done_btn, TRUE);
793         }
794 }
795
796 static void
797 setting_network_edit_connection_display_auth_type(SettingNetworkUG *ad,
798                                                   int auth_type)
799 {
800         SETTING_TRACE_BEGIN;
801         retm_if(ad == NULL, "Data parameter is NULL");
802         if (ad->chkType == auth_type) return;
803
804         ad->chkType = auth_type;        /* for update genlist */
805         if (NET_PDP_AUTH_NONE != auth_type) {   /* to show */
806                 SETTING_TRACE("ad->is_show_user:%d", ad->is_show_user);
807                 if (ad->is_show_user == 0) {    /* do only when hiden */
808                         SETTING_TRACE("to create");
809
810                         ad->data_user_name =
811                             (Setting_GenGroupItem_Data *) calloc(1,
812                                                                  sizeof
813                                                                  (Setting_GenGroupItem_Data));
814                         setting_retm_if(ad->data_user_name == NULL, "calloc failed");
815                         ad->data_user_name->keyStr =
816                             (char *)g_strdup("IDS_COM_BODY_USER_NAME");
817                         ad->data_user_name->sub_desc =
818                             (char *)g_strdup(ad->ed_user_name_desc);
819                         ad->data_user_name->swallow_type =
820                             SWALLOW_Type_LAYOUT_ENTRY;
821                         ad->data_user_name->userdata = ad;
822                         ad->data_user_name->chk_change_cb =
823                             setting_network_connection_entry_changed_cb;
824                         ad->data_user_name->item =
825                             elm_genlist_item_insert_after(ad->scl_edit,
826                                                           &
827                                                           (ad->itc_variable_height),
828                                                           ad->data_user_name,
829                                                           NULL,
830                                                           ad->item_above_user_name,
831                                                           ELM_GENLIST_ITEM_NONE,
832                                                           _gl_Gendial_sel, ad);
833
834                         ad->data_pwd =
835                             (Setting_GenGroupItem_Data *) calloc(1,
836                                                                  sizeof
837                                                                  (Setting_GenGroupItem_Data));
838
839                         setting_retm_if(ad->data_pwd == NULL, "calloc failed");
840                         ad->data_pwd->keyStr =
841                             (char *)g_strdup("IDS_COM_BODY_PASSWORD");
842                         ad->data_pwd->sub_desc =
843                             (char *)g_strdup(ad->ed_pwd_desc);
844                         ad->data_pwd->swallow_type = SWALLOW_Type_LAYOUT_ENTRY;
845                         ad->data_pwd->userdata = ad;
846                         ad->data_pwd->chk_change_cb =
847                             setting_network_connection_entry_changed_cb;
848                         ad->data_pwd->isPasswordFlag = TRUE;
849                         ad->data_pwd->item =
850                             elm_genlist_item_insert_after(ad->scl_edit,
851                                                           &
852                                                           (ad->itc_variable_height),
853                                                           ad->data_pwd, NULL,
854                                                           ad->
855                                                           data_user_name->item,
856                                                           ELM_GENLIST_ITEM_NONE,
857                                                           _gl_Gendial_sel, ad);
858
859                         ad->item_above_proxy_add =
860                             elm_genlist_item_insert_after(ad->scl_edit,
861                                                           &(ad->itc_seperator),
862                                                           NULL, NULL,
863                                                           ad->data_pwd->item,
864                                                           ELM_GENLIST_ITEM_NONE,
865                                                           NULL, NULL);
866                         elm_genlist_item_select_mode_set
867                             (ad->item_above_proxy_add, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
868
869                         Evas_Object *done_btn = elm_object_item_part_content_get(ad->navi_it, "title_right_btn");
870                         if (!evas_object_pass_events_get(done_btn)) {//it had not yet been disabled
871                                 setting_disable_evas_object(done_btn);
872                                 setting_dim_evas_object(done_btn, TRUE);
873                         }
874                 }
875                 ad->is_show_user = 1;
876         } else {                /* to hide */
877
878                 SETTING_TRACE("ad->is_show_user:%d", ad->is_show_user);
879                 if (ad->is_show_user == 1) {    /* do only when shown */
880                         SETTING_TRACE("to destroy");
881                         if (ad->data_user_name) {
882                                 elm_object_item_del(ad->data_user_name->item);
883                                 ad->data_user_name = NULL;
884                         }
885                         if (ad->data_pwd) {
886                                 elm_object_item_del(ad->data_pwd->item);
887                                 ad->data_pwd = NULL;
888                         }
889                         if (ad->item_above_proxy_add) {
890                                 elm_object_item_del(ad->item_above_proxy_add);
891                                 ad->item_above_proxy_add = NULL;
892                         }
893
894                 }
895                 ad->has_form_changed  = TRUE;
896                 setting_network_connection_check_entry_empty(ad);
897                 ad->is_show_user = 0;
898
899         }
900 }
901
902 static void
903 setting_network_connection_entry_changed_cb(void *data, Evas_Object *obj,
904                                             void *event_info)
905 {
906         SETTING_TRACE_BEGIN;
907         retm_if(data == NULL, "Data parameter is NULL");
908         Setting_GenGroupItem_Data *list_item =
909             (Setting_GenGroupItem_Data *) data;
910         SettingNetworkUG *ad = list_item->userdata;
911         const char *entry_str = elm_entry_entry_get(obj);
912         if (0 != safeStrCmp(entry_str, list_item->sub_desc))
913         {
914                 list_item->sub_desc = (char *)g_strdup(entry_str);
915                 ad->has_form_changed  = TRUE;
916         }
917
918         if (NULL == entry_str || 0 == safeStrLen(entry_str)) {
919                 Evas_Object *layout = elm_object_parent_widget_get(list_item->eo_check);
920                 if (layout) elm_object_part_text_set(layout, "elm.guidetext", _("IDS_ST_BODY_TAP_TO_INSERT"));
921         }
922
923         setting_network_connection_check_entry_empty(ad);
924 }