[Packagemanager] Fix managing delegate lifetime 81/161381/1 4.0.1-preview1-00028
authorSangyoon Jang <jeremy.jang@samsung.com>
Wed, 22 Nov 2017 11:35:22 +0000 (20:35 +0900)
committerSemun Lee <semun.lee@samsung.com>
Thu, 23 Nov 2017 06:04:33 +0000 (06:04 +0000)
Change-Id: I5c44ebe3a43ea83b7cb850dfa155f13aebf577d1
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
(cherry picked from commit cee53da59d23edd0924c69e722ab6322af1b3460)

src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManager.cs [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
index a4a999c..2b10511
@@ -1101,42 +1101,11 @@ namespace Tizen.Applications
 
         private static void RegisterPackageManagerEventIfNeeded()
         {
-            if (s_installEventHandler != null && s_uninstallEventHandler != null && s_updateEventHandler != null && s_moveEventHandler != null && s_clearDataEventHandler != null)
-            {
+            if (s_packageManagerEventCallback != null)
                 return;
-            }
 
             var err = Interop.PackageManager.ErrorCode.None;
-            s_packageManagerEventCallback = (packageType, packageId, eventType, eventState, progress, error, user_data) =>
-            {
-                try
-                {
-                    if (eventType == Interop.PackageManager.EventType.Install)
-                    {
-                        s_installEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
-                    }
-                    else if (eventType == Interop.PackageManager.EventType.Uninstall)
-                    {
-                        s_uninstallEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
-                    }
-                    else if (eventType == Interop.PackageManager.EventType.Update)
-                    {
-                        s_updateEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
-                    }
-                    else if (eventType == Interop.PackageManager.EventType.Move)
-                    {
-                        s_moveEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
-                    }
-                    else if (eventType == Interop.PackageManager.EventType.ClearData)
-                    {
-                        s_clearDataEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
-                    }
-                }
-                catch (Exception e)
-                {
-                    Log.Warn(LogTag, e.Message);
-                }
-            };
+            s_packageManagerEventCallback = new Interop.PackageManager.PackageManagerEventCallback(InternalEventCallback);
 
             if (!Handle.IsInvalid)
             {
@@ -1155,13 +1124,46 @@ namespace Tizen.Applications
             }
         }
 
+        private static void InternalEventCallback(string packageType, string packageId, Interop.PackageManager.EventType eventType, Interop.PackageManager.PackageEventState eventState, int progress, Interop.PackageManager.ErrorCode error, IntPtr user_data)
+        {
+            try
+            {
+                if (eventType == Interop.PackageManager.EventType.Install)
+                {
+                    s_installEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                }
+                else if (eventType == Interop.PackageManager.EventType.Uninstall)
+                {
+                    s_uninstallEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                }
+                else if (eventType == Interop.PackageManager.EventType.Update)
+                {
+                    s_updateEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                }
+                else if (eventType == Interop.PackageManager.EventType.Move)
+                {
+                    s_moveEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                }
+                else if (eventType == Interop.PackageManager.EventType.ClearData)
+                {
+                    s_clearDataEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                }
+            }
+            catch (Exception e)
+            {
+                Log.Warn(LogTag, e.Message);
+            }
+        }
+
         private static void UnregisterPackageManagerEventIfNeeded()
         {
-            if (Handle.IsInvalid || s_installEventHandler != null || s_uninstallEventHandler != null || s_updateEventHandler != null || s_moveEventHandler != null || s_clearDataEventHandler != null)
+            if (Handle.IsInvalid || s_packageManagerEventCallback == null || s_installEventHandler != null || s_uninstallEventHandler != null || s_updateEventHandler != null || s_moveEventHandler != null || s_clearDataEventHandler != null)
             {
                 return;
             }
 
+            s_packageManagerEventCallback = null;
+
             var err = Interop.PackageManager.PackageManagerUnsetEvent(Handle);
             if (err != Interop.PackageManager.ErrorCode.None)
             {