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";
28 internal partial class WiFiManagerImpl : IDisposable
30 private static readonly WiFiManagerImpl _instance = new WiFiManagerImpl();
31 private Dictionary<IntPtr, Interop.WiFi.VoidCallback> _callback_map = new Dictionary<IntPtr, Interop.WiFi.VoidCallback>();
32 private int _requestId = 0;
33 private string _macAddress;
34 private bool disposed = false;
36 internal string MacAddress
40 if (String.IsNullOrEmpty(_macAddress))
43 int ret = Interop.WiFi.GetMacAddress(out address);
44 if (ret != (int)WiFiError.None)
46 Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiError)ret);
51 _macAddress = address;
57 internal string InterfaceName
62 int ret = Interop.WiFi.GetNetworkInterfaceName(out name);
63 if (ret != (int)WiFiError.None)
65 Log.Error(Globals.LogTag, "Failed to get interface name, Error - " + (WiFiError)ret);
71 internal WiFiConnectionState ConnectionState
76 int ret = Interop.WiFi.GetConnectionState(out state);
77 if (ret != (int)WiFiError.None)
79 Log.Error(Globals.LogTag, "Failed to get connection state, Error - " + (WiFiError)ret);
80 return WiFiConnectionState.Failure;
82 return (WiFiConnectionState)state;
85 internal bool IsActivated
90 int ret = Interop.WiFi.IsActivated(out active);
91 if (ret != (int)WiFiError.None)
93 Log.Error(Globals.LogTag, "Failed to get isActive, Error - " + (WiFiError)ret);
99 internal static WiFiManagerImpl Instance
107 private WiFiManagerImpl()
117 public void Dispose()
120 GC.SuppressFinalize(this);
123 private void Dispose(bool disposing)
130 // Free managed objects.
132 //Free unmanaged objects
134 RemoveAllRegisteredEvent();
138 private void initialize()
140 int ret = Interop.WiFi.Initialize();
141 if (ret != (int)WiFiError.None)
143 Log.Error(Globals.LogTag, "Failed to initialize wifi, Error - " + (WiFiError)ret);
144 WiFiErrorFactory.ThrowWiFiException(ret);
147 ret = Interop.WiFi.GetMacAddress(out address);
148 if (ret != (int)WiFiError.None)
150 Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiError)ret);
153 _macAddress = address;
156 private void deinitialize()
158 int ret = Interop.WiFi.Deinitialize();
159 if (ret != (int)WiFiError.None)
161 Log.Error(Globals.LogTag, "Failed to deinitialize wifi, Error - " + (WiFiError)ret);
162 WiFiErrorFactory.ThrowWiFiException(ret);
166 internal IEnumerable<WiFiAp> GetFoundAps()
168 List<WiFiAp> apList = new List<WiFiAp>();
169 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
171 if (apHandle != IntPtr.Zero)
174 Interop.WiFi.Ap.Clone(out clonedHandle, apHandle);
175 WiFiAp apItem = new WiFiAp(clonedHandle);
182 int ret = Interop.WiFi.GetForeachFoundAps(callback, IntPtr.Zero);
183 if (ret != (int)WiFiError.None)
185 Log.Error(Globals.LogTag, "Failed to get all APs, Error - " + (WiFiError)ret);
186 WiFiErrorFactory.ThrowWiFiException(ret);
192 internal IEnumerable<WiFiAp> GetFoundSpecificAps()
194 List<WiFiAp> apList = new List<WiFiAp>();
195 Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
197 if (apHandle != IntPtr.Zero)
200 Interop.WiFi.Ap.Clone(out clonedHandle, apHandle);
201 WiFiAp apItem = new WiFiAp(clonedHandle);
209 int ret = Interop.WiFi.GetForeachFoundSpecificAps(callback, IntPtr.Zero);
210 if (ret != (int)WiFiError.None)
212 Log.Error(Globals.LogTag, "Failed to get specific APs, Error - " + (WiFiError)ret);
213 WiFiErrorFactory.ThrowWiFiException(ret);
219 internal IEnumerable<WiFiConfiguration> GetWiFiConfigurations()
221 List<WiFiConfiguration> configList = new List<WiFiConfiguration>();
222 Interop.WiFi.HandleCallback callback = (IntPtr configHandle, IntPtr userData) =>
224 if (configHandle != IntPtr.Zero)
227 Interop.WiFi.Config.Clone(configHandle, out clonedConfig);
228 WiFiConfiguration configItem = new WiFiConfiguration(clonedConfig);
229 configList.Add(configItem);
235 int ret = Interop.WiFi.Config.GetForeachConfiguration(callback, IntPtr.Zero);
236 if (ret != (int)WiFiError.None)
238 Log.Error(Globals.LogTag, "Failed to get configurations, Error - " + (WiFiError)ret);
239 WiFiErrorFactory.ThrowWiFiException(ret);
245 internal void SaveWiFiNetworkConfiguration(WiFiConfiguration config)
247 IntPtr configHandle = config.GetHandle();
248 int ret = Interop.WiFi.Config.SaveConfiguration(configHandle);
249 if (ret != (int)WiFiError.None)
251 Log.Error(Globals.LogTag, "Failed to save configuration, Error - " + (WiFiError)ret);
252 WiFiErrorFactory.ThrowWiFiException(ret);
256 internal WiFiAp GetConnectedAp()
260 int ret = Interop.WiFi.GetConnectedAp(out apHandle);
261 if (ret != (int)WiFiError.None)
263 Log.Error(Globals.LogTag, "Failed to connect with AP, Error - " + (WiFiError)ret);
264 WiFiErrorFactory.ThrowWiFiException(ret);
266 WiFiAp ap = new WiFiAp(apHandle);
270 internal void RemoveAp(WiFiAp ap)
272 IntPtr apHandle = ap.GetHandle();
273 int ret = Interop.WiFi.RemoveAp(apHandle);
274 if (ret != (int)WiFiError.None)
276 Log.Error(Globals.LogTag, "Failed to remove with AP, Error - " + (WiFiError)ret);
277 WiFiErrorFactory.ThrowWiFiException(ret);
281 internal Task ActivateAsync()
283 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
287 id = (IntPtr)_requestId++;
288 _callback_map[id] = (error, key) =>
290 Log.Debug(Globals.LogTag, "wifi activated");
291 if (error != (int)WiFiError.None)
293 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
294 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
296 task.SetResult(true);
299 _callback_map.Remove(key);
303 int ret = Interop.WiFi.Activate(_callback_map[id], id);
304 if (ret != (int)WiFiError.None)
306 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
307 WiFiErrorFactory.ThrowWiFiException(ret);
312 internal Task ActivateWithWiFiPickerTestedAsync()
314 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
318 id = (IntPtr)_requestId++;
319 _callback_map[id] = (error, key) =>
321 Log.Debug(Globals.LogTag, "Activation finished");
322 if (error != (int)WiFiError.None)
324 Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
325 task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
327 task.SetResult(true);
330 _callback_map.Remove(key);
334 int ret = Interop.WiFi.ActivateWithWiFiPickerTested(_callback_map[id], id);
335 if (ret != (int)WiFiError.None)
337 Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
338 WiFiErrorFactory.ThrowWiFiException(ret);
343 internal Task DeactivateAsync()
345 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
349 id = (IntPtr)_requestId++;
350 _callback_map[id] = (error, key) =>
352 Log.Debug(Globals.LogTag, "Deactivation finished");
353 if (error != (int)WiFiError.None)
355 Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error);
356 task.SetException(new InvalidOperationException("Error occurs during WiFi deactivating, " + (WiFiError)error));
358 task.SetResult(true);
361 _callback_map.Remove(key);
365 int ret = Interop.WiFi.Deactivate(_callback_map[id], id);
366 if (ret != (int)WiFiError.None)
368 Log.Error(Globals.LogTag, "Failed to deactivate wifi, Error - " + (WiFiError)ret);
369 WiFiErrorFactory.ThrowWiFiException(ret);
374 internal Task ScanAsync()
376 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
380 id = (IntPtr)_requestId++;
381 _callback_map[id] = (error, key) =>
383 Log.Debug(Globals.LogTag, "Scanning finished");
384 if (error != (int)WiFiError.None)
386 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
387 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
389 task.SetResult(true);
392 _callback_map.Remove(key);
396 int ret = Interop.WiFi.Scan(_callback_map[id], id);
397 if (ret != (int)WiFiError.None)
399 Log.Error(Globals.LogTag, "Failed to scan all AP, Error - " + (WiFiError)ret);
400 WiFiErrorFactory.ThrowWiFiException(ret);
405 internal Task ScanSpecificApAsync(string essid)
407 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
411 id = (IntPtr)_requestId++;
412 _callback_map[id] = (error, key) =>
414 Log.Debug(Globals.LogTag, "Scanning with specific AP finished");
415 if (error != (int)WiFiError.None)
417 Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
418 task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
420 task.SetResult(true);
423 _callback_map.Remove(key);
427 int ret = Interop.WiFi.ScanSpecificAp(essid, _callback_map[id], id);
428 if (ret != (int)WiFiError.None)
430 Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
431 WiFiErrorFactory.ThrowWiFiException(ret);
436 internal Task ConnectAsync(WiFiAp ap)
438 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
442 id = (IntPtr)_requestId++;
443 _callback_map[id] = (error, key) =>
445 Log.Debug(Globals.LogTag, "Connecting finished : " + (WiFiError)error);
446 if (error != (int)WiFiError.None)
448 Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
449 task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
451 task.SetResult(true);
454 _callback_map.Remove(key);
458 IntPtr apHandle = ap.GetHandle();
459 int ret = Interop.WiFi.Connect(apHandle, _callback_map[id], id);
460 if (ret != (int)WiFiError.None)
462 Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
463 WiFiErrorFactory.ThrowWiFiException(ret);
468 internal Task DisconnectAsync(WiFiAp ap)
470 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
474 id = (IntPtr)_requestId++;
475 _callback_map[id] = (error, key) =>
477 Log.Debug(Globals.LogTag, "Disconnecting finished");
478 if (error != (int)WiFiError.None)
480 Log.Error(Globals.LogTag, "Error occurs during WiFi disconnecting, " + (WiFiError)error);
481 task.SetException(new InvalidOperationException("Error occurs during WiFi disconnecting, " + (WiFiError)error));
483 task.SetResult(true);
486 _callback_map.Remove(key);
490 IntPtr apHandle = ap.GetHandle();
491 int ret = Interop.WiFi.Disconnect(apHandle, _callback_map[id], id);
492 if (ret != (int)WiFiError.None)
494 Log.Error(Globals.LogTag, "Failed to disconnect wifi, Error - " + (WiFiError)ret);
495 WiFiErrorFactory.ThrowWiFiException(ret);
500 internal Task ConnectByWpsPbcAsync(WiFiAp ap)
502 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
506 id = (IntPtr)_requestId++;
507 _callback_map[id] = (error, key) =>
509 Log.Debug(Globals.LogTag, "Connecting by WPS PBC finished");
510 if (error != (int)WiFiError.None)
512 Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
513 task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
515 task.SetResult(true);
518 _callback_map.Remove(key);
522 IntPtr apHandle = ap.GetHandle();
523 int ret = Interop.WiFi.ConnectByWpsPbc(apHandle, _callback_map[id], id);
524 if (ret != (int)WiFiError.None)
526 Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
527 WiFiErrorFactory.ThrowWiFiException(ret);
532 internal Task ConnectByWpsPinAsync(WiFiAp ap, string pin)
534 TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
538 id = (IntPtr)_requestId++;
539 _callback_map[id] = (error, key) =>
541 Log.Debug(Globals.LogTag, "Connecting by WPS PIN finished");
542 if (error != (int)WiFiError.None)
544 Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
545 task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
547 task.SetResult(true);
550 _callback_map.Remove(key);
554 IntPtr apHandle = ap.GetHandle();
555 int ret = Interop.WiFi.ConnectByWpsPin(apHandle, pin, _callback_map[id], id);
556 if (ret != (int)WiFiError.None)
558 Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
559 WiFiErrorFactory.ThrowWiFiException(ret);