4 * Copyright 2012 Samsung Electronics Co., Ltd
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
10 * http://floralicense.org/license
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.
24 #include <Elementary.h>
27 //#include <vconf-keys.h>
28 #include <tethering.h>
29 #include <network-cm-intf.h>
30 #include <network-wifi-intf.h>
33 #include "wfd_ug_view.h"
34 #include "wfd_client.h"
37 * This function let the ug make a change callback for wifi state
39 * @param[in] key the pointer to the key
40 * @param[in] data the pointer to the main data structure
42 static void _wifi_state_cb(keynode_t *key, void *data)
44 __WDUG_LOG_FUNC_ENTER__;
45 struct ug_data *ugd = (struct ug_data *)data;
49 res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
51 WDUG_LOGE("Failed to get wifi state from vconf. [%d]\n", res);
55 if (wifi_state == VCONFKEY_WIFI_OFF) {
56 WDUG_LOGI("WiFi is turned off\n");
57 wfd_client_swtch_force(ugd, TRUE);
59 WDUG_LOGI("WiFi is turned on\n");
62 res = net_deregister_client();
63 if (res != NET_ERR_NONE) {
64 WDUG_LOGE("Failed to deregister network client. [%d]\n", res);
67 __WDUG_LOG_FUNC_EXIT__;
71 * This function let the ug make a event callback for network registering
73 * @param[in] event_info the pointer to the information of network event
74 * @param[in] user_data the pointer to the user data
76 static void _network_event_cb(net_event_info_t *event_info, void *user_data)
78 __WDUG_LOG_FUNC_ENTER__;
79 WDUG_LOGI("Event from network. [%d]\n", event_info->Event);
80 __WDUG_LOG_FUNC_EXIT__;
84 * This function let the ug turn wifi off
85 * @return If success, return 0, else return -1
86 * @param[in] data the pointer to the main data structure
88 int wfd_wifi_off(void *data)
90 __WDUG_LOG_FUNC_ENTER__;
91 struct ug_data *ugd = (struct ug_data *)data;
94 res = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb, ugd);
96 WDUG_LOGE("Failed to register vconf callback\n");
100 WDUG_LOGI("Vconf key callback is registered\n");
102 res = net_register_client((net_event_cb_t) _network_event_cb, NULL);
103 if (res != NET_ERR_NONE) {
104 WDUG_LOGE("Failed to register network client. [%d]\n", res);
108 WDUG_LOGI("Network client is registered\n");
110 res = net_wifi_power_off();
111 if (res != NET_ERR_NONE) {
112 WDUG_LOGE("Failed to turn off wifi. [%d]\n", res);
116 WDUG_LOGI("WiFi power off\n");
118 __WDUG_LOG_FUNC_EXIT__;
123 * This function let the ug make a change callback for enabling hotspot state
125 * @param[in] key the pointer to the key
126 * @param[in] data the pointer to the main data structure
128 static void _enable_hotspot_state_cb(keynode_t *key, void *data)
130 __WDUG_LOG_FUNC_ENTER__;
131 struct ug_data *ugd = (struct ug_data *)data;
134 tethering_error_e ret = TETHERING_ERROR_NONE;
135 tethering_h th = NULL;
137 res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
139 WDUG_LOGE("Failed to get mobile hotspot state from vconf. [%d]\n", res);
143 if (hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) {
144 WDUG_LOGI(" Mobile hotspot is activated\n");
147 th = ugd->hotspot_handle;
151 ret = tethering_unset_enabled_cb(th, TETHERING_TYPE_WIFI);
152 if (ret != TETHERING_ERROR_NONE) {
153 WDUG_LOGE("tethering_unset_enabled_cb is failed(%d)\n", ret);
156 /* Destroy tethering handle */
157 ret = tethering_destroy(th);
158 if (ret != TETHERING_ERROR_NONE) {
159 WDUG_LOGE("tethering_destroy is failed(%d)\n", ret);
162 ugd->hotspot_handle = NULL;
165 __WDUG_LOG_FUNC_EXIT__;
169 * This function let the ug make a change callback for disabling hotspot state
171 * @param[in] key the pointer to the key
172 * @param[in] data the pointer to the main data structure
174 static void _disable_hotspot_state_cb(keynode_t *key, void *data)
176 __WDUG_LOG_FUNC_ENTER__;
177 struct ug_data *ugd = (struct ug_data *)data;
180 tethering_error_e ret = TETHERING_ERROR_NONE;
181 tethering_h th = NULL;
183 res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
185 WDUG_LOGE("Failed to get mobile hotspot state from vconf. [%d]\n", res);
189 if (!(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI)) {
190 WDUG_LOGI(" Mobile hotspot is deactivated\n");
191 wfd_client_swtch_force(ugd, TRUE);
194 th = ugd->hotspot_handle;
198 ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_WIFI);
199 if (ret != TETHERING_ERROR_NONE) {
200 WDUG_LOGE("tethering_unset_disabled_cb is failed(%d)\n", ret);
203 /* Destroy tethering handle */
204 ret = tethering_destroy(th);
205 if (ret != TETHERING_ERROR_NONE) {
206 WDUG_LOGE("tethering_destroy is failed(%d)\n", ret);
209 ugd->hotspot_handle = NULL;
212 __WDUG_LOG_FUNC_EXIT__;
216 * This function let the ug make a callback for setting tethering mode enabled
218 * @param[in] error the returned error code
219 * @param[in] type the type of tethering
220 * @param[in] is_requested whether tethering mode is enabled
221 * @param[in] data the pointer to the user data
223 static void __enabled_cb(tethering_error_e error, tethering_type_e type, bool is_requested, void *data)
225 __WDUG_LOG_FUNC_ENTER__;
227 if (error != TETHERING_ERROR_NONE) {
228 if (is_requested != TRUE) {
232 WDUG_LOGE("error !!! TETHERING is not enabled.\n");
236 WDUG_LOGI("TETHERING is enabled.\n");
238 __WDUG_LOG_FUNC_EXIT__;
243 * This function let the ug make a callback for setting tethering mode disabled
245 * @param[in] error the returned error code
246 * @param[in] type the type of tethering
247 * @param[in] code whether tethering mode is enabled
248 * @param[in] data the pointer to the user data
250 static void __disabled_cb(tethering_error_e error, tethering_type_e type, tethering_disabled_cause_e code, void *data)
252 __WDUG_LOG_FUNC_ENTER__;
254 if (error != TETHERING_ERROR_NONE) {
255 if (code != TETHERING_DISABLED_BY_REQUEST) {
259 WDUG_LOGE("error !!! TETHERING is not disabled.\n");
263 WDUG_LOGI("TETHERING is disabled.\n");
265 __WDUG_LOG_FUNC_EXIT__;
270 * This function let the ug turn AP on
271 * @return If success, return 0, else return -1
272 * @param[in] data the pointer to the main data structure
274 int wfd_mobile_ap_on(void *data)
276 __WDUG_LOG_FUNC_ENTER__;
277 struct ug_data *ugd = (struct ug_data *)data;
279 tethering_error_e ret = TETHERING_ERROR_NONE;
280 tethering_h th = NULL;
282 res = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _enable_hotspot_state_cb, ugd);
284 WDUG_LOGE("Failed to register vconf callback\n");
288 /* Create tethering handle */
289 ret = tethering_create(&th);
290 if (ret != TETHERING_ERROR_NONE) {
291 WDUG_LOGE("Failed to tethering_create() [%d]\n", ret);
294 WDUG_LOGI("Succeeded to tethering_create()\n");
298 ret = tethering_set_enabled_cb(th, TETHERING_TYPE_WIFI, __enabled_cb, NULL);
299 if (ret != TETHERING_ERROR_NONE) {
300 WDUG_LOGE("tethering_set_enabled_cb is failed\n", ret);
304 /* Enable tethering */
305 ret = tethering_enable(th, TETHERING_TYPE_WIFI);
306 if (ret != TETHERING_ERROR_NONE) {
307 WDUG_LOGE("Failed to turn on mobile hotspot. [%d]\n", ret);
310 WDUG_LOGI("Succeeded to turn on mobile hotspot\n");
313 ugd->hotspot_handle = th;
314 ugd->is_hotspot_off = FALSE;
316 __WDUG_LOG_FUNC_EXIT__;
321 * This function let the ug turn AP off
322 * @return If success, return 0, else return -1
323 * @param[in] data the pointer to the main data structure
325 int wfd_mobile_ap_off(void *data)
327 __WDUG_LOG_FUNC_ENTER__;
328 struct ug_data *ugd = (struct ug_data *)data;
330 tethering_error_e ret = TETHERING_ERROR_NONE;
331 tethering_h th = NULL;
333 res = vconf_notify_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _disable_hotspot_state_cb, ugd);
335 WDUG_LOGE("Failed to register vconf callback\n");
339 /* Create tethering handle */
340 ret = tethering_create(&th);
341 if (ret != TETHERING_ERROR_NONE) {
342 WDUG_LOGE("Failed to tethering_create() [%d]\n", ret);
345 WDUG_LOGI("Succeeded to tethering_create()\n");
349 ret = tethering_set_disabled_cb(th, TETHERING_TYPE_WIFI, __disabled_cb, NULL);
350 if (ret != TETHERING_ERROR_NONE) {
351 WDUG_LOGE("tethering_set_disabled_cb is failed\n", ret);
355 /* Disable tethering */
356 ret = tethering_disable(th, TETHERING_TYPE_WIFI);
357 if (ret != TETHERING_ERROR_NONE) {
358 WDUG_LOGE("Failed to turn off mobile hotspot. [%d]\n", ret);
361 WDUG_LOGI("Succeeded to turn off mobile hotspot\n");
364 ugd->hotspot_handle = th;
365 ugd->is_hotspot_off = TRUE;
367 __WDUG_LOG_FUNC_EXIT__;
372 * This function let the ug find the peer by mac address
373 * @return the found peer
374 * @param[in] data the pointer to the main data structure
375 * @param[in] mac_addr the pointer to mac address
377 static device_type_s *wfd_client_find_peer_by_mac(void *data, const char *mac_addr)
379 __WDUG_LOG_FUNC_ENTER__;
380 struct ug_data *ugd = (struct ug_data *)data;
384 WDUG_LOGE("Incorrect parameter(NULL)\n");
388 if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE) {
389 for (i = 0; i < ugd->raw_multi_selected_peer_cnt; i++) {
390 WDUG_LOGI("[Multi Connect] check %dth peer\n", i);
391 if (!strncmp(mac_addr, (const char *)ugd->raw_multi_selected_peers[i].mac_addr, MAC_LENGTH)) {
392 WDUG_LOGI("selected found peer. [%d]\n", i);
393 __WDUG_LOG_FUNC_EXIT__;
394 return &ugd->raw_multi_selected_peers[i];
398 for (i = 0; i < ugd->raw_discovered_peer_cnt; i++) {
399 WDUG_LOGI("check %dth peer\n", i);
400 if (!strncmp(mac_addr, (const char *)ugd->raw_discovered_peers[i].mac_addr, MAC_LENGTH)) {
401 WDUG_LOGI("found peer. [%d]\n", i);
402 __WDUG_LOG_FUNC_EXIT__;
403 return &ugd->raw_discovered_peers[i];
408 __WDUG_LOG_FUNC_EXIT__;
413 * This function let the ug make a callback for registering activation event
415 * @param[in] error_code the returned error code
416 * @param[in] device_state the state of device
417 * @param[in] user_data the pointer to the main data structure
419 void _activation_cb(int error_code, wifi_direct_device_state_e device_state, void *user_data)
421 __WDUG_LOG_FUNC_ENTER__;
423 struct ug_data *ugd = (struct ug_data *)user_data;
425 wfd_refresh_wifi_direct_state(ugd);
427 switch (device_state) {
428 case WIFI_DIRECT_DEVICE_STATE_ACTIVATED:
429 WDUG_LOGI("WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n");
430 if (error_code != WIFI_DIRECT_ERROR_NONE) {
431 WDUG_LOGE("Error in Activation/Deactivation [%d]\n", error_code);
432 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_ACTIVATE_FAIL);
434 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
436 wfd_ug_view_refresh_glitem(ugd->head);
440 ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED;
442 wfd_ug_view_refresh_glitem(ugd->head);
444 wfg_ug_act_popup_remove(ugd);
446 res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
448 WDUG_LOGE("Failed to ignore vconf key callback for wifi state\n");
451 res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _disable_hotspot_state_cb);
453 WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
456 res = wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
457 if (res != WIFI_DIRECT_ERROR_NONE) {
458 WDUG_LOGE("Failed to start discovery. [%d]\n", res);
459 ugd->is_re_discover = TRUE;
460 wifi_direct_cancel_discovery();
462 WDUG_LOGI("Discovery is started\n");
463 ugd->is_re_discover = FALSE;
467 case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED:
468 WDUG_LOGI("WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n");
469 if (error_code != WIFI_DIRECT_ERROR_NONE) {
470 WDUG_LOGE("Error in Activation/Deactivation [%d]\n", error_code);
471 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_DEACTIVATE_FAIL);
472 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
474 wfd_ug_view_refresh_glitem(ugd->head);
478 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
482 * when deactivated, clear all the
483 * discovered peers and connected peers
485 if (ugd->raw_discovered_peer_cnt > 0) {
486 memset(ugd->raw_discovered_peers, 0x00, ugd->raw_discovered_peer_cnt*sizeof(device_type_s));
489 if (ugd->raw_connected_peer_cnt > 0) {
490 memset(ugd->raw_connected_peers, 0x00, ugd->raw_connected_peer_cnt*sizeof(device_type_s));
493 ugd->raw_discovered_peer_cnt = 0;
494 ugd->raw_connected_peer_cnt = 0;
496 wfd_ug_view_update_peers(ugd);
498 /* remove the callback for hotspot */
499 res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _enable_hotspot_state_cb);
501 WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
504 /* when deactivated, stop the timer */
505 if (ugd->monitor_timer) {
506 ecore_timer_del(ugd->monitor_timer);
507 ugd->monitor_timer = NULL;
514 wfd_ug_view_refresh_glitem(ugd->head);
517 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
520 if (ugd->multi_connect_btn) {
521 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
525 elm_object_disabled_set(ugd->back_btn, FALSE);
528 __WDUG_LOG_FUNC_EXIT__;
533 * This function let the ug make a callback for discovering peer
535 * @param[in] peer the pointer to the discovered peer
536 * @param[in] user_data the pointer to the main data structure
538 bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s *peer, void *user_data)
540 __WDUG_LOG_FUNC_ENTER__;
541 if (NULL == peer || NULL == user_data) {
542 WDUG_LOGE("Incorrect parameter(NULL)\n");
543 __WDUG_LOG_FUNC_EXIT__;
547 struct ug_data *ugd = (struct ug_data *)user_data;
548 int peer_cnt = ugd->raw_discovered_peer_cnt;
550 WDUG_LOGI("%dth discovered peer. [%s] [%s]\n", peer_cnt, peer->device_name, peer->mac_address);
552 strncpy(ugd->raw_discovered_peers[peer_cnt].ssid, peer->device_name, sizeof(ugd->raw_discovered_peers[peer_cnt].ssid));
553 ugd->raw_discovered_peers[peer_cnt].category = peer->primary_device_type;
554 strncpy(ugd->raw_discovered_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
555 strncpy(ugd->raw_discovered_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
556 ugd->raw_discovered_peers[peer_cnt].is_group_owner = peer->is_group_owner;
557 ugd->raw_discovered_peers[peer_cnt].is_persistent_group_owner = peer->is_persistent_group_owner;
558 ugd->raw_discovered_peers[peer_cnt].is_connected = peer->is_connected;
560 if (TRUE == peer->is_connected) {
561 ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
563 ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_DISCONNECTED;
566 WDUG_LOGI("\tSSID: [%s]\n", ugd->raw_discovered_peers[peer_cnt].ssid);
567 WDUG_LOGI("\tPeer category [%d] -> [%d]\n", peer->primary_device_type, ugd->raw_discovered_peers[peer_cnt].category);
568 WDUG_LOGI("\tStatus: [%d]\n", ugd->raw_discovered_peers[peer_cnt].conn_status);
570 ugd->raw_discovered_peer_cnt++;
572 free(peer->device_name);
573 free(peer->mac_address);
574 free(peer->interface_address);
577 __WDUG_LOG_FUNC_EXIT__;
582 * This function let the ug make a callback for connected peer
584 * @param[in] peer the pointer to the connected peer
585 * @param[in] user_data the pointer to the main data structure
587 bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_data)
589 __WDUG_LOG_FUNC_ENTER__;
590 if (NULL == peer || NULL == user_data) {
591 WDUG_LOGE("Incorrect parameter(NULL)\n");
592 __WDUG_LOG_FUNC_EXIT__;
596 struct ug_data *ugd = (struct ug_data *)user_data;
597 int peer_cnt = ugd->raw_connected_peer_cnt;
599 WDUG_LOGI("%dth connected peer. [%s] [%s]\n", peer_cnt, peer->device_name, peer->mac_address);
601 strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->device_name, SSID_LENGTH);
602 ugd->raw_connected_peers[peer_cnt].ssid[SSID_LENGTH-1] = '\0';
603 ugd->raw_connected_peers[peer_cnt].category = peer->primary_device_type;
604 strncpy(ugd->raw_connected_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
605 ugd->raw_connected_peers[peer_cnt].mac_addr[MAC_LENGTH-1] = '\0';
606 strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
607 ugd->raw_connected_peers[peer_cnt].if_addr[MAC_LENGTH-1] = '\0';
608 ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
610 WDUG_LOGI("\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status);
611 WDUG_LOGI("\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category);
612 WDUG_LOGI("\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid);
613 WDUG_LOGI("\tMAC addr: [" MACSTR "]\n", ugd->raw_connected_peers[peer_cnt].mac_addr);
614 WDUG_LOGI("\tIface addr: [" MACSTR "]\n", ugd->raw_connected_peers[peer_cnt].if_addr);
616 ugd->raw_connected_peer_cnt++;
618 free(peer->device_name);
619 free(peer->mac_address);
620 free(peer->interface_address);
623 __WDUG_LOG_FUNC_EXIT__;
628 * This function let the ug get the found peers
629 * @return If success, return 0, else return -1
630 * @param[in] ugd the pointer to the main data structure
632 int wfd_ug_get_discovered_peers(struct ug_data *ugd)
634 __WDUG_LOG_FUNC_ENTER__;
641 ugd->raw_discovered_peer_cnt = 0;
642 res = wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, (void *)ugd);
643 if (res != WIFI_DIRECT_ERROR_NONE) {
644 ugd->raw_discovered_peer_cnt = 0;
645 WDUG_LOGE("Get discovery result failed: %d\n", res);
648 __WDUG_LOG_FUNC_EXIT__;
653 * This function let the ug get the connected peers
654 * @return If success, return 0, else return -1
655 * @param[in] ugd the pointer to the main data structure
657 int wfd_ug_get_connected_peers(struct ug_data *ugd)
659 __WDUG_LOG_FUNC_ENTER__;
666 ugd->raw_connected_peer_cnt = 0;
667 res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void *)ugd);
668 if (res != WIFI_DIRECT_ERROR_NONE) {
669 ugd->raw_connected_peer_cnt = 0;
670 WDUG_LOGE("Get connected peer failed: %d\n", res);
673 __WDUG_LOG_FUNC_EXIT__;
678 * This function let the ug make a callback for deactivating wfd automatically
679 * @return if stop the timer, return ECORE_CALLBACK_CANCEL, else return ECORE_CALLBACK_RENEW
680 * @param[in] user_data the pointer to the main data structure
682 static Eina_Bool _wfd_automatic_deactivated_for_no_connection_cb(void *user_data)
686 struct ug_data *ugd = (struct ug_data *)user_data;
689 WDUG_LOGE("NULL parameters.\n");
690 return ECORE_CALLBACK_CANCEL;
693 /* check the action, if action is exist, keep the cb */
694 res = wifi_direct_get_state(&ugd->wfd_status);
695 if (res != WIFI_DIRECT_ERROR_NONE) {
696 WDUG_LOGE("Failed to get link status. [%d]\n", res);
697 return ECORE_CALLBACK_CANCEL;
700 if (ugd->last_wfd_status != ugd->wfd_status) {
701 WDUG_LOGE("Action is exist, last status: %d\n",
702 ugd->last_wfd_status);
703 ugd->last_wfd_status = ugd->wfd_status;
704 ugd->last_wfd_time = time(NULL);
705 return ECORE_CALLBACK_RENEW;
708 /* check the timeout, if not timeout, keep the cb */
709 interval = time(NULL) - ugd->last_wfd_time;
710 if (interval < MAX_NO_ACTION_TIME_OUT) {
711 return ECORE_CALLBACK_RENEW;
714 /* turn off the Wi-Fi Direct */
715 wifi_direct_get_state(&ugd->wfd_status);
716 if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
717 WDUG_LOGE("Wi-Fi Direct is already deactivated\n");
719 wfd_ug_warn_popup(ugd, IDS_WFD_POP_AUTOMATIC_TURN_OFF, POP_TYPE_AUTOMATIC_TURN_OFF);
722 return ECORE_CALLBACK_CANCEL;
726 * This function let the ug make a callback for registering discover event
728 * @param[in] error_code the returned error code
729 * @param[in] discovery_state the state of discover
730 * @param[in] user_data the pointer to the main data structure
732 void _discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data)
734 __WDUG_LOG_FUNC_ENTER__;
735 struct ug_data *ugd = (struct ug_data *)user_data;
738 WDUG_LOGE("Incorrect parameter(NULL)\n");
742 WDUG_LOGI("Discovery event [%d], error_code [%d]\n", discovery_state, error_code);
744 if (discovery_state == WIFI_DIRECT_ONLY_LISTEN_STARTED) {
745 __WDUG_LOG_FUNC_EXIT__;
747 } else if (discovery_state == WIFI_DIRECT_DISCOVERY_STARTED) {
748 ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
750 /* clear all the previous discovered peers */
751 if (ugd->raw_discovered_peer_cnt > 0) {
752 memset(ugd->raw_discovered_peers, 0x00, ugd->raw_discovered_peer_cnt*sizeof(device_type_s));
755 ugd->raw_discovered_peer_cnt = 0;
756 } else if (discovery_state == WIFI_DIRECT_DISCOVERY_FOUND) {
757 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
758 wfd_ug_get_discovered_peers(ugd);
760 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
762 if (TRUE == ugd->is_re_discover) {
763 ugd->is_re_discover = FALSE;
764 wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
766 /* start LISTEN ONLY mode */
767 wifi_direct_start_discovery(TRUE, 0);
771 wfd_ug_view_refresh_glitem(ugd->head);
772 wfd_ug_view_update_peers(ugd);
773 wfd_update_multiconnect_device(ugd);
775 if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state) {
777 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
780 if (ugd->multi_connect_btn) {
781 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
785 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
788 if (ugd->multi_connect_btn) {
789 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
793 __WDUG_LOG_FUNC_EXIT__;
798 * This function let the ug make a callback for registering connection event
800 * @param[in] error_code the returned error code
801 * @param[in] connection_state the state of connection
802 * @param[in] mac_address the mac address of peer
803 * @param[in] user_data the pointer to the main data structure
805 void _connection_cb(int error_code, wifi_direct_connection_state_e connection_state, const char *mac_address, void *user_data)
807 __WDUG_LOG_FUNC_ENTER__;
808 struct ug_data *ugd = (struct ug_data *)user_data;
809 device_type_s *peer = NULL;
813 WDUG_LOGI("Connection event [%d], error_code [%d], multi_connect_mode [%d]\n",
814 connection_state, error_code, ugd->multi_connect_mode);
816 if (mac_address == NULL) {
817 WDUG_LOGE("Incorrect parameter(peer mac is NULL)\n");
821 /* when not in connection, mac_address is empty */
822 if (connection_state <= WIFI_DIRECT_DISASSOCIATION_IND) {
823 peer = wfd_client_find_peer_by_mac(ugd, mac_address);
825 if (NULL == peer || '\0' == peer->ssid[0]) {
826 WDUG_LOGE("invalid peer from connection !!\n");
831 if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
832 switch (connection_state) {
833 case WIFI_DIRECT_CONNECTION_RSP:
834 WDUG_LOGI("MULTI: WIFI_DIRECT_CONNECTION_RSP\n");
836 if (error_code == WIFI_DIRECT_ERROR_NONE) {
837 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
838 wfd_ug_get_connected_peers(ugd);
840 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
843 wfd_ug_view_update_peers(ugd);
845 /* connect the next peer */
846 ugd->g_source_multi_connect_next = g_timeout_add(1000, wfd_multi_connect_next_cb, ugd);
848 case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
849 WDUG_LOGI("MULTI: WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
850 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
851 wfd_ug_view_update_peers(ugd);
853 case WIFI_DIRECT_GROUP_CREATED:
854 WDUG_LOGI("MULTI: WIFI_DIRECT_GROUP_CREATED\n");
855 wfd_multi_connect_next_cb(ugd);
861 switch (connection_state) {
862 case WIFI_DIRECT_CONNECTION_RSP:
863 WDUG_LOGI("WIFI_DIRECT_CONNECTION_RSP\n");
865 if (error_code == WIFI_DIRECT_ERROR_NONE) {
866 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
867 wfd_ug_get_connected_peers(ugd);
869 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
872 wfd_ug_view_update_peers(ugd);
874 case WIFI_DIRECT_DISASSOCIATION_IND:
875 WDUG_LOGI("WIFI_DIRECT_DISASSOCIATION_IND\n");
876 /* change the multi connection mode, it can be connected now */
877 if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) {
878 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
881 /* if other peer disconnected, get connected peers and update */
882 peer->conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT;
883 wfd_ug_get_connected_peers(ugd);
884 wfd_ug_view_update_peers(ugd);
886 case WIFI_DIRECT_DISCONNECTION_RSP:
887 case WIFI_DIRECT_DISCONNECTION_IND:
888 WDUG_LOGI("WIFI_DIRECT_DISCONNECTION_X\n");
890 /* when disconnection, clear all the connected peers */
891 if (ugd->raw_connected_peer_cnt > 0) {
892 memset(ugd->raw_connected_peers, 0x00, ugd->raw_connected_peer_cnt*sizeof(device_type_s));
895 ugd->raw_connected_peer_cnt = 0;
897 /* start discovery again */
898 res = wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
899 if (res != WIFI_DIRECT_ERROR_NONE) {
900 WDUG_LOGE("Failed to start discovery. [%d]\n", res);
901 ugd->is_re_discover = TRUE;
902 wifi_direct_cancel_discovery();
904 WDUG_LOGI("Discovery is started\n");
905 ugd->is_re_discover = FALSE;
909 case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
910 WDUG_LOGI("WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
911 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
912 wfd_ug_view_update_peers(ugd);
914 case WIFI_DIRECT_CONNECTION_REQ:
915 case WIFI_DIRECT_CONNECTION_WPS_REQ:
916 WDUG_LOGI("WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ\n");
924 wfd_ug_view_refresh_glitem(peer->gl_item);
927 _change_multi_button_title(ugd);
930 /* refresh the scan button */
931 wfd_refresh_wifi_direct_state(ugd);
932 if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status ||
933 WIFI_DIRECT_STATE_DISCONNECTING == ugd->wfd_status) {
934 res = wifi_direct_is_group_owner(&owner);
935 if (res == WIFI_DIRECT_ERROR_NONE) {
938 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
941 if (ugd->multi_connect_btn) {
942 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
946 WDUG_LOGE("Failed to get whether client is group owner. [%d]\n", res);
950 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
953 if (ugd->multi_connect_btn) {
954 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
958 /* if no connection, start the monitor timer */
959 wifi_direct_get_state(&ugd->wfd_status);
960 WDUG_LOGI("status: %d", ugd->wfd_status);
962 if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
963 if (ugd->monitor_timer) {
964 ecore_timer_del(ugd->monitor_timer);
965 ugd->monitor_timer = NULL;
968 if (NULL == ugd->monitor_timer) {
969 WDUG_LOGI("start the monitor timer\n");
970 ugd->last_wfd_time = time(NULL);
971 ugd->monitor_timer = ecore_timer_add(5.0,
972 (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ugd);
976 __WDUG_LOG_FUNC_EXIT__;
981 * This function let the ug get wi-fi direct status from vconf
982 * @return If success, return 0, else return -1
983 * @param[in] data the pointer to the main data structure
985 int wfd_get_vconf_status(void *data)
987 __WDUG_LOG_FUNC_ENTER__;
988 struct ug_data *ugd = (struct ug_data *)data;
990 int wifi_direct_state = 0;
992 /* get wifi direct status from vconf */
993 if (vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state) < 0) {
994 WDUG_LOGE("Error reading vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE);
998 ugd->wfd_status = wifi_direct_state;
1000 /* get device name from vconf */
1001 dev_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1002 if (dev_name == NULL) {
1003 ugd->dev_name = strdup(DEFAULT_DEV_NAME);
1004 WDUG_LOGE("The AP name is NULL(setting default value)\n");
1006 ugd->dev_name = strdup(dev_name);
1010 __WDUG_LOG_FUNC_EXIT__;
1015 * This function let the ug refresh current status of wi-fi direct
1016 * @return If success, return 0, else return -1
1017 * @param[in] data the pointer to the main data structure
1019 int wfd_refresh_wifi_direct_state(void *data)
1021 __WDUG_LOG_FUNC_ENTER__;
1022 struct ug_data *ugd = (struct ug_data *)data;
1024 wifi_direct_state_e wfd_status;
1026 res = wifi_direct_get_state(&wfd_status);
1027 if (res != WIFI_DIRECT_ERROR_NONE) {
1028 WDUG_LOGE("Failed to get link status. [%d]\n", res);
1032 WDUG_LOGI("WFD status [%d]", wfd_status);
1033 ugd->wfd_status = wfd_status;
1035 __WDUG_LOG_FUNC_EXIT__;
1040 * This function let the ug do initialization
1041 * @return If success, return 0, else return -1
1042 * @param[in] data the pointer to the main data structure
1044 int init_wfd_client(void *data)
1046 __WDUG_LOG_FUNC_ENTER__;
1047 struct ug_data *ugd = (struct ug_data *)data;
1050 res = wifi_direct_initialize();
1051 if (res != WIFI_DIRECT_ERROR_NONE) {
1052 WDUG_LOGE("Failed to initialize wifi direct. [%d]\n", res);
1056 res = wifi_direct_initialize();
1057 if (res != WIFI_DIRECT_ERROR_NONE) {
1058 WDUG_LOGE("Failed to initialize Wi-Fi Direct. error code = [%d]\n", res);
1062 res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void *)ugd);
1063 if (res != WIFI_DIRECT_ERROR_NONE) {
1064 WDUG_LOGE("Failed to register _cb_activation. error code = [%d]\n", res);
1068 res = wifi_direct_set_discovery_state_changed_cb(_discover_cb, (void *)ugd);
1069 if (res != WIFI_DIRECT_ERROR_NONE) {
1070 WDUG_LOGE("Failed to register _cb_discover. error code = [%d]\n", res);
1074 res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void *)ugd);
1075 if (res != WIFI_DIRECT_ERROR_NONE) {
1076 WDUG_LOGE("Failed to register _cb_connection. error code = [%d]\n", res);
1080 /* update WFD status */
1081 wfd_refresh_wifi_direct_state(ugd);
1082 if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) {
1088 WDUG_LOGI("WFD link status. [%d]\n", ugd->wfd_status);
1090 /* start the monitor timer */
1091 ugd->last_wfd_time = time(NULL);
1092 ugd->last_wfd_status = WIFI_DIRECT_STATE_DEACTIVATED;
1093 ugd->monitor_timer = ecore_timer_add(5.0, (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ugd);
1095 ugd->is_re_discover = FALSE;
1097 __WDUG_LOG_FUNC_EXIT__;
1102 * This function let the ug do de-initialization
1103 * @return If success, return 0, else return -1
1104 * @param[in] data the pointer to the main data structure
1106 int deinit_wfd_client(void *data)
1108 __WDUG_LOG_FUNC_ENTER__;
1109 struct ug_data *ugd = (struct ug_data *)data;
1111 tethering_error_e ret = TETHERING_ERROR_NONE;
1112 tethering_h th = NULL;
1114 wfd_refresh_wifi_direct_state(ugd);
1116 if (ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING) {
1117 WDUG_LOGI("Stop discovery before deregister client\n");
1118 wifi_direct_cancel_discovery();
1121 res = wifi_direct_deinitialize();
1122 if (res != WIFI_DIRECT_ERROR_NONE) {
1123 WDUG_LOGE("Failed to deregister client. [%d]\n", res);
1126 /* release monitor timer */
1127 if (ugd->monitor_timer) {
1128 ecore_timer_del(ugd->monitor_timer);
1129 ugd->monitor_timer = NULL;
1132 /* release vconf, hotspot.. */
1133 res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
1135 WDUG_LOGE("Failed to ignore vconf key callback for wifi state\n");
1138 res = net_deregister_client();
1139 if (res != NET_ERR_NONE) {
1140 WDUG_LOGE("Failed to deregister network client. [%d]\n", res);
1143 res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _enable_hotspot_state_cb);
1145 WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
1148 res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _disable_hotspot_state_cb);
1150 WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
1153 th = ugd->hotspot_handle;
1156 /* Deregister cbs */
1157 ret = tethering_unset_enabled_cb(th, TETHERING_TYPE_WIFI);
1158 if (ret != TETHERING_ERROR_NONE) {
1159 WDUG_LOGE("tethering_unset_enabled_cb is failed(%d)\n", ret);
1162 ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_WIFI);
1163 if (ret != TETHERING_ERROR_NONE) {
1164 WDUG_LOGE("tethering_unset_disabled_cb is failed(%d)\n", ret);
1167 /* Destroy tethering handle */
1168 ret = tethering_destroy(th);
1169 if (ret != TETHERING_ERROR_NONE) {
1170 WDUG_LOGE("tethering_destroy is failed(%d)\n", ret);
1173 ugd->hotspot_handle = NULL;
1176 __WDUG_LOG_FUNC_EXIT__;
1181 * This function let the ug turn wi-fi direct on
1182 * @return If success, return 0, else return -1
1183 * @param[in] data the pointer to the main data structure
1185 int wfd_client_switch_on(void *data)
1187 __WDUG_LOG_FUNC_ENTER__;
1188 struct ug_data *ugd = (struct ug_data *)data;
1191 wfd_refresh_wifi_direct_state(ugd);
1192 WDUG_LOGI("WFD status [%d]\n", ugd->wfd_status);
1194 if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
1196 res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
1198 WDUG_LOGE("Failed to get wifi state from vconf. [%d]\n", res);
1203 res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
1205 WDUG_LOGE("Failed to get mobile hotspot state from vconf. [%d]\n", res);
1209 if (wifi_state > VCONFKEY_WIFI_OFF) {
1210 WDUG_LOGI("WiFi is connected, so have to turn off WiFi");
1211 wfd_ug_act_popup(ugd, _("IDS_WFD_POP_WIFI_OFF"), POPUP_TYPE_WIFI_OFF);
1212 } else if (hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) {
1213 WDUG_LOGI("WiFi is connected, so have to turn off WiFi");
1214 wfd_ug_act_popup(ugd, _("IDS_WFD_POP_HOTSPOT_OFF"), POPUP_TYPE_HOTSPOT_OFF);
1216 res = wifi_direct_activate();
1217 if (res != WIFI_DIRECT_ERROR_NONE) {
1218 WDUG_LOGE("Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
1219 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1221 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1222 wfd_ug_view_refresh_glitem(ugd->head);
1226 /* refresh the header */
1227 ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATING;
1228 wfd_ug_view_refresh_glitem(ugd->head);
1230 /* while activating, disable the buttons */
1231 if (ugd->scan_btn) {
1232 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1235 if (ugd->multi_scan_btn) {
1236 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1239 if (ugd->back_btn) {
1240 elm_object_disabled_set(ugd->back_btn, TRUE);
1244 WDUG_LOGI("Wi-Fi Direct is already activated\n");
1247 __WDUG_LOG_FUNC_EXIT__;
1252 * This function let the ug turn wi-fi direct off
1253 * @return If success, return 0, else return -1
1254 * @param[in] data the pointer to the main data structure
1256 int wfd_client_switch_off(void *data)
1258 __WDUG_LOG_FUNC_ENTER__;
1259 struct ug_data *ugd = (struct ug_data *)data;
1262 wfd_refresh_wifi_direct_state(ugd);
1263 WDUG_LOGI("WFD status [%d]\n", ugd->wfd_status);
1265 if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
1266 WDUG_LOGI("Wi-Fi Direct is already deactivated\n");
1268 /*if connected, disconnect all devices*/
1269 if (WIFI_DIRECT_STATE_CONNECTED == ugd->wfd_status) {
1270 res = wifi_direct_disconnect_all();
1271 if (res != WIFI_DIRECT_ERROR_NONE) {
1272 WDUG_LOGE("Failed to send disconnection request to all. [%d]\n", res);
1277 res = wifi_direct_deactivate();
1278 if (res != WIFI_DIRECT_ERROR_NONE) {
1279 WDUG_LOGE("Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
1280 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1282 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1283 wfd_ug_view_refresh_glitem(ugd->head);
1287 /* refresh the header */
1288 ugd->head_text_mode = HEAD_TEXT_TYPE_DEACTIVATING;
1289 wfd_ug_view_refresh_glitem(ugd->head);
1291 /* while deactivating, disable the buttons */
1292 if (ugd->scan_btn) {
1293 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1296 if (ugd->multi_scan_btn) {
1297 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1300 if (ugd->back_btn) {
1301 elm_object_disabled_set(ugd->back_btn, TRUE);
1305 __WDUG_LOG_FUNC_EXIT__;
1310 * This function let the ug turn wi-fi direct on/off forcely
1311 * @return If success, return 0, else return -1
1312 * @param[in] data the pointer to the main data structure
1313 * @param[in] onoff whether to turn on/off wi-fi direct
1315 int wfd_client_swtch_force(void *data, int onoff)
1317 __WDUG_LOG_FUNC_ENTER__;
1318 struct ug_data *ugd = (struct ug_data *)data;
1322 res = wifi_direct_activate();
1323 if (res != WIFI_DIRECT_ERROR_NONE) {
1324 WDUG_LOGE("Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
1325 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1327 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1328 wfd_ug_view_refresh_glitem(ugd->head);
1332 res = wifi_direct_deactivate();
1333 if (res != WIFI_DIRECT_ERROR_NONE) {
1334 WDUG_LOGE("Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
1335 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1337 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1338 wfd_ug_view_refresh_glitem(ugd->head);
1343 __WDUG_LOG_FUNC_EXIT__;
1348 * This function let the ug create a group
1349 * @return If success, return 0, else return -1
1351 int wfd_client_group_add()
1353 __WDUG_LOG_FUNC_ENTER__;
1356 res = wifi_direct_create_group();
1357 if (res != WIFI_DIRECT_ERROR_NONE) {
1358 WDUG_LOGE("Failed to add group");
1359 __WDUG_LOG_FUNC_EXIT__;
1363 __WDUG_LOG_FUNC_EXIT__;
1368 * This function let the ug connect to the device by mac address
1369 * @return If success, return 0, else return -1
1370 * @param[in] mac_addr the pointer to the mac address of device
1372 int wfd_client_connect(const char *mac_addr)
1374 __WDUG_LOG_FUNC_ENTER__;
1377 WDUG_LOGE("connect to peer=[%s]\n", mac_addr);
1378 res = wifi_direct_connect(mac_addr);
1379 if (res != WIFI_DIRECT_ERROR_NONE) {
1380 WDUG_LOGE("Failed to send connection request. [%d]\n", res);
1384 __WDUG_LOG_FUNC_EXIT__;
1389 * This function let the ug disconnect to the device by mac address
1390 * @return If success, return 0, else return -1
1391 * @param[in] mac_addr the pointer to the mac address of device
1393 int wfd_client_disconnect(const char *mac_addr)
1395 __WDUG_LOG_FUNC_ENTER__;
1398 if (mac_addr == NULL) {
1399 res = wifi_direct_disconnect_all();
1400 if (res != WIFI_DIRECT_ERROR_NONE) {
1401 WDUG_LOGE("Failed to send disconnection request to all. [%d]\n", res);
1405 res = wifi_direct_disconnect(mac_addr);
1406 if (res != WIFI_DIRECT_ERROR_NONE) {
1407 WDUG_LOGE("Failed to send disconnection request. [%d]\n", res);
1412 __WDUG_LOG_FUNC_EXIT__;
1417 * This function let the ug set the intent of a group owner
1418 * @return If success, return 0, else return -1
1419 * @param[in] go_intent the intent parameter
1421 int wfd_client_set_p2p_group_owner_intent(int go_intent)
1423 __WDUG_LOG_FUNC_ENTER__;
1426 res = wifi_direct_set_group_owner_intent(go_intent);
1427 if (res != WIFI_DIRECT_ERROR_NONE) {
1428 WDUG_LOGE("Failed to wifi_direct_set_go_intent(%d). [%d]\n", go_intent, res);
1432 __WDUG_LOG_FUNC_EXIT__;