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<WiFiAP> GetFoundBssids()
223 Log.Info(Globals.LogTag, "GetFoundBssids");
224 List<WiFiAP> apList = new List<WiFiAP>();
225 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
227 if (apHandle != IntPtr.Zero)
230 Interop.WiFi.AP.Clone(out clonedHandle, apHandle);
231 WiFiAP apItem = new WiFiAP(clonedHandle);
238 int ret = Interop.WiFi.GetForeachFoundBssids(GetSafeHandle(), callback, IntPtr.Zero);
239 if (ret != (int)WiFiError.None)
241 Log.Error(Globals.LogTag, "Failed to get bssid APs, Error - " + (WiFiError)ret);
242 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
248 internal IEnumerable<WiFiConfiguration> GetWiFiConfigurations()
250 Log.Debug(Globals.LogTag, "GetWiFiConfigurations");
251 List<WiFiConfiguration> configList = new List<WiFiConfiguration>();
252 Interop.WiFi.HandleCallback callback = (IntPtr configHandle, IntPtr userData) =>
254 if (configHandle != IntPtr.Zero)
257 Interop.WiFi.Config.Clone(configHandle, out clonedConfig);
258 WiFiConfiguration configItem = new WiFiConfiguration(clonedConfig);
259 configList.Add(configItem);
265 int ret = Interop.WiFi.Config.GetForeachConfiguration(GetSafeHandle(), callback, IntPtr.Zero);
266 if (ret != (int)WiFiError.None)
268 Log.Error(Globals.LogTag, "Failed to get configurations, Error - " + (WiFiError)ret);
269 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
275 internal void SaveWiFiNetworkConfiguration(WiFiConfiguration config)
277 Log.Debug(Globals.LogTag, "SaveWiFiNetworkConfiguration");
280 throw new ArgumentNullException("WiFi configuration is null");
283 IntPtr configHandle = config.GetHandle();
284 int ret = Interop.WiFi.Config.SaveConfiguration(GetSafeHandle(), configHandle);
285 if (ret != (int)WiFiError.None)
287 Log.Error(Globals.LogTag, "Failed to save configuration, Error - " + (WiFiError)ret);
288 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
292 internal WiFiAP GetConnectedAP()
294 Log.Info(Globals.LogTag, "GetConnectedAP");
296 int ret = Interop.WiFi.GetConnectedAP(GetSafeHandle(), out apHandle);
297 if (ret != (int)WiFiError.None)
299 if (ret == (int)WiFiError.NoConnectionError)
301 Log.Error(Globals.LogTag, "No connection " + (WiFiError)ret);
306 Log.Error(Globals.LogTag, "Failed to get connected AP, Error - " + (WiFiError)ret);
307 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
310 WiFiAP ap = new WiFiAP(apHandle);
314 internal Task ActivateAsync()
316 Log.Info(Globals.LogTag, "ActivateAsync");
317 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
321 id = (IntPtr)_requestId++;
322 _callback_map[id] = (error, key) =>
324 Log.Info(Globals.LogTag, "ActivateAsync done");
325 if (error != (int)WiFiError.None)
327 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
328 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
332 task.SetResult(true);
336 _callback_map.Remove(key);
343 Log.Info(Globals.LogTag, "Interop.WiFi.ActivateAsync");
346 int ret = Interop.WiFi.Activate(GetSafeHandle(), _callback_map[id], id);
347 if (ret != (int)WiFiError.None)
349 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
350 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
355 Log.Error(Globals.LogTag, "Exception on ActivateAsync\n" + e.ToString());
356 task.SetException(e);
363 internal Task ActivateWithWiFiPickerTestedAsync()
365 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync");
366 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
370 id = (IntPtr)_requestId++;
371 _callback_map[id] = (error, key) =>
373 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync done");
374 if (error != (int)WiFiError.None)
376 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
377 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
381 task.SetResult(true);
385 _callback_map.Remove(key);
392 Log.Info(Globals.LogTag, "Interop.WiFi.ActivateWithWiFiPickerTestedAsync");
395 int ret = Interop.WiFi.ActivateWithWiFiPickerTested(GetSafeHandle(), _callback_map[id], id);
396 if (ret != (int)WiFiError.None)
398 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
399 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
404 Log.Error(Globals.LogTag, "Exception on ActivateWithWiFiPickerTestedAsync\n" + e.ToString());
405 task.SetException(e);
412 internal Task DeactivateAsync()
414 Log.Info(Globals.LogTag, "DeactivateAsync");
415 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
419 id = (IntPtr)_requestId++;
420 _callback_map[id] = (error, key) =>
422 Log.Info(Globals.LogTag, "DeactivateAsync done");
423 if (error != (int)WiFiError.None)
425 Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error);
426 task.SetException(new InvalidOperationException("Error occurs during WiFi deactivating, " + (WiFiError)error));
430 task.SetResult(true);
434 _callback_map.Remove(key);
441 Log.Info(Globals.LogTag, "Interop.WiFi.Deactivate");
444 int ret = Interop.WiFi.Deactivate(GetSafeHandle(), _callback_map[id], id);
445 if (ret != (int)WiFiError.None)
447 Log.Error(Globals.LogTag, "Failed to deactivate wifi, Error - " + (WiFiError)ret);
448 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
453 Log.Error(Globals.LogTag, "Exception on Deactivate\n" + e.ToString());
454 task.SetException(e);
461 internal Task ScanAsync()
463 Log.Info(Globals.LogTag, "ScanAsync");
464 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
468 id = (IntPtr)_requestId++;
469 _callback_map[id] = (error, key) =>
471 Log.Info(Globals.LogTag, "ScanAsync done");
472 if (error != (int)WiFiError.None)
474 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
475 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
479 task.SetResult(true);
483 _callback_map.Remove(key);
490 Log.Info(Globals.LogTag, "Interop.WiFi.Scan");
493 int ret = Interop.WiFi.Scan(GetSafeHandle(), _callback_map[id], id);
494 if (ret != (int)WiFiError.None)
496 Log.Error(Globals.LogTag, "Failed to scan all AP, Error - " + (WiFiError)ret);
497 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
502 Log.Error(Globals.LogTag, "Exception on Scan\n" + e.ToString());
503 task.SetException(e);
510 internal Task ScanSpecificAPAsync(string essid)
512 Log.Info(Globals.LogTag, "ScanSpecificAPAsync " + essid);
513 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
517 id = (IntPtr)_requestId++;
518 _callback_map[id] = (error, key) =>
520 Log.Info(Globals.LogTag, "ScanSpecificAPAsync Done " + essid);
521 if (error != (int)WiFiError.None)
523 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
524 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
528 task.SetResult(true);
532 _callback_map.Remove(key);
539 Log.Info(Globals.LogTag, "Interop.WiFi.ScanSpecificAPAsync");
542 int ret = Interop.WiFi.ScanSpecificAP(GetSafeHandle(), essid, _callback_map[id], id);
543 if (ret != (int)WiFiError.None)
545 Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
546 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
551 Log.Error(Globals.LogTag, "Exception on ScanSpecificAPAsync\n" + e.ToString());
552 task.SetException(e);
559 internal Task BssidScanAsync()
561 Log.Info(Globals.LogTag, "BssidScanAsync");
562 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
566 id = (IntPtr)_requestId++;
567 _callback_map[id] = (error, key) =>
569 Log.Info(Globals.LogTag, "BssidScanAsync done");
570 if (error != (int)WiFiError.None)
572 Log.Error(Globals.LogTag, "Error occurs during bssid scanning, " + (WiFiError)error);
573 task.SetException(new InvalidOperationException("Error occurs during bssid scanning, " + (WiFiError)error));
577 task.SetResult(true);
581 _callback_map.Remove(key);
588 Log.Info(Globals.LogTag, "Interop.WiFi.BssidScan");
591 int ret = Interop.WiFi.BssidScan(GetSafeHandle(), _callback_map[id], id);
592 if (ret != (int)WiFiError.None)
594 Log.Error(Globals.LogTag, "Failed to scan Bssid AP, Error - " + (WiFiError)ret);
595 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
600 Log.Error(Globals.LogTag, "Exception on BssidScan\n" + e.ToString());
601 task.SetException(e);