2 * Copyright (c) 2018 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 if (ret == (int)WiFiError.InvalidParameterError)
189 throw new InvalidOperationException("Invalid handle");
191 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
197 internal IEnumerable<WiFiAP> GetFoundSpecificAPs()
199 Log.Info(Globals.LogTag, "GetFoundSpecificAPs");
200 List<WiFiAP> apList = new List<WiFiAP>();
201 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
203 if (apHandle != IntPtr.Zero)
206 Interop.WiFi.AP.Clone(out clonedHandle, apHandle);
207 WiFiAP apItem = new WiFiAP(clonedHandle);
215 int ret = Interop.WiFi.GetForeachFoundSpecificAPs(GetSafeHandle(), callback, IntPtr.Zero);
216 if (ret != (int)WiFiError.None)
218 Log.Error(Globals.LogTag, "Failed to get specific APs, Error - " + (WiFiError)ret);
219 if (ret == (int)WiFiError.InvalidParameterError)
221 throw new InvalidOperationException("Invalid handle");
223 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
229 internal IEnumerable<WiFiAP> GetFoundBssids()
231 Log.Info(Globals.LogTag, "GetFoundBssids");
232 List<WiFiAP> apList = new List<WiFiAP>();
233 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
235 if (apHandle != IntPtr.Zero)
238 Interop.WiFi.AP.Clone(out clonedHandle, apHandle);
239 WiFiAP apItem = new WiFiAP(clonedHandle);
246 int ret = Interop.WiFi.GetForeachFoundBssids(GetSafeHandle(), callback, IntPtr.Zero);
247 if (ret != (int)WiFiError.None)
249 Log.Error(Globals.LogTag, "Failed to get bssid APs, Error - " + (WiFiError)ret);
250 if (ret == (int)WiFiError.InvalidParameterError)
252 throw new InvalidOperationException("Invalid handle");
254 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
260 internal IEnumerable<WiFiConfiguration> GetWiFiConfigurations()
262 Log.Debug(Globals.LogTag, "GetWiFiConfigurations");
263 List<WiFiConfiguration> configList = new List<WiFiConfiguration>();
264 Interop.WiFi.HandleCallback callback = (IntPtr configHandle, IntPtr userData) =>
266 if (configHandle != IntPtr.Zero)
269 Interop.WiFi.Config.Clone(configHandle, out clonedConfig);
270 WiFiConfiguration configItem = new WiFiConfiguration(clonedConfig);
271 configList.Add(configItem);
277 int ret = Interop.WiFi.Config.GetForeachConfiguration(GetSafeHandle(), callback, IntPtr.Zero);
278 if (ret != (int)WiFiError.None)
280 Log.Error(Globals.LogTag, "Failed to get configurations, Error - " + (WiFiError)ret);
281 if (ret == (int)WiFiError.InvalidParameterError)
283 throw new InvalidOperationException("Invalid handle");
285 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
291 internal void SaveWiFiNetworkConfiguration(WiFiConfiguration config)
293 Log.Debug(Globals.LogTag, "SaveWiFiNetworkConfiguration");
296 throw new ArgumentNullException("WiFi configuration is null");
299 IntPtr configHandle = config.GetHandle();
300 int ret = Interop.WiFi.Config.SaveConfiguration(GetSafeHandle(), configHandle);
301 if (ret != (int)WiFiError.None)
303 Log.Error(Globals.LogTag, "Failed to save configuration, Error - " + (WiFiError)ret);
304 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
308 internal WiFiAP GetConnectedAP()
310 Log.Info(Globals.LogTag, "GetConnectedAP");
312 int ret = Interop.WiFi.GetConnectedAP(GetSafeHandle(), out apHandle);
313 if (ret != (int)WiFiError.None)
315 if (ret == (int)WiFiError.NoConnectionError)
317 Log.Error(Globals.LogTag, "No connection " + (WiFiError)ret);
320 else if (ret == (int)WiFiError.InvalidParameterError)
322 throw new InvalidOperationException("Invalid handle");
326 Log.Error(Globals.LogTag, "Failed to get connected AP, Error - " + (WiFiError)ret);
327 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
330 WiFiAP ap = new WiFiAP(apHandle);
334 internal Task ActivateAsync()
336 Log.Info(Globals.LogTag, "ActivateAsync");
337 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
341 id = (IntPtr)_requestId++;
342 _callback_map[id] = (error, key) =>
344 Log.Info(Globals.LogTag, "ActivateAsync done");
345 if (error != (int)WiFiError.None)
347 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
348 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
352 task.SetResult(true);
356 _callback_map.Remove(key);
363 Log.Info(Globals.LogTag, "Interop.WiFi.ActivateAsync");
366 int ret = Interop.WiFi.Activate(GetSafeHandle(), _callback_map[id], id);
367 if (ret != (int)WiFiError.None)
369 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
370 if (ret == (int)WiFiError.InvalidParameterError)
372 throw new InvalidOperationException("Invalid handle");
374 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
379 Log.Error(Globals.LogTag, "Exception on ActivateAsync\n" + e.ToString());
380 task.SetException(e);
387 internal Task ActivateWithWiFiPickerTestedAsync()
389 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync");
390 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
394 id = (IntPtr)_requestId++;
395 _callback_map[id] = (error, key) =>
397 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync done");
398 if (error != (int)WiFiError.None)
400 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
401 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
405 task.SetResult(true);
409 _callback_map.Remove(key);
416 Log.Info(Globals.LogTag, "Interop.WiFi.ActivateWithWiFiPickerTestedAsync");
419 int ret = Interop.WiFi.ActivateWithWiFiPickerTested(GetSafeHandle(), _callback_map[id], id);
420 if (ret != (int)WiFiError.None)
422 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
423 if (ret == (int)WiFiError.InvalidParameterError)
425 throw new InvalidOperationException("Invalid handle");
427 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
432 Log.Error(Globals.LogTag, "Exception on ActivateWithWiFiPickerTestedAsync\n" + e.ToString());
433 task.SetException(e);
440 internal Task DeactivateAsync()
442 Log.Info(Globals.LogTag, "DeactivateAsync");
443 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
447 id = (IntPtr)_requestId++;
448 _callback_map[id] = (error, key) =>
450 Log.Info(Globals.LogTag, "DeactivateAsync done");
451 if (error != (int)WiFiError.None)
453 Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error);
454 task.SetException(new InvalidOperationException("Error occurs during WiFi deactivating, " + (WiFiError)error));
458 task.SetResult(true);
462 _callback_map.Remove(key);
469 Log.Info(Globals.LogTag, "Interop.WiFi.Deactivate");
472 int ret = Interop.WiFi.Deactivate(GetSafeHandle(), _callback_map[id], id);
473 if (ret != (int)WiFiError.None)
475 Log.Error(Globals.LogTag, "Failed to deactivate wifi, Error - " + (WiFiError)ret);
476 if (ret == (int)WiFiError.InvalidParameterError)
478 throw new InvalidOperationException("Invalid handle");
480 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
485 Log.Error(Globals.LogTag, "Exception on Deactivate\n" + e.ToString());
486 task.SetException(e);
493 internal Task ScanAsync()
495 Log.Info(Globals.LogTag, "ScanAsync");
496 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
500 id = (IntPtr)_requestId++;
501 _callback_map[id] = (error, key) =>
503 Log.Info(Globals.LogTag, "ScanAsync done");
504 if (error != (int)WiFiError.None)
506 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
507 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
511 task.SetResult(true);
515 _callback_map.Remove(key);
522 Log.Info(Globals.LogTag, "Interop.WiFi.Scan");
525 int ret = Interop.WiFi.Scan(GetSafeHandle(), _callback_map[id], id);
526 if (ret != (int)WiFiError.None)
528 Log.Error(Globals.LogTag, "Failed to scan all AP, Error - " + (WiFiError)ret);
529 if (ret == (int)WiFiError.InvalidParameterError)
531 throw new InvalidOperationException("Invalid handle");
533 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
538 Log.Error(Globals.LogTag, "Exception on Scan\n" + e.ToString());
539 task.SetException(e);
546 internal Task ScanSpecificAPAsync(string essid)
548 Log.Info(Globals.LogTag, "ScanSpecificAPAsync " + essid);
549 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
553 id = (IntPtr)_requestId++;
554 _callback_map[id] = (error, key) =>
556 Log.Info(Globals.LogTag, "ScanSpecificAPAsync Done " + essid);
557 if (error != (int)WiFiError.None)
559 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
560 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
564 task.SetResult(true);
568 _callback_map.Remove(key);
575 Log.Info(Globals.LogTag, "Interop.WiFi.ScanSpecificAPAsync");
578 int ret = Interop.WiFi.ScanSpecificAP(GetSafeHandle(), essid, _callback_map[id], id);
579 if (ret != (int)WiFiError.None)
581 Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
582 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
587 Log.Error(Globals.LogTag, "Exception on ScanSpecificAPAsync\n" + e.ToString());
588 task.SetException(e);
595 internal Task BssidScanAsync()
597 Log.Info(Globals.LogTag, "BssidScanAsync");
598 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
602 id = (IntPtr)_requestId++;
603 _callback_map[id] = (error, key) =>
605 Log.Info(Globals.LogTag, "BssidScanAsync done");
606 if (error != (int)WiFiError.None)
608 Log.Error(Globals.LogTag, "Error occurs during bssid scanning, " + (WiFiError)error);
609 task.SetException(new InvalidOperationException("Error occurs during bssid scanning, " + (WiFiError)error));
613 task.SetResult(true);
617 _callback_map.Remove(key);
624 Log.Info(Globals.LogTag, "Interop.WiFi.BssidScan");
627 int ret = Interop.WiFi.BssidScan(GetSafeHandle(), _callback_map[id], id);
628 if (ret != (int)WiFiError.None)
630 Log.Error(Globals.LogTag, "Failed to scan Bssid AP, Error - " + (WiFiError)ret);
631 if (ret == (int)WiFiError.InvalidParameterError)
633 throw new InvalidOperationException("Invalid handle");
635 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
640 Log.Error(Globals.LogTag, "Exception on BssidScan\n" + e.ToString());
641 task.SetException(e);