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://www.tizenopensource.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>
31 #include <wifi-direct.h>
34 #include "wfd_ug_view.h"
35 #include "wfd_client.h"
37 static void _wifi_state_cb(keynode_t *key, void *data)
40 struct ug_data *ugd = (struct ug_data*) data;
44 res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
47 DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res);
48 // TODO: set genlist head item as "WiFi Direct"
52 if(wifi_state == VCONFKEY_WIFI_OFF)
54 DBG(LOG_VERBOSE, "WiFi is turned off\n");
55 wfd_client_swtch_force(ugd, TRUE);
59 DBG(LOG_VERBOSE, "WiFi is turned on\n");
62 res = net_deregister_client();
63 if(res != NET_ERR_NONE)
65 DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
71 static void _network_event_cb(net_event_info_t *event_info, void *user_data)
74 DBG(LOG_VERBOSE, "Event from network. [%d]\n", event_info->Event);
78 int wfd_wifi_off(void *data)
81 struct ug_data *ugd = (struct ug_data*) data;
84 res = vconf_notify_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb, ugd);
87 DBG(LOG_ERROR, "Failed to register vconf callback\n");
90 DBG(LOG_VERBOSE, "Vconf key callback is registered\n");
91 res = net_register_client((net_event_cb_t) _network_event_cb, NULL);
92 if(res != NET_ERR_NONE)
94 DBG(LOG_ERROR, "Failed to register network client. [%d]\n", res);
97 DBG(LOG_VERBOSE, "Network client is registered\n");
98 res = net_wifi_power_off();
99 if(res != NET_ERR_NONE)
101 DBG(LOG_ERROR, "Failed to turn off wifi. [%d]\n", res);
104 DBG(LOG_VERBOSE, "WiFi power off\n");
109 static void __disabled_cb(tethering_error_e error, tethering_type_e type, tethering_disabled_cause_e code, void *data)
113 if (error != TETHERING_ERROR_NONE) {
115 if (code != TETHERING_DISABLED_BY_REQUEST) {
118 DBG(LOG_ERROR, "error !!! TETHERING is not disabled.\n");
122 DBG(LOG_VERBOSE, "TETHERING is disabled.\n");
131 static device_type_s *wfd_client_find_peer_by_ssid(void *data, const char *ssid)
134 struct ug_data *ugd = (struct ug_data*) data;
139 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
143 for(i=0; i<ugd->gl_available_peer_cnt; i++)
145 DBG(LOG_VERBOSE, "check %dth peer\n", i);
146 if(!strcmp(ugd->gl_available_peers[i].ssid, ssid))
148 DBG(LOG_VERBOSE, "found peer. [%d]\n", i);
150 return &ugd->gl_available_peers[i];
159 static device_type_s *wfd_client_find_peer_by_mac(void *data, const char *mac_addr)
162 struct ug_data *ugd = (struct ug_data*) data;
167 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
171 if (ugd->multi_connect_mode != WFD_MULTI_CONNECT_MODE_NONE)
173 for(i=0; i<ugd->raw_multi_selected_peer_cnt; i++)
175 DBG(LOG_VERBOSE, "[Multi Connect] check %dth peer\n", i);
176 if(!strncmp(mac_addr, (const char*) ugd->raw_multi_selected_peers[i].mac_addr, MAC_LENGTH))
178 DBG(LOG_VERBOSE, "selected found peer. [%d]\n", i);
180 return &ugd->raw_multi_selected_peers[i];
186 for(i=0; i<ugd->raw_discovered_peer_cnt; i++)
188 DBG(LOG_VERBOSE, "check %dth peer\n", i);
189 if(!strncmp(mac_addr, (const char*) ugd->raw_discovered_peers[i].mac_addr, MAC_LENGTH))
191 DBG(LOG_VERBOSE, "found peer. [%d]\n", i);
193 return &ugd->raw_discovered_peers[i];
203 int _wfd_ug_view_clean_on_off(struct ug_data *ugd)
205 wfd_ug_view_update_peers(ugd);
209 void _activation_cb(int error_code, wifi_direct_device_state_e device_state, void *user_data)
213 struct ug_data *ugd = (struct ug_data*) user_data;
215 wfd_refresh_wifi_direct_state(ugd);
219 case WIFI_DIRECT_DEVICE_STATE_ACTIVATED:
220 DBG(LOG_VERBOSE, "WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n");
221 if(error_code != WIFI_DIRECT_ERROR_NONE)
223 DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code);
224 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_ACTIVATE_FAIL);
226 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
228 wfd_ug_view_refresh_glitem(ugd->head);
232 ugd->head_text_mode = HEAD_TEXT_TYPE_ACTIVATED;
234 wfd_ug_view_refresh_glitem(ugd->head);
236 wfg_ug_act_popup_remove(ugd);
238 res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
241 DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n");
244 res = wifi_direct_start_discovery(FALSE, 0);
245 if(res != WIFI_DIRECT_ERROR_NONE)
247 DBG(LOG_ERROR, "Failed to start discovery. [%d]\n", res);
249 DBG(LOG_VERBOSE, "Discovery is started\n");
252 case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED:
253 DBG(LOG_VERBOSE, "WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n");
254 if(error_code != WIFI_DIRECT_ERROR_NONE)
256 DBG(LOG_ERROR, "Error in Activation/Deactivation [%d]\n", error_code);
257 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_DEACTIVATE_FAIL);
258 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
260 wfd_ug_view_refresh_glitem(ugd->head);
264 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
267 wfd_ug_view_update_peers(ugd);
274 wfd_ug_view_refresh_glitem(ugd->head);
277 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
280 if (ugd->multi_connect_btn) {
281 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
288 bool _wfd_discoverd_peer_cb(wifi_direct_discovered_peer_info_s* peer, void *user_data)
292 struct ug_data *ugd = (struct ug_data*) user_data;
293 int peer_cnt = ugd->raw_discovered_peer_cnt;
295 DBG(LOG_VERBOSE, "%dth discovered peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address);
297 strncpy(ugd->raw_discovered_peers[peer_cnt].ssid, peer->ssid, sizeof(ugd->raw_discovered_peers[peer_cnt].ssid));
298 ugd->raw_discovered_peers[peer_cnt].category = peer->primary_device_type;
299 strncpy(ugd->raw_discovered_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
300 strncpy(ugd->raw_discovered_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
301 ugd->raw_discovered_peers[peer_cnt].is_group_owner = peer->is_group_owner;
302 ugd->raw_discovered_peers[peer_cnt].is_persistent_group_owner = peer->is_persistent_group_owner;
303 ugd->raw_discovered_peers[peer_cnt].is_connected = peer->is_connected;
305 if (TRUE == peer->is_connected) {
306 ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
308 ugd->raw_discovered_peers[peer_cnt].conn_status = PEER_CONN_STATUS_DISCONNECTED;
311 DBG(LOG_VERBOSE, "\tSSID: [%s]\n", ugd->raw_discovered_peers[peer_cnt].ssid);
312 DBG(LOG_VERBOSE, "\tPeer category [%d] -> [%d]\n", peer->primary_device_type, ugd->raw_discovered_peers[peer_cnt].category);
313 DBG(LOG_VERBOSE, "\tStatus: [%d]\n", ugd->raw_discovered_peers[peer_cnt].conn_status);
315 ugd->raw_discovered_peer_cnt ++;
318 free(peer->mac_address);
319 free(peer->interface_address);
326 bool _wfd_connected_peer_cb(wifi_direct_connected_peer_info_s* peer, void *user_data)
329 struct ug_data *ugd = (struct ug_data*) user_data;
330 int peer_cnt = ugd->raw_connected_peer_cnt;
332 DBG(LOG_VERBOSE, "%dth connected peer. [%s] [%s]\n", peer_cnt, peer->ssid, peer->mac_address);
334 strncpy(ugd->raw_connected_peers[peer_cnt].ssid, peer->ssid, sizeof(ugd->raw_connected_peers[peer_cnt].ssid));
335 ugd->raw_connected_peers[peer_cnt].category = peer->primary_device_type;
336 strncpy(ugd->raw_connected_peers[peer_cnt].mac_addr, peer->mac_address, MAC_LENGTH);
337 strncpy(ugd->raw_connected_peers[peer_cnt].if_addr, peer->interface_address, MAC_LENGTH);
338 ugd->raw_connected_peers[peer_cnt].conn_status = PEER_CONN_STATUS_CONNECTED;
340 DBG(LOG_VERBOSE, "\tStatus: [%d]\n", ugd->raw_connected_peers[peer_cnt].conn_status);
341 DBG(LOG_VERBOSE, "\tCategory: [%d]\n", ugd->raw_connected_peers[peer_cnt].category);
342 DBG(LOG_VERBOSE, "\tSSID: [%s]\n", ugd->raw_connected_peers[peer_cnt].ssid);
344 ugd->raw_connected_peer_cnt++;
347 free(peer->mac_address);
348 free(peer->interface_address);
354 int wfd_ug_get_discovered_peers(struct ug_data *ugd)
361 ugd->raw_discovered_peer_cnt = 0;
362 res = wifi_direct_foreach_discovered_peers(_wfd_discoverd_peer_cb, (void*) ugd);
363 if (res != WIFI_DIRECT_ERROR_NONE)
365 ugd->raw_discovered_peer_cnt = 0;
366 DBG(LOG_ERROR, "Get discovery result failed: %d\n", res);
373 int wfd_ug_get_connected_peers(struct ug_data *ugd)
380 ugd->raw_connected_peer_cnt = 0;
381 res = wifi_direct_foreach_connected_peers(_wfd_connected_peer_cb, (void*) ugd);
382 if(res != WIFI_DIRECT_ERROR_NONE)
384 ugd->raw_connected_peer_cnt = 0;
385 DBG(LOG_ERROR, "Get connected peer failed: %d\n", res);
390 void _discover_cb(int error_code, wifi_direct_discovery_state_e discovery_state, void *user_data)
393 struct ug_data *ugd = (struct ug_data*) user_data;
397 DBG(LOG_ERROR, "Incorrect parameter(NULL)\n");
401 if(discovery_state == WIFI_DIRECT_ONLY_LISTEN_STARTED)
403 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
405 else if(discovery_state == WIFI_DIRECT_DISCOVERY_STARTED)
407 ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
409 else if(discovery_state == WIFI_DIRECT_DISCOVERY_FOUND)
411 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
414 wfd_ug_view_refresh_glitem(ugd->head);
416 if (WIFI_DIRECT_DISCOVERY_STARTED == discovery_state) {
418 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
421 if (ugd->multi_connect_btn) {
422 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_STOPSCAN"), TRUE);
426 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
429 if (ugd->multi_connect_btn) {
430 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
434 wfd_ug_get_discovered_peers(ugd);
435 wfd_ug_get_connected_peers(ugd);
437 wfd_ug_view_update_peers(ugd);
439 _wfd_free_multiconnect_device(ugd);
440 _wfd_update_multiconnect_device(ugd);
441 //_change_multi_button_title(ugd);
447 void _connection_cb(int error_code, wifi_direct_connection_state_e connection_state, const char *mac_address, void *user_data)
451 struct ug_data *ugd = (struct ug_data*) user_data;
452 device_type_s *peer = NULL;
456 DBG(LOG_VERBOSE, "Connection event [%d], error_code [%d]\n", connection_state, error_code);
458 if(mac_address == NULL)
460 DBG(LOG_ERROR, "Incorrect parameter(peer mac is NULL)\n");
463 DBG(LOG_VERBOSE, "Connection event from %s", mac_address);
465 if (ugd->multi_connect_mode == WFD_MULTI_CONNECT_MODE_IN_PROGRESS)
467 peer = wfd_client_find_peer_by_mac(ugd, mac_address);
470 switch(connection_state)
472 case WIFI_DIRECT_CONNECTION_RSP:
473 if(error_code == WIFI_DIRECT_ERROR_NONE)
475 ugd->wfd_status = WFD_LINK_STATUS_CONNECTED;
476 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
480 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
482 ugd->g_source_multi_connect_next = g_timeout_add(1000, wfd_multi_connect_next_cb, ugd);
487 wfd_ug_get_connected_peers(ugd);
488 wfd_ug_view_update_peers(ugd);
492 DBG(LOG_VERBOSE, "peer is not found [%s]", mac_address);
498 peer = wfd_client_find_peer_by_mac(ugd, mac_address);
500 if (NULL == peer || NULL == peer->ssid) {
501 DBG(LOG_ERROR, "SSID from connection is NULL !!\n");
505 switch(connection_state)
507 case WIFI_DIRECT_CONNECTION_RSP:
508 DBG(LOG_VERBOSE, "WIFI_DIRECT_CONNECTION_RSP\n");
510 if(error_code == WIFI_DIRECT_ERROR_NONE)
512 ugd->wfd_status = WFD_LINK_STATUS_CONNECTED;
513 peer->conn_status = PEER_CONN_STATUS_CONNECTED;
517 peer->conn_status = PEER_CONN_STATUS_FAILED_TO_CONNECT;
520 wfd_ug_get_connected_peers(ugd);
521 wfd_ug_view_update_peers(ugd);
523 case WIFI_DIRECT_DISCONNECTION_RSP:
524 case WIFI_DIRECT_DISCONNECTION_IND:
525 case WIFI_DIRECT_DISASSOCIATION_IND:
526 DBG(LOG_VERBOSE, "WIFI_DIRECT_DISCONNECTION_X\n");
527 if(error_code != WIFI_DIRECT_ERROR_NONE)
529 // TODO: show disconnection error popup
534 peer->conn_status = PEER_CONN_STATUS_DISCONNECTED;
537 // In case of disconnect_all(), no specific peer is found.
540 wifi_direct_start_discovery(FALSE, 0);
541 ugd->wfd_status = WFD_LINK_STATUS_DISCOVERING;
542 ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
544 wfd_ug_view_refresh_glitem(ugd->head);
546 wfd_ug_get_discovered_peers(ugd);
547 wfd_ug_get_connected_peers(ugd);
548 wfd_ug_view_update_peers(ugd);
551 case WIFI_DIRECT_CONNECTION_IN_PROGRESS:
552 DBG(LOG_VERBOSE, "WIFI_DIRECT_CONNECTION_IN_PROGRESS\n");
553 peer->conn_status = PEER_CONN_STATUS_CONNECTING;
555 case WIFI_DIRECT_CONNECTION_REQ:
556 case WIFI_DIRECT_CONNECTION_WPS_REQ:
557 DBG(LOG_VERBOSE, "WIFI_DIRECT_CLI_EVENT_CONNECTION_REQ\n");
564 wfd_ug_view_refresh_glitem(peer->gl_item);
566 _change_multi_button_title(ugd);
569 /* refresh the scan button */
570 wfd_refresh_wifi_direct_state(ugd);
571 if (WIFI_DIRECT_STATE_CONNECTING == ugd->wfd_status ||
572 WIFI_DIRECT_STATE_DISCONNECTING == ugd->wfd_status) {
574 res = wifi_direct_is_group_owner(&owner);
575 if (res == WIFI_DIRECT_ERROR_NONE) {
578 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
581 if (ugd->multi_connect_btn) {
582 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), FALSE);
586 DBG(LOG_ERROR, "Failed to get whether client is group owner. [%d]\n", res);
590 wfd_ug_view_refresh_button(ugd->scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
593 if (ugd->multi_connect_btn) {
594 wfd_ug_view_refresh_button(ugd->multi_scan_btn, _("IDS_WFD_BUTTON_SCAN"), TRUE);
602 int wfd_get_vconf_status(void *data)
605 struct ug_data *ugd = (struct ug_data*) data;
608 // TODO: get wifi direct status from vconf
609 // db/mobile_hotspot/wifi_key (string)
611 dev_name = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR); // "db/setting/device_name" (VCONF_WFD_APNAME)
612 if (dev_name == NULL)
614 ugd->dev_name = strdup(DEFAULT_DEV_NAME);
615 DBG(LOG_ERROR, "The AP name is NULL(setting default value)\n");
619 ugd->dev_name = strdup(dev_name);
628 int wfd_refresh_wifi_direct_state(void *data)
630 struct ug_data *ugd = (struct ug_data*) data;
632 wifi_direct_state_e wfd_status;
633 res = wifi_direct_get_state(&wfd_status);
634 if(res != WIFI_DIRECT_ERROR_NONE)
636 DBG(LOG_ERROR, "Failed to get link status. [%d]\n", res);
639 DBG(LOG_VERBOSE, "WFD status [%d]", wfd_status);
640 ugd->wfd_status = wfd_status;
644 int init_wfd_client(void *data)
647 struct ug_data *ugd = (struct ug_data*) data;
650 res = wifi_direct_initialize();
651 if(res != WIFI_DIRECT_ERROR_NONE)
653 DBG(LOG_ERROR, "Failed to initialize wifi direct. [%d]\n", res);
657 res = wifi_direct_set_device_state_changed_cb(_activation_cb, (void*) ugd);
658 res = wifi_direct_set_discovery_state_changed_cb(_discover_cb, (void*) ugd);
659 res = wifi_direct_set_connection_state_changed_cb(_connection_cb, (void*) ugd);
661 /* update WFD status */
662 wfd_refresh_wifi_direct_state(ugd);
663 if (ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING)
668 DBG(LOG_VERBOSE, "WFD link status. [%d]\n", ugd->wfd_status);
675 int deinit_wfd_client(void *data)
678 struct ug_data *ugd = (struct ug_data*) data;
680 tethering_error_e ret = TETHERING_ERROR_NONE;
681 tethering_h th = NULL;
683 wfd_refresh_wifi_direct_state(ugd);
685 if(ugd->wfd_status == WIFI_DIRECT_STATE_DISCOVERING)
687 DBG(LOG_VERBOSE, "Stop discovery before deregister client\n");
688 wifi_direct_cancel_discovery();
691 res = wifi_direct_deinitialize();
692 if(res != WIFI_DIRECT_ERROR_NONE)
694 DBG(LOG_ERROR, "Failed to deregister client. [%d]\n", res);
697 res = vconf_ignore_key_changed(VCONFKEY_WIFI_STATE, _wifi_state_cb);
700 DBG(LOG_ERROR, "Failed to ignore vconf key callback for wifi state\n");
703 res = net_deregister_client();
704 if(res != NET_ERR_NONE)
706 DBG(LOG_ERROR, "Failed to deregister network client. [%d]\n", res);
714 int wfd_client_switch_on(void *data)
717 struct ug_data *ugd = (struct ug_data*) data;
720 DBG(LOG_VERBOSE, "WFD status [%d]\n", ugd->wfd_status);
722 if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATING)
724 ugd->wfd_status = WFD_LINK_STATUS_ACTIVATING;
727 res = vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
730 DBG(LOG_ERROR, "Failed to get wifi state from vconf. [%d]\n", res);
731 // TODO: set genlist head item as "WiFi Direct"
735 if(wifi_state > VCONFKEY_WIFI_OFF)
737 DBG(LOG_VERBOSE, "WiFi is connected, so have to turn off WiFi");
738 wfd_ug_act_popup(ugd, _("IDS_WFD_POP_WIFI_OFF"), POPUP_TYPE_WIFI_OFF); // "This will turn off Wi-Fi client operation.<br>Continue?"
740 else // (wifi_state < VCONFKEY_WIFI_CONNECTED && !(hotspot_mode & VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI))
742 res = wifi_direct_activate();
743 if(res != WIFI_DIRECT_ERROR_NONE)
745 DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
746 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
748 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
749 wfd_ug_view_refresh_glitem(ugd->head);
756 DBG(LOG_VERBOSE, "Wi-Fi Direct is already activated\n");
763 int wfd_client_switch_off(void *data)
766 struct ug_data *ugd = (struct ug_data*) data;
769 DBG(LOG_VERBOSE, "WFD status [%d]\n", ugd->wfd_status);
771 if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATING)
773 DBG(LOG_VERBOSE, "Wi-Fi Direct is already deactivated\n");
777 ugd->wfd_status = WFD_LINK_STATUS_DEACTIVATING;
779 res = wifi_direct_deactivate();
780 if(res != WIFI_DIRECT_ERROR_NONE)
782 DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
783 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
785 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
786 wfd_ug_view_refresh_glitem(ugd->head);
795 int wfd_client_swtch_force(void *data, int onoff)
798 struct ug_data *ugd = (struct ug_data*) data;
803 res = wifi_direct_activate();
804 if(res != WIFI_DIRECT_ERROR_NONE)
806 DBG(LOG_ERROR, "Failed to activate Wi-Fi Direct. error code = [%d]\n", res);
807 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_ACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
809 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
810 wfd_ug_view_refresh_glitem(ugd->head);
816 res = wifi_direct_deactivate();
817 if(res != WIFI_DIRECT_ERROR_NONE)
819 DBG(LOG_ERROR, "Failed to deactivate Wi-Fi Direct. error code = [%d]\n", res);
820 wfd_ug_warn_popup(ugd, _("IDS_WFD_POP_DEACTIVATE_FAIL"), POPUP_TYPE_TERMINATE);
822 ugd->head_text_mode = HEAD_TEXT_TYPE_DIRECT;
823 wfd_ug_view_refresh_glitem(ugd->head);
831 int wfd_client_start_discovery(void *data)
834 struct ug_data *ugd = (struct ug_data*) data;
838 ret = wifi_direct_cancel_discovery();
839 // ret = wifi_direct_cancel_discovery();
840 if (ret != WIFI_DIRECT_ERROR_NONE) {
841 DBG(LOG_ERROR, "Failed wfd discover() : %d", ret);
846 if(ugd->wfd_status >= WIFI_DIRECT_STATE_ACTIVATED)
848 res = wifi_direct_start_discovery(FALSE, 30);
849 if (res != WIFI_DIRECT_ERROR_NONE)
851 DBG(LOG_ERROR, "Failed to start wfd discovery. [%d]", res);
857 ugd->wfd_status = WIFI_DIRECT_DISCOVERY_STARTED;
858 wfd_refresh_wifi_direct_state(ugd);
859 ugd->head_text_mode = HEAD_TEXT_TYPE_SCANING;
860 wfd_ug_view_refresh_glitem(ugd->head);
861 wifi_direct_cancel_discovery();
863 res = wifi_direct_start_discovery(FALSE, 0);
864 if (res != WIFI_DIRECT_ERROR_NONE) {
865 DBG(LOG_ERROR, "Fail to restart scanning. %d\n", res);
869 ugd->wfd_status = WIFI_DIRECT_DISCOVERY_FOUND;
870 wfd_refresh_wifi_direct_state(ugd);
876 int wfd_client_connect(const char *mac_addr)
881 DBG(LOG_ERROR, "connect to peer=[%s]\n", mac_addr);
882 res = wifi_direct_connect(mac_addr);
883 if(res != WIFI_DIRECT_ERROR_NONE)
885 DBG(LOG_ERROR, "Failed to send connection request. [%d]\n", res);
892 int wfd_client_disconnect(const char *mac_addr)
899 res = wifi_direct_disconnect_all();
900 if(res != WIFI_DIRECT_ERROR_NONE)
902 DBG(LOG_ERROR, "Failed to send disconnection request to all. [%d]\n", res);
908 res = wifi_direct_disconnect(mac_addr);
909 if(res != WIFI_DIRECT_ERROR_NONE)
911 DBG(LOG_ERROR, "Failed to send disconnection request. [%d]\n", res);
919 int wfd_client_set_p2p_group_owner_intent(int go_intent)
924 res = wifi_direct_set_group_owner_intent(go_intent);
925 if(res != WIFI_DIRECT_ERROR_NONE)
927 DBG(LOG_ERROR, "Failed to wifi_direct_set_go_intent(%d). [%d]\n", go_intent, res);
934 int wfd_client_get_peers(struct ug_data *ugd)
937 if(ugd->wfd_status < WFD_LINK_STATUS_ACTIVATED)
939 ugd->raw_discovered_peer_cnt = 0;
940 ugd->raw_connected_peer_cnt = 0;
944 if(ugd->wfd_status > WIFI_DIRECT_STATE_ACTIVATING)
946 wfd_ug_get_discovered_peers(ugd);
949 if(ugd->wfd_status >= WIFI_DIRECT_STATE_CONNECTED)
951 wfd_ug_get_connected_peers(ugd);
954 wfd_ug_view_update_peers(ugd);
955 _change_multi_button_title(ugd);