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");
317 int ret = Interop.WiFi.Activate(GetSafeHandle(), _callback_map[id], id);
318 if (ret != (int)WiFiError.None)
320 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
321 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
328 internal Task ActivateWithWiFiPickerTestedAsync()
330 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync");
331 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
335 id = (IntPtr)_requestId++;
336 _callback_map[id] = (error, key) =>
338 Log.Info(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync done");
339 if (error != (int)WiFiError.None)
341 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
342 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
346 task.SetResult(true);
350 _callback_map.Remove(key);
357 Log.Info(Globals.LogTag, "Interop.WiFi.ActivateWithWiFiPickerTestedAsync");
358 int ret = Interop.WiFi.ActivateWithWiFiPickerTested(GetSafeHandle(), _callback_map[id], id);
359 if (ret != (int)WiFiError.None)
361 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
362 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
369 internal Task DeactivateAsync()
371 Log.Info(Globals.LogTag, "DeactivateAsync");
372 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
376 id = (IntPtr)_requestId++;
377 _callback_map[id] = (error, key) =>
379 Log.Info(Globals.LogTag, "DeactivateAsync done");
380 if (error != (int)WiFiError.None)
382 Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error);
383 task.SetException(new InvalidOperationException("Error occurs during WiFi deactivating, " + (WiFiError)error));
387 task.SetResult(true);
391 _callback_map.Remove(key);
398 Log.Info(Globals.LogTag, "Interop.WiFi.Deactivate");
399 int ret = Interop.WiFi.Deactivate(GetSafeHandle(), _callback_map[id], id);
400 if (ret != (int)WiFiError.None)
402 Log.Error(Globals.LogTag, "Failed to deactivate wifi, Error - " + (WiFiError)ret);
403 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
410 internal Task ScanAsync()
412 Log.Info(Globals.LogTag, "ScanAsync");
413 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
417 id = (IntPtr)_requestId++;
418 _callback_map[id] = (error, key) =>
420 Log.Info(Globals.LogTag, "ScanAsync done");
421 if (error != (int)WiFiError.None)
423 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
424 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
428 task.SetResult(true);
432 _callback_map.Remove(key);
439 Log.Info(Globals.LogTag, "Interop.WiFi.Scan");
440 int ret = Interop.WiFi.Scan(GetSafeHandle(), _callback_map[id], id);
441 if (ret != (int)WiFiError.None)
443 Log.Error(Globals.LogTag, "Failed to scan all AP, Error - " + (WiFiError)ret);
444 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
451 internal Task ScanSpecificAPAsync(string essid)
453 Log.Info(Globals.LogTag, "ScanSpecificAPAsync " + essid);
454 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
458 id = (IntPtr)_requestId++;
459 _callback_map[id] = (error, key) =>
461 Log.Info(Globals.LogTag, "ScanSpecificAPAsync Done " + essid);
462 if (error != (int)WiFiError.None)
464 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
465 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
469 task.SetResult(true);
473 _callback_map.Remove(key);
480 Log.Info(Globals.LogTag, "Interop.WiFi.ScanSpecificAPAsync");
481 int ret = Interop.WiFi.ScanSpecificAP(GetSafeHandle(), essid, _callback_map[id], id);
482 if (ret != (int)WiFiError.None)
484 Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
485 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
492 internal void UpdateAP(Interop.WiFi.SafeWiFiAPHandle apHandle)
494 int ret = Interop.WiFi.UpdateAP(GetSafeHandle(), apHandle.DangerousGetHandle());
495 if (ret != (int)WiFiError.None)
497 Log.Error(Globals.LogTag, "Failed to update AP, Error - " + (WiFiError)ret);
498 WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), apHandle.DangerousGetHandle());