2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (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://www.apache.org/licenses/LICENSE-2.0
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 using System.Collections.Generic;
19 using System.Threading;
20 using System.Threading.Tasks;
21 using System.Runtime.InteropServices;
22 using Tizen.Applications;
24 namespace Tizen.Network.WiFi
26 static internal class Globals
28 internal const string LogTag = "Tizen.Network.WiFi";
31 internal class HandleHolder
33 private SafeWiFiManagerHandle _handle;
35 internal HandleHolder()
37 _handle = WiFiManagerImpl.Instance.Initialize();
38 Log.Info(Globals.LogTag, "Handle: " + _handle);
41 internal SafeWiFiManagerHandle GetSafeHandle()
43 Log.Debug(Globals.LogTag, "Handleholder safehandle = " + _handle);
48 internal partial class WiFiManagerImpl
50 private static readonly Lazy<WiFiManagerImpl> _instance =
51 new Lazy<WiFiManagerImpl>(() => new WiFiManagerImpl());
53 private TizenSynchronizationContext context = new TizenSynchronizationContext();
55 private Dictionary<IntPtr, Interop.WiFi.VoidCallback> _callback_map =
56 new Dictionary<IntPtr, Interop.WiFi.VoidCallback>();
58 private int _requestId = 0;
59 private string _macAddress;
61 internal string MacAddress
65 if (String.IsNullOrEmpty(_macAddress))
68 int ret = Interop.WiFi.GetMacAddress(GetSafeHandle(), out address);
69 if (ret != (int)WiFiError.None)
71 Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiError)ret);
76 _macAddress = address;
83 internal string InterfaceName
88 int ret = Interop.WiFi.GetNetworkInterfaceName(GetSafeHandle(), out name);
89 if (ret != (int)WiFiError.None)
91 Log.Error(Globals.LogTag, "Failed to get interface name, Error - " + (WiFiError)ret);
98 internal WiFiConnectionState ConnectionState
103 int ret = Interop.WiFi.GetConnectionState(GetSafeHandle(), out state);
104 if (ret != (int)WiFiError.None)
106 Log.Error(Globals.LogTag, "Failed to get connection state, Error - " + (WiFiError)ret);
107 return WiFiConnectionState.Failure;
109 return (WiFiConnectionState)state;
113 internal bool IsActive
118 int ret = Interop.WiFi.IsActive(GetSafeHandle(), out active);
119 if (ret != (int)WiFiError.None)
121 Log.Error(Globals.LogTag, "Failed to get isActive, Error - " + (WiFiError)ret);
127 internal static WiFiManagerImpl Instance
131 return _instance.Value;
135 private static ThreadLocal<HandleHolder> s_threadName = new ThreadLocal<HandleHolder>(() =>
137 Log.Info(Globals.LogTag, "In threadlocal delegate");
138 return new HandleHolder();
141 private WiFiManagerImpl()
143 Log.Info(Globals.LogTag, "WiFiManagerImpl constructor");
146 internal SafeWiFiManagerHandle GetSafeHandle()
148 return s_threadName.Value.GetSafeHandle();
151 internal SafeWiFiManagerHandle Initialize()
153 SafeWiFiManagerHandle handle;
154 int tid = Thread.CurrentThread.ManagedThreadId;
155 Log.Info(Globals.LogTag, "PInvoke wifi_manager_initialize");
156 int ret = Interop.WiFi.Initialize(tid, out handle);
157 if (ret != (int)WiFiError.None)
159 Log.Error(Globals.LogTag, "Failed to initialize wifi, Error - " + (WiFiError)ret);
160 WiFiErrorFactory.ThrowWiFiException(ret, "http://tizen.org/privilege/network.get");
166 internal IEnumerable<WiFiAP> GetFoundAPs()
168 Log.Info(Globals.LogTag, "GetFoundAPs");
169 List<WiFiAP> apList = new List<WiFiAP>();
170 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
172 if (apHandle != IntPtr.Zero)
175 Interop.WiFi.AP.Clone(out clonedHandle, apHandle);
176 WiFiAP apItem = new WiFiAP(clonedHandle);
183 int ret = Interop.WiFi.GetForeachFoundAPs(GetSafeHandle(), callback, IntPtr.Zero);
184 if (ret != (int)WiFiError.None)
186 Log.Error(Globals.LogTag, "Failed to get all APs, Error - " + (WiFiError)ret);
187 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
193 internal IEnumerable<WiFiAP> GetFoundSpecificAPs()
195 Log.Info(Globals.LogTag, "GetFoundSpecificAPs");
196 List<WiFiAP> apList = new List<WiFiAP>();
197 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
199 if (apHandle != IntPtr.Zero)
202 Interop.WiFi.AP.Clone(out clonedHandle, apHandle);
203 WiFiAP apItem = new WiFiAP(clonedHandle);
211 int ret = Interop.WiFi.GetForeachFoundSpecificAPs(GetSafeHandle(), callback, IntPtr.Zero);
212 if (ret != (int)WiFiError.None)
214 Log.Error(Globals.LogTag, "Failed to get specific APs, Error - " + (WiFiError)ret);
215 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
221 internal IEnumerable<WiFiConfiguration> GetWiFiConfigurations()
223 Log.Debug(Globals.LogTag, "GetWiFiConfigurations");
224 List<WiFiConfiguration> configList = new List<WiFiConfiguration>();
225 Interop.WiFi.HandleCallback callback = (IntPtr configHandle, IntPtr userData) =>
227 if (configHandle != IntPtr.Zero)
230 Interop.WiFi.Config.Clone(configHandle, out clonedConfig);
231 WiFiConfiguration configItem = new WiFiConfiguration(clonedConfig);
232 configList.Add(configItem);
238 int ret = Interop.WiFi.Config.GetForeachConfiguration(GetSafeHandle(), callback, IntPtr.Zero);
239 if (ret != (int)WiFiError.None)
241 Log.Error(Globals.LogTag, "Failed to get configurations, Error - " + (WiFiError)ret);
242 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
248 internal void SaveWiFiNetworkConfiguration(WiFiConfiguration config)
250 Log.Debug(Globals.LogTag, "SaveWiFiNetworkConfiguration");
253 throw new ArgumentNullException("WiFi configuration is null");
256 IntPtr configHandle = config.GetHandle();
257 int ret = Interop.WiFi.Config.SaveConfiguration(GetSafeHandle(), configHandle);
258 if (ret != (int)WiFiError.None)
260 Log.Error(Globals.LogTag, "Failed to save configuration, Error - " + (WiFiError)ret);
261 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
265 internal WiFiAP GetConnectedAP()
267 Log.Info(Globals.LogTag, "GetConnectedAP");
269 int ret = Interop.WiFi.GetConnectedAP(GetSafeHandle(), out apHandle);
270 if (ret != (int)WiFiError.None)
272 if (ret == (int)WiFiError.NoConnectionError)
274 Log.Error(Globals.LogTag, "No connection " + (WiFiError)ret);
279 Log.Error(Globals.LogTag, "Failed to get connected AP, Error - " + (WiFiError)ret);
280 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
283 WiFiAP ap = new WiFiAP(apHandle);
287 internal Task ActivateAsync()
289 Log.Info(Globals.LogTag, "ActivateAsync");
290 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
294 id = (IntPtr)_requestId++;
295 _callback_map[id] = (error, key) =>
297 Log.Info(Globals.LogTag, "ActivateAsync done");
298 if (error != (int)WiFiError.None)
300 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
301 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
305 task.SetResult(true);
309 _callback_map.Remove(key);
316 Log.Info(Globals.LogTag, "Interop.WiFi.ActivateAsync");
319 int ret = Interop.WiFi.Activate(GetSafeHandle(), _callback_map[id], id);
320 if (ret != (int)WiFiError.None)
322 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
323 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
328 Log.Error(Globals.LogTag, "Exception on ActivateAsync\n" + e.ToString());
329 task.SetException(e);
336 internal Task ActivateWithWiFiPickerTestedAsync()
338 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync");
339 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
343 id = (IntPtr)_requestId++;
344 _callback_map[id] = (error, key) =>
346 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync done");
347 if (error != (int)WiFiError.None)
349 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
350 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
354 task.SetResult(true);
358 _callback_map.Remove(key);
365 Log.Info(Globals.LogTag, "Interop.WiFi.ActivateWithWiFiPickerTestedAsync");
368 int ret = Interop.WiFi.ActivateWithWiFiPickerTested(GetSafeHandle(), _callback_map[id], id);
369 if (ret != (int)WiFiError.None)
371 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
372 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
377 Log.Error(Globals.LogTag, "Exception on ActivateWithWiFiPickerTestedAsync\n" + e.ToString());
378 task.SetException(e);
385 internal Task DeactivateAsync()
387 Log.Info(Globals.LogTag, "DeactivateAsync");
388 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
392 id = (IntPtr)_requestId++;
393 _callback_map[id] = (error, key) =>
395 Log.Info(Globals.LogTag, "DeactivateAsync done");
396 if (error != (int)WiFiError.None)
398 Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error);
399 task.SetException(new InvalidOperationException("Error occurs during WiFi deactivating, " + (WiFiError)error));
403 task.SetResult(true);
407 _callback_map.Remove(key);
414 Log.Info(Globals.LogTag, "Interop.WiFi.Deactivate");
417 int ret = Interop.WiFi.Deactivate(GetSafeHandle(), _callback_map[id], id);
418 if (ret != (int)WiFiError.None)
420 Log.Error(Globals.LogTag, "Failed to deactivate wifi, Error - " + (WiFiError)ret);
421 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
426 Log.Error(Globals.LogTag, "Exception on Deactivate\n" + e.ToString());
427 task.SetException(e);
434 internal Task ScanAsync()
436 Log.Info(Globals.LogTag, "ScanAsync");
437 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
441 id = (IntPtr)_requestId++;
442 _callback_map[id] = (error, key) =>
444 Log.Info(Globals.LogTag, "ScanAsync done");
445 if (error != (int)WiFiError.None)
447 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
448 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
452 task.SetResult(true);
456 _callback_map.Remove(key);
463 Log.Info(Globals.LogTag, "Interop.WiFi.Scan");
466 int ret = Interop.WiFi.Scan(GetSafeHandle(), _callback_map[id], id);
467 if (ret != (int)WiFiError.None)
469 Log.Error(Globals.LogTag, "Failed to scan all AP, Error - " + (WiFiError)ret);
470 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
475 Log.Error(Globals.LogTag, "Exception on Scan\n" + e.ToString());
476 task.SetException(e);
483 internal Task ScanSpecificAPAsync(string essid)
485 Log.Info(Globals.LogTag, "ScanSpecificAPAsync " + essid);
486 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
490 id = (IntPtr)_requestId++;
491 _callback_map[id] = (error, key) =>
493 Log.Info(Globals.LogTag, "ScanSpecificAPAsync Done " + essid);
494 if (error != (int)WiFiError.None)
496 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
497 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
501 task.SetResult(true);
505 _callback_map.Remove(key);
512 Log.Info(Globals.LogTag, "Interop.WiFi.ScanSpecificAPAsync");
515 int ret = Interop.WiFi.ScanSpecificAP(GetSafeHandle(), essid, _callback_map[id], id);
516 if (ret != (int)WiFiError.None)
518 Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
519 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
524 Log.Error(Globals.LogTag, "Exception on ScanSpecificAPAsync\n" + e.ToString());
525 task.SetException(e);