using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
+using System.Runtime.InteropServices;
namespace Tizen.Network.WiFi
{
internal const string LogTag = "Tizen.Network.WiFi";
}
- internal class HandleHolder : IDisposable
+ internal class HandleHolder
{
- private IntPtr _handle = IntPtr.Zero;
- private bool disposed = false;
+ private SafeWiFiManagerHandle _handle;
internal HandleHolder()
{
- Log.Debug(Globals.LogTag, "HandleHolder() Constructor");
_handle = WiFiManagerImpl.Instance.Initialize();
Log.Debug(Globals.LogTag, "Handle: " + _handle);
}
- ~HandleHolder()
+ internal SafeWiFiManagerHandle GetSafeHandle()
{
- Dispose(false);
- }
-
- internal IntPtr GetHandle()
- {
- Log.Debug(Globals.LogTag, "Handleholder handle = " + _handle);
+ Log.Debug(Globals.LogTag, "Handleholder safehandle = " + _handle);
return _handle;
}
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- private void Dispose(bool disposing)
- {
- Log.Debug(Globals.LogTag, ">>> HandleHolder Dispose with " + disposing);
- Log.Debug(Globals.LogTag, ">>> Handle: " + _handle);
- if (disposed)
- return;
-
- if (disposing)
- {
- // Free managed objects.
- WiFiManagerImpl.Instance.Deinitialize(_handle);
- }
- disposed = true;
- }
}
- internal partial class WiFiManagerImpl : IDisposable
+ internal partial class WiFiManagerImpl
{
- private static WiFiManagerImpl _instance = null;
+ private static readonly Lazy<WiFiManagerImpl> _instance =
+ new Lazy<WiFiManagerImpl>(() => new WiFiManagerImpl());
private Dictionary<IntPtr, Interop.WiFi.VoidCallback> _callback_map = new Dictionary<IntPtr, Interop.WiFi.VoidCallback>();
private int _requestId = 0;
private string _macAddress;
- private bool disposed = false;
internal string MacAddress
{
if (String.IsNullOrEmpty(_macAddress))
{
string address;
- int ret = Interop.WiFi.GetMacAddress(GetHandle(), out address);
+ int ret = Interop.WiFi.GetMacAddress(GetSafeHandle(), out address);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to get mac address, Error - " + (WiFiError)ret);
return _macAddress;
}
}
+
internal string InterfaceName
{
get
{
string name;
- int ret = Interop.WiFi.GetNetworkInterfaceName(GetHandle(), out name);
+ int ret = Interop.WiFi.GetNetworkInterfaceName(GetSafeHandle(), out name);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to get interface name, Error - " + (WiFiError)ret);
return name;
}
}
+
internal WiFiConnectionState ConnectionState
{
get
{
int state;
- int ret = Interop.WiFi.GetConnectionState(GetHandle(), out state);
+ int ret = Interop.WiFi.GetConnectionState(GetSafeHandle(), out state);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to get connection state, Error - " + (WiFiError)ret);
return (WiFiConnectionState)state;
}
}
+
internal bool IsActive
{
get
{
bool active;
- int ret = Interop.WiFi.IsActive(GetHandle(), out active);
+ int ret = Interop.WiFi.IsActive(GetSafeHandle(), out active);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to get isActive, Error - " + (WiFiError)ret);
{
get
{
- Log.Debug(Globals.LogTag, "Instance getter");
- if (_instance == null)
- {
- Log.Debug(Globals.LogTag, "Instance is null");
- _instance = new WiFiManagerImpl();
- }
-
- return _instance;
+ return _instance.Value;
}
}
private WiFiManagerImpl()
{
+ Log.Info(Globals.LogTag, "WiFiManagerImpl constructor");
}
- ~WiFiManagerImpl()
- {
- Dispose(false);
- }
-
- public void Dispose()
+ internal SafeWiFiManagerHandle GetSafeHandle()
{
- Dispose(true);
- GC.SuppressFinalize(this);
+ return s_threadName.Value.GetSafeHandle();
}
- private void Dispose(bool disposing)
+ internal SafeWiFiManagerHandle Initialize()
{
- if (disposed)
- return;
-
- if (disposing)
- {
- // Free managed objects.
- }
- //Free unmanaged objects
- RemoveAllRegisteredEvent();
- disposed = true;
- }
-
- internal IntPtr GetHandle()
- {
- Log.Debug(Globals.LogTag, "GetHandle, Thread Id = " + Thread.CurrentThread.ManagedThreadId);
- return s_threadName.Value.GetHandle();
- }
-
- internal IntPtr Initialize()
- {
- IntPtr handle;
+ SafeWiFiManagerHandle handle;
int ret = Interop.WiFi.Initialize(out handle);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to initialize wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, "http://tizen.org/privilege/network.get");
}
return handle;
}
- internal void Deinitialize(IntPtr handle)
- {
- int ret = Interop.WiFi.Deinitialize(handle);
- if (ret != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Failed to deinitialize wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
- }
- }
-
internal IEnumerable<WiFiAP> GetFoundAPs()
{
+ Log.Debug(Globals.LogTag, "GetFoundAPs");
List<WiFiAP> apList = new List<WiFiAP>();
Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
{
return false;
};
- int ret = Interop.WiFi.GetForeachFoundAPs(GetHandle(), callback, IntPtr.Zero);
+ int ret = Interop.WiFi.GetForeachFoundAPs(GetSafeHandle(), callback, IntPtr.Zero);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to get all APs, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
}
return apList;
internal IEnumerable<WiFiAP> GetFoundSpecificAPs()
{
+ Log.Debug(Globals.LogTag, "GetFoundSpecificAPs");
List<WiFiAP> apList = new List<WiFiAP>();
Interop.WiFi.HandleCallback callback = (IntPtr apHandle, IntPtr userData) =>
{
};
- int ret = Interop.WiFi.GetForeachFoundSpecificAPs(GetHandle(), callback, IntPtr.Zero);
+ int ret = Interop.WiFi.GetForeachFoundSpecificAPs(GetSafeHandle(), callback, IntPtr.Zero);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to get specific APs, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
}
return apList;
internal IEnumerable<WiFiConfiguration> GetWiFiConfigurations()
{
+ Log.Debug(Globals.LogTag, "GetWiFiConfigurations");
List<WiFiConfiguration> configList = new List<WiFiConfiguration>();
Interop.WiFi.HandleCallback callback = (IntPtr configHandle, IntPtr userData) =>
{
return false;
};
- int ret = Interop.WiFi.Config.GetForeachConfiguration(GetHandle(), callback, IntPtr.Zero);
+ int ret = Interop.WiFi.Config.GetForeachConfiguration(GetSafeHandle(), callback, IntPtr.Zero);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to get configurations, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
}
return configList;
internal void SaveWiFiNetworkConfiguration(WiFiConfiguration config)
{
+ Log.Debug(Globals.LogTag, "SaveWiFiNetworkConfiguration");
+ if (config == null)
+ {
+ throw new ArgumentNullException("WiFi configuration is null");
+ }
+
IntPtr configHandle = config.GetHandle();
- int ret = Interop.WiFi.Config.SaveConfiguration(GetHandle(), configHandle);
+ int ret = Interop.WiFi.Config.SaveConfiguration(GetSafeHandle(), configHandle);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to save configuration, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.profile");
}
}
internal WiFiAP GetConnectedAP()
{
+ Log.Debug(Globals.LogTag, "GetConnectedAP");
IntPtr apHandle;
-
- int ret = Interop.WiFi.GetConnectedAP(GetHandle(), out apHandle);
+ int ret = Interop.WiFi.GetConnectedAP(GetSafeHandle(), out apHandle);
if (ret != (int)WiFiError.None)
{
- Log.Error(Globals.LogTag, "Failed to connect with AP, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ if (ret == (int)WiFiError.NoConnectionError)
+ {
+ Log.Error(Globals.LogTag, "No connection " + (WiFiError)ret);
+ return null;
+ }
+ else
+ {
+ Log.Error(Globals.LogTag, "Failed to get connected AP, Error - " + (WiFiError)ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle(), "http://tizen.org/privilege/network.get");
+ }
}
WiFiAP ap = new WiFiAP(apHandle);
return ap;
}
- internal void RemoveAP(WiFiAP ap)
- {
- IntPtr apHandle = ap.GetHandle();
- int ret = Interop.WiFi.RemoveAP(GetHandle(), apHandle);
- if (ret != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Failed to remove with AP, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
- }
- }
-
internal Task ActivateAsync()
{
+ Log.Debug(Globals.LogTag, "ActivateAsync");
TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
IntPtr id;
lock (_callback_map)
Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
}
- task.SetResult(true);
+ else
+ {
+ task.SetResult(true);
+ }
lock (_callback_map)
{
_callback_map.Remove(key);
}
};
}
- int ret = Interop.WiFi.Activate(GetHandle(), _callback_map[id], id);
+ int ret = Interop.WiFi.Activate(GetSafeHandle(), _callback_map[id], id);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
}
return task.Task;
}
internal Task ActivateWithWiFiPickerTestedAsync()
{
+ Log.Debug(Globals.LogTag, "ActivateWithWiFiPickerTestedAsync");
TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
IntPtr id;
lock (_callback_map)
Log.Error(Globals.LogTag, "Error occurs during WiFi activating, " + (WiFiError)error);
task.SetException(new InvalidOperationException("Error occurs during WiFi activating, " + (WiFiError)error));
}
- task.SetResult(true);
+ else
+ {
+ task.SetResult(true);
+ }
lock (_callback_map)
{
_callback_map.Remove(key);
}
};
}
- int ret = Interop.WiFi.ActivateWithWiFiPickerTested(GetHandle(), _callback_map[id], id);
+ int ret = Interop.WiFi.ActivateWithWiFiPickerTested(GetSafeHandle(), _callback_map[id], id);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to activate wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
}
return task.Task;
}
internal Task DeactivateAsync()
{
+ Log.Debug(Globals.LogTag, "DeactivateAsync");
TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
IntPtr id;
lock (_callback_map)
Log.Error(Globals.LogTag, "Error occurs during WiFi deactivating, " + (WiFiError)error);
task.SetException(new InvalidOperationException("Error occurs during WiFi deactivating, " + (WiFiError)error));
}
- task.SetResult(true);
+ else
+ {
+ task.SetResult(true);
+ }
lock (_callback_map)
{
_callback_map.Remove(key);
}
};
}
- int ret = Interop.WiFi.Deactivate(GetHandle(), _callback_map[id], id);
+ int ret = Interop.WiFi.Deactivate(GetSafeHandle(), _callback_map[id], id);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to deactivate wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
}
return task.Task;
}
internal Task ScanAsync()
{
+ Log.Debug(Globals.LogTag, "ScanAsync");
TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
IntPtr id;
lock (_callback_map)
Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
}
- task.SetResult(true);
+ else
+ {
+ task.SetResult(true);
+ }
lock (_callback_map)
{
_callback_map.Remove(key);
}
};
}
- int ret = Interop.WiFi.Scan(GetHandle(), _callback_map[id], id);
+ int ret = Interop.WiFi.Scan(GetSafeHandle(), _callback_map[id], id);
if (ret != (int)WiFiError.None)
{
Log.Error(Globals.LogTag, "Failed to scan all AP, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
}
return task.Task;
}
internal Task ScanSpecificAPAsync(string essid)
{
+ Log.Debug(Globals.LogTag, "ScanSpecificAPAsync " + essid);
TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
IntPtr id;
lock (_callback_map)
Log.Error(Globals.LogTag, "Error occurs during WiFi scanning, " + (WiFiError)error);
task.SetException(new InvalidOperationException("Error occurs during WiFi scanning, " + (WiFiError)error));
}
- task.SetResult(true);
- lock (_callback_map)
- {
- _callback_map.Remove(key);
- }
- };
- }
- int ret = Interop.WiFi.ScanSpecificAP(GetHandle(), essid, _callback_map[id], id);
- if (ret != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
- }
- return task.Task;
- }
-
- internal Task ConnectAsync(WiFiAP ap)
- {
- TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
- IntPtr id;
- lock (_callback_map)
- {
- id = (IntPtr)_requestId++;
- _callback_map[id] = (error, key) =>
- {
- Log.Debug(Globals.LogTag, "Connecting finished : " + (WiFiError)error);
- if (error != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
- task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
- }
- task.SetResult(true);
- lock (_callback_map)
- {
- _callback_map.Remove(key);
- }
- };
- }
- IntPtr apHandle = ap.GetHandle();
- int ret = Interop.WiFi.Connect(GetHandle(), apHandle, _callback_map[id], id);
- if (ret != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
- }
- return task.Task;
- }
-
- internal Task DisconnectAsync(WiFiAP ap)
- {
- TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
- IntPtr id;
- lock (_callback_map)
- {
- id = (IntPtr)_requestId++;
- _callback_map[id] = (error, key) =>
- {
- Log.Debug(Globals.LogTag, "Disconnecting finished");
- if (error != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Error occurs during WiFi disconnecting, " + (WiFiError)error);
- task.SetException(new InvalidOperationException("Error occurs during WiFi disconnecting, " + (WiFiError)error));
- }
- task.SetResult(true);
- lock (_callback_map)
- {
- _callback_map.Remove(key);
- }
- };
- }
- IntPtr apHandle = ap.GetHandle();
- int ret = Interop.WiFi.Disconnect(GetHandle(), apHandle, _callback_map[id], id);
- if (ret != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Failed to disconnect wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
- }
- return task.Task;
- }
-
- internal Task ConnectByWpsPbcAsync(WiFiAP ap)
- {
- TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
- IntPtr id;
- lock (_callback_map)
- {
- id = (IntPtr)_requestId++;
- _callback_map[id] = (error, key) =>
- {
- Log.Debug(Globals.LogTag, "Connecting by WPS PBC finished");
- if (error != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
- task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
- }
- task.SetResult(true);
- lock (_callback_map)
- {
- _callback_map.Remove(key);
- }
- };
- }
- IntPtr apHandle = ap.GetHandle();
- int ret = Interop.WiFi.ConnectByWpsPbc(GetHandle(), apHandle, _callback_map[id], id);
- if (ret != (int)WiFiError.None)
- {
- Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
- }
- return task.Task;
- }
-
- internal Task ConnectByWpsPinAsync(WiFiAP ap, string pin)
- {
- TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
- IntPtr id;
- lock (_callback_map)
- {
- id = (IntPtr)_requestId++;
- _callback_map[id] = (error, key) =>
- {
- Log.Debug(Globals.LogTag, "Connecting by WPS PIN finished");
- if (error != (int)WiFiError.None)
+ else
{
- Log.Error(Globals.LogTag, "Error occurs during WiFi connecting, " + (WiFiError)error);
- task.SetException(new InvalidOperationException("Error occurs during WiFi connecting, " + (WiFiError)error));
+ task.SetResult(true);
}
- task.SetResult(true);
lock (_callback_map)
{
_callback_map.Remove(key);
}
};
}
- IntPtr apHandle = ap.GetHandle();
- int ret = Interop.WiFi.ConnectByWpsPin(GetHandle(), apHandle, pin, _callback_map[id], id);
+ int ret = Interop.WiFi.ScanSpecificAP(GetSafeHandle(), essid, _callback_map[id], id);
if (ret != (int)WiFiError.None)
{
- Log.Error(Globals.LogTag, "Failed to connect wifi, Error - " + (WiFiError)ret);
- WiFiErrorFactory.ThrowWiFiException(ret);
+ Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
+ WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
}
return task.Task;
}