summaryrefslogtreecommitdiff
path: root/popup-wifidirect/src/wfd-app-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'popup-wifidirect/src/wfd-app-client.c')
-rw-r--r--popup-wifidirect/src/wfd-app-client.c426
1 files changed, 426 insertions, 0 deletions
diff --git a/popup-wifidirect/src/wfd-app-client.c b/popup-wifidirect/src/wfd-app-client.c
new file mode 100644
index 0000000..a4c9c98
--- /dev/null
+++ b/popup-wifidirect/src/wfd-app-client.c
@@ -0,0 +1,426 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * This file implements wifi direct application client functions.
+ *
+ * @file wfd-app-client.c
+ * @author Sungsik Jang (sungsik.jang@samsung.com)
+ * @version 0.1
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "wifi-direct.h"
+#include "wfd-app.h"
+#include "wfd-app-util.h"
+
+
+void _cb_activation(int error_code, wifi_direct_device_state_e device_state,
+ void *user_data)
+{
+ __WFD_APP_FUNC_ENTER__;
+
+ wfd_appdata_t *ad = (wfd_appdata_t *) user_data;
+
+ switch (device_state)
+ {
+ case WIFI_DIRECT_DEVICE_STATE_ACTIVATED:
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "event ------------------ WIFI_DIRECT_DEVICE_STATE_ACTIVATED\n");
+ break;
+
+ case WIFI_DIRECT_DEVICE_STATE_DEACTIVATED:
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "event ------------------ WIFI_DIRECT_DEVICE_STATE_DEACTIVATED\n");
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "Termination process of wifi-direct popup begins...\n");
+ elm_exit();
+ break;
+
+ default:
+ break;
+ }
+
+ __WFD_APP_FUNC_EXIT__;
+
+}
+
+
+static wfd_device_info_t *_wfd_app_find_peer_by_mac_address(void *data,
+ const char *mac_address)
+{
+ __WFD_APP_FUNC_ENTER__;
+
+ wfd_appdata_t *ad = (wfd_appdata_t *) data;
+
+ int i;
+
+ if (ad == NULL)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "Incorrect parameter(NULL)\n");
+ return NULL;
+ }
+
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "find peer by MAC [%s] \n", mac_address);
+
+ for (i = 0; i < ad->discovered_peer_count; i++)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "check %dth peer\n", i);
+
+ if (!strncmp(mac_address, (const char *) ad->discovered_peers[i].mac_address, 18))
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "found peer. [%d]\n", i);
+ __WFD_APP_FUNC_EXIT__;
+ return &ad->discovered_peers[i];
+ }
+ }
+
+ __WFD_APP_FUNC_EXIT__;
+
+ return NULL;
+}
+
+
+bool _wfd_app_discoverd_peer_cb(wifi_direct_discovered_peer_info_s * peer,
+ void *user_data)
+{
+ __WFD_APP_FUNC_ENTER__;
+
+ wfd_appdata_t *ad = (wfd_appdata_t *) user_data;
+
+ if (NULL != peer->ssid)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "discovered peer ssid[%s]\n", peer->ssid);
+ strncpy(ad->discovered_peers[ad->discovered_peer_count].ssid, peer->ssid, 32);
+ }
+ else
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "peer's ssid is NULL\n");
+ }
+
+ if (NULL != peer->mac_address)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "discovered peer mac[%s]\n", peer->mac_address);
+ strncpy(ad->discovered_peers[ad->discovered_peer_count].mac_address, peer->mac_address, 18);
+ }
+ else
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "peer's mac is NULL\n");
+ }
+
+ ad->discovered_peer_count++;
+
+ __WFD_APP_FUNC_EXIT__;
+
+ return TRUE;
+
+}
+
+
+void _cb_discover(int error_code, wifi_direct_discovery_state_e discovery_state,
+ void *user_data)
+{
+ __WFD_APP_FUNC_ENTER__;
+
+ wfd_appdata_t *ad = (wfd_appdata_t *) user_data;
+ int ret;
+
+ switch (discovery_state)
+ {
+ case WIFI_DIRECT_DISCOVERY_STARTED:
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_DISCOVERY_STARTED\n");
+ }
+ break;
+
+ case WIFI_DIRECT_ONLY_LISTEN_STARTED:
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_ONLY_LISTEN_STARTED\n");
+ }
+ break;
+
+ case WIFI_DIRECT_DISCOVERY_FINISHED:
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_DISCOVERY_FINISHED\n");
+ }
+ break;
+
+ case WIFI_DIRECT_DISCOVERY_FOUND:
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_DISCOVERY_FOUND\n");
+
+ if (NULL != ad->discovered_peers)
+ free(ad->discovered_peers);
+
+ ad->discovered_peers = calloc(10, sizeof(wfd_device_info_t));
+ ad->discovered_peer_count = 0;
+
+ ret = wifi_direct_foreach_discovered_peers(_wfd_app_discoverd_peer_cb, (void *) ad);
+ if (ret != WIFI_DIRECT_ERROR_NONE)
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "get discovery result failed: %d\n", ret);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ __WFD_APP_FUNC_EXIT__;
+
+}
+
+void _cb_connection(int error_code,
+ wifi_direct_connection_state_e connection_state,
+ const char *mac_address, void *user_data)
+{
+ __WFD_APP_FUNC_ENTER__;
+
+ wfd_appdata_t *ad = (wfd_appdata_t *) user_data;
+ int result;
+
+ switch (connection_state)
+ {
+ case WIFI_DIRECT_CONNECTION_RSP:
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "event ------------------ WIFI_DIRECT_CONNECTION_RSP\n");
+
+ if (error_code == WIFI_DIRECT_ERROR_NONE)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "Link Complete!\n");
+ wfd_prepare_popup(WFD_POP_NOTI_CONNECTED, NULL);
+ }
+ else
+ {
+ if (error_code == WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT)
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "Error Code - WIFI_DIRECT_ERROR_CONNECTION_TIME_OUT\n");
+ else if (error_code == WIFI_DIRECT_ERROR_AUTH_FAILED)
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "Error Code - WIFI_DIRECT_ERROR_AUTH_FAILED\n");
+ else if (error_code == WIFI_DIRECT_ERROR_CONNECTION_FAILED)
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "Error Code - WIFI_DIRECT_ERROR_CONNECTION_FAILED\n");
+
+ wfd_prepare_popup(WFD_POP_FAIL_CONNECT, NULL);
+
+ result = wifi_direct_start_discovery(FALSE, 0);
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "wifi_direct_start_discovery() result=[%d]\n",
+ result);
+ }
+ }
+ break;
+
+ case WIFI_DIRECT_CONNECTION_WPS_REQ:
+ {
+ wifi_direct_config_data_s *config = NULL;
+
+ memcpy(ad->peer_mac, mac_address, sizeof(ad->peer_mac));
+
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "event ------------------ WIFI_DIRECT_CONNECTION_WPS_REQ\n");
+ result = wifi_direct_get_config_data(&config);
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "wifi_direct_client_get_config_data() result=[%d]\n",
+ result);
+
+ if (config->wps_config == WIFI_DIRECT_WPS_PUSHBUTTON)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "wps_config is WFD_WPS_PUSHBUTTON. Ignore it..\n");
+ }
+ else if (config->wps_config == WIFI_DIRECT_WPS_KEYPAD)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wps_config is WFD_WPS_KEYPAD\n");
+
+ result = wifi_direct_generate_wps_pin();
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "wifi_direct_client_generate_wps_pin() result=[%d]\n",
+ result);
+
+ char *pin_number = NULL;
+ result = wifi_direct_get_wps_pin(&pin_number);
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "wifi_direct_client_get_wps_pin() result=[%d]. pin=[%s]\n",
+ result, ad->pin_number);
+
+ strncpy(ad->pin_number, pin_number, 32);
+
+ result = wifi_direct_accept_connection(ad->peer_mac);
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "wifi_direct_accept_connection[%s] result=[%d].\n",
+ ad->peer_mac, result);
+
+ result = wifi_direct_activate_pushbutton();
+ wfd_prepare_popup(WFD_POP_PROG_CONNECT_WITH_PIN, NULL);
+
+ if (pin_number != NULL)
+ free(pin_number);
+ }
+ else if (config->wps_config == WIFI_DIRECT_WPS_DISPLAY)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wps_config is WFD_WPS_DISPLAY\n");
+ wfd_prepare_popup(WFD_POP_PROG_CONNECT_WITH_KEYPAD,
+ (void *) NULL);
+ }
+ else
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wps_config is unkown!\n");
+
+ }
+ if (config != NULL)
+ free(config);
+ }
+ break;
+
+ case WIFI_DIRECT_CONNECTION_REQ:
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "event ------------------ WIFI_DIRECT_CONNECTION_REQ\n");
+
+ wifi_direct_config_data_s *config = NULL;
+ wfd_device_info_t *peer_info = NULL;
+
+ if (NULL == mac_address)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "ERROR : incomming_peer_mac is NULL !!\n");
+ return;
+ }
+
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "Connection Request from MAC[%s]\n", mac_address);
+ strncpy(ad->peer_mac, mac_address, strlen(mac_address));
+
+ peer_info = _wfd_app_find_peer_by_mac_address(ad, mac_address);
+
+ if (NULL != peer_info->ssid)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "Connection Request from SSID[%s]\n", peer_info->ssid);
+ strncpy(ad->peer_name, peer_info->ssid, strlen(peer_info->ssid));
+ }
+ else
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "incomming_peer SSID is NULL !!\n");
+ }
+
+ if (ad->peer_name == NULL || strlen(ad->peer_name) == 0)
+ strncpy(ad->peer_name, ad->peer_mac, strlen(ad->peer_mac));
+
+ result = wifi_direct_get_config_data(&config);
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wifi_direct_client_get_config_data() result=[%d]\n", result);
+
+ if (config->wps_config == WIFI_DIRECT_WPS_PUSHBUTTON)
+ {
+ char pushbutton;
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wps_config is WFD_WPS_PUSHBUTTON\n");
+
+ wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_PUSHBUTTON_REQ, NULL);
+ }
+ else if (config->wps_config == WIFI_DIRECT_WPS_DISPLAY)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wps_config is WFD_WPS_DISPLAY\n");
+
+ result = wifi_direct_generate_wps_pin();
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wifi_direct_client_generate_wps_pin() result=[%d]\n", result);
+
+ char *pin_number = NULL;
+ result = wifi_direct_get_wps_pin(&pin_number);
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wifi_direct_get_wps_pin() result=[%d]\n", result);
+
+ strncpy(ad->pin_number, pin_number, 32);
+
+ wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_DISPLAY_REQ, NULL);
+
+ if (pin_number != NULL)
+ free(pin_number);
+ }
+ else if (config->wps_config == WIFI_DIRECT_WPS_KEYPAD)
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wps_config is WFD_WPS_KEYPAD\n");
+ wfd_prepare_popup(WFD_POP_APRV_CONNECTION_WPS_KEYPAD_REQ, (void *) NULL);
+ }
+ else
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW, "wps_config is unkown!\n");
+ }
+
+ if (config != NULL)
+ free(config);
+ }
+ break;
+
+ case WIFI_DIRECT_DISCONNECTION_IND:
+ {
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "event ------------------ WIFI_DIRECT_DISCONNECTION_IND\n");
+ }
+ break;
+
+ case WIFI_DIRECT_DISCONNECTION_RSP:
+ {
+ wfd_destroy_popup();
+
+ result = wifi_direct_start_discovery(FALSE, 0);
+ WFD_APP_LOG(WFD_APP_LOG_LOW,
+ "wifi_direct_start_discovery() result=[%d]\n", result);
+ }
+ break;
+
+ default:
+ break;
+
+ }
+
+ __WFD_APP_FUNC_EXIT__;
+}
+
+
+int init_wfd_popup_client(wfd_appdata_t * ad)
+{
+ __WFD_APP_FUNC_ENTER__;
+ int ret;
+
+ ret = wifi_direct_initialize();
+
+ ret = wifi_direct_set_device_state_changed_cb(_cb_activation, (void *) ad);
+ ret = wifi_direct_set_discovery_state_changed_cb(_cb_discover, (void *) ad);
+ ret =
+ wifi_direct_set_connection_state_changed_cb(_cb_connection,
+ (void *) ad);
+
+ __WFD_APP_FUNC_EXIT__;
+
+ if (ret)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+int deinit_wfd_popup_client(void)
+{
+ __WFD_APP_FUNC_ENTER__;
+
+ int ret;
+
+ ret = wifi_direct_deinitialize();
+
+ __WFD_APP_FUNC_EXIT__;
+
+ if (ret)
+ return TRUE;
+ else
+ return FALSE;
+}