Tizen 2.0 Release
[apps/home/settings.git] / setting-network / src / setting-network-con.c
1 /*
2  * setting
3  * Copyright (c) 2012 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Flora License, Version 1.0 (the License);
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://floralicense.org/license/
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an AS IS BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #include <setting-network-con.h>
18
19 static int setting_network_con_create(void *cb);
20 static int setting_network_con_destroy(void *cb);
21 static int setting_network_con_update(void *cb);
22 static int setting_network_con_cleanup(void *cb);
23
24 setting_view setting_view_network_con = {
25         .create = setting_network_con_create,
26         .destroy = setting_network_con_destroy,
27         .update = setting_network_con_update,
28         .cleanup = setting_network_con_cleanup,
29 };
30
31 /* ***************************************************
32  *
33  *basic func
34  *
35  ***************************************************/
36
37 static int setting_network_con_create(void *cb)
38 {
39         SETTING_TRACE_BEGIN;
40         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
41
42         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
43
44         Evas_Object *scroller = elm_genlist_add(ad->win_main_layout);
45         elm_object_style_set(scroller, "dialogue");
46         retvm_if(scroller == NULL, SETTING_DRAW_ERR_FAIL_SCROLLER,
47                  "Cannot set scroller object  as contento of layout");
48         elm_genlist_clear(scroller);    /* first to clear list */
49
50         setting_push_layout_navi_bar(_(CONNECTION_DSC),
51                                      _("IDS_COM_BODY_BACK"),
52                                      _(KeyStr_Reset_Def),
53                                      _("Create"),
54                                      setting_network_con_click_softkey_cancel_cb,
55                                      setting_network_con_click_softkey_reset_cb,
56                                      setting_network_con_click_softkey_create_cb,
57                                      ad, scroller, ad->navi_bar, NULL);
58         Elm_Object_Item *item = NULL;
59         item = elm_genlist_item_append(scroller, &itc_seperator, NULL, NULL,
60                                     ELM_GENLIST_ITEM_NONE, NULL, NULL);
61         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
62
63         /* scroller is a genlist */
64         setting_create_Gendial_field_def(scroller, &itc_1text,
65                                          setting_network_con_item_Gendial_mouse_up_cb,
66                                          ad, SWALLOW_Type_INVALID, NULL, NULL,
67                                          0, "IDS_ST_BODY_INTERNET_CONNECTION",
68                                          NULL, NULL);
69         setting_create_Gendial_field_def(scroller, &itc_1text,
70                                          setting_network_con_item_Gendial_mouse_up_cb,
71                                          ad, SWALLOW_Type_INVALID, NULL, NULL,
72                                          0, STR_SETTING_MMS_CONNECTIONS, NULL,
73                                          NULL);
74
75 #ifdef ENABLED_PREFERRED_NETWORKS
76         setting_create_Gendial_field_def(scroller, &itc_1text,
77                                          setting_network_con_item_Gendial_mouse_up_cb,
78                                          ad, SWALLOW_Type_INVALID, NULL, NULL,
79                                          0, "IDS_ST_BODY_PREFERRED_NETWORKS",
80                                          NULL, NULL);
81 #endif
82 #ifdef ENABLED_2G3G_NETWORK
83         /*  create 3g connection option */
84         setting_create_Gendial_field_def(scroller, &itc_1text,
85                                          setting_network_con_item_Gendial_mouse_up_cb,
86                                          ad, SWALLOW_Type_INVALID, NULL, NULL,
87                                          0, "2G/3G Connection", NULL, NULL);
88
89 #endif
90         connection_profile_iterator_h profile_iter = NULL;
91         connection_profile_h profile_h = NULL;
92
93         char *profile_name = NULL;
94         char *apn = NULL;
95         connection_profile_type_e profile_type = CONNECTION_PROFILE_TYPE_CELLULAR;
96         connection_cellular_service_type_e service_type = CONNECTION_CELLULAR_SERVICE_TYPE_UNKNOWN;
97
98         int rv = connection_get_profile_iterator(ad->connection, CONNECTION_ITERATOR_TYPE_REGISTERED, &profile_iter);
99         if (rv != CONNECTION_ERROR_NONE) {
100                 SETTING_TRACE_ERROR("Fail to get profile iterator [%d]", rv);
101                 return false;
102         }
103
104         int cnt = 0;
105         #ifndef SUPPORT_REVERSED_ORDER
106         Elm_Object_Item *last_item = elm_genlist_item_append(scroller, &itc_bottom_seperator,
107                                        NULL, NULL,
108                                        ELM_GENLIST_ITEM_NONE, NULL, NULL);
109         elm_genlist_item_select_mode_set(last_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
110         Setting_GenGroupItem_Data *item_data = NULL;
111         #endif
112
113         while (connection_profile_iterator_has_next(profile_iter)) {
114                 if (cnt >= MAX_PROFILE_NUM)
115                 {
116                         break;
117                 }
118                 if (connection_profile_iterator_next(profile_iter, &profile_h) != CONNECTION_ERROR_NONE) {
119                         SETTING_TRACE_ERROR("Fail to get profile handle");
120                         break;
121                 }
122
123                 if (connection_profile_get_type(profile_h, &profile_type) != CONNECTION_ERROR_NONE) {
124                         SETTING_TRACE_ERROR("Fail to get profile type");
125                         continue;
126                 }
127                 if (connection_profile_get_cellular_service_type(profile_h, &service_type) != CONNECTION_ERROR_NONE) {
128                         SETTING_TRACE_ERROR("Fail to get service type");
129                         continue;
130                 }
131
132                 if (connection_profile_get_name(profile_h, &profile_name) != CONNECTION_ERROR_NONE) {
133                         SETTING_TRACE_ERROR("Fail to get profile name");
134                         continue;
135                 }
136
137                 if (connection_profile_get_cellular_apn(profile_h, &apn) != CONNECTION_ERROR_NONE) {
138                         SETTING_TRACE_ERROR("Fail to get apn");
139                         G_FREE(profile_name);
140                         continue;
141                 }
142
143                 SETTING_TRACE("Record[%d:%s], profile_name:%s, profile_type:%d, service_type:%d",
144                               cnt, apn, profile_name, profile_type, service_type);
145                 if(CONNECTION_PROFILE_TYPE_CELLULAR != profile_type)
146                 {
147                         G_FREE(apn);
148                         G_FREE(profile_name);
149                         continue;
150                 }
151                 if (CONNECTION_CELLULAR_SERVICE_TYPE_MMS != service_type
152                     && CONNECTION_CELLULAR_SERVICE_TYPE_INTERNET != service_type) //unknow, match with ad->con_name
153                 {
154                         #ifdef SUPPORT_REVERSED_ORDER
155                         setting_create_Gendial_field_def(scroller, &itc_1text,
156                                                          setting_network_con_item_Gendial_mouse_up_cb,
157                                                          ad, SWALLOW_Type_INVALID, NULL, NULL,
158                                                          0, apn, NULL,
159                                                          NULL);
160                         #else
161                         item_data = calloc(1, sizeof(Setting_GenGroupItem_Data));
162                         setting_retvm_if(!item_data, SETTING_RETURN_FAIL, "calloc failed");
163                         item_data->keyStr = (char *)g_strdup(apn);
164                         item_data->swallow_type = SWALLOW_Type_INVALID;
165                         item_data->item = elm_genlist_item_insert_before(scroller,
166                                                         &itc_1text, item_data, NULL, last_item,
167                                                         ELM_GENLIST_ITEM_NONE,
168                                                         setting_network_con_item_Gendial_mouse_up_cb,ad);
169                         last_item = item_data->item;
170                         #endif
171                 }
172                 G_FREE(apn);
173                 G_FREE(profile_name);
174                 cnt++;
175         }
176
177 #ifdef SUPPORT_REVERSED_ORDER
178         /*  add separator */
179         item = elm_genlist_item_append(scroller, &itc_bottom_seperator,
180                                        NULL, NULL,
181                                        ELM_GENLIST_ITEM_NONE, NULL, NULL);
182         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
183 #endif
184         setting_view_network_con.is_create = 1;
185
186         return SETTING_RETURN_SUCCESS;
187 }
188
189 static int setting_network_con_destroy(void *cb)
190 {
191         SETTING_TRACE_BEGIN;
192         /* error check */
193         retv_if(cb == NULL, SETTING_GENERAL_ERR_NULL_DATA_PARAMETER);
194
195         SettingNetworkUG *ad = (SettingNetworkUG *) cb;
196         FREE(ad->con_name);
197         elm_naviframe_item_pop(ad->navi_bar);
198         setting_view_network_con.is_create = 0;
199
200         return SETTING_RETURN_SUCCESS;
201 }
202
203 static int setting_network_con_update(void *cb)
204 {
205         setting_network_con_destroy(cb);
206         setting_network_con_create(cb);
207         return SETTING_RETURN_SUCCESS;
208 }
209
210 static int setting_network_con_cleanup(void *cb)
211 {
212         return setting_network_con_destroy(cb);
213 }
214
215 /* ***************************************************
216  *
217  *general func
218  *
219  ***************************************************/
220
221 /* ***************************************************
222  *
223  *call back func
224  *
225  ***************************************************/
226
227 static void
228 setting_network_con_item_Gendial_mouse_up_cb(void *data, Evas_Object *obj,
229                                               void *event_info)
230 {
231         SETTING_TRACE_BEGIN;
232         /* error check */
233         setting_retm_if(data == NULL, "Data parameter is NULL");
234         Elm_Object_Item *item = (Elm_Object_Item *) event_info;
235         elm_genlist_item_selected_set(item, 0);
236         Setting_GenGroupItem_Data *list_item =
237             (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
238
239         SettingNetworkUG *ad = (SettingNetworkUG *) data;
240
241         SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
242         int ret;
243
244         if (!safeStrCmp("IDS_ST_BODY_SELECT_NETWORK", list_item->keyStr)) {
245                 ret =
246                     setting_view_change(&setting_view_network_main,
247                                         &setting_view_network_select_network,
248                                         ad);
249         }
250 #ifdef ENABLED_PREFERRED_NETWORKS
251         else if (!safeStrCmp("IDS_ST_BODY_PREFERRED_NETWORKS",
252                                 list_item->keyStr)) {
253
254                 int value = -1;
255                 int err = -1;
256                 ret =
257                     setting_get_int_slp_key(INT_SLP_SETTING_SIM_SLOT, &value,
258                                             &err);
259                         /** @todo check 'err' variable for exception handling */
260                 SETTING_TRACE("INT_SLP_SETTING_SIM_SLOT value:%d", value);
261                 switch (value) {
262                 case VCONFKEY_TELEPHONY_SIM_INSERTED:
263                         /* To Recreate the view in order to search the perferred network again. */
264                         /* ret = setting_view_destroy(&setting_view_network_preferred_network, ad); */
265                         ret =
266                             setting_view_change(&setting_view_network_main,
267                                                 &setting_view_network_preferred_network,
268                                                 ad);
269
270                         break;
271
272                 case VCONFKEY_TELEPHONY_SIM_NOT_PRESENT:
273
274                         setting_create_simple_popup(NULL, ad->win_get,
275                                                     NULL, _("IDS_ST_SECURITY_BODY_NOIMSI"));
276                         SETTING_TRACE_DEBUG
277                             ("%s*** [ERR] INCORRECTED SIM. sim_slot_type=%d ***%s",
278                              SETTING_FONT_RED, value, SETTING_FONT_BLACK);
279                         return;
280
281                         break;
282
283                 case VCONFKEY_TELEPHONY_SIM_CARD_ERROR:
284                 case VCONFKEY_TELEPHONY_SIM_UNKNOWN:
285
286                         setting_create_simple_popup(NULL, ad->win_get,
287                                                     NULL, _("IDS_COM_BODY_INVALID_SIM_CARD"));
288                         SETTING_TRACE_DEBUG
289                             ("%s*** [ERR] INCORRECTED SIM. sim_slot_type=%d ***%s",
290                              SETTING_FONT_RED, value, SETTING_FONT_BLACK);
291                         return;
292
293                         break;
294                 default:
295                         SETTING_TRACE("Unknown SIM information from vconf");
296                         break;
297                 }
298         }
299 #endif
300 #ifdef ENABLED_2G3G_NETWORK
301         else if (!safeStrCmp("2G/3G Connection", list_item->keyStr)) {
302                 ret =
303                     setting_view_change(&setting_view_network_main,
304                                         &setting_view_network_3gcon, ad);
305         }
306 #endif
307         else {//connections..
308                 ad->con_name = strdup(list_item->keyStr);
309                 ret = setting_view_change(&setting_view_network_main,
310                                         &setting_view_network_connection_create,
311                                         ad);
312         }
313 }
314
315 static void
316 setting_network_con_click_softkey_reset_cb(void *data, Evas_Object *obj, void *event_info)
317 {
318         SETTING_TRACE_BEGIN;
319         /* error check */
320         retm_if(data == NULL, "Data parameter is NULL");
321
322         SettingNetworkUG *ad = (SettingNetworkUG *) data;
323         //Reset connections info..
324         excuteCmd("/usr/bin/dbus-send", 1, NET_CON_RESET_DBUS_PARA);
325         setting_create_simple_popup(ad, ad->win_get, NULL, _("IDS_COM_POP_SUCCESS"));
326
327         setting_network_con_update(ad);
328 }
329
330 static void
331 setting_network_con_click_softkey_create_cb(void *data, Evas_Object *obj,
332                                            void *event_info)
333 {
334         /* error check */
335         retm_if(data == NULL, "Data parameter is NULL");
336
337         SettingNetworkUG *ad = (SettingNetworkUG *) data;
338
339         //setting_create_simple_popup(ad, ad->win_get, NULL, _("UX Undefined"));
340         //return;
341
342         //to add a new connection
343         //ad->con_type = -1;
344         ad->con_name = strdup(STR_SETTING_NEW_CONNECTIONS);
345         setting_view_change(&setting_view_network_main, &setting_view_network_connection_create, ad);
346 }
347
348 static void
349 setting_network_con_click_softkey_cancel_cb(void *data, Evas_Object *obj,
350                                               void *event_info)
351 {
352         /* error check */
353         retm_if(data == NULL, "Data parameter is NULL");
354
355         SettingNetworkUG *ad = (SettingNetworkUG *) data;
356
357         setting_view_change(&setting_view_network_con,
358                             &setting_view_network_main, ad);
359 }