Release tizen_2.0_beta
[apps/home/ug-wifi-efl.git] / sources / wifi-syspopup / viewer-popups / view-main.c
1 /*
2 *  Wi-Fi syspopup
3 *
4 * Copyright 2012  Samsung Electronics Co., Ltd
5
6 * Licensed under the Flora License, Version 1.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9
10 * http://www.tizenopensource.org/license
11
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20
21
22 #include "common.h"
23 #include "view-main.h"
24 #include "common_pswd_popup.h"
25 #include "common_utils.h"
26 #include "view-alerts.h"
27 #include "i18nmanager.h"
28 #include "common_eap_connect.h"
29
30 extern wifi_object* syspopup_app_state;
31
32 static Evas_Object* list = NULL;
33 static Elm_Genlist_Item_Class itc;
34
35 int view_main_item_connection_mode_set(syspopup_genlist_data_t *data, ITEM_CONNECTION_MODES mode)
36 {
37         __COMMON_FUNC_ENTER__;
38
39         if (data == NULL) {
40                 WARN_LOG(SP_NAME_NORMAL, "NULL == data");
41                 __COMMON_FUNC_EXIT__;
42                 return FALSE;
43         }
44
45         if (ITEM_CONNECTION_MODE_NULL >= mode || ITEM_CONNECTION_MODE_MAX <= mode) {
46                 ERROR_LOG(SP_NAME_NORMAL, "mode[%d] is not valid", mode);
47                 __COMMON_FUNC_EXIT__;
48                 return FALSE;
49         }
50
51         /* mode set */
52         data->connection_mode = mode;
53         INFO_LOG(SP_NAME_NORMAL, "mode: [%d]", data->connection_mode);
54
55         elm_genlist_item_update(data->it);
56
57         __COMMON_FUNC_EXIT__;
58
59         return TRUE;
60 }
61
62 static ITEM_CONNECTION_MODES view_main_state_get(Evas_Object *glist)
63 {
64         __COMMON_FUNC_ENTER__;
65
66         if (glist == NULL)
67                 return ITEM_CONNECTION_MODE_NULL;
68
69         Elm_Object_Item* it = NULL;
70         it = elm_genlist_first_item_get(glist);
71         while (it) {
72                 syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *)elm_object_item_data_get(it);
73                 if (gdata->connection_mode == ITEM_CONNECTION_MODE_CONNECTING) {
74                         return ITEM_CONNECTION_MODE_CONNECTING;
75                 }
76
77                 it = elm_genlist_item_next_get(it);
78         }
79
80         __COMMON_FUNC_EXIT__;
81         return ITEM_CONNECTION_MODE_OFF;
82 }
83
84 static void _popup_ok_cb(void *data, Evas_Object *obj, void *event_info)
85 {
86         __COMMON_FUNC_ENTER__;
87         if (!syspopup_app_state->passpopup) {
88                 return;
89         }
90         assertm_if(NULL == data, "data is NULL!!");
91         assertm_if(NULL == obj, "obj is NULL!!");
92         assertm_if(NULL == event_info, "event_info is NULL!!");
93
94         syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *)data;
95         char *profile_name = gdata->dev_info->profile_name;
96         wlan_security_mode_type_t sec_mode = gdata->dev_info->security_mode;
97
98         char* password = NULL;
99         int len_password = 0;
100         int ret = WLAN_MANAGER_ERR_UNKNOWN;
101         password = common_pswd_popup_get_txt(syspopup_app_state->passpopup);
102         len_password = strlen(password);
103         INFO_LOG(SP_NAME_NORMAL, "* password len [%d]", len_password);
104
105         switch (sec_mode) {
106         case WLAN_SEC_MODE_WEP:
107                 if (len_password == 5 || len_password == 13 || len_password == 26 || len_password == 10) {
108                         wlan_manager_password_data* param = (wlan_manager_password_data *)g_malloc0(sizeof(wlan_manager_password_data));
109                         assertm_if(NULL == param, "param is NULL!!");
110
111                         param->wlan_eap_type = WLAN_MANAGER_EAP_TYPE_NONE;
112                         param->password = password;
113
114                         ret = wlan_manager_connect_with_password(profile_name, sec_mode, param);
115                         g_free(param);
116
117                 } else {
118                         view_alerts_popup_show(WEP_WRONG_PASSWORD_LEN_ERR_MSG_STR);
119                         goto popup_ok_exit;
120                 }
121                 break;
122
123         case WLAN_SEC_MODE_WPA_PSK:
124         case WLAN_SEC_MODE_WPA2_PSK:
125                 if (len_password < 8 || len_password > 63) {
126                         view_alerts_popup_show(WPA_WRONG_PASSWORD_LEN_ERR_MSG_STR);
127                         goto popup_ok_exit;
128                 } else {
129                         wlan_manager_password_data* param = (wlan_manager_password_data *)g_malloc0(sizeof(wlan_manager_password_data));
130                         assertm_if(NULL == param, "param is NULL!!");
131
132                         param->wlan_eap_type = WLAN_MANAGER_EAP_TYPE_NONE;
133                         param->password = password;
134
135                         ret = wlan_manager_connect_with_password(profile_name, sec_mode, param);
136                         g_free(param);
137                 }
138                 break;
139
140         default:
141                 ret = WLAN_MANAGER_ERR_UNKNOWN;
142                 ERROR_LOG(SP_NAME_ERR, "Fatal: Wrong security mode : %d", sec_mode);
143                 break;
144         }
145
146         if (WLAN_MANAGER_ERR_NONE == ret)
147                 view_main_item_connection_mode_set(gdata, ITEM_CONNECTION_MODE_CONNECTING);
148         else
149                 view_main_item_connection_mode_set(gdata, ITEM_CONNECTION_MODE_OFF);
150
151         common_pswd_popup_destroy(syspopup_app_state->passpopup);
152         syspopup_app_state->passpopup = NULL;
153
154 popup_ok_exit:
155         g_free(password);
156
157         __COMMON_FUNC_EXIT__;
158 }
159
160 static void _popup_cancel_cb(void *data, Evas_Object *obj, void *event_info)
161 {
162         __COMMON_FUNC_ENTER__;
163
164         INFO_LOG(SP_NAME_NORMAL, "button cancel");
165
166         common_pswd_popup_destroy(syspopup_app_state->passpopup);
167         syspopup_app_state->passpopup = NULL;
168
169         __COMMON_FUNC_EXIT__;
170 }
171
172 static void _wps_pbc_popup_cancel_connecting(void* data, Evas_Object* obj, void* event_info)
173 {
174         if (!syspopup_app_state->passpopup || !data) {
175                 return;
176         }
177
178         syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *)data;
179         char *profile_name = gdata->dev_info->profile_name;
180         int ret = wlan_manager_request_cancel_wps_connection(profile_name);
181         if (ret == WLAN_MANAGER_ERR_NONE) {
182                 INFO_LOG(SP_NAME_NORMAL, "WPS conection cancelled successfully for AP[%s]", profile_name);
183         } else {
184                 ERROR_LOG(SP_NAME_ERR, "Error!!! wlan_manager_request_cancel_wps_connection failed for AP[%s]", profile_name);
185         }
186         common_pswd_popup_destroy(syspopup_app_state->passpopup);
187         syspopup_app_state->passpopup = NULL;
188         return;
189 }
190
191 static void _wps_btn_cb(void* data, Evas_Object* obj, void* event_info)
192 {
193         __COMMON_FUNC_ENTER__;
194         if (!syspopup_app_state->passpopup || !data) {
195                 return;
196         }
197
198         syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *)data;
199         int ret = wlan_manager_request_wps_connection(gdata->dev_info->profile_name);
200         if (ret == WLAN_MANAGER_ERR_NONE) {
201                 common_pswd_popup_pbc_popup_create(syspopup_app_state->passpopup, _wps_pbc_popup_cancel_connecting, gdata);
202         } else {
203                 ERROR_LOG(SP_NAME_ERR, "Error!!! wlan_manager_request_wps_connection failed");
204         }
205         __COMMON_FUNC_EXIT__;
206 }
207
208
209 static void _gl_sel(void *data, Evas_Object *obj, void *event_info)
210 {
211         __COMMON_FUNC_ENTER__;
212         assertm_if(NULL == data, "data is NULL!!");
213         assertm_if(NULL == obj, "obj is NULL!!");
214         assertm_if(NULL == event_info, "event_info is NULL!!");
215         Elm_Object_Item *item = (Elm_Object_Item *)event_info;
216
217         if (view_main_state_get(obj) != ITEM_CONNECTION_MODE_OFF) {
218                 INFO_LOG(SP_NAME_NORMAL, "In connecting state, nothing can do" );
219                 elm_genlist_item_selected_set(item, 0);
220                 __COMMON_FUNC_EXIT__;
221                 return;
222         }
223
224         syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t*) data;
225
226         int ret = WLAN_MANAGER_ERR_UNKNOWN;
227
228         switch (gdata->connection_mode) {
229         case ITEM_CONNECTION_MODE_OFF:
230                 INFO_LOG( SP_NAME_NORMAL, "item state: off");
231                 ret = wlan_manager_request_connection(gdata->dev_info);
232                 break;
233         case ITEM_CONNECTION_MODE_CONNECTING:
234                 INFO_LOG( SP_NAME_NORMAL, "item state: connecting");
235                 break;
236         default:
237                 ERROR_LOG( SP_NAME_NORMAL, "item state: etc [%d]", gdata->connection_mode);
238                 break;
239         }
240
241         switch (ret) {
242         case WLAN_MANAGER_ERR_NONE:
243                 INFO_LOG( SP_NAME_NORMAL, "ERROR_NONE");
244                 view_main_item_connection_mode_set(gdata, ITEM_CONNECTION_MODE_CONNECTING);
245                 break;
246         case WLAN_MANAGER_ERR_CONNECT_PASSWORD_NEEDED:
247                 INFO_LOG( SP_NAME_NORMAL, "Password view will show up");
248                 pswd_popup_create_req_data_t    popup_info;
249                 popup_info.title = gdata->dev_info->ssid;
250                 popup_info.ok_cb = _popup_ok_cb;
251                 popup_info.cancel_cb = _popup_cancel_cb;
252                 popup_info.show_wps_btn = gdata->dev_info->wps_mode;
253                 popup_info.wps_btn_cb = _wps_btn_cb;
254                 popup_info.cb_data = gdata;
255                 syspopup_app_state->passpopup = common_pswd_popup_create(syspopup_app_state->win_main, PACKAGE, &popup_info);
256                 break;
257         case WLAN_MANAGER_ERR_CONNECT_EAP_SEC_TYPE:
258                 create_eap_connect(syspopup_app_state->win_main, NULL, PACKAGE, gdata->dev_info, NULL);
259                 break;
260         default:
261                 view_main_item_connection_mode_set(gdata, ITEM_CONNECTION_MODE_OFF);
262                 view_main_refresh();
263                 ERROR_LOG( SP_NAME_NORMAL, "errro code [%d]", ret);
264                 break;
265         }
266
267         elm_genlist_item_selected_set(item, 0);
268         elm_genlist_item_update(item);
269
270         __COMMON_FUNC_EXIT__;
271 }
272
273 static char *_gl_text_get(void *data, Evas_Object *obj, const char *part)
274 {
275         __COMMON_FUNC_ENTER__;
276         char *ret = NULL;
277         assertm_if(NULL == data, "data param is NULL!!");
278         assertm_if(NULL == obj, "obj param is NULL!!");
279         assertm_if(NULL == part, "part param is NULL!!");
280
281         syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *) data;
282         if (!strncmp(part, "elm.text.1", strlen(part))) {
283                 ret = gdata->dev_info->ssid;
284                 if (ret == NULL) {
285                         ERROR_LOG(SP_NAME_NORMAL, "ssid name is NULL!!");
286                 }
287         } else if (!strncmp(part, "elm.text.2", strlen(part))) {
288                 if (ITEM_CONNECTION_MODE_CONNECTING == gdata->connection_mode) {
289                         ret = sc(PACKAGE, I18N_TYPE_Connecting);
290                 } else {
291                         ret = gdata->dev_info->ap_status_txt;
292                 }
293                 if (ret == NULL) {
294                         ERROR_LOG(SP_NAME_NORMAL, "ap_status_txt is NULL!!");
295                 }
296         }
297
298         __COMMON_FUNC_EXIT__;
299
300         return g_strdup(ret);
301 }
302
303 static Evas_Object *_gl_content_get(void *data, Evas_Object *obj, const char *part)
304 {
305         __COMMON_FUNC_ENTER__;
306         if (data == NULL)
307                 return NULL;
308
309         syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *) data;
310
311         const char* ssid_name = gdata->dev_info->ssid;
312         INFO_LOG(SP_NAME_NORMAL, "ssid name [%s]", ssid_name);
313
314         Evas_Object* icon = NULL;
315
316         if (!strncmp(part, "elm.icon.1", strlen(part))) {
317                 icon = elm_icon_add(obj);
318                 elm_icon_file_set(icon, gdata->dev_info->ap_image_path, NULL);
319                 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 5, 5);
320         } else if (!strncmp(part, "elm.icon.2", strlen(part))) {
321                 switch (gdata->connection_mode) {
322                 case ITEM_CONNECTION_MODE_OFF:
323                 default:
324                         break;
325                 case ITEM_CONNECTION_MODE_CONNECTING:
326                         icon = elm_progressbar_add(obj);
327                         elm_object_style_set(icon, "list_process");
328                         evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, 0.5);
329                         evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
330                         elm_progressbar_pulse(icon, TRUE);
331                         break;
332                 }
333
334         }
335
336         __COMMON_FUNC_EXIT__;
337         return icon;
338 }
339
340 static void _gl_list_del(void* data, Evas_Object* obj)
341 {
342         if (data == NULL)
343                 return;
344
345         syspopup_genlist_data_t* gdata = (syspopup_genlist_data_t *) data;
346
347         if (gdata->dev_info) {
348                 DEBUG_LOG(UG_NAME_NORMAL, "del target ssid:[%s]", gdata->dev_info->ssid);
349                 g_free(gdata->dev_info->ap_image_path);
350                 g_free(gdata->dev_info->ap_status_txt);
351                 g_free(gdata->dev_info->ssid);
352                 g_free(gdata->dev_info);
353         }
354         elm_object_item_data_set(gdata->it, NULL);
355         g_free(gdata);
356
357         return;
358 }
359
360 Evas_Object *view_main_create(Evas_Object* parent)
361 {
362         __COMMON_FUNC_ENTER__;
363         assertm_if(NULL == parent, "parent is NULL!!");
364
365         list = elm_genlist_add(parent); //syspopup_app_state->win_main);
366         assertm_if(NULL == list, "list allocation fail!!");
367
368         evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
369         evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
370
371         __COMMON_FUNC_EXIT__;
372
373         return list;
374 }
375
376 int view_main_destroy(void)
377 {
378         __COMMON_FUNC_ENTER__;
379         if(NULL != list) {
380                 evas_object_del(list);
381                 list = NULL;
382         }
383
384         __COMMON_FUNC_EXIT__;
385         return TRUE;
386 }
387
388 static void view_main_scan_ui_clear(void)
389 {
390         __COMMON_FUNC_ENTER__;
391
392         if (list == NULL)
393                 return;
394         elm_genlist_clear(list);
395
396         __COMMON_FUNC_EXIT__;
397 }
398
399 void *view_main_item_set(net_profile_info_t *profile_info)
400 {
401         __COMMON_FUNC_ENTER__;
402
403         wifi_device_info_t *wifi_device = (wifi_device_info_t*)g_malloc0(sizeof(wifi_device_info_t));
404
405         wifi_device->profile_name = g_strdup(profile_info->ProfileName);
406         wifi_device->ssid = g_strdup(profile_info->ProfileInfo.Wlan.essid);
407         wifi_device->rssi = (int)profile_info->ProfileInfo.Wlan.Strength;
408         wifi_device->security_mode = (int)profile_info->ProfileInfo.Wlan.security_info.sec_mode;
409         wifi_device->wps_mode = (int)profile_info->ProfileInfo.Wlan.security_info.wps_support;
410         wifi_device->ap_status_txt = common_utils_get_ap_security_type_info_txt(PACKAGE, wifi_device);
411         wifi_device->ap_image_path = common_utils_get_device_icon(WIFI_SP_ICON_PATH, wifi_device);
412
413         __COMMON_FUNC_EXIT__;
414         return wifi_device;
415 }
416
417 int view_main_refresh()
418 {
419         view_main_show(NULL);
420
421         return TRUE;
422 }
423
424 Eina_Bool view_main_show(void *data)
425 {
426         __COMMON_FUNC_ENTER__;
427
428         if (list == NULL) {
429                 ERROR_LOG( SP_NAME_NORMAL, "list is NULL!!" );
430                 return ECORE_CALLBACK_CANCEL;
431         }
432
433         view_main_scan_ui_clear();
434
435         char profile_name[NET_PROFILE_NAME_LEN_MAX+1] = "";
436         int state = wlan_manager_state_get(profile_name);
437
438         if (WLAN_MANAGER_ERROR == state || WLAN_MANAGER_OFF == state) {
439                 return ECORE_CALLBACK_CANCEL;
440         }
441
442         net_profile_info_t *profiles_list = wlan_manager_profile_table_get();
443         if (profiles_list == NULL)
444                 return ECORE_CALLBACK_CANCEL;
445
446         int profiles_list_size = wlan_manager_profile_scanned_length_get();
447         INFO_LOG(SP_NAME_NORMAL, "profiles list count [%d]\n", profiles_list_size);
448         if (profiles_list_size <= 0) {
449                 WARN_LOG(SP_NAME_NORMAL, "scan size is ZERO");
450                 return ECORE_CALLBACK_CANCEL;
451         }
452
453         itc.item_style = "2text.2icon.4";
454         itc.func.text_get = _gl_text_get;
455         itc.func.content_get = _gl_content_get;
456         itc.func.state_get = NULL;
457         itc.func.del = _gl_list_del;
458
459         int i = 0;
460         if (WLAN_MANAGER_CONNECTING == state) {
461                 for (; i < profiles_list_size; i++) {
462                         syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *)g_malloc0(sizeof(syspopup_genlist_data_t));
463                         gdata->dev_info = (wifi_device_info_t *)view_main_item_set(profiles_list+i);
464                         if (!g_strcmp0((profiles_list+i)->ProfileName, profile_name)) {
465                                 gdata->connection_mode = ITEM_CONNECTION_MODE_CONNECTING;
466                                 gdata->it = elm_genlist_item_append(list, &itc, gdata, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, gdata);
467                                 /* We have found the connecting AP, so lets break here and continue list
468                                  * the remaining in the below for loop. The below for loop doesnt have comparison.
469                                  * So it makes things little fast.
470                                  */
471                                 break;
472                         }
473                         gdata->connection_mode = ITEM_CONNECTION_MODE_OFF;
474                         gdata->it = elm_genlist_item_append(list, &itc, gdata, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, gdata);
475                 }
476         }
477
478         for (; i < profiles_list_size; i++) {
479                 syspopup_genlist_data_t *gdata = (syspopup_genlist_data_t *)g_malloc0(sizeof(syspopup_genlist_data_t));
480                 gdata->dev_info = (wifi_device_info_t *)view_main_item_set(profiles_list+i);
481                 gdata->connection_mode = ITEM_CONNECTION_MODE_OFF;
482
483                 gdata->it = elm_genlist_item_append(list, &itc, gdata, NULL, ELM_GENLIST_ITEM_NONE, _gl_sel, gdata);
484                 elm_object_item_data_set(gdata->it, gdata);
485         }
486
487         evas_object_show(list);
488         __COMMON_FUNC_EXIT__;
489
490         return ECORE_CALLBACK_CANCEL;
491 }