[Packagemanager] Do not catch the exception thrown by event handler of app (#1540)
authorjeremy-jang <35089715+jeremy-jang@users.noreply.github.com>
Tue, 14 Apr 2020 05:34:45 +0000 (14:34 +0900)
committerGitHub <noreply@github.com>
Tue, 14 Apr 2020 05:34:45 +0000 (14:34 +0900)
* [Packagemanager] Fix exception handling when invoking app's event handlers

Invoke the registered event handlers one by one in try-catch block to
invoking all event handlers whether exception occurred at one of event
handlers.

Change-Id: Id2f6d9815ddbb43867a11cab9423384c6614b848
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
* [Packagemanager] Fix invoking event handlers as thread-safely

Change-Id: I21e2ff25726d6a4a24453e351dd64ecd47bdece4
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
* [Packagemanager] Do not catch the exception thrown by event handler of app

The applications should be responsible its exception, they should
determine handle or not the exception.

Change-Id: Ifffb4a14aa920eae905f6ff76f3a887d06e579b8
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/Tizen.Applications.PackageManager/Tizen.Applications/PackageManager.cs

index 29bfc2d..df613b4 100755 (executable)
@@ -1193,33 +1193,43 @@ 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)
         {
+            PackageManagerEventArgs args;
             try
             {
+                args = new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress);
+            }
+            catch (Exception e)
+            {
+                Log.Warn(LogTag, e.Message);
+                return;
+            }
+
+            EventHandler<PackageManagerEventArgs> handlers = null;
+            lock (s_pkgEventLock)
+            {
                 if (eventType == Interop.PackageManager.EventType.Install)
                 {
-                    s_installEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                    handlers = s_installEventHandler;
                 }
                 else if (eventType == Interop.PackageManager.EventType.Uninstall)
                 {
-                    s_uninstallEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                    handlers = s_uninstallEventHandler;
                 }
                 else if (eventType == Interop.PackageManager.EventType.Update)
                 {
-                    s_updateEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                    handlers = s_updateEventHandler;
                 }
                 else if (eventType == Interop.PackageManager.EventType.Move)
                 {
-                    s_moveEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                    handlers = s_moveEventHandler;
                 }
                 else if (eventType == Interop.PackageManager.EventType.ClearData)
                 {
-                    s_clearDataEventHandler?.Invoke(null, new PackageManagerEventArgs(packageType, packageId, (PackageEventState)eventState, progress));
+                    handlers = s_clearDataEventHandler;
                 }
             }
-            catch (Exception e)
-            {
-                Log.Warn(LogTag, e.Message);
-            }
+
+            handlers?.Invoke(null, args);
         }
 
         private static void UnregisterPackageManagerEventIfNeeded()