2 * Copyright (c) 2018 Samsung Electronics Co., Ltd.
4 * Licensed under the Flora License, Version 1.1 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <wifi-manager.h>
23 typedef struct net_util_ {
26 connection_type_e net_state;
30 wifi_connection_changed_cb cb;
34 static net_util_t net_util;
36 static int _set_ap_mac();
37 static int _set_ap_ssid();
38 static int _set_ip_addr();
39 static void _connection_changed_cb(connection_type_e type, void *user_data);
44 ret = connection_create(&net_util.conn);
45 if (ret != CONNECTION_ERROR_NONE) {
46 _E("connection_create() failed, error: %s", get_error_message(ret));
50 ret = connection_get_type(net_util.conn, &net_util.net_state);
51 if (ret != CONNECTION_ERROR_NONE) {
52 _E("connection_get_type() failed, error: %s", get_error_message(ret));
56 ret = wifi_manager_initialize(&net_util.wifi);
57 if (ret != WIFI_MANAGER_ERROR_NONE) {
58 _E("wifi_manager_initialize() failed, error: %s", get_error_message(ret));
62 ret = connection_set_type_changed_cb(net_util.conn, _connection_changed_cb, NULL);
63 if (ret != CONNECTION_ERROR_NONE) {
64 _E("connection_set_type_changed_cb() failed, error: %s", get_error_message(ret));
75 ret = wifi_manager_deinitialize(&net_util.wifi);
76 if (ret != WIFI_MANAGER_ERROR_NONE) {
77 _E("wifi_manager_deinitialize() failed, error: %s", get_error_message(ret));
81 ret = connection_destroy(&net_util.conn);
82 if (ret != CONNECTION_ERROR_NONE) {
83 _E("wifi_manager_deinitialize() failed, error: %s", get_error_message(ret));
90 net_util.net_state = CONNECTION_TYPE_DISCONNECTED;
93 ret = connection_destroy(net_util.conn);
94 if (ret != CONNECTION_ERROR_NONE) {
95 _E("connection_set_type_changed_cb() failed, error: %s", get_error_message(ret));
98 ret = wifi_manager_deinitialize(&net_util.wifi);
99 if (ret != WIFI_MANAGER_ERROR_NONE) {
100 _E("wifi_manager_deinitialize() failed, error: %s", get_error_message(ret));
103 free(net_util.ap_mac);
104 free(net_util.ap_ssid);
105 free(net_util.ip_addr);
108 int net_util_set_wifi_connection_changed_cb(wifi_connection_changed_cb callback, void *user_data)
112 _E("Callback already set");
116 net_util.cb = callback;
117 net_util.cb_user_data = user_data;
121 int net_util_get_ap_mac(char **mac)
125 if (!net_util.ap_mac && _set_ap_mac() != 0) {
129 *mac = strdup(net_util.ap_mac);
133 int net_util_get_ap_ssid(char **ssid)
137 if (!net_util.ap_ssid && _set_ap_ssid() != 0) {
141 *ssid = strdup(net_util.ap_ssid);
145 int net_util_get_ip_addr(char **ip)
149 if (!net_util.ip_addr && _set_ip_addr() != 0) {
153 *ip = strdup(net_util.ip_addr);
157 static int _set_ap_mac()
159 wifi_manager_ap_h ap_h = NULL;
160 int ret = WIFI_MANAGER_ERROR_NONE;
162 free(net_util.ap_mac);
163 net_util.ap_mac = NULL;
165 if (net_util.net_state != CONNECTION_TYPE_WIFI) {
169 ret = wifi_manager_get_connected_ap(net_util.wifi, &ap_h);
170 if (ret != WIFI_MANAGER_ERROR_NONE) {
171 _E("wifi_manager_get_connected_ap() failed, error: %s", get_error_message(ret));
176 ret = wifi_manager_ap_get_bssid(ap_h, &net_util.ap_mac);
177 if (ret != WIFI_MANAGER_ERROR_NONE) {
178 _E("wifi_manager_ap_get_bssid() failed, error: %s", get_error_message(ret));
182 ret = wifi_manager_ap_destroy(ap_h);
183 if (ret != WIFI_MANAGER_ERROR_NONE) {
184 _E("wifi_manager_ap_destroy() failed, error: %s", get_error_message(ret));
189 static int _set_ap_ssid()
191 wifi_manager_ap_h ap_h = NULL;
193 int ret = WIFI_MANAGER_ERROR_NONE;
195 free(net_util.ap_ssid);
196 net_util.ap_ssid = NULL;
198 if (net_util.net_state != CONNECTION_TYPE_WIFI) {
202 ret = wifi_manager_get_connected_ap(net_util.wifi, &ap_h);
203 if (ret != WIFI_MANAGER_ERROR_NONE) {
204 _E("wifi_manager_get_connected_ap() failed, error: %s", get_error_message(ret));
209 ret = wifi_manager_ap_get_raw_ssid(ap_h, &net_util.ap_ssid, &ssid_len);
210 if (ret != WIFI_MANAGER_ERROR_NONE) {
211 _E("wifi_manager_ap_get_raw_ssid() failed, error: %s", get_error_message(ret));
215 ret = wifi_manager_ap_destroy(ap_h);
216 if (ret != WIFI_MANAGER_ERROR_NONE) {
217 _E("wifi_manager_ap_destroy() failed, error: %s", get_error_message(ret));
222 static int _set_ip_addr()
226 free(net_util.ip_addr);
227 net_util.ap_ssid = NULL;
229 if (net_util.net_state == CONNECTION_TYPE_DISCONNECTED) {
233 ret = connection_get_ip_address(net_util.conn, CONNECTION_ADDRESS_FAMILY_IPV4, &net_util.ip_addr);
234 if (CONNECTION_ERROR_NONE != ret) {
235 _E("connection_get_ip_address() failed, error: %s", get_error_message(ret));
242 static void _connection_changed_cb(connection_type_e type, void *user_data)
244 net_util.net_state = type;
249 if (type == CONNECTION_TYPE_WIFI && net_util.cb) {
250 net_util.cb(net_util.ap_mac, net_util.ap_ssid, net_util.ip_addr, net_util.cb_user_data);