[Tizen.Network.WiFi] Use lock on checking if instance is null (#119)
[platform/core/csapi/tizenfx.git] / src / Tizen.Network.WiFi / Tizen.Network.WiFi / WiFiManagerImpl.cs
index 2472463..ec52dc9 100755 (executable)
@@ -29,7 +29,7 @@ namespace Tizen.Network.WiFi
 
     internal class HandleHolder
     {
-        private Interop.WiFi.SafeWiFiManagerHandle _handle;
+        private SafeWiFiManagerHandle _handle;
 
         internal HandleHolder()
         {
@@ -37,7 +37,7 @@ namespace Tizen.Network.WiFi
             Log.Debug(Globals.LogTag, "Handle: " + _handle);
         }
 
-        internal Interop.WiFi.SafeWiFiManagerHandle GetSafeHandle()
+        internal SafeWiFiManagerHandle GetSafeHandle()
         {
             Log.Debug(Globals.LogTag, "Handleholder safehandle = " + _handle);
             return _handle;
@@ -46,7 +46,8 @@ namespace Tizen.Network.WiFi
 
     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;
@@ -121,13 +122,7 @@ namespace Tizen.Network.WiFi
         {
             get
             {
-                if (_instance == null)
-                {
-                    Log.Debug(Globals.LogTag, "Instance is null");
-                    _instance = new WiFiManagerImpl();
-                }
-
-                return _instance;
+               return _instance.Value;
             }
         }
 
@@ -139,21 +134,22 @@ namespace Tizen.Network.WiFi
 
         private WiFiManagerImpl()
         {
+            Log.Info(Globals.LogTag, "WiFiManagerImpl constructor");
         }
 
-        internal Interop.WiFi.SafeWiFiManagerHandle GetSafeHandle()
+        internal SafeWiFiManagerHandle GetSafeHandle()
         {
             return s_threadName.Value.GetSafeHandle();
         }
 
-        internal Interop.WiFi.SafeWiFiManagerHandle Initialize()
+        internal SafeWiFiManagerHandle Initialize()
         {
-            Interop.WiFi.SafeWiFiManagerHandle 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;
         }
@@ -179,7 +175,7 @@ namespace Tizen.Network.WiFi
             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;
@@ -207,7 +203,7 @@ namespace Tizen.Network.WiFi
             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;
@@ -234,7 +230,7 @@ namespace Tizen.Network.WiFi
             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;
@@ -243,12 +239,17 @@ namespace Tizen.Network.WiFi
         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(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");
             }
         }
 
@@ -259,8 +260,16 @@ namespace Tizen.Network.WiFi
             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;
@@ -282,7 +291,10 @@ namespace Tizen.Network.WiFi
                         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);
@@ -293,7 +305,7 @@ namespace Tizen.Network.WiFi
             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;
         }
@@ -314,7 +326,10 @@ namespace Tizen.Network.WiFi
                         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);
@@ -325,7 +340,7 @@ namespace Tizen.Network.WiFi
             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;
         }
@@ -346,7 +361,10 @@ namespace Tizen.Network.WiFi
                         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);
@@ -357,7 +375,7 @@ namespace Tizen.Network.WiFi
             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;
         }
@@ -378,7 +396,10 @@ namespace Tizen.Network.WiFi
                         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);
@@ -389,7 +410,7 @@ namespace Tizen.Network.WiFi
             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;
         }
@@ -410,7 +431,10 @@ namespace Tizen.Network.WiFi
                         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);
@@ -421,7 +445,7 @@ namespace Tizen.Network.WiFi
             if (ret != (int)WiFiError.None)
             {
                 Log.Error(Globals.LogTag, "Failed to scan with specific AP, Error - " + (WiFiError)ret);
-                WiFiErrorFactory.ThrowWiFiException(ret);
+                WiFiErrorFactory.ThrowWiFiException(ret, GetSafeHandle().DangerousGetHandle());
             }
             return task.Task;
         }