Fix SVace issues 41084 41135
[apps/native/ug-wifi-direct.git] / ug-wifidirect / src / wfd_client.c
1 /*
2 *  WiFi-Direct UG
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 #include <stdio.h>
21 #include <stdbool.h>
22 #include <libintl.h>
23
24 #include <Elementary.h>
25 #include <vconf.h>
26 #include <vconf-keys.h>
27
28 #include <tethering.h>
29
30 #include <network-cm-intf.h>
31 #include <network-wifi-intf.h>
32
33 #include <wifi-direct.h>
34
35 #include "wfd_ug.h"
36 #include "wfd_ug_view.h"
37 #include "wfd_client.h"
38
39 bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s *peer, void *user_data);
40
41 #ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
42 /**
43  *      This function let the ug make a change callback for wifi state
44  *      @return   void
45  *      @param[in] key the pointer to the key
46  *      @param[in] data the pointer to the main data structure
47  */
48 static void _wifi_state_cb(keynode_t *key, void *data)
49 {
50         __FUNC_ENTER__;
51         struct ug_data *ugd = (struct ug_data *)data;
52         int res;
53         int wifi_state;
54
55         res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
56         if (res != 0) {
57                 DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res);
58                 return;
59         }
60
61         if (wifi_state == VCONFKEY_WIFI_OFF) {
62                 DBG(LOG_INFO, "WiFi is turned off\n");
63                 wfd_client_swtch_force(ugd, TRUE);
64         } else {
65                 DBG(LOG_INFO, "WiFi is turned on\n");
66         }
67
68         res = net_deregister_client();
69         if (res != NET_ERR_NONE) {
70                 DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
71         }
72
73         __FUNC_EXIT__;
74 }
75
76 /**
77  *      This function let the ug make a event callback for network registering
78  *      @return   void
79  *      @param[in] event_info the pointer to the information of network event
80  *      @param[in] user_data the pointer to the user data
81  */
82 static void _network_event_cb(net_event_info_t *event_info, void *user_data)
83 {
84         __FUNC_ENTER__;
85         DBG(LOG_INFO, "Event from network. [%d]\n", event_info->Event);
86         __FUNC_EXIT__;
87 }
88
89 /**
90  *      This function let the ug turn wifi off
91  *      @return   If success, return 0, else return -1
92  *      @param[in] data the pointer to the main data structure
93  */
94 int wfd_wifi_off(void *data)
95 {
96         __FUNC_ENTER__;
97         struct ug_data *ugd = (struct ug_data *)data;
98         int res;
99
100         res = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb, ugd);
101         if (res == -1) {
102                 DBG(LOG_ERROR, "Failed to register vconf callback\n");
103                 return -1;
104         }
105
106         DBG(LOG_INFO, "Vconf key callback is registered\n");
107
108         res = net_register_client((net_event_cb_t) _network_event_cb, NULL);
109         if (res != NET_ERR_NONE) {
110                 DBG(LOG_ERROR, "Failed to register network client. [%d]\n", res);
111                 return -1;
112         }
113
114         DBG(LOG_INFO, "Network client is registered\n");
115
116         res = net_wifi_power_off();
117         if (res != NET_ERR_NONE) {
118                 DBG(LOG_ERROR, "Failed to turn off wifi. [%d]\n", res);
119                 return -1;
120         }
121
122         DBG(LOG_INFO, "WiFi power off\n");
123
124         __FUNC_EXIT__;
125         return 0;
126 }
127 #endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
128
129
130 /**
131  *      This function let the ug make a callback for setting tethering mode enabled
132  *      @return   void
133  *      @param[in] error the returned error code
134  *      @param[in] type the type of tethering
135  *      @param[in] is_requested whether tethering mode is enabled
136  *      @param[in] data the pointer to the user data
137  */
138 static void __enabled_cb(tethering_error_e error, tethering_type_e type, bool is_requested, void *data)
139 {
140         __FUNC_ENTER__;
141         struct ug_data *ugd = (struct ug_data *)data;
142         tethering_error_e ret = TETHERING_ERROR_NONE;
143         tethering_h th = NULL;
144         bool is_wifi_enabled = false;
145
146         if (error != TETHERING_ERROR_NONE) {
147                 if (is_requested != TRUE) {
148                         return;
149                 }
150
151                 DBG(LOG_ERROR, "error !!! TETHERING is not enabled.\n");
152                 return;
153         }
154
155         th = ugd->hotspot_handle;
156         if (th != NULL) {
157                 is_wifi_enabled = tethering_is_enabled(th, TETHERING_TYPE_WIFI);
158                 if (is_wifi_enabled) {
159                         DBG(LOG_INFO, "Mobile hotspot is activated\n");
160                 }
161
162                 /* Deregister cbs */
163                 ret = tethering_unset_enabled_cb(th, TETHERING_TYPE_WIFI);
164                 if (ret != TETHERING_ERROR_NONE) {
165                         DBG(LOG_ERROR, "tethering_unset_enabled_cb is failed(%d)\n", ret);
166                 }
167
168                 /* Destroy tethering handle */
169                 ret = tethering_destroy(th);
170                 if (ret != TETHERING_ERROR_NONE) {
171                         DBG(LOG_ERROR, "tethering_destroy is failed(%d)\n", ret);
172                 }
173
174                 ugd->hotspot_handle = NULL;
175         }
176
177         DBG(LOG_INFO, "TETHERING is enabled.\n");
178
179         __FUNC_EXIT__;
180         return;
181 }
182
183 /**
184  *      This function let the ug make a callback for setting tethering mode disabled
185  *      @return   void
186  *      @param[in] error the returned error code
187  *      @param[in] type the type of tethering
188  *      @param[in] code whether tethering mode is enabled
189  *      @param[in] data the pointer to the user data
190  */
191 static void __disabled_cb(tethering_error_e error, tethering_type_e type, tethering_disabled_cause_e code, void *data)
192 {
193         __FUNC_ENTER__;
194
195         struct ug_data *ugd = (struct ug_data *)data;
196         tethering_error_e ret = TETHERING_ERROR_NONE;
197         tethering_h th = NULL;
198         bool is_wifi_enabled = false;
199         bool is_wifi_ap_enabled = false;
200
201         if (error != TETHERING_ERROR_NONE) {
202                 if (code != TETHERING_DISABLED_BY_REQUEST) {
203                         return;
204                 }
205
206                 DBG(LOG_ERROR, "error !!! TETHERING is not disabled.\n");
207                 return;
208         }
209
210         th = ugd->hotspot_handle;
211         if (th != NULL) {
212                 is_wifi_enabled = tethering_is_enabled(th, TETHERING_TYPE_WIFI);
213                 is_wifi_ap_enabled = tethering_is_enabled(th, TETHERING_TYPE_RESERVED);
214                 if (is_wifi_enabled || is_wifi_ap_enabled) {
215                         DBG(LOG_ERROR, "error !!! TETHERING is not disabled.\n");
216                         DBG(LOG_ERROR, "is_wifi_enabled:%d is_wifi_ap_enabled:%d\n", is_wifi_enabled, is_wifi_ap_enabled);
217                         return;
218                 }
219
220                 DBG(LOG_INFO, "Mobile hotspot is deactivated\n");
221                 wfd_client_swtch_force(ugd, TRUE);
222
223                 ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_WIFI);
224                 if (ret != TETHERING_ERROR_NONE) {
225                         DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret);
226                 }
227
228                 ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_RESERVED);
229                 if (ret != TETHERING_ERROR_NONE) {
230                         DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret);
231                 }
232
233                 /* Destroy tethering handle */
234                 ret = tethering_destroy(th);
235                 if (ret != TETHERING_ERROR_NONE) {
236                         DBG(LOG_ERROR, "tethering_destroy is failed(%d)\n", ret);
237                 }
238
239                 ugd->hotspot_handle = NULL;
240         }
241
242         DBG(LOG_INFO, "TETHERING is disabled.\n");
243
244         __FUNC_EXIT__;
245         return;
246 }
247
248 /**
249  *      This function let the ug turn AP on
250  *      @return   If success, return 0, else return -1
251  *      @param[in] data the pointer to the main data structure
252  */
253 int wfd_mobile_ap_on(void *data)
254 {
255         __FUNC_ENTER__;
256         struct ug_data *ugd = (struct ug_data *)data;
257         tethering_error_e ret = TETHERING_ERROR_NONE;
258         WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
259
260         if (NULL == ugd->hotspot_handle) {
261                 ret = tethering_create(&(ugd->hotspot_handle));
262                 if (TETHERING_ERROR_NONE != ret) {
263                         DBG(LOG_ERROR, "Failed to tethering_create() [%d]\n", ret);
264                         ugd->hotspot_handle = NULL;
265                         return -1;
266                 }
267                 DBG(LOG_INFO, "Succeeded to tethering_create()\n");
268         }
269         /* Register cbs */
270         ret = tethering_set_enabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI, __enabled_cb, ugd);
271         if (ret != TETHERING_ERROR_NONE) {
272                 DBG(LOG_ERROR, "tethering_set_enabled_cb is failed\n", ret);
273                 return -1;
274         }
275
276         /* Enable tethering */
277         ret = tethering_enable(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
278         if (ret != TETHERING_ERROR_NONE) {
279                 DBG(LOG_ERROR, "Failed to turn on mobile hotspot. [%d]\n", ret);
280                 return -1;
281         } else {
282                 DBG(LOG_INFO, "Succeeded to turn on mobile hotspot\n");
283         }
284
285         ugd->is_hotspot_off = FALSE;
286
287         __FUNC_EXIT__;
288         return 0;
289 }
290
291 /**
292  *      This function let the ug turn AP off
293  *      @return   If success, return 0, else return -1
294  *      @param[in] data the pointer to the main data structure
295  */
296 int wfd_mobile_ap_off(void *data)
297 {
298         __FUNC_ENTER__;
299         struct ug_data *ugd = (struct ug_data *)data;
300         WFD_RETV_IF(ugd == NULL || ugd->hotspot_handle == NULL, -1, "Incorrect parameter(NULL)\n");
301         tethering_error_e ret = TETHERING_ERROR_NONE;
302         bool is_wifi_enabled = false;
303         bool is_wifi_ap_enabled = false;
304
305         is_wifi_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
306         is_wifi_ap_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
307
308         if (is_wifi_enabled) {
309                 /* Register cbs */
310                 ret = tethering_set_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI, __disabled_cb, ugd);
311                 if (ret != TETHERING_ERROR_NONE) {
312                         DBG(LOG_ERROR, "tethering_set_disabled_cb is failed\n", ret);
313                         return -1;
314                 }
315                 /* Disable tethering */
316                 ret = tethering_disable(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
317         } else if (is_wifi_ap_enabled) {
318                 ret = tethering_set_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_RESERVED, __disabled_cb, ugd);
319                 if (ret != TETHERING_ERROR_NONE) {
320                         DBG(LOG_ERROR, "tethering_set_disabled_cb is failed\n", ret);
321                         return -1;
322                 }
323                 ret = tethering_disable(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
324         }
325
326         if (ret != TETHERING_ERROR_NONE) {
327                 DBG(LOG_ERROR, "Failed to turn off mobile hotspot. [%d]\n", ret);
328                 return -1;
329         } else {
330                 DBG(LOG_INFO, "Succeeded to turn off mobile hotspot\n");
331         }
332
333         ugd->is_hotspot_off = TRUE;
334
335         __FUNC_EXIT__;
336         return 0;
337 }
338
339 void wfd_client_free_raw_discovered_peers(struct ug_data *ugd)
340 {
341         __FUNC_ENTER__;
342         WFD_RET_IF(ugd->raw_discovered_peer_list == NULL, "Incorrect parameter(NULL)\n");
343
344         g_list_free(ugd->raw_discovered_peer_list);
345         ugd->raw_discovered_peer_list = NULL;
346
347         __FUNC_EXIT__;
348 }
349
350 /**
351  *      This function let the ug find the peer by mac address
352  *      @return   the found peer
353  *      @param[in] data the pointer to the main data structure
354  *      @param[in] mac_addr the pointer to mac address
355  */
356 static device_type_s *wfd_client_find_peer_by_mac(void *data, const char *mac_addr)
357 {
358         __FUNC_ENTER__;
359         struct ug_data *ugd = (struct ug_data *)data;
360         wifi_direct_discovered_peer_info_s *peer_info = NULL;
361         GList *iterator = NULL;
362         int i;
363         WFD_RETV_IF(ugd == NULL, NULL, "Incorrect parameter(NULL)\n");
364
365         if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
366                 for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
367                         if (!strncmp(mac_addr, (const char *)ugd->raw_multi_selected_peers[i].mac_addr, MAC_LENGTH)) {
368                                 return &ugd->raw_multi_selected_peers[i];
369                         }
370                 }
371         } else {
372                 for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
373                         if (!strncmp(mac_addr, ((device_type_s *)iterator->data)->mac_addr, MAC_LENGTH)) {
374                                 return (device_type_s *)iterator->data;
375                         }
376                 }
377         }
378
379         /*
380          * In case, device is not in raw discovered list, then get peer info.
381          * There could be situation in which device is not yet discovered and
382          * connected process started.
383          */
384         if (WIFI_DIRECT_ERROR_NONE != wifi_direct_get_peer_info((char *)mac_addr, &peer_info) ||
385                 NULL == peer_info) {
386                 DBG(LOG_ERROR, "Peer Not Found !!!");
387                 return NULL;
388         }
389
390         /* Update peer list */
391         DBG(LOG_INFO, "Update Peer info");
392         _wfd_discoverd_peer_cb(peer_info, (void *)ugd);
393
394         /* Get the device from peer list */
395         for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
396                 if (!strncmp(mac_addr, ((device_type_s *)iterator->data)->mac_addr, MAC_LENGTH)) {
397                         return (device_type_s *)iterator->data;
398                 }
399         }
400
401         __FUNC_EXIT__;
402         return NULL;
403 }
404
405 /**
406  *      This function let the ug make a callback for registering activation event
407  *      @return   void
408  *      @param[in] error_code the returned error code
409  *      @param[in] device_state the state of device
410  *      @param[in] user_data the pointer to the main data structure
411  */
412 void _activation_cb(int error_code, wifi_direct_device_state_e device_state, void *user_data)
413 {
414         __FUNC_ENTER__;
415         int res = -1;
416         struct ug_data *ugd = (struct ug_data *)user_data;
417         wfd_refresh_wifi_direct_state(ugd);
418
419         switch (device_state) {
420         case WIFI_DIRECT_DEVICE_STATE_ACTIVATED:
421                 DBG(LOG_INFO, "WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n");
422                 if(ugd->scan_toolbar == NULL) {
423                         scan_button_create(ugd);
424                 }
425                 if (error_code != WIFI_DIRECT_ERROR_NONE) {
426                         DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code);
427                         if (WIFI_DIRECT_ERROR_AUTH_FAILED == error_code) {
428                                 wfd_ug_warn_popup(ugd, _("IDS_COM_POP_SECURITY_POLICY_RESTRICTS_USE_OF_WI_FI"), POPUP_TYPE_ACTIVATE_FAIL_POLICY_RESTRICTS);
429                         } else {
430                                 wfd_ug_warn_popup(ugd, _("IDS_COM_POP_FAILED"), POPUP_TYPE_ACTIVATE_FAIL);
431                         }
432
433 #ifdef WFD_ON_OFF_GENLIST
434                         ugd->wfd_onoff = 0;
435                         wfd_ug_refresh_on_off_check(ugd);
436 #endif
437                         return;
438                 }
439
440                 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
441 #ifdef WFD_ON_OFF_GENLIST
442                 ugd->wfd_onoff = 1;
443                 wfd_ug_refresh_on_off_check(ugd);
444 #endif
445                 wfg_ug_act_popup_remove(ugd);
446
447                 if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_BACKGROUND) {
448                         DBG(LOG_INFO, "Background mode\n");
449                         return;
450                 }
451
452 #ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
453                 res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
454                 if (res == -1) {
455                         DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n");
456                 }
457 #endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
458
459                 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
460                 res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
461                 if (res != WIFI_DIRECT_ERROR_NONE) {
462                         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
463                         DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
464                         wifi_direct_cancel_discovery();
465                 }
466
467                 break;
468         case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED:
469                 DBG(LOG_INFO, "WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n");
470                 if (error_code != WIFI_DIRECT_ERROR_NONE) {
471                         DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code);
472                         wfd_ug_warn_popup(ugd, _("IDS_WIFI_POP_DEACTIVATION_FAILED"), POPUP_TYPE_DEACTIVATE_FAIL);
473 #ifdef WFD_ON_OFF_GENLIST
474                         ugd->wfd_onoff = 1;
475                         wfd_ug_refresh_on_off_check(ugd);
476 #endif
477                         return;
478                 }
479
480                 WFD_IF_DEL_ITEM(ugd->multi_connect_toolbar_item);
481
482                 if (ugd->ctxpopup) {
483                         ctxpopup_dismissed_cb(ugd, NULL, NULL);
484                 }
485
486                 /*
487                  * When multi-connect is on ongoing and deactivte happened destroy
488                  * disconnect button.
489                  */
490                 if (ugd->disconnect_btn) {
491                         Evas_Object *content;
492                         content = elm_object_part_content_unset(ugd->layout, "button.next");
493                         WFD_IF_DEL_OBJ(content);
494                         ugd->disconnect_btn = NULL;
495                         elm_object_part_content_set(ugd->layout, "button.big",
496                         ugd->scan_toolbar);
497                 }
498
499                 /* When connect is on ongoing and deactivte happened refresh scan */
500                 if (ugd->scan_toolbar) {
501                         wfd_ug_view_refresh_button(ugd->scan_toolbar,
502                                 "IDS_WIFI_SK4_SCAN", FALSE);
503                 }
504                 /* Delete pop-up when deactivate happens */
505                 WFD_IF_DEL_OBJ(ugd->act_popup);
506                 /* Remove timeout handlers */
507                 if (ugd->timer_stop_progress_bar > 0)
508                         g_source_remove(ugd->timer_stop_progress_bar);
509
510                 if (ugd->timer_delete_not_alive_peer > 0)
511                         g_source_remove(ugd->timer_delete_not_alive_peer);
512
513                 if (ugd->g_source_multi_connect_next > 0)
514                         g_source_remove(ugd->g_source_multi_connect_next);
515
516                 if (ugd->timer_multi_reset > 0)
517                         g_source_remove(ugd->timer_multi_reset);
518
519                 /* Delete warn popups for Airplane mode */
520                 if (NULL != ugd->warn_popup) {
521                         evas_object_del( ugd->warn_popup);
522                         ugd->warn_popup = NULL;
523                 }
524
525 #ifdef WFD_ON_OFF_GENLIST
526                 ugd->wfd_onoff = 0;
527                 wfd_ug_refresh_on_off_check(ugd);
528 #endif
529                 /*
530                 * when deactivated, clear all the
531                 *  discovered peers and connected peers
532                 */
533                 wfd_client_free_raw_discovered_peers(ugd);
534                 if (ugd->raw_connected_peer_cnt > 0) {
535                         memset(ugd->raw_connected_peers, 0x00, ugd->raw_connected_peer_cnt*sizeof(device_type_s));
536                 }
537
538                 ugd->raw_discovered_peer_cnt = 0;
539                 ugd->raw_connected_peer_cnt = 0;
540
541                 wfd_free_nodivice_item(ugd);
542                 wfd_ug_view_init_genlist(ugd, true);
543
544                 if (ugd->multi_navi_item != NULL) {
545                         elm_naviframe_item_pop(ugd->naviframe);
546                 }
547
548                 if (TRUE == ugd->is_hotspot_off && TRUE == ugd->is_hotspot_locally_disabled) {
549                         if (0 == wfd_mobile_ap_on(ugd)) {
550                                 ugd->is_hotspot_locally_disabled = FALSE;
551                         }
552                 }
553
554                 if(ugd->scan_toolbar) {
555                         evas_object_del(ugd->scan_toolbar);
556                         ugd->scan_toolbar = NULL;
557                 }
558                 break;
559         default:
560                 break;
561         }
562
563         /*if (ugd->scan_toolbar) {
564                 wfd_ug_view_refresh_button(ugd->scan_toolbar, _("IDS_WIFI_SK4_SCAN"), TRUE);
565         }*/
566
567         if (ugd->multiconn_scan_stop_btn) {
568                 wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", TRUE);
569         }
570
571         if (ugd->back_btn) {
572                 elm_object_disabled_set(ugd->back_btn, FALSE);
573         }
574
575         __FUNC_EXIT__;
576         return;
577 }
578
579 /**
580  *      This function let the ug make a callback for discovering peer
581  *      @return   TRUE
582  *      @param[in] peer the pointer to the discovered peer
583  *      @param[in] user_data the pointer to the main data structure
584  */
585 bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s *peer, void *user_data)
586 {
587         __FUNC_ENTER__;
588         WFD_RETV_IF(NULL == peer || NULL == user_data, FALSE, "Incorrect parameter(NULL)\n");
589
590         struct ug_data *ugd = (struct ug_data *)user_data;
591         int peer_cnt = ugd->raw_discovered_peer_cnt;
592         device_type_s *peer_tmp = g_new(device_type_s, 1);
593         int i;
594
595         DBG_SECURE(LOG_INFO, "%dth discovered peer. [%s] ["MACSECSTR"]\n", peer_cnt,
596                 peer->device_name, MAC2SECSTR(peer->mac_address));
597
598         if (ugd->device_filter < 0 || peer->primary_device_type == ugd->device_filter) {
599                 strncpy(peer_tmp->ssid, peer->device_name, sizeof(peer_tmp->ssid) - 1);
600                 peer_tmp->ssid[SSID_LENGTH - 1] = '\0';
601                 peer_tmp->category = peer->primary_device_type;
602                 peer_tmp->sub_category = peer->secondary_device_type;
603                 strncpy(peer_tmp->mac_addr, peer->mac_address, MAC_LENGTH - 1);
604                 peer_tmp->mac_addr[MAC_LENGTH - 1] = '\0';
605                 strncpy(peer_tmp->if_addr, peer->interface_address, MAC_LENGTH - 1);
606                 peer_tmp->if_addr[MAC_LENGTH - 1] = '\0';
607                 peer_tmp->is_group_owner = peer->is_group_owner;
608                 peer_tmp->is_persistent_group_owner = peer->is_persistent_group_owner;
609                 peer_tmp->is_connected = peer->is_connected;
610                 peer_tmp->dev_sel_state = FALSE;
611
612                 if (TRUE == peer->is_connected) {
613                         peer_tmp->conn_status = PEER_CONN_STATUS_CONNECTED;
614                 } else {
615                         peer_tmp->conn_status = PEER_CONN_STATUS_DISCONNECTED;
616                 }
617
618                 ugd->raw_discovered_peer_list = g_list_append(ugd->raw_discovered_peer_list, peer_tmp);
619                 DBG(LOG_INFO, "\tSSID: [%s]\n", peer_tmp->ssid);
620                 DBG(LOG_INFO, "\tPeer category [%d] -> [%d]\n", peer->primary_device_type, peer_tmp->category);
621                 DBG(LOG_INFO, "\tStatus: [%d]\n", peer_tmp->conn_status);
622                 DBG(LOG_INFO, "\tservice_count: [%d]\n", peer->service_count);
623                 ugd->raw_discovered_peer_cnt++;
624         } else {
625                 DBG(LOG_INFO, "Unavailable WiFi-Direct Device\n");
626         }
627
628         WFD_IF_FREE_MEM(peer->device_name);
629         WFD_IF_FREE_MEM(peer->mac_address);
630         WFD_IF_FREE_MEM(peer->interface_address);
631
632         if (NULL != peer->service_list)
633         {
634                 for (i=0; i<peer->service_count && peer->service_list[i] != NULL; i++) {
635                         free(peer->service_list[i]);
636                 }
637                 WFD_IF_FREE_MEM(peer->service_list);
638         }
639
640         WFD_IF_FREE_MEM(peer);
641
642         __FUNC_EXIT__;
643         return TRUE;
644 }
645
646 /**
647  *      This function let the ug make a callback for connected peer
648  *      @return   TRUE
649  *      @param[in] peer the pointer to the connected peer
650  *      @param[in] user_data the pointer to the main data structure
651  */
652 bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_data)
653 {
654         __FUNC_ENTER__;
655         WFD_RETV_IF(NULL == peer || NULL == user_data, FALSE, "Incorrect parameter(NULL)\n");
656
657         struct ug_data *ugd = (struct ug_data *)user_data;
658         int peer_cnt = ugd->raw_connected_peer_cnt;
659         int i;
660
661         DBG_SECURE(LOG_INFO, "%dth connected peer. [%s] ["MACSECSTR"]\n", peer_cnt,
662                 peer->device_name, MAC2SECSTR(peer->mac_address));
663
664         /*
665         * check wether ug needs to exit
666         * automatically after successed connection
667         */
668
669         char services[256] = {0,};
670         DBG(LOG_INFO, "\tservice_count: [%d]\n", peer->service_count);
671         if (peer->service_count>0) {
672                 unsigned int len = 0;
673                 for (i=0; i<peer->service_count && peer->service_list != NULL; i++) {
674                         snprintf(services + len, 256-len, "%s ", peer->service_list[i]);
675                         len = len + strlen(peer->service_list[i]) + 1;
676                 }
677                 DBG(LOG_INFO, "\tServices: [%s]\n", services);
678         }
679
680         strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->device_name, sizeof(ugd->raw_connected_peers[peer_cnt].ssid) - 1);
681         ugd->raw_connected_peers[peer_cnt].category = peer->primary_device_type;
682         ugd->raw_connected_peers[peer_cnt].sub_category = peer->secondary_device_type;
683         strncpy(ugd->raw_connected_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH - 1);
684         strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH - 1);
685         ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
686
687         DBG(LOG_INFO, "\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status);
688         DBG(LOG_INFO, "\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category);
689         DBG(LOG_INFO, "\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid);
690
691         ugd->raw_connected_peer_cnt++;
692
693         int error = -1;
694         bool is_group_owner = FALSE;
695         error = wifi_direct_is_group_owner(&is_group_owner);
696         if (error != WIFI_DIRECT_ERROR_NONE) {
697                 DBG(LOG_ERROR, "Fail to get group_owner_state. ret=[%d]", error);
698                 return FALSE;
699         }
700
701         if (FALSE == is_group_owner) {
702                 /* to send ip_addr*/
703                 int ret = -1;
704                 app_control_h control = NULL;
705                 ret = app_control_create(&control);
706                 if (ret) {
707                         DBG(LOG_ERROR, "Failed to create control");
708                         return FALSE;
709                 }
710
711                 if(peer->ip_address != NULL && strlen(services) != 0 ) {
712                         app_control_add_extra_data(control, "ip_address", peer->ip_address);
713                         app_control_add_extra_data(control, "wfds", services);
714                         ug_send_result(ugd->ug, control);
715                 }
716                 app_control_destroy(control);
717         }
718
719         WFD_IF_FREE_MEM(peer->device_name);
720         WFD_IF_FREE_MEM(peer->mac_address);
721         WFD_IF_FREE_MEM(peer->interface_address);
722
723         if (NULL != peer->service_list)
724         {
725                 for (i=0; i<peer->service_count && peer->service_list[i] != NULL; i++) {
726                         free(peer->service_list[i]);
727                 }
728                 WFD_IF_FREE_MEM(peer->service_list);
729         }
730
731         WFD_IF_FREE_MEM(peer);
732
733         __FUNC_EXIT__;
734         return TRUE;
735 }
736
737 /**
738  *      This function let the ug get the found peers
739  *      @return   If success, return 0, else return -1
740  *      @param[in] ugd the pointer to the main data structure
741  */
742 int wfd_ug_get_discovered_peers(struct ug_data *ugd)
743 {
744         __FUNC_ENTER__;
745         int res = 0;
746         WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
747
748         ugd->raw_discovered_peer_cnt = 0;
749         wfd_client_free_raw_discovered_peers(ugd);
750         res = wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, (void *)ugd);
751         if (res != WIFI_DIRECT_ERROR_NONE) {
752                 ugd->raw_discovered_peer_cnt = 0;
753                 DBG(LOG_ERROR, "Get discovery result failed: %d\n", res);
754         }
755
756         __FUNC_EXIT__;
757         return 0;
758 }
759
760 /**
761  *      This function let the ug get the connecting peer
762  *      @return   If success, return 0, else return -1
763  *      @param[in] ugd the pointer to the main data structure
764  */
765 int wfd_ug_get_connecting_peer(struct ug_data *ugd)
766 {
767         __FUNC_ENTER__;
768         int res = 0;
769         WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
770         char *mac_addr = NULL;
771         GList *iterator = NULL;
772
773         ugd->mac_addr_connecting = NULL;
774         res = wifi_direct_get_connecting_peer(&mac_addr);
775         if (res != WIFI_DIRECT_ERROR_NONE) {
776                 DBG(LOG_ERROR, "Get connecting device mac failed: %d\n", res);
777                 return -1;
778         }
779         DBG_SECURE(LOG_INFO, "Mac Addr Connecting: ["MACSECSTR"]\n",
780                 MAC2SECSTR(mac_addr));
781         ugd->mac_addr_connecting = mac_addr;
782
783         for (iterator = ugd->raw_discovered_peer_list; iterator; iterator = iterator->next) {
784                 if (!strncmp(mac_addr, ((device_type_s *)iterator->data)->mac_addr, MAC_LENGTH)) {
785                         ((device_type_s *)iterator->data)->conn_status = PEER_CONN_STATUS_CONNECTING;
786                 }
787         }
788
789
790         __FUNC_EXIT__;
791         return 0;
792 }
793
794
795 /**
796  *      This function let the ug get the connected peers
797  *      @return   If success, return 0, else return -1
798  *      @param[in] ugd the pointer to the main data structure
799  */
800 int wfd_ug_get_connected_peers(struct ug_data *ugd)
801 {
802         __FUNC_ENTER__;
803         int res = 0;
804         WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
805
806         ugd->raw_connected_peer_cnt = 0;
807         res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void *)ugd);
808         if (res != WIFI_DIRECT_ERROR_NONE) {
809                 ugd->raw_connected_peer_cnt = 0;
810                 DBG(LOG_ERROR, "Get connected peer failed: %d\n", res);
811         }
812
813         __FUNC_EXIT__;
814         return 0;
815 }
816
817 /**
818  *      This function let the ug exits automatically after successed connection
819  *      @return   void
820  *      @param[in] user_data the pointer to the main data structure
821  */
822 void _wfd_ug_auto_exit(void *user_data)
823 {
824         __FUNC_ENTER__;
825         struct ug_data *ugd = (struct ug_data *)user_data;
826         WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
827
828         deinit_wfd_client(ugd);
829         wfd_destroy_ug(ugd);
830
831         __FUNC_EXIT__;
832 }
833
834 gboolean wfd_delete_not_alive_peer_cb(void *user_data)
835 {
836         __FUNC_ENTER__;
837         struct ug_data *ugd = (struct ug_data *)user_data;
838         WFD_RETV_IF(ugd == NULL, FALSE, "Incorrect parameter(NULL)\n");
839
840         delete_not_alive_peers(ugd, &ugd->gl_avlb_peers_start, &ugd->gl_available_peer_cnt);
841         delete_not_alive_peers(ugd, &ugd->gl_busy_peers_start, &ugd->gl_busy_peer_cnt);
842         delete_not_alive_peers(ugd, &ugd->multi_conn_dev_list_start, &ugd->gl_available_dev_cnt_at_multiconn_view);
843         wfd_ug_view_init_genlist(ugd, false);
844         wfd_update_multiconnect_device(ugd, false);
845         __FUNC_EXIT__;
846         return FALSE;
847 }
848
849
850 gboolean wfd_delete_progressbar_cb(void *user_data)
851 {
852         __FUNC_ENTER__;
853         struct ug_data *ugd = (struct ug_data *)user_data;
854         WFD_RETV_IF(ugd == NULL, FALSE, "Incorrect parameter(NULL)\n");
855
856         ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
857         if (ugd->raw_discovered_peer_cnt == 0 &&
858                 ugd->nodevice_title_item == NULL &&
859                 ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE &&
860                 ugd->gl_available_peer_cnt == 0) {
861                         _create_no_device_genlist(ugd);
862         };
863
864         wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
865         wfd_ug_view_refresh_glitem(ugd->avlbl_wfd_item);
866
867         if (0 == ugd->gl_available_dev_cnt_at_multiconn_view) {
868                 _create_no_device_multiconnect_genlist(ugd);
869         }
870
871         wfd_refresh_wifi_direct_state(ugd);
872         if (WIFI_DIRECT_STATE_CONNECTING != ugd->wfd_status &&
873                 WIFI_DIRECT_STATE_DISCONNECTING != ugd->wfd_status) {
874                 if (ugd->scan_toolbar) {
875                         wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", TRUE);
876                         evas_object_data_set(ugd->toolbar, "scan", "scan");
877                 }
878
879                 if (ugd->multiconn_layout) {
880                         wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", TRUE);
881                         DBG(LOG_INFO, "Multiconn button text IDS_WIFI_SK4_SCAN \n");
882
883                 }
884         }
885
886         __FUNC_EXIT__;
887         return FALSE;
888 }
889
890 /**
891  *      This function let the ug make a callback for registering discover event
892  *      @return   void
893  *      @param[in] error_code the returned error code
894  *      @param[in] discovery_state the state of discover
895  *      @param[in] user_data the pointer to the main data structure
896  */
897 void discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data)
898 {
899         __FUNC_ENTER__;
900         int ret;
901         struct ug_data *ugd = (struct ug_data *)user_data;
902
903         if (ugd == NULL) {
904                 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
905                 return;
906         }
907
908         if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
909                 return;
910         }
911
912         DBG(LOG_INFO, "Discovery event [%d], error_code [%d]\n", discovery_state, error_code);
913
914         if (discovery_state == WIFI_DIRECT_DISCOVERY_STARTED) {
915                 if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START) {
916                         ugd->title_content_mode = TITLE_CONTENT_TYPE_SCANNING;
917                         wfd_cancel_progressbar_stop_timer(ugd);
918                         ugd->timer_stop_progress_bar = g_timeout_add(1000*30, wfd_delete_progressbar_cb, ugd);
919                         /* clear all the previous discovered peers */
920                         wfd_client_free_raw_discovered_peers(ugd);
921
922                         ugd->raw_discovered_peer_cnt = 0;
923                         wfd_ug_view_init_genlist(ugd, false);
924
925                         if (ugd->avlbl_wfd_item == NULL) {
926                                 _create_available_dev_genlist(ugd);
927                         }
928
929                         wfd_ug_view_refresh_glitem(ugd->mcview_title_item);
930                         /* clear not alive peers after 5 secs */
931                         wfd_cancel_not_alive_delete_timer(ugd);
932                         ugd->timer_delete_not_alive_peer = g_timeout_add(1000*5, wfd_delete_not_alive_peer_cb, ugd);
933                         set_not_alive_peers(ugd->gl_avlb_peers_start);
934                         set_not_alive_peers(ugd->gl_busy_peers_start);
935                         set_not_alive_peers(ugd->multi_conn_dev_list_start);
936                 }
937         } else if (discovery_state == WIFI_DIRECT_DISCOVERY_FOUND) {
938                 if (ugd->wfd_discovery_status != WIFI_DIRECT_DISCOVERY_NONE) {
939                         wfd_ug_get_discovered_peers(ugd);
940                         wfd_ug_update_available_peers(ugd);
941                         wfd_update_multiconnect_device(ugd, false);
942                 }
943         } else if (discovery_state == WIFI_DIRECT_DISCOVERY_FINISHED) {
944                 if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START) {
945                         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_FULL_SCAN_START;
946                         ret = wifi_direct_start_discovery_specific_channel(false, 0, WIFI_DIRECT_DISCOVERY_FULL_SCAN);
947                         if (ret != WIFI_DIRECT_ERROR_NONE) {
948                                 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
949                                 DBG(LOG_ERROR, "Failed to start discovery with full scan. [%d]\n", ret);
950                                 wifi_direct_cancel_discovery();
951                         }
952                 }
953         }
954
955         if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state &&
956                 ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START) {
957                 WFD_IF_DEL_ITEM(ugd->multi_connect_toolbar_item);
958                 if (!ugd->conn_wfd_item) {
959                         elm_object_part_content_set(ugd->layout, "button.big", ugd->scan_toolbar);
960                 }
961                 wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK_STOP", TRUE);
962                 if (ugd->multiconn_scan_stop_btn) {
963                         wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK_STOP", TRUE);
964                 }
965         }
966
967         __FUNC_EXIT__;
968         return;
969 }
970
971 /**
972  *      This function let the ug make a callback for registering connection event
973  *      @return   void
974  *      @param[in] error_code the returned error code
975  *      @param[in] connection_state the state of connection
976  *      @param[in] mac_address the mac address of peer
977  *      @param[in] user_data the pointer to the main data structure
978  */
979 void _connection_cb(int error_code, wifi_direct_connection_state_e connection_state, const char *mac_address, void *user_data)
980 {
981         __FUNC_ENTER__;
982         struct ug_data *ugd = (struct ug_data *)user_data;
983         device_type_s *peer = NULL;
984         bool owner = FALSE;
985         int res = 0;
986
987         if (mac_address == NULL) {
988                 DBG(LOG_ERROR, "Incorrect parameter(peer mac is NULL)\n");
989                 return;
990         }
991
992         DBG_SECURE(LOG_INFO, "Connection event [%d], error_code [%d], multi_connect_mode [%d] mac ["MACSECSTR"]\n",
993                 connection_state, error_code, ugd->multi_connect_mode, MAC2SECSTR(mac_address));
994
995         /* when not in connection, mac_address is empty */
996         if (connection_state <= WIFI_DIRECT_DISASSOCIATION_IND) {
997                 peer = wfd_client_find_peer_by_mac(ugd, mac_address);
998
999                 if (NULL == peer || '\0' == peer->ssid[0]) {
1000                         DBG(LOG_ERROR, "invalid peer from connection !!\n");
1001                         ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
1002                         goto refresh_button;
1003                 }
1004         }
1005
1006         if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
1007                 switch (connection_state) {
1008                 case WIFI_DIRECT_CONNECTION_RSP:
1009                         DBG(LOG_INFO, "MULTI: WIFI_DIRECT_CONNECTION_RSP\n");
1010                         ugd->mac_addr_connecting = NULL;
1011                         if (error_code == WIFI_DIRECT_ERROR_NONE) {
1012                                 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
1013                                 wfd_ug_get_connected_peers(ugd);
1014                                 wfd_ug_update_connected_peers(ugd);
1015                         } else {
1016                                 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
1017                                 peer = find_peer_in_glist(ugd->gl_mul_conn_peers_start, peer->mac_addr);
1018                                 if ( peer != NULL) {
1019                                         peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
1020                                         wfd_ug_view_refresh_glitem(peer->gl_item);
1021                                 }
1022                         }
1023                         /* connect the next peer */
1024                         ugd->g_source_multi_connect_next = g_timeout_add(500, wfd_multi_connect_next_cb, ugd);
1025                         break;
1026                 case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
1027                         DBG(LOG_INFO, "MULTI: WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
1028                         peer->conn_status = PEER_CONN_STATUS_CONNECTING;
1029                         peer = find_peer_in_glist(ugd->gl_mul_conn_peers_start, peer->mac_addr);
1030
1031                         if ( peer != NULL) {
1032                                 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
1033                                 wfd_ug_view_refresh_glitem(peer->gl_item);
1034                         }
1035
1036                         wfd_ug_update_toolbar(ugd);
1037                         break;
1038                 case WIFI_DIRECT_GROUP_CREATED:
1039                         DBG(LOG_INFO, "MULTI: WIFI_DIRECT_GROUP_CREATED\n");
1040                         wfd_cancel_progressbar_stop_timer(ugd);
1041                         wfd_delete_progressbar_cb(ugd);
1042
1043                         wfd_ug_view_init_genlist(ugd, true);
1044                         wfd_ug_view_update_multiconn_peers(ugd);
1045                         wfd_multi_connect_next_cb(ugd);
1046                         break;
1047                 default:
1048                         break;
1049                 }
1050         } else {
1051                 switch (connection_state) {
1052                 case WIFI_DIRECT_CONNECTION_RSP:
1053                         DBG(LOG_INFO, "WIFI_DIRECT_CONNECTION_RSP\n");
1054                         wfd_delete_progressbar_cb(ugd);
1055
1056                         if (ugd->act_popup) {
1057                                 evas_object_del(ugd->act_popup);
1058                                 ugd->act_popup = NULL;
1059                         }
1060                         ugd->mac_addr_connecting = NULL;
1061
1062                         if (error_code == WIFI_DIRECT_ERROR_NONE) {
1063                                 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
1064                                 wfd_ug_get_connected_peers(ugd);
1065
1066                                 /* when auto_exit and not multi-connect*/
1067                                 if ((ugd->is_auto_exit)&&(ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE)) {
1068                                         _wfd_ug_auto_exit(ugd);
1069                                 }
1070
1071                                 wfd_ug_update_connected_peers(ugd);
1072                         } else {
1073                                 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
1074                                 wfd_ug_update_failed_peers(ugd);
1075                         }
1076
1077                         wfd_ug_update_toolbar(ugd);
1078                         break;
1079                 case WIFI_DIRECT_DISASSOCIATION_IND:
1080                         DBG(LOG_INFO, "WIFI_DIRECT_DISASSOCIATION_IND\n");
1081                         /* remove any possible popup */
1082                         WFD_IF_DEL_OBJ(ugd->act_popup);
1083                         wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", TRUE);
1084
1085                         /* change the multi connection mode, it can be connected now */
1086                         if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) {
1087                                 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
1088                         }
1089
1090                         /* if other peer disconnected, get connected peers and update */
1091                         peer->conn_status = PEER_CONN_STATUS_DISCONNECTED;
1092                         wfd_ug_get_connected_peers(ugd);
1093                         wfd_ug_update_available_peers(ugd);
1094                         break;
1095                 case WIFI_DIRECT_DISCONNECTION_RSP:
1096                 case WIFI_DIRECT_DISCONNECTION_IND:
1097                         DBG(LOG_INFO, "WIFI_DIRECT_DISCONNECTION_X\n");
1098                         WFD_IF_DEL_OBJ(ugd->act_popup);
1099
1100                         Evas_Object *content;
1101                         content = elm_object_part_content_unset(ugd->layout, "button.next");
1102                         WFD_IF_DEL_OBJ(content);
1103                         /* when disconnection, clear all the connected peers */
1104                         if (ugd->raw_connected_peer_cnt > 0) {
1105                                 memset(ugd->raw_connected_peers, 0x00, ugd->raw_connected_peer_cnt*sizeof(device_type_s));
1106                         }
1107
1108                         ugd->raw_connected_peer_cnt = 0;
1109                         wfd_ug_view_init_genlist(ugd, true);
1110                         if (ugd->wfd_discovery_status == WIFI_DIRECT_DISCOVERY_BACKGROUND) {
1111                                 DBG(LOG_INFO, "Background mode\n");
1112                                 break;
1113                         }
1114
1115                         if (ugd->is_paused == false) {
1116                                 /* start discovery again */
1117                                 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
1118                                 res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
1119                                 if (res != WIFI_DIRECT_ERROR_NONE) {
1120                                         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
1121                                         DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
1122                                         wifi_direct_cancel_discovery();
1123                                 }
1124                         }
1125
1126                         break;
1127                 case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
1128                         DBG(LOG_INFO, "WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
1129                         wfd_ug_update_toolbar(ugd);
1130                         wfd_cancel_progressbar_stop_timer(ugd);
1131                         wfd_delete_progressbar_cb(ugd);
1132
1133                         if (ugd->multi_navi_item) {
1134                                 elm_naviframe_item_pop(ugd->naviframe);
1135                         }
1136
1137                         ugd->mac_addr_connecting = peer->mac_addr;
1138                         ugd->is_conn_incoming = FALSE;
1139                         peer->conn_status = PEER_CONN_STATUS_CONNECTING;
1140                         peer = find_peer_in_glist(ugd->gl_avlb_peers_start, peer->mac_addr);
1141                         if (peer != NULL) {
1142                                 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
1143                                 wfd_ug_view_refresh_glitem(peer->gl_item);
1144                         } else {
1145                                 wfd_ug_get_discovered_peers(ugd);
1146                                 wfd_ug_update_available_peers(ugd);
1147                         }
1148
1149                         break;
1150                 case WIFI_DIRECT_CONNECTION_REQ:
1151                 case WIFI_DIRECT_CONNECTION_WPS_REQ:
1152                         ugd->mac_addr_connecting = peer->mac_addr;
1153                         ugd->is_conn_incoming = TRUE;
1154                         DBG(LOG_INFO, "WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ\n");
1155                         break;
1156                 case WIFI_DIRECT_GROUP_DESTROYED:
1157                         wfd_ug_update_toolbar(ugd);
1158                         if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) {
1159                                 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_NONE;
1160                         } else {
1161                                 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
1162                                 res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
1163                                 if (res != WIFI_DIRECT_ERROR_NONE) {
1164                                         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
1165                                         DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
1166                                         wifi_direct_cancel_discovery();
1167                                 }
1168                         }
1169
1170                         break;
1171                 default:
1172                         break;
1173                 }
1174         }
1175
1176 refresh_button:
1177         /* refresh the scan button */
1178         wfd_refresh_wifi_direct_state(ugd);
1179         if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status ||
1180                 WIFI_DIRECT_STATE_DISCONNECTING == ugd->wfd_status) {
1181                 res = wifi_direct_is_group_owner(&owner);
1182                 if (res == WIFI_DIRECT_ERROR_NONE) {
1183                         if (!owner) {
1184                                 if (ugd->scan_toolbar) {
1185                                         evas_object_data_set(ugd->toolbar, "scan", "scan");
1186                                 }
1187
1188                                 if (ugd->multiconn_scan_stop_btn) {
1189                                         wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
1190                                 }
1191                         }
1192                 } else {
1193                     DBG(LOG_ERROR, "Failed to get whether client is group owner. [%d]\n", res);
1194                 }
1195         } else {
1196                 if (ugd->scan_toolbar) {
1197                         evas_object_data_set(ugd->toolbar, "scan", "scan");
1198                 }
1199
1200                 if (ugd->multiconn_scan_stop_btn) {
1201                         wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", TRUE);
1202                 }
1203         }
1204
1205         __FUNC_EXIT__;
1206         return;
1207 }
1208
1209 /**
1210  *      This function let the ug make a callback for registering ip assigned event
1211  *      @return   void
1212  *      @param[in] mac_address the mac address of peer
1213  *      @param[in] ip_address the ip address of peer
1214  *      @param[in] interface_address the interface address
1215  *      @param[in] user_data the pointer to the main data structure
1216  */
1217 void _ip_assigned_cb(const char *mac_address, const char *ip_address, const char *interface_address, void *user_data)
1218 {
1219         __FUNC_ENTER__;
1220
1221         if (!user_data) {
1222                 DBG(LOG_ERROR, "The user_data is NULL\n");
1223                 return;
1224         }
1225
1226         struct ug_data *ugd = (struct ug_data *)user_data;
1227
1228         if (!ip_address || 0 == strncmp(ip_address, "0.0.0.0", 7)) {
1229                 DBG(LOG_ERROR,"ip address is invalid.\n");
1230                 return;
1231         }
1232
1233         ugd->peer_ip_address = strdup(ip_address);
1234
1235
1236         /* to send ip_addr*/
1237         int ret = -1;
1238         app_control_h control = NULL;
1239         ret = app_control_create(&control);
1240         if (ret) {
1241                 DBG(LOG_ERROR, "Failed to create control");
1242                 return;
1243         }
1244         app_control_add_extra_data(control, "ip_address", ugd->peer_ip_address);
1245         app_control_add_extra_data(control, "wfds", ugd->service_name);
1246         ug_send_result(ugd->ug, control);
1247         app_control_destroy(control);
1248
1249         /* when auto_exit and not multi-connect*/
1250         if ((ugd->is_auto_exit)&&(ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_NONE)) {
1251                 _wfd_ug_auto_exit(ugd);
1252         }
1253
1254         __FUNC_EXIT__;
1255 }
1256
1257 /**
1258  *      This function let the ug get wi-fi direct status from vconf
1259  *      @return   If success, return the wfd status, else return -1
1260  *      @param[in] void
1261  */
1262 int wfd_get_vconf_status()
1263 {
1264         __FUNC_ENTER__;
1265         int wifi_direct_state = 0;
1266
1267         /* get wifi direct status from vconf */
1268         if (vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state) < 0) {
1269                 DBG(LOG_ERROR, "Error reading vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE);
1270                 return -1;
1271         }
1272         DBG(LOG_INFO, "WiFi Direct State [%d]", wifi_direct_state);
1273
1274         __FUNC_EXIT__;
1275         return wifi_direct_state;
1276 }
1277
1278 /**
1279  *      This function let the ug get device name from vconf
1280  *      @return   If success, return 0, else return -1
1281  *      @param[in] data the pointer to the main data structure
1282  */
1283 int wfd_get_vconf_device_name(void *data)
1284 {
1285         __FUNC_ENTER__;
1286         struct ug_data *ugd = (struct ug_data *)data;
1287         char *dev_name = NULL;
1288
1289         /* get device name from vconf */
1290         dev_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1291         if (dev_name == NULL) {
1292                 ugd->dev_name = strdup(DEFAULT_DEV_NAME);
1293                 DBG(LOG_ERROR, "The AP name is NULL(setting default value)\n");
1294                 return -1;
1295         }
1296
1297         ugd->dev_name = strdup(dev_name);
1298         WFD_IF_FREE_MEM(dev_name);
1299
1300         __FUNC_EXIT__;
1301         return 0;
1302 }
1303
1304 /**
1305  *      This function let the ug refresh current status of wi-fi direct
1306  *      @return   If success, return 0, else return -1
1307  *      @param[in] data the pointer to the main data structure
1308  */
1309 int wfd_refresh_wifi_direct_state(void *data)
1310 {
1311         __FUNC_ENTER__;
1312         struct ug_data *ugd = (struct ug_data *)data;
1313         int res;
1314         wifi_direct_state_e wfd_status;
1315
1316         res = wifi_direct_get_state(&wfd_status);
1317         if (res != WIFI_DIRECT_ERROR_NONE) {
1318                 DBG(LOG_ERROR, "Failed to get link status. [%d]\n", res);
1319                 return -1;
1320         }
1321
1322         DBG(LOG_INFO, "WFD status [%d]", wfd_status);
1323         ugd->wfd_status = wfd_status;
1324
1325         __FUNC_EXIT__;
1326         return 0;
1327 }
1328
1329 void wfd_init_ug_by_status(void *user_data)
1330 {
1331         __FUNC_ENTER__;
1332         struct ug_data *ugd = (struct ug_data *)user_data;
1333         int res = 0;
1334
1335         if(ugd == NULL) {
1336                 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
1337                 return;
1338         }
1339
1340         if (ugd->wfd_status >= WIFI_DIRECT_STATE_ACTIVATED) {
1341                 //wfd_ug_get_discovered_peers(ugd);
1342                 ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
1343         }
1344
1345         if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
1346                 wfd_ug_get_connected_peers(ugd);
1347                 wfd_ug_update_connected_peers(ugd);
1348                 ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
1349                 wfd_ug_get_discovered_peers(ugd);
1350                 wfd_ug_update_available_peers(ugd);
1351                 wfd_ug_update_toolbar(ugd);
1352         }
1353
1354         if (ugd->wfd_status == WIFI_DIRECT_STATE_CONNECTING) {
1355                 ugd->title_content_mode = TITLE_CONTENT_TYPE_NONE;
1356                 wfd_ug_get_discovered_peers(ugd);
1357                 wfd_ug_get_connecting_peer(ugd);
1358                 wfd_ug_update_available_peers(ugd);
1359                 wfd_ug_update_toolbar(ugd);
1360         }
1361
1362         if (ugd->wfd_status == WIFI_DIRECT_STATE_ACTIVATED ||
1363                 ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING) {
1364                 /* start discovery */
1365                 ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL_START;
1366                 res = wifi_direct_start_discovery_specific_channel(false, 1, WIFI_DIRECT_DISCOVERY_SOCIAL_CHANNEL);
1367                 if (res != WIFI_DIRECT_ERROR_NONE) {
1368                         ugd->wfd_discovery_status = WIFI_DIRECT_DISCOVERY_NONE;
1369                         DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
1370                         wifi_direct_cancel_discovery();
1371                 }
1372         }
1373
1374         __FUNC_EXIT__;
1375 }
1376
1377 /**
1378  *      This function let the ug do initialization
1379  *      @return   If success, return 0, else return -1
1380  *      @param[in] data the pointer to the main data structure
1381  */
1382 int init_wfd_client(void* data)
1383 {
1384         __FUNC_ENTER__;
1385         WFD_RETV_IF(data == NULL, -1, "Incorrect parameter(NULL)\n");
1386         struct ug_data *ugd = (struct ug_data *)data;
1387         int res = 0;
1388
1389         res = wifi_direct_initialize();
1390         if (res != WIFI_DIRECT_ERROR_NONE) {
1391                 if (res != WIFI_DIRECT_ERROR_ALREADY_INITIALIZED) {
1392                         DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res);
1393                         return -1;
1394                 } else {
1395                         DBG(LOG_ERROR, "Already registered\n");
1396                 }
1397         }
1398
1399         res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void *)ugd);
1400         if (res != WIFI_DIRECT_ERROR_NONE) {
1401                 DBG(LOG_ERROR, "Failed to register _cb_activation. error code = [%d]\n", res);
1402                 return -1;
1403         }
1404
1405         res = wifi_direct_set_discovery_state_changed_cb(discover_cb, (void *)ugd);
1406         if (res != WIFI_DIRECT_ERROR_NONE) {
1407                 DBG(LOG_ERROR, "Failed to register _cb_discover. error code = [%d]\n", res);
1408                 return -1;
1409         }
1410
1411         res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void *)ugd);
1412         if (res != WIFI_DIRECT_ERROR_NONE) {
1413                 DBG(LOG_ERROR, "Failed to register _cb_connection. error code = [%d]\n", res);
1414                 return -1;
1415         }
1416
1417         res = wifi_direct_set_client_ip_address_assigned_cb(_ip_assigned_cb, (void *)ugd);
1418         if (res != WIFI_DIRECT_ERROR_NONE) {
1419                 DBG(LOG_ERROR, "Failed to register _ip_assigned_cb. error code = [%d]\n", res);
1420                 return -1;
1421         }
1422
1423         /* update WFD status */
1424         wfd_refresh_wifi_direct_state(ugd);
1425 #ifdef WFD_ON_OFF_GENLIST
1426         if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) {
1427                 ugd->wfd_onoff = 1;
1428                 wfd_ug_refresh_on_off_check(ugd);
1429         } else {
1430                 ugd->wfd_onoff = 0;
1431         }
1432 #endif
1433
1434         DBG(LOG_INFO, "WFD link status. [%d]\n", ugd->wfd_status);
1435         ugd->is_init_ok = TRUE;
1436         wfd_init_ug_by_status(ugd);
1437
1438         __FUNC_EXIT__;
1439         return 0;
1440 }
1441
1442 #ifdef WFD_DBUS_LAUNCH
1443 void wfd_gdbus_callback(GObject *source_object, GAsyncResult *result, gpointer user_data)
1444 {
1445         __FUNC_ENTER__;
1446         struct ug_data *ugd = (struct ug_data *)user_data;
1447         WFD_RET_IF(ugd == NULL, "Incorrect parameter(NULL)\n");
1448         int res = -1;
1449
1450         GError *error = NULL;
1451         GVariant *return_data;
1452
1453         g_object_unref(ugd->dbus_cancellable);
1454         ugd->dbus_cancellable = NULL;
1455         ugd->conn = G_DBUS_CONNECTION (source_object);
1456         return_data = g_dbus_connection_call_finish(ugd->conn, result, &error);
1457
1458         if (error != NULL) {
1459                 DBG(LOG_ERROR,"DBus action failed. Error Msg [%s]\n", error->message);
1460                 g_clear_error(&error);
1461         } else {
1462                 DBG(LOG_INFO, "error msg is NULL\n");
1463         }
1464
1465         if (return_data)
1466                 g_variant_unref(return_data);
1467
1468         if (ugd->conn) {
1469                 g_object_unref(ugd->conn);
1470                 ugd->conn = NULL;
1471         }
1472
1473         res = init_wfd_client(ugd);
1474         WFD_RET_IF(res != 0, "Failed to initialize WFD client library\n");
1475
1476         /* Activate WiFi Direct */
1477         DBG(LOG_INFO, "Activating WiFi Direct...");
1478         if (ugd->wfd_status <= WIFI_DIRECT_STATE_DEACTIVATING) {
1479                 res = wfd_client_switch_on(ugd);
1480                 WFD_RET_IF(res != 0, "Failed to activate WFD\n");
1481         }
1482
1483         __FUNC_EXIT__;
1484 }
1485
1486 int launch_wifi_direct_manager(void *data)
1487 {
1488         __FUNC_ENTER__;
1489
1490         gchar *addr = NULL;
1491         GError *error = NULL;
1492
1493         struct ug_data *ugd = (struct ug_data *)data;
1494         WFD_RETV_IF(ugd == NULL, -1, "Incorrect parameter(NULL)\n");
1495
1496         ugd->dbus_cancellable = g_cancellable_new();
1497
1498         addr  = g_dbus_address_get_for_bus_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
1499         WFD_RETV_IF(addr == NULL, -1, "Fail to get dbus addr.\n");
1500
1501         ugd->conn = g_dbus_connection_new_for_address_sync(addr,G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT |
1502                         G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION, NULL, NULL, NULL);
1503
1504         if(ugd->conn == NULL) {
1505                 DBG(LOG_ERROR,"g_dbus_conn is NULL\n");
1506                 return -1;
1507         } else {
1508                 g_dbus_connection_call(ugd->conn, "net.netconfig", "/net/netconfig/wifi","net.netconfig.wifi",
1509                 "LaunchDirect", NULL, NULL, G_DBUS_CALL_FLAGS_NONE, -1, ugd->dbus_cancellable, wfd_gdbus_callback, data);
1510         }
1511
1512         __FUNC_EXIT__;
1513         return 0;
1514 }
1515 #endif
1516
1517 void wfd_client_destroy_tethering(struct ug_data *ugd)
1518 {
1519         __FUNC_ENTER__;
1520
1521         tethering_error_e ret = TETHERING_ERROR_NONE;
1522
1523         if (ugd->hotspot_handle != NULL) {
1524                 /* Deregister cbs */
1525                 ret = tethering_unset_enabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
1526                 if (ret != TETHERING_ERROR_NONE) {
1527                         DBG(LOG_ERROR, "tethering_unset_enabled_cb is failed(%d)\n", ret);
1528                 }
1529
1530                 ret = tethering_unset_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
1531                 if (ret != TETHERING_ERROR_NONE) {
1532                         DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret);
1533                 }
1534
1535                 ret = tethering_unset_disabled_cb(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
1536                 if (ret != TETHERING_ERROR_NONE) {
1537                         DBG(LOG_ERROR, "tethering_unset_disabled_cb is failed(%d)\n", ret);
1538                 }
1539
1540                 /* Destroy tethering handle */
1541                 ret = tethering_destroy(ugd->hotspot_handle);
1542                 if (ret != TETHERING_ERROR_NONE) {
1543                         DBG(LOG_ERROR, "tethering_destroy is failed(%d)\n", ret);
1544                 }
1545
1546                 ugd->hotspot_handle = NULL;
1547         }
1548
1549         __FUNC_EXIT__;
1550 }
1551
1552 /**
1553  *      This function let the ug do de-initialization
1554  *      @return   If success, return 0, else return -1
1555  *      @param[in] data the pointer to the main data structure
1556  */
1557 int deinit_wfd_client(void *data)
1558 {
1559         __FUNC_ENTER__;
1560         struct ug_data *ugd = (struct ug_data *)data;
1561         int res = 0;
1562
1563         wfd_refresh_wifi_direct_state(ugd);
1564
1565         if ((WIFI_DIRECT_STATE_DISCOVERING == ugd->wfd_status) &&
1566                 (WIFI_DIRECT_ERROR_NONE != wifi_direct_cancel_discovery())) {
1567                 DBG(LOG_ERROR, "Failed to send cancel discovery state [%d]\n", ugd->wfd_status);
1568         }
1569
1570         wfd_cancel_progressbar_stop_timer(ugd);
1571         wfd_cancel_not_alive_delete_timer(ugd);
1572
1573         if(ugd->timer_multi_reset > 0) {
1574                 g_source_remove(ugd->timer_multi_reset);
1575         }
1576         ugd->timer_multi_reset = 0;
1577
1578         if (ugd->g_source_multi_connect_next > 0) {
1579                 g_source_remove(ugd->g_source_multi_connect_next);
1580         }
1581         ugd->g_source_multi_connect_next = 0;
1582
1583         res = wifi_direct_unset_discovery_state_changed_cb();
1584         if (res != WIFI_DIRECT_ERROR_NONE) {
1585                         DBG(LOG_ERROR, "Failed to unset discovery state changed cb. [%d]\n", res);
1586         }
1587
1588         wifi_direct_unset_device_state_changed_cb();
1589         if (res != WIFI_DIRECT_ERROR_NONE) {
1590                         DBG(LOG_ERROR, "Failed to unset device state changed cb. [%d]\n", res);
1591         }
1592
1593         wifi_direct_unset_connection_state_changed_cb();
1594         if (res != WIFI_DIRECT_ERROR_NONE) {
1595                         DBG(LOG_ERROR, "Failed to unset connection state changed cb. [%d]\n", res);
1596         }
1597
1598         wifi_direct_unset_client_ip_address_assigned_cb();
1599         if (res != WIFI_DIRECT_ERROR_NONE) {
1600                         DBG(LOG_ERROR, "Failed to unset client ip address assigned cb. [%d]\n", res);
1601         }
1602
1603         if (ugd->wfd_status == WIFI_DIRECT_STATE_CONNECTING &&
1604                 NULL != ugd->mac_addr_connecting) {
1605                 if (ugd->is_conn_incoming) {
1606                         DBG(LOG_INFO, "Reject the incoming connection before client deregister \n");
1607                         res = wifi_direct_reject_connection(ugd->mac_addr_connecting);
1608                         if (res != WIFI_DIRECT_ERROR_NONE) {
1609                                 DBG(LOG_ERROR, "Failed to send reject request [%d]\n", res);
1610                         }
1611                 } else {
1612                         DBG(LOG_INFO, "Cancel the outgoing connection before client deregister \n");
1613                         res = wifi_direct_cancel_connection(ugd->mac_addr_connecting);
1614                         if (res != WIFI_DIRECT_ERROR_NONE) {
1615                                 DBG(LOG_ERROR, "Failed to send cancel request [%d]\n", res);
1616                         }
1617                 }
1618                 ugd->mac_addr_connecting = NULL;
1619         }
1620
1621
1622         res = wifi_direct_deinitialize();
1623         if (res != WIFI_DIRECT_ERROR_NONE) {
1624                 DBG(LOG_ERROR, "Failed to deregister client. [%d]\n", res);
1625         }
1626
1627         /* release vconf, hotspot..  */
1628 #ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
1629         res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
1630         if (res == -1) {
1631                 DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n");
1632         }
1633
1634         res = net_deregister_client();
1635         if (res != NET_ERR_NONE) {
1636                 DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
1637         }
1638 #endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
1639
1640
1641         wfd_client_destroy_tethering(ugd);
1642
1643         __FUNC_EXIT__;
1644         return 0;
1645 }
1646
1647 /**
1648  *      This function let the ug turn wi-fi direct on
1649  *      @return   If success, return 0, else return -1
1650  *      @param[in] data the pointer to the main data structure
1651  */
1652 int wfd_client_switch_on(void *data)
1653 {
1654         __FUNC_ENTER__;
1655         struct ug_data *ugd = (struct ug_data *)data;
1656         int res;
1657
1658         bool is_wifi_enabled = false;
1659         bool is_wifi_ap_enabled = false;
1660
1661
1662         if(!ugd->is_init_ok) {
1663                 DBG(LOG_ERROR, "device is initializing, please wait\n");
1664                 return -1;
1665         }
1666
1667         wfd_refresh_wifi_direct_state(ugd);
1668         DBG(LOG_INFO, "WFD status [%d]\n", ugd->wfd_status);
1669
1670         if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
1671
1672 #ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
1673                 int wifi_state;
1674                 res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
1675                 if (res != 0) {
1676                         DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res);
1677                         return -1;
1678                 }
1679 #endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
1680
1681                 ugd->hotspot_handle = NULL;
1682                 res = tethering_create(&(ugd->hotspot_handle));
1683                 if (res != TETHERING_ERROR_NONE) {
1684                         DBG(LOG_ERROR, "Failed to tethering_create() [%d]\n", res);
1685                         return -1;
1686                 } else {
1687                         DBG(LOG_INFO, "Succeeded to tethering_create()\n");
1688                 }
1689
1690                 is_wifi_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_WIFI);
1691                 is_wifi_ap_enabled = tethering_is_enabled(ugd->hotspot_handle, TETHERING_TYPE_RESERVED);
1692
1693 #ifndef MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE
1694                 if (wifi_state > VCONFKEY_WIFI_OFF) {
1695                         DBG(LOG_INFO, "WiFi is connected, so have to turn off WiFi");
1696                         wfd_ug_act_popup(ugd, _("IDS_WIFI_BODY_USING_WI_FI_DIRECT_WILL_DISCONNECT_CURRENT_WI_FI_CONNECTION_CONTINUE_Q"), POPUP_TYPE_WIFI_OFF);
1697                 } else
1698 #endif /* MODEL_BUILD_FEATURE_WLAN_CONCURRENT_MODE */
1699
1700                 if (is_wifi_enabled || is_wifi_ap_enabled) {
1701                         DBG(LOG_INFO, "WiFi is connected, so have to turn off WiFi");
1702                         wfd_ug_act_popup(ugd, _("IDS_WIFI_BODY_USING_WI_FI_DIRECT_WILL_DISCONNECT_CURRENT_WI_FI_TETHERING_CONTINUE_Q"), POPUP_TYPE_HOTSPOT_OFF);
1703                 } else
1704
1705                 {
1706                         res = wifi_direct_activate();
1707                         if (res != WIFI_DIRECT_ERROR_NONE) {
1708                                 DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
1709                                 wfd_ug_warn_popup(ugd, _("IDS_COM_POP_FAILED"), POPUP_TYPE_TERMINATE);
1710 #ifdef WFD_ON_OFF_GENLIST
1711                                 wfd_ug_refresh_on_off_check(ugd);
1712 #endif
1713                                 return -1;
1714                         }
1715
1716 #ifdef WFD_ON_OFF_GENLIST
1717                         if (ugd->on_off_check) {
1718                                 elm_check_state_set(ugd->on_off_check, TRUE);
1719                                 elm_object_disabled_set(ugd->on_off_check, TRUE);
1720                         }
1721 #endif
1722                         /* while activating, disable the buttons */
1723                         if (ugd->scan_toolbar == NULL) {
1724                                 scan_button_create(ugd);
1725                         }
1726
1727                         if (ugd->scan_toolbar) {
1728                                 wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", FALSE);
1729                         }
1730
1731                         if (ugd->multiconn_scan_stop_btn) {
1732                                 wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
1733                         }
1734
1735                         if (ugd->back_btn) {
1736                                 elm_object_disabled_set(ugd->back_btn, TRUE);
1737                         }
1738                 }
1739         } else {
1740                 DBG(LOG_INFO, "Wi-Fi Direct is already activated\n");
1741         }
1742
1743         __FUNC_EXIT__;
1744         return 0;
1745 }
1746
1747 /**
1748  *      This function let the ug turn wi-fi direct off
1749  *      @return   If success, return 0, else return -1
1750  *      @param[in] data the pointer to the main data structure
1751  */
1752 int wfd_client_switch_off(void *data)
1753 {
1754         __FUNC_ENTER__;
1755         struct ug_data *ugd = (struct ug_data *)data;
1756         int res;
1757
1758         wfd_ug_view_free_peers(ugd);
1759         wfd_free_nodivice_item(ugd);
1760
1761         wfd_refresh_wifi_direct_state(ugd);
1762         DBG(LOG_INFO, "WFD status [%d]\n", ugd->wfd_status);
1763
1764         if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
1765                 DBG(LOG_INFO, "Wi-Fi Direct is already deactivated\n");
1766         } else {
1767
1768                 wfd_client_destroy_tethering(ugd);
1769
1770                 wfd_cancel_progressbar_stop_timer(ugd);
1771                 wfd_cancel_not_alive_delete_timer(ugd);
1772
1773                 if(ugd->timer_multi_reset > 0) {
1774                         g_source_remove(ugd->timer_multi_reset);
1775                 }
1776                 ugd->timer_multi_reset = 0;
1777
1778                 if (ugd->g_source_multi_connect_next > 0) {
1779                         g_source_remove(ugd->g_source_multi_connect_next);
1780                 }
1781                 ugd->g_source_multi_connect_next = 0;
1782
1783                 /*if connected, disconnect all devices*/
1784                 if (WIFI_DIRECT_STATE_CONNECTED == ugd->wfd_status) {
1785                         res = wifi_direct_disconnect_all();
1786                         if (res != WIFI_DIRECT_ERROR_NONE) {
1787                                 DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
1788                                 return -1;
1789                         }
1790                 }
1791
1792                 res = wifi_direct_deactivate();
1793                 if (res != WIFI_DIRECT_ERROR_NONE) {
1794                         DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
1795                         wfd_ug_warn_popup(ugd, _("IDS_WIFI_POP_DEACTIVATION_FAILED"), POPUP_TYPE_TERMINATE_DEACTIVATE_FAIL);
1796 #ifdef WFD_ON_OFF_GENLIST
1797                         wfd_ug_refresh_on_off_check(ugd);
1798 #endif
1799                         return -1;
1800                 }
1801
1802                 /* while deactivating, disable the buttons */
1803                 if (ugd->scan_toolbar) {
1804                         wfd_ug_view_refresh_button(ugd->scan_toolbar, "IDS_WIFI_SK4_SCAN", FALSE);
1805                         evas_object_del(ugd->scan_toolbar);
1806                         ugd->scan_toolbar = NULL;
1807                 }
1808
1809                 if (ugd->multiconn_scan_stop_btn) {
1810                         wfd_ug_view_refresh_button(ugd->multiconn_scan_stop_btn, "IDS_WIFI_SK4_SCAN", FALSE);
1811                 }
1812
1813                 if (ugd->multi_connect_toolbar_item) {
1814                         elm_object_item_disabled_set(ugd->multi_connect_toolbar_item, TRUE);
1815                 }
1816
1817                 if (ugd->back_btn) {
1818                         elm_object_disabled_set(ugd->back_btn, TRUE);
1819                 }
1820         }
1821
1822         __FUNC_EXIT__;
1823         return 0;
1824 }
1825
1826 #ifdef WFD_ON_OFF_GENLIST
1827 /**
1828  *      This function let the ug turn wi-fi direct on/off forcely
1829  *      @return   If success, return 0, else return -1
1830  *      @param[in] data the pointer to the main data structure
1831   *     @param[in] onoff whether to turn on/off wi-fi direct
1832  */
1833 int wfd_client_swtch_force(void *data, int onoff)
1834 {
1835         __FUNC_ENTER__;
1836         struct ug_data *ugd = (struct ug_data *)data;
1837         int res;
1838
1839         if (onoff) {
1840                 res = wifi_direct_activate();
1841                 if (res != WIFI_DIRECT_ERROR_NONE) {
1842                         DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
1843                         wfd_ug_warn_popup(ugd, _("IDS_COM_POP_FAILED"), POPUP_TYPE_TERMINATE);
1844                         wfd_ug_refresh_on_off_check(ugd);
1845                         return -1;
1846                 }
1847         } else {
1848                 res = wifi_direct_deactivate();
1849                 if (res != WIFI_DIRECT_ERROR_NONE) {
1850                         DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
1851                         wfd_ug_warn_popup(ugd, _("IDS_WIFI_POP_DEACTIVATION_FAILED"), POPUP_TYPE_TERMINATE);
1852                         wfd_ug_refresh_on_off_check(ugd);
1853                         return -1;
1854                 }
1855         }
1856
1857         __FUNC_EXIT__;
1858         return 0;
1859 }
1860 #endif
1861
1862 /**
1863  *      This function let the ug create a group
1864  *      @return   If success, return 0, else return -1
1865  */
1866 int wfd_client_group_add()
1867 {
1868         __FUNC_ENTER__;
1869         int res;
1870
1871         res = wifi_direct_create_group();
1872         if (res != WIFI_DIRECT_ERROR_NONE) {
1873                 DBG(LOG_ERROR, "Failed to add group");
1874                 __FUNC_EXIT__;
1875                 return -1;
1876         }
1877
1878         __FUNC_EXIT__;
1879         return 0;
1880 }
1881
1882 /**
1883  *      This function let the ug connect to the device by mac address
1884  *      @return   If success, return 0, else return -1
1885  *      @param[in] mac_addr the pointer to the mac address of device
1886  */
1887 int wfd_client_connect(const char *mac_addr)
1888 {
1889         __FUNC_ENTER__;
1890         int res;
1891
1892         DBG_SECURE(LOG_INFO, "connect to peer=["MACSECSTR"]\n", MAC2SECSTR(mac_addr));
1893         res = wifi_direct_connect((char *)mac_addr);
1894         if (res != WIFI_DIRECT_ERROR_NONE) {
1895                 DBG(LOG_ERROR, "Failed to send connection request. [%d]\n", res);
1896                 return -1;
1897         }
1898
1899         __FUNC_EXIT__;
1900         return 0;
1901 }
1902
1903 /**
1904  *      This function let the ug disconnect to the device by mac address
1905  *      @return   If success, return 0, else return -1
1906  *      @param[in] mac_addr the pointer to the mac address of device
1907  */
1908 int wfd_client_disconnect(const char *mac_addr)
1909 {
1910         __FUNC_ENTER__;
1911         int res;
1912
1913         wifi_direct_cancel_discovery();
1914         /*
1915          * No need to handle return in cancel discovery as there maybe case
1916          * when framework can return failure.
1917          */
1918
1919         if (mac_addr == NULL) {
1920                 res = wifi_direct_disconnect_all();
1921                 if (res != WIFI_DIRECT_ERROR_NONE) {
1922                         DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
1923                         return -1;
1924                 }
1925         } else {
1926                 res = wifi_direct_disconnect((char *)mac_addr);
1927                 if (res != WIFI_DIRECT_ERROR_NONE) {
1928                         DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res);
1929                         return -1;
1930                 }
1931         }
1932
1933         __FUNC_EXIT__;
1934         return 0;
1935 }
1936
1937 /**
1938  *      This function let the ug set the intent of a group owner
1939  *      @return   If success, return 0, else return -1
1940  *      @param[in] go_intent the intent parameter
1941  */
1942 int wfd_client_set_p2p_group_owner_intent(int go_intent)
1943 {
1944         __FUNC_ENTER__;
1945         int res;
1946
1947         res = wifi_direct_set_group_owner_intent(go_intent);
1948         if (res != WIFI_DIRECT_ERROR_NONE) {
1949                 DBG(LOG_ERROR, "Failed to wifi_direct_set_go_intent(%d). [%d]\n", go_intent, res);
1950                 return -1;
1951         }
1952
1953         __FUNC_EXIT__;
1954         return 0;
1955 }