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.Tasks;
21 namespace Tizen.Network.WiFi
23 static internal class Globals
25 internal const string LogTag = "Tizen.Network.WiFi";
26 internal static bool s_isInitialize = false;
28 internal static bool IsInitialize
32 if (!Globals.s_isInitialize)
34 WiFiManagerImpl.Instance.Initialize();
36 return Globals.s_isInitialize;
41 internal partial class WiFiManagerImpl : IDisposable
43 private static WiFiManagerImpl _instance;
44 private Dictionary<IntPtr, Interop.WiFi.VoidCallback> _callback_map = new Dictionary<IntPtr, Interop.WiFi.VoidCallback>();
45 private int _requestId = 0;
46 private string _macAddress;
47 private bool disposed = false;
49 internal string MacAddress
53 if (String.IsNullOrEmpty(_macAddress))
56 int ret = Interop.WiFi.GetMacAddress(out address);
57 if (ret != (int)WiFiError.None)
59 Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiError)ret);
64 _macAddress = address;
70 internal string InterfaceName
75 int ret = Interop.WiFi.GetNetworkInterfaceName(out name);
76 if (ret != (int)WiFiError.None)
78 Log.Error(Globals.LogTag, "Failed to get interface name, Error - " + (WiFiError)ret);
84 internal WiFiConnectionState ConnectionState
89 int ret = Interop.WiFi.GetConnectionState(out state);
90 if (ret != (int)WiFiError.None)
92 Log.Error(Globals.LogTag, "Failed to get connection state, Error - " + (WiFiError)ret);
93 return WiFiConnectionState.Failure;
95 return (WiFiConnectionState)state;
98 internal bool IsActivated
103 int ret = Interop.WiFi.IsActivated(out active);
104 if (ret != (int)WiFiError.None)
106 Log.Error(Globals.LogTag, "Failed to get isActive, Error - " + (WiFiError)ret);
112 internal static WiFiManagerImpl Instance
116 if (_instance == null)
118 _instance = new WiFiManagerImpl();
125 private WiFiManagerImpl()
134 public void Dispose()
137 GC.SuppressFinalize(this);
140 private void Dispose(bool disposing)
147 // Free managed objects.
149 //Free unmanaged objects
151 RemoveAllRegisteredEvent();
155 internal void Initialize()
157 int ret = Interop.WiFi.Initialize();
158 if (ret != (int)WiFiError.None)
160 Log.Error(Globals.LogTag, "Failed to initialize wifi, Error - " + (WiFiError)ret);
161 WiFiErrorFactory.ThrowWiFiException(ret);
163 Globals.s_isInitialize = true;
165 ret = Interop.WiFi.GetMacAddress(out address);
166 if (ret != (int)WiFiError.None)
168 Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiError)ret);
171 _macAddress = address;
174 private void deinitialize()
176 int ret = Interop.WiFi.Deinitialize();
177 if (ret != (int)WiFiError.None)
179 Log.Error(Globals.LogTag, "Failed to deinitialize wifi, Error - " + (WiFiError)ret);
180 WiFiErrorFactory.ThrowWiFiException(ret);
182 Globals.s_isInitialize = false;
185 internal IEnumerable<WiFiAp> GetFoundAps()
187 List<WiFiAp> apList = new List<WiFiAp>();
188 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
190 if (apHandle != IntPtr.Zero)
193 Interop.WiFi.Ap.Clone(out clonedHandle, apHandle);
194 WiFiAp apItem = new WiFiAp(clonedHandle);
201 int ret = Interop.WiFi.GetForeachFoundAps(callback, IntPtr.Zero);
202 if (ret != (int)WiFiError.None)
204 Log.Error(Globals.LogTag, "Failed to get all APs, Error - " + (WiFiError)ret);
205 WiFiErrorFactory.ThrowWiFiException(ret);
211 internal IEnumerable<WiFiAp> GetFoundSpecificAps()
213 List<WiFiAp> apList = new List<WiFiAp>();
214 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
216 if (apHandle != IntPtr.Zero)
219 Interop.WiFi.Ap.Clone(out clonedHandle, apHandle);
220 WiFiAp apItem = new WiFiAp(clonedHandle);
228 int ret = Interop.WiFi.GetForeachFoundSpecificAps(callback, IntPtr.Zero);
229 if (ret != (int)WiFiError.None)
231 Log.Error(Globals.LogTag, "Failed to get specific APs, Error - " + (WiFiError)ret);
232 WiFiErrorFactory.ThrowWiFiException(ret);
238 internal IEnumerable<WiFiConfiguration> GetWiFiConfigurations()
240 List<WiFiConfiguration> configList = new List<WiFiConfiguration>();
241 Interop.WiFi.HandleCallback callback = (IntPtr configHandle, IntPtr userData) =>
243 if (configHandle != IntPtr.Zero)
246 Interop.WiFi.Config.Clone(configHandle, out clonedConfig);
247 WiFiConfiguration configItem = new WiFiConfiguration(clonedConfig);
248 configList.Add(configItem);
254 int ret = Interop.WiFi.Config.GetForeachConfiguration(callback, IntPtr.Zero);
255 if (ret != (int)WiFiError.None)
257 Log.Error(Globals.LogTag, "Failed to get configurations, Error - " + (WiFiError)ret);
258 WiFiErrorFactory.ThrowWiFiException(ret);
264 internal void SaveWiFiNetworkConfiguration(WiFiConfiguration config)
266 IntPtr configHandle = config.GetHandle();
267 int ret = Interop.WiFi.Config.SaveConfiguration(configHandle);
268 if (ret != (int)WiFiError.None)
270 Log.Error(Globals.LogTag, "Failed to save configuration, Error - " + (WiFiError)ret);
271 WiFiErrorFactory.ThrowWiFiException(ret);
275 internal WiFiAp GetConnectedAp()
279 int ret = Interop.WiFi.GetConnectedAp(out apHandle);
280 if (ret != (int)WiFiError.None)
282 Log.Error(Globals.LogTag, "Failed to connect with AP, Error - " + (WiFiError)ret);
283 WiFiErrorFactory.ThrowWiFiException(ret);
285 WiFiAp ap = new WiFiAp(apHandle);
289 internal void RemoveAp(WiFiAp ap)
291 IntPtr apHandle = ap.GetHandle();
292 int ret = Interop.WiFi.RemoveAp(apHandle);
293 if (ret != (int)WiFiError.None)
295 Log.Error(Globals.LogTag, "Failed to remove with AP, Error - " + (WiFiError)ret);
296 WiFiErrorFactory.ThrowWiFiException(ret);
300 internal Task ActivateAsync()
302 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
306 id = (IntPtr)_requestId++;
307 _callback_map[id] = (error, key) =>
309 Log.Debug(Globals.LogTag, "wifi activated");
310 if (error != (int)WiFiError.None)
312 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
313 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
315 task.SetResult(true);
318 _callback_map.Remove(key);
322 int ret = Interop.WiFi.Activate(_callback_map[id], id);
323 if (ret != (int)WiFiError.None)
325 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
326 WiFiErrorFactory.ThrowWiFiException(ret);
331 internal Task ActivateWithWiFiPickerTestedAsync()
333 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
337 id = (IntPtr)_requestId++;
338 _callback_map[id] = (error, key) =>
340 Log.Debug(Globals.LogTag, "Activation finished");
341 if (error != (int)WiFiError.None)
343 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
344 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
346 task.SetResult(true);
349 _callback_map.Remove(key);
353 int ret = Interop.WiFi.ActivateWithWiFiPickerTested(_callback_map[id], id);
354 if (ret != (int)WiFiError.None)
356 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
357 WiFiErrorFactory.ThrowWiFiException(ret);
362 internal Task DeactivateAsync()
364 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
368 id = (IntPtr)_requestId++;
369 _callback_map[id] = (error, key) =>
371 Log.Debug(Globals.LogTag, "Deactivation finished");
372 if (error != (int)WiFiError.None)
374 Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error);
375 task.SetException(new InvalidOperationException("Error occurs during WiFi deactivating, " + (WiFiError)error));
377 task.SetResult(true);
380 _callback_map.Remove(key);
384 int ret = Interop.WiFi.Deactivate(_callback_map[id], id);
385 if (ret != (int)WiFiError.None)
387 Log.Error(Globals.LogTag, "Failed to deactivate wifi, Error - " + (WiFiError)ret);
388 WiFiErrorFactory.ThrowWiFiException(ret);
393 internal Task ScanAsync()
395 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
399 id = (IntPtr)_requestId++;
400 _callback_map[id] = (error, key) =>
402 Log.Debug(Globals.LogTag, "Scanning finished");
403 if (error != (int)WiFiError.None)
405 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
406 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
408 task.SetResult(true);
411 _callback_map.Remove(key);
415 int ret = Interop.WiFi.Scan(_callback_map[id], id);
416 if (ret != (int)WiFiError.None)
418 Log.Error(Globals.LogTag, "Failed to scan all AP, Error - " + (WiFiError)ret);
419 WiFiErrorFactory.ThrowWiFiException(ret);
424 internal Task ScanSpecificApAsync(string essid)
426 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
430 id = (IntPtr)_requestId++;
431 _callback_map[id] = (error, key) =>
433 Log.Debug(Globals.LogTag, "Scanning with specific AP finished");
434 if (error != (int)WiFiError.None)
436 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
437 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
439 task.SetResult(true);
442 _callback_map.Remove(key);
446 int ret = Interop.WiFi.ScanSpecificAp(essid, _callback_map[id], id);
447 if (ret != (int)WiFiError.None)
449 Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
450 WiFiErrorFactory.ThrowWiFiException(ret);
455 internal Task ConnectAsync(WiFiAp ap)
457 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
461 id = (IntPtr)_requestId++;
462 _callback_map[id] = (error, key) =>
464 Log.Debug(Globals.LogTag, "Connecting finished : " + (WiFiError)error);
465 if (error != (int)WiFiError.None)
467 Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
468 task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
470 task.SetResult(true);
473 _callback_map.Remove(key);
477 IntPtr apHandle = ap.GetHandle();
478 int ret = Interop.WiFi.Connect(apHandle, _callback_map[id], id);
479 if (ret != (int)WiFiError.None)
481 Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
482 WiFiErrorFactory.ThrowWiFiException(ret);
487 internal Task DisconnectAsync(WiFiAp ap)
489 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
493 id = (IntPtr)_requestId++;
494 _callback_map[id] = (error, key) =>
496 Log.Debug(Globals.LogTag, "Disconnecting finished");
497 if (error != (int)WiFiError.None)
499 Log.Error(Globals.LogTag, "Error occurs during WiFi disconnecting, " + (WiFiError)error);
500 task.SetException(new InvalidOperationException("Error occurs during WiFi disconnecting, " + (WiFiError)error));
502 task.SetResult(true);
505 _callback_map.Remove(key);
509 IntPtr apHandle = ap.GetHandle();
510 int ret = Interop.WiFi.Disconnect(apHandle, _callback_map[id], id);
511 if (ret != (int)WiFiError.None)
513 Log.Error(Globals.LogTag, "Failed to disconnect wifi, Error - " + (WiFiError)ret);
514 WiFiErrorFactory.ThrowWiFiException(ret);
519 internal Task ConnectByWpsPbcAsync(WiFiAp ap)
521 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
525 id = (IntPtr)_requestId++;
526 _callback_map[id] = (error, key) =>
528 Log.Debug(Globals.LogTag, "Connecting by WPS PBC finished");
529 if (error != (int)WiFiError.None)
531 Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
532 task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
534 task.SetResult(true);
537 _callback_map.Remove(key);
541 IntPtr apHandle = ap.GetHandle();
542 int ret = Interop.WiFi.ConnectByWpsPbc(apHandle, _callback_map[id], id);
543 if (ret != (int)WiFiError.None)
545 Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
546 WiFiErrorFactory.ThrowWiFiException(ret);
551 internal Task ConnectByWpsPinAsync(WiFiAp ap, string pin)
553 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
557 id = (IntPtr)_requestId++;
558 _callback_map[id] = (error, key) =>
560 Log.Debug(Globals.LogTag, "Connecting by WPS PIN finished");
561 if (error != (int)WiFiError.None)
563 Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
564 task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
566 task.SetResult(true);
569 _callback_map.Remove(key);
573 IntPtr apHandle = ap.GetHandle();
574 int ret = Interop.WiFi.ConnectByWpsPin(apHandle, pin, _callback_map[id], id);
575 if (ret != (int)WiFiError.None)
577 Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
578 WiFiErrorFactory.ThrowWiFiException(ret);