4 * Copyright 2012 Samsung Electronics Co., Ltd
6 * Licensed under the Flora License, Version 1.1 (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, SSID_LENGTH);
553 ugd->raw_discovered_peers[peer_cnt].ssid[SSID_LENGTH-1] = '\0';
554 ugd->raw_discovered_peers[peer_cnt].category = peer->primary_device_type;
555 strncpy(ugd->raw_discovered_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
556 ugd->raw_discovered_peers[peer_cnt].mac_addr[MAC_LENGTH-1] = '\0';
557 strncpy(ugd->raw_discovered_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
558 ugd->raw_discovered_peers[peer_cnt].if_addr[MAC_LENGTH-1] = '\0';
559 ugd->raw_discovered_peers[peer_cnt].is_group_owner = peer->is_group_owner;
560 ugd->raw_discovered_peers[peer_cnt].is_persistent_group_owner = peer->is_persistent_group_owner;
561 ugd->raw_discovered_peers[peer_cnt].is_connected = peer->is_connected;
563 if (TRUE == peer->is_connected) {
564 ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
566 ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_DISCONNECTED;
569 WDUG_LOGI("\tSSID: [%s]\n", ugd->raw_discovered_peers[peer_cnt].ssid);
570 WDUG_LOGI("\tPeer category [%d] -> [%d]\n", peer->primary_device_type, ugd->raw_discovered_peers[peer_cnt].category);
571 WDUG_LOGI("\tStatus: [%d]\n", ugd->raw_discovered_peers[peer_cnt].conn_status);
573 ugd->raw_discovered_peer_cnt++;
575 free(peer->device_name);
576 free(peer->mac_address);
577 free(peer->interface_address);
580 __WDUG_LOG_FUNC_EXIT__;
585 * This function let the ug make a callback for connected peer
587 * @param[in] peer the pointer to the connected peer
588 * @param[in] user_data the pointer to the main data structure
590 bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s *peer, void *user_data)
592 __WDUG_LOG_FUNC_ENTER__;
593 if (NULL == peer || NULL == user_data) {
594 WDUG_LOGE("Incorrect parameter(NULL)\n");
595 __WDUG_LOG_FUNC_EXIT__;
599 struct ug_data *ugd = (struct ug_data *)user_data;
600 int peer_cnt = ugd->raw_connected_peer_cnt;
602 WDUG_LOGI("%dth connected peer. [%s] [%s]\n", peer_cnt, peer->device_name, peer->mac_address);
604 strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->device_name, SSID_LENGTH);
605 ugd->raw_connected_peers[peer_cnt].ssid[SSID_LENGTH-1] = '\0';
606 ugd->raw_connected_peers[peer_cnt].category = peer->primary_device_type;
607 strncpy(ugd->raw_connected_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
608 ugd->raw_connected_peers[peer_cnt].mac_addr[MAC_LENGTH-1] = '\0';
609 strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
610 ugd->raw_connected_peers[peer_cnt].if_addr[MAC_LENGTH-1] = '\0';
611 ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
613 WDUG_LOGI("\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status);
614 WDUG_LOGI("\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category);
615 WDUG_LOGI("\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid);
616 WDUG_LOGI("\tMAC addr: [" MACSTR "]\n", ugd->raw_connected_peers[peer_cnt].mac_addr);
617 WDUG_LOGI("\tIface addr: [" MACSTR "]\n", ugd->raw_connected_peers[peer_cnt].if_addr);
619 ugd->raw_connected_peer_cnt++;
621 free(peer->device_name);
622 free(peer->mac_address);
623 free(peer->interface_address);
626 __WDUG_LOG_FUNC_EXIT__;
631 * This function let the ug get the found peers
632 * @return If success, return 0, else return -1
633 * @param[in] ugd the pointer to the main data structure
635 int wfd_ug_get_discovered_peers(struct ug_data *ugd)
637 __WDUG_LOG_FUNC_ENTER__;
644 ugd->raw_discovered_peer_cnt = 0;
645 res = wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, (void *)ugd);
646 if (res != WIFI_DIRECT_ERROR_NONE) {
647 ugd->raw_discovered_peer_cnt = 0;
648 WDUG_LOGE("Get discovery result failed: %d\n", res);
651 __WDUG_LOG_FUNC_EXIT__;
656 * This function let the ug get the connected peers
657 * @return If success, return 0, else return -1
658 * @param[in] ugd the pointer to the main data structure
660 int wfd_ug_get_connected_peers(struct ug_data *ugd)
662 __WDUG_LOG_FUNC_ENTER__;
669 ugd->raw_connected_peer_cnt = 0;
670 res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void *)ugd);
671 if (res != WIFI_DIRECT_ERROR_NONE) {
672 ugd->raw_connected_peer_cnt = 0;
673 WDUG_LOGE("Get connected peer failed: %d\n", res);
676 __WDUG_LOG_FUNC_EXIT__;
681 * This function let the ug make a callback for deactivating wfd automatically
682 * @return if stop the timer, return ECORE_CALLBACK_CANCEL, else return ECORE_CALLBACK_RENEW
683 * @param[in] user_data the pointer to the main data structure
685 static Eina_Bool _wfd_automatic_deactivated_for_no_connection_cb(void *user_data)
689 struct ug_data *ugd = (struct ug_data *)user_data;
692 WDUG_LOGE("NULL parameters.\n");
693 return ECORE_CALLBACK_CANCEL;
696 /* check the action, if action is exist, keep the cb */
697 res = wifi_direct_get_state(&ugd->wfd_status);
698 if (res != WIFI_DIRECT_ERROR_NONE) {
699 WDUG_LOGE("Failed to get link status. [%d]\n", res);
700 return ECORE_CALLBACK_CANCEL;
703 if (ugd->last_wfd_status != ugd->wfd_status) {
704 WDUG_LOGE("Action is exist, last status: %d\n",
705 ugd->last_wfd_status);
706 ugd->last_wfd_status = ugd->wfd_status;
707 ugd->last_wfd_time = time(NULL);
708 return ECORE_CALLBACK_RENEW;
711 /* check the timeout, if not timeout, keep the cb */
712 interval = time(NULL) - ugd->last_wfd_time;
713 if (interval < MAX_NO_ACTION_TIME_OUT) {
714 return ECORE_CALLBACK_RENEW;
717 /* turn off the Wi-Fi Direct */
718 wifi_direct_get_state(&ugd->wfd_status);
719 if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
720 WDUG_LOGE("Wi-Fi Direct is already deactivated\n");
722 wfd_ug_warn_popup(ugd, IDS_WFD_POP_AUTOMATIC_TURN_OFF, POP_TYPE_AUTOMATIC_TURN_OFF);
725 return ECORE_CALLBACK_CANCEL;
729 * This function let the ug make a callback for registering discover event
731 * @param[in] error_code the returned error code
732 * @param[in] discovery_state the state of discover
733 * @param[in] user_data the pointer to the main data structure
735 void _discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data)
737 __WDUG_LOG_FUNC_ENTER__;
738 struct ug_data *ugd = (struct ug_data *)user_data;
741 WDUG_LOGE("Incorrect parameter(NULL)\n");
745 WDUG_LOGI("Discovery event [%d], error_code [%d]\n", discovery_state, error_code);
747 if (discovery_state == WIFI_DIRECT_ONLY_LISTEN_STARTED) {
748 __WDUG_LOG_FUNC_EXIT__;
750 } else if (discovery_state == WIFI_DIRECT_DISCOVERY_STARTED) {
751 ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
753 /* clear all the previous discovered peers */
754 if (ugd->raw_discovered_peer_cnt > 0) {
755 memset(ugd->raw_discovered_peers, 0x00, ugd->raw_discovered_peer_cnt*sizeof(device_type_s));
758 ugd->raw_discovered_peer_cnt = 0;
759 } else if (discovery_state == WIFI_DIRECT_DISCOVERY_FOUND) {
760 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
761 wfd_ug_get_discovered_peers(ugd);
763 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
765 if (TRUE == ugd->is_re_discover) {
766 ugd->is_re_discover = FALSE;
767 wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
769 /* start LISTEN ONLY mode */
770 wifi_direct_start_discovery(TRUE, 0);
774 wfd_ug_view_refresh_glitem(ugd->head);
775 wfd_ug_view_update_peers(ugd);
776 wfd_update_multiconnect_device(ugd);
778 if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state) {
780 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
783 if (ugd->multi_connect_btn) {
784 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
788 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
791 if (ugd->multi_connect_btn) {
792 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
796 __WDUG_LOG_FUNC_EXIT__;
801 * This function let the ug make a callback for registering connection event
803 * @param[in] error_code the returned error code
804 * @param[in] connection_state the state of connection
805 * @param[in] mac_address the mac address of peer
806 * @param[in] user_data the pointer to the main data structure
808 void _connection_cb(int error_code, wifi_direct_connection_state_e connection_state, const char *mac_address, void *user_data)
810 __WDUG_LOG_FUNC_ENTER__;
811 struct ug_data *ugd = (struct ug_data *)user_data;
812 device_type_s *peer = NULL;
816 WDUG_LOGI("Connection event [%d], error_code [%d], multi_connect_mode [%d]\n",
817 connection_state, error_code, ugd->multi_connect_mode);
819 if (mac_address == NULL) {
820 WDUG_LOGE("Incorrect parameter(peer mac is NULL)\n");
824 /* when not in connection, mac_address is empty */
825 if (connection_state <= WIFI_DIRECT_DISASSOCIATION_IND) {
826 peer = wfd_client_find_peer_by_mac(ugd, mac_address);
828 if (NULL == peer || '\0' == peer->ssid[0]) {
829 WDUG_LOGE("invalid peer from connection !!\n");
834 if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS) {
835 switch (connection_state) {
836 case WIFI_DIRECT_CONNECTION_RSP:
837 WDUG_LOGI("MULTI: WIFI_DIRECT_CONNECTION_RSP\n");
839 if (error_code == WIFI_DIRECT_ERROR_NONE) {
840 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
841 wfd_ug_get_connected_peers(ugd);
843 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
846 wfd_ug_view_update_peers(ugd);
848 /* connect the next peer */
849 ugd->g_source_multi_connect_next = g_timeout_add(1000, wfd_multi_connect_next_cb, ugd);
851 case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
852 WDUG_LOGI("MULTI: WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
853 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
854 wfd_ug_view_update_peers(ugd);
856 case WIFI_DIRECT_GROUP_CREATED:
857 WDUG_LOGI("MULTI: WIFI_DIRECT_GROUP_CREATED\n");
858 wfd_multi_connect_next_cb(ugd);
864 switch (connection_state) {
865 case WIFI_DIRECT_CONNECTION_RSP:
866 WDUG_LOGI("WIFI_DIRECT_CONNECTION_RSP\n");
868 if (error_code == WIFI_DIRECT_ERROR_NONE) {
869 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
870 wfd_ug_get_connected_peers(ugd);
872 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
875 wfd_ug_view_update_peers(ugd);
877 case WIFI_DIRECT_DISASSOCIATION_IND:
878 WDUG_LOGI("WIFI_DIRECT_DISASSOCIATION_IND\n");
879 /* change the multi connection mode, it can be connected now */
880 if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_COMPLETED) {
881 ugd->multi_connect_mode = WFD_MULTI_CONNECT_MODE_IN_PROGRESS;
884 /* if other peer disconnected, get connected peers and update */
885 peer->conn_status = PEER_CONN_STATUS_WAIT_FOR_CONNECT;
886 wfd_ug_get_connected_peers(ugd);
887 wfd_ug_view_update_peers(ugd);
889 case WIFI_DIRECT_DISCONNECTION_RSP:
890 case WIFI_DIRECT_DISCONNECTION_IND:
891 WDUG_LOGI("WIFI_DIRECT_DISCONNECTION_X\n");
893 /* when disconnection, clear all the connected peers */
894 if (ugd->raw_connected_peer_cnt > 0) {
895 memset(ugd->raw_connected_peers, 0x00, ugd->raw_connected_peer_cnt*sizeof(device_type_s));
898 ugd->raw_connected_peer_cnt = 0;
900 /* start discovery again */
901 res = wifi_direct_start_discovery(FALSE, MAX_SCAN_TIME_OUT);
902 if (res != WIFI_DIRECT_ERROR_NONE) {
903 WDUG_LOGE("Failed to start discovery. [%d]\n", res);
904 ugd->is_re_discover = TRUE;
905 wifi_direct_cancel_discovery();
907 WDUG_LOGI("Discovery is started\n");
908 ugd->is_re_discover = FALSE;
912 case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
913 WDUG_LOGI("WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
914 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
915 wfd_ug_view_update_peers(ugd);
917 case WIFI_DIRECT_CONNECTION_REQ:
918 case WIFI_DIRECT_CONNECTION_WPS_REQ:
919 WDUG_LOGI("WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ\n");
927 wfd_ug_view_refresh_glitem(peer->gl_item);
930 _change_multi_button_title(ugd);
933 /* refresh the scan button */
934 wfd_refresh_wifi_direct_state(ugd);
935 if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status ||
936 WIFI_DIRECT_STATE_DISCONNECTING == ugd->wfd_status) {
937 res = wifi_direct_is_group_owner(&owner);
938 if (res == WIFI_DIRECT_ERROR_NONE) {
941 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
944 if (ugd->multi_connect_btn) {
945 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
949 WDUG_LOGE("Failed to get whether client is group owner. [%d]\n", res);
953 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
956 if (ugd->multi_connect_btn) {
957 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
961 /* if no connection, start the monitor timer */
962 wifi_direct_get_state(&ugd->wfd_status);
963 WDUG_LOGI("status: %d", ugd->wfd_status);
965 if (ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED) {
966 if (ugd->monitor_timer) {
967 ecore_timer_del(ugd->monitor_timer);
968 ugd->monitor_timer = NULL;
971 if (NULL == ugd->monitor_timer) {
972 WDUG_LOGI("start the monitor timer\n");
973 ugd->last_wfd_time = time(NULL);
974 ugd->monitor_timer = ecore_timer_add(5.0,
975 (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ugd);
979 __WDUG_LOG_FUNC_EXIT__;
984 * This function let the ug get wi-fi direct status from vconf
985 * @return If success, return 0, else return -1
986 * @param[in] data the pointer to the main data structure
988 int wfd_get_vconf_status(void *data)
990 __WDUG_LOG_FUNC_ENTER__;
991 struct ug_data *ugd = (struct ug_data *)data;
993 int wifi_direct_state = 0;
995 /* get wifi direct status from vconf */
996 if (vconf_get_int(VCONFKEY_WIFI_DIRECT_STATE, &wifi_direct_state) < 0) {
997 WDUG_LOGE("Error reading vconf (%s)\n", VCONFKEY_WIFI_DIRECT_STATE);
1001 ugd->wfd_status = wifi_direct_state;
1003 /* get device name from vconf */
1004 dev_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1005 if (dev_name == NULL) {
1006 ugd->dev_name = strdup(DEFAULT_DEV_NAME);
1007 WDUG_LOGE("The AP name is NULL(setting default value)\n");
1009 ugd->dev_name = strdup(dev_name);
1013 __WDUG_LOG_FUNC_EXIT__;
1018 * This function let the ug refresh current status of wi-fi direct
1019 * @return If success, return 0, else return -1
1020 * @param[in] data the pointer to the main data structure
1022 int wfd_refresh_wifi_direct_state(void *data)
1024 __WDUG_LOG_FUNC_ENTER__;
1025 struct ug_data *ugd = (struct ug_data *)data;
1027 wifi_direct_state_e wfd_status;
1029 res = wifi_direct_get_state(&wfd_status);
1030 if (res != WIFI_DIRECT_ERROR_NONE) {
1031 WDUG_LOGE("Failed to get link status. [%d]\n", res);
1035 WDUG_LOGI("WFD status [%d]", wfd_status);
1036 ugd->wfd_status = wfd_status;
1038 __WDUG_LOG_FUNC_EXIT__;
1043 * This function let the ug do initialization
1044 * @return If success, return 0, else return -1
1045 * @param[in] data the pointer to the main data structure
1047 int init_wfd_client(void *data)
1049 __WDUG_LOG_FUNC_ENTER__;
1050 struct ug_data *ugd = (struct ug_data *)data;
1053 res = wifi_direct_initialize();
1054 if (res != WIFI_DIRECT_ERROR_NONE) {
1055 WDUG_LOGE("Failed to initialize wifi direct. [%d]\n", res);
1059 res = wifi_direct_initialize();
1060 if (res != WIFI_DIRECT_ERROR_NONE) {
1061 WDUG_LOGE("Failed to initialize Wi-Fi Direct. error code = [%d]\n", res);
1065 res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void *)ugd);
1066 if (res != WIFI_DIRECT_ERROR_NONE) {
1067 WDUG_LOGE("Failed to register _cb_activation. error code = [%d]\n", res);
1071 res = wifi_direct_set_discovery_state_changed_cb(_discover_cb, (void *)ugd);
1072 if (res != WIFI_DIRECT_ERROR_NONE) {
1073 WDUG_LOGE("Failed to register _cb_discover. error code = [%d]\n", res);
1077 res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void *)ugd);
1078 if (res != WIFI_DIRECT_ERROR_NONE) {
1079 WDUG_LOGE("Failed to register _cb_connection. error code = [%d]\n", res);
1083 /* update WFD status */
1084 wfd_refresh_wifi_direct_state(ugd);
1085 if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING) {
1091 WDUG_LOGI("WFD link status. [%d]\n", ugd->wfd_status);
1093 /* start the monitor timer */
1094 ugd->last_wfd_time = time(NULL);
1095 ugd->last_wfd_status = WIFI_DIRECT_STATE_DEACTIVATED;
1096 ugd->monitor_timer = ecore_timer_add(5.0, (Ecore_Task_Cb)_wfd_automatic_deactivated_for_no_connection_cb, ugd);
1098 ugd->is_re_discover = FALSE;
1100 __WDUG_LOG_FUNC_EXIT__;
1105 * This function let the ug do de-initialization
1106 * @return If success, return 0, else return -1
1107 * @param[in] data the pointer to the main data structure
1109 int deinit_wfd_client(void *data)
1111 __WDUG_LOG_FUNC_ENTER__;
1112 struct ug_data *ugd = (struct ug_data *)data;
1114 tethering_error_e ret = TETHERING_ERROR_NONE;
1115 tethering_h th = NULL;
1117 wfd_refresh_wifi_direct_state(ugd);
1119 if (ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING) {
1120 WDUG_LOGI("Stop discovery before deregister client\n");
1121 wifi_direct_cancel_discovery();
1124 res = wifi_direct_deinitialize();
1125 if (res != WIFI_DIRECT_ERROR_NONE) {
1126 WDUG_LOGE("Failed to deregister client. [%d]\n", res);
1129 /* release monitor timer */
1130 if (ugd->monitor_timer) {
1131 ecore_timer_del(ugd->monitor_timer);
1132 ugd->monitor_timer = NULL;
1135 /* release vconf, hotspot.. */
1136 res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
1138 WDUG_LOGE("Failed to ignore vconf key callback for wifi state\n");
1141 res = net_deregister_client();
1142 if (res != NET_ERR_NONE) {
1143 WDUG_LOGE("Failed to deregister network client. [%d]\n", res);
1146 res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _enable_hotspot_state_cb);
1148 WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
1151 res = vconf_ignore_key_changed(VCONFKEY_MOBILE_HOTSPOT_MODE, _disable_hotspot_state_cb);
1153 WDUG_LOGE("Failed to ignore vconf key callback for hotspot state\n");
1156 th = ugd->hotspot_handle;
1159 /* Deregister cbs */
1160 ret = tethering_unset_enabled_cb(th, TETHERING_TYPE_WIFI);
1161 if (ret != TETHERING_ERROR_NONE) {
1162 WDUG_LOGE("tethering_unset_enabled_cb is failed(%d)\n", ret);
1165 ret = tethering_unset_disabled_cb(th, TETHERING_TYPE_WIFI);
1166 if (ret != TETHERING_ERROR_NONE) {
1167 WDUG_LOGE("tethering_unset_disabled_cb is failed(%d)\n", ret);
1170 /* Destroy tethering handle */
1171 ret = tethering_destroy(th);
1172 if (ret != TETHERING_ERROR_NONE) {
1173 WDUG_LOGE("tethering_destroy is failed(%d)\n", ret);
1176 ugd->hotspot_handle = NULL;
1179 __WDUG_LOG_FUNC_EXIT__;
1184 * This function let the ug turn wi-fi direct on
1185 * @return If success, return 0, else return -1
1186 * @param[in] data the pointer to the main data structure
1188 int wfd_client_switch_on(void *data)
1190 __WDUG_LOG_FUNC_ENTER__;
1191 struct ug_data *ugd = (struct ug_data *)data;
1194 wfd_refresh_wifi_direct_state(ugd);
1195 WDUG_LOGI("WFD status [%d]\n", ugd->wfd_status);
1197 if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
1199 res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
1201 WDUG_LOGE("Failed to get wifi state from vconf. [%d]\n", res);
1206 res = vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &hotspot_mode);
1208 WDUG_LOGE("Failed to get mobile hotspot state from vconf. [%d]\n", res);
1212 if (wifi_state > VCONFKEY_WIFI_OFF) {
1213 WDUG_LOGI("WiFi is connected, so have to turn off WiFi");
1214 wfd_ug_act_popup(ugd, _("IDS_WFD_POP_WIFI_OFF"), POPUP_TYPE_WIFI_OFF);
1215 } else if (hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI) {
1216 WDUG_LOGI("WiFi is connected, so have to turn off WiFi");
1217 wfd_ug_act_popup(ugd, _("IDS_WFD_POP_HOTSPOT_OFF"), POPUP_TYPE_HOTSPOT_OFF);
1219 res = wifi_direct_activate();
1220 if (res != WIFI_DIRECT_ERROR_NONE) {
1221 WDUG_LOGE("Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
1222 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1224 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1225 wfd_ug_view_refresh_glitem(ugd->head);
1229 /* refresh the header */
1230 ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATING;
1231 wfd_ug_view_refresh_glitem(ugd->head);
1233 /* while activating, disable the buttons */
1234 if (ugd->scan_btn) {
1235 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1238 if (ugd->multi_scan_btn) {
1239 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1242 if (ugd->back_btn) {
1243 elm_object_disabled_set(ugd->back_btn, TRUE);
1247 WDUG_LOGI("Wi-Fi Direct is already activated\n");
1250 __WDUG_LOG_FUNC_EXIT__;
1255 * This function let the ug turn wi-fi direct off
1256 * @return If success, return 0, else return -1
1257 * @param[in] data the pointer to the main data structure
1259 int wfd_client_switch_off(void *data)
1261 __WDUG_LOG_FUNC_ENTER__;
1262 struct ug_data *ugd = (struct ug_data *)data;
1265 wfd_refresh_wifi_direct_state(ugd);
1266 WDUG_LOGI("WFD status [%d]\n", ugd->wfd_status);
1268 if (ugd->wfd_status < WIFI_DIRECT_STATE_ACTIVATING) {
1269 WDUG_LOGI("Wi-Fi Direct is already deactivated\n");
1271 /*if connected, disconnect all devices*/
1272 if (WIFI_DIRECT_STATE_CONNECTED == ugd->wfd_status) {
1273 res = wifi_direct_disconnect_all();
1274 if (res != WIFI_DIRECT_ERROR_NONE) {
1275 WDUG_LOGE("Failed to send disconnection request to all. [%d]\n", res);
1280 res = wifi_direct_deactivate();
1281 if (res != WIFI_DIRECT_ERROR_NONE) {
1282 WDUG_LOGE("Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
1283 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1285 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1286 wfd_ug_view_refresh_glitem(ugd->head);
1290 /* refresh the header */
1291 ugd->head_text_mode = HEAD_TEXT_TYPE_DEACTIVATING;
1292 wfd_ug_view_refresh_glitem(ugd->head);
1294 /* while deactivating, disable the buttons */
1295 if (ugd->scan_btn) {
1296 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1299 if (ugd->multi_scan_btn) {
1300 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
1303 if (ugd->back_btn) {
1304 elm_object_disabled_set(ugd->back_btn, TRUE);
1308 __WDUG_LOG_FUNC_EXIT__;
1313 * This function let the ug turn wi-fi direct on/off forcely
1314 * @return If success, return 0, else return -1
1315 * @param[in] data the pointer to the main data structure
1316 * @param[in] onoff whether to turn on/off wi-fi direct
1318 int wfd_client_swtch_force(void *data, int onoff)
1320 __WDUG_LOG_FUNC_ENTER__;
1321 struct ug_data *ugd = (struct ug_data *)data;
1325 res = wifi_direct_activate();
1326 if (res != WIFI_DIRECT_ERROR_NONE) {
1327 WDUG_LOGE("Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
1328 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1330 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1331 wfd_ug_view_refresh_glitem(ugd->head);
1335 res = wifi_direct_deactivate();
1336 if (res != WIFI_DIRECT_ERROR_NONE) {
1337 WDUG_LOGE("Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
1338 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
1340 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
1341 wfd_ug_view_refresh_glitem(ugd->head);
1346 __WDUG_LOG_FUNC_EXIT__;
1351 * This function let the ug create a group
1352 * @return If success, return 0, else return -1
1354 int wfd_client_group_add()
1356 __WDUG_LOG_FUNC_ENTER__;
1359 res = wifi_direct_create_group();
1360 if (res != WIFI_DIRECT_ERROR_NONE) {
1361 WDUG_LOGE("Failed to add group");
1362 __WDUG_LOG_FUNC_EXIT__;
1366 __WDUG_LOG_FUNC_EXIT__;
1371 * This function let the ug connect to the device by mac address
1372 * @return If success, return 0, else return -1
1373 * @param[in] mac_addr the pointer to the mac address of device
1375 int wfd_client_connect(const char *mac_addr)
1377 __WDUG_LOG_FUNC_ENTER__;
1380 WDUG_LOGE("connect to peer=[%s]\n", mac_addr);
1381 res = wifi_direct_connect(mac_addr);
1382 if (res != WIFI_DIRECT_ERROR_NONE) {
1383 WDUG_LOGE("Failed to send connection request. [%d]\n", res);
1387 __WDUG_LOG_FUNC_EXIT__;
1392 * This function let the ug disconnect to the device by mac address
1393 * @return If success, return 0, else return -1
1394 * @param[in] mac_addr the pointer to the mac address of device
1396 int wfd_client_disconnect(const char *mac_addr)
1398 __WDUG_LOG_FUNC_ENTER__;
1401 if (mac_addr == NULL) {
1402 res = wifi_direct_disconnect_all();
1403 if (res != WIFI_DIRECT_ERROR_NONE) {
1404 WDUG_LOGE("Failed to send disconnection request to all. [%d]\n", res);
1408 res = wifi_direct_disconnect(mac_addr);
1409 if (res != WIFI_DIRECT_ERROR_NONE) {
1410 WDUG_LOGE("Failed to send disconnection request. [%d]\n", res);
1415 __WDUG_LOG_FUNC_EXIT__;
1420 * This function let the ug set the intent of a group owner
1421 * @return If success, return 0, else return -1
1422 * @param[in] go_intent the intent parameter
1424 int wfd_client_set_p2p_group_owner_intent(int go_intent)
1426 __WDUG_LOG_FUNC_ENTER__;
1429 res = wifi_direct_set_group_owner_intent(go_intent);
1430 if (res != WIFI_DIRECT_ERROR_NONE) {
1431 WDUG_LOGE("Failed to wifi_direct_set_go_intent(%d). [%d]\n", go_intent, res);
1435 __WDUG_LOG_FUNC_EXIT__;