Implemented fix for the connection callbacks crash tct issue
authorshikha.ta <shikha.ta@samsung.com>
Wed, 25 Jan 2017 12:04:46 +0000 (17:34 +0530)
committershikha.ta <shikha.ta@samsung.com>
Fri, 27 Jan 2017 05:51:34 +0000 (11:21 +0530)
Signed-off-by: shikha.ta <shikha.ta@samsung.com>
Change-Id: I35d96ce41ee7a4e91455f6bbb8ccba3eb7d68ee6

src/Tizen.Network.Connection/Interop/Interop.Connection.cs [changed mode: 0644->0755]
src/Tizen.Network.Connection/Tizen.Network.Connection/ConnectionManager.cs [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 04cde64..9ca98e5
@@ -22,9 +22,13 @@ internal static partial class Interop
 {
     internal static partial class Connection
     {
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         public delegate void ConnectionTypeChangedCallback(ConnectionType type, IntPtr userData);
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         public delegate void EthernetCableStateChangedCallback(EthernetCableState state, IntPtr userData);
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         public delegate void ConnectionAddressChangedCallback(IntPtr ipv4, IntPtr ipv6, IntPtr userData);
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         public delegate void ConnectionCallback(ConnectionError result, IntPtr userData);
 
         [DllImport(Libraries.Connection, EntryPoint = "connection_create")]
old mode 100644 (file)
new mode 100755 (executable)
index 21724ca..3ae6a56
@@ -40,6 +40,10 @@ namespace Tizen.Network.Connection
         private EventHandler _EthernetCableStateChanged = null;
         private EventHandler _ProxyAddressChanged = null;
 
+        private Interop.Connection.ConnectionAddressChangedCallback _connectionAddressChangedCallback;
+        private Interop.Connection.ConnectionTypeChangedCallback _connectionTypeChangedCallback;
+        private Interop.Connection.ConnectionAddressChangedCallback _proxyAddressChangedCallback;
+
         public ConnectionManager()
         {
             _internalManager = new ConnectionInternalManager();
@@ -97,7 +101,14 @@ namespace Tizen.Network.Connection
 
         private void ConnectionTypeChangedStart()
         {
-            int ret = Interop.Connection.SetTypeChangedCallback(_internalManager.GetHandle(), TypeChangedCallback, IntPtr.Zero);
+            _connectionTypeChangedCallback = (ConnectionType type, IntPtr user_data) =>
+            {
+                if (_ConnectionTypeChanged != null)
+                {
+                    _ConnectionTypeChanged(null, new ConnectionTypeEventArgs(type));
+                }
+            };
+            int ret = Interop.Connection.SetTypeChangedCallback(_internalManager.GetHandle(), _connectionTypeChangedCallback, IntPtr.Zero);
             if ((ConnectionError)ret != ConnectionError.None)
             {
                 Log.Error(Globals.LogTag, "It failed to register connection type changed callback, " + (ConnectionError)ret);
@@ -115,14 +126,6 @@ namespace Tizen.Network.Connection
             }
         }
 
-        private void TypeChangedCallback(ConnectionType type, IntPtr user_data)
-        {
-            if (_ConnectionTypeChanged != null)
-            {
-                _ConnectionTypeChanged(null, new ConnectionTypeEventArgs(type));
-            }
-        }
-
         /// <summary>
         /// Event for ethernet cable is plugged [in/out] event.
         /// </summary>
@@ -199,8 +202,21 @@ namespace Tizen.Network.Connection
 
         private void IpAddressChangedStart()
         {
+            _connectionAddressChangedCallback = (IntPtr Ipv4, IntPtr Ipv6, IntPtr UserData) =>
+            {
+                if (_IPAddressChanged != null)
+                {
+                    string ipv4 = Marshal.PtrToStringAnsi(Ipv4);
+                    string ipv6 = Marshal.PtrToStringAnsi(Ipv6);
+
+                    if ((string.IsNullOrEmpty(ipv4) == false) || (string.IsNullOrEmpty(ipv6) == false))
+                    {
+                        _IPAddressChanged(null, new AddressEventArgs(ipv4, ipv6));
+                    }
+                }
+            };
             Log.Debug(Globals.LogTag, "Handle: " + _internalManager.GetHandle());
-            int ret = Interop.Connection.SetIpAddressChangedCallback(_internalManager.GetHandle(), IPAddressChangedCallback, IntPtr.Zero);
+            int ret = Interop.Connection.SetIpAddressChangedCallback(_internalManager.GetHandle(), _connectionAddressChangedCallback, IntPtr.Zero);
             if ((ConnectionError)ret != ConnectionError.None)
             {
                 Log.Error(Globals.LogTag, "It failed to register callback for changing IP address, " + (ConnectionError)ret);
@@ -216,20 +232,6 @@ namespace Tizen.Network.Connection
             }
         }
 
-        private void IPAddressChangedCallback(IntPtr Ipv4, IntPtr Ipv6, IntPtr UserData)
-        {
-            if (_IPAddressChanged != null)
-            {
-                string ipv4 = Marshal.PtrToStringAnsi(Ipv4);
-                string ipv6 = Marshal.PtrToStringAnsi(Ipv6);
-
-                if ((string.IsNullOrEmpty(ipv4) == false) || (string.IsNullOrEmpty(ipv6) == false))
-                {
-                    _IPAddressChanged(null, new AddressEventArgs(ipv4, ipv6));
-                }
-            }
-        }
-
         /// <summary>
         /// Event that is called when the proxy address is changed.
         /// </summary>
@@ -257,7 +259,20 @@ namespace Tizen.Network.Connection
 
         private void ProxyAddressChangedStart()
         {
-            int ret = Interop.Connection.SetProxyAddressChangedCallback(_internalManager.GetHandle(), IPAddressChangedCallback, IntPtr.Zero);
+            _proxyAddressChangedCallback = (IntPtr Ipv4, IntPtr Ipv6, IntPtr UserData) =>
+            {
+                if (_ProxyAddressChanged != null)
+                {
+                    string ipv4 = Marshal.PtrToStringAnsi(Ipv4);
+                    string ipv6 = Marshal.PtrToStringAnsi(Ipv6);
+
+                    if ((string.IsNullOrEmpty(ipv4) == false) || (string.IsNullOrEmpty(ipv6) == false))
+                    {
+                        _ProxyAddressChanged(null, new AddressEventArgs(ipv4, ipv6));
+                    }
+                }
+            };
+            int ret = Interop.Connection.SetProxyAddressChangedCallback(_internalManager.GetHandle(), _proxyAddressChangedCallback, IntPtr.Zero);
             if ((ConnectionError)ret != ConnectionError.None)
             {
                 Log.Error(Globals.LogTag, "It failed to register callback for changing proxy address, " + (ConnectionError)ret);
@@ -273,19 +288,6 @@ namespace Tizen.Network.Connection
             }
         }
 
-        private void ProxyAddressChangedCallback(IntPtr Ipv4, IntPtr Ipv6, IntPtr UserData)
-        {
-            if (_ProxyAddressChanged != null)
-            {
-                string ipv4 = Marshal.PtrToStringAnsi(Ipv4);
-                string ipv6 = Marshal.PtrToStringAnsi(Ipv6);
-                Interop.Libc.Free(Ipv4);
-                Interop.Libc.Free(Ipv6);
-
-                _ProxyAddressChanged(null, new AddressEventArgs(ipv4, ipv6));
-            }
-        }
-
         private void UnregisterEvents()
         {
             if (_ConnectionTypeChanged != null)