X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FTizen.Security.PrivacyPrivilegeManager%2FTizen.Security%2FPrivacyPrivilegeManager.cs;h=9c47cd30bd78e944769edf968e05d6e75b1fac28;hb=98dcbeeefd4172dbe9fab93fafe101200ce6255e;hp=83de89ab9fbee0b47ccd5fa01de6690a412311fa;hpb=185705fe581c1cb9a05c6ff795e912a6fe87c4ee;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git diff --git a/src/Tizen.Security.PrivacyPrivilegeManager/Tizen.Security/PrivacyPrivilegeManager.cs b/src/Tizen.Security.PrivacyPrivilegeManager/Tizen.Security/PrivacyPrivilegeManager.cs index 83de89a..9c47cd3 100644 --- a/src/Tizen.Security.PrivacyPrivilegeManager/Tizen.Security/PrivacyPrivilegeManager.cs +++ b/src/Tizen.Security.PrivacyPrivilegeManager/Tizen.Security/PrivacyPrivilegeManager.cs @@ -18,7 +18,6 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Tizen.Internals.Errors; namespace Tizen.Security { @@ -29,6 +28,8 @@ namespace Tizen.Security public static class PrivacyPrivilegeManager { private const string LogTag = "Tizen.Privilege"; + private static Dictionary> s_multipleRequestMap = new Dictionary>(); + private static int s_requestId = 0; private static IDictionary> s_responseWeakMap = new Dictionary>(); private static Interop.PrivacyPrivilegeManager.RequestResponseCallback s_requestResponseCb = (Interop.PrivacyPrivilegeManager.CallCause cause, Interop.PrivacyPrivilegeManager.RequestResult result, @@ -62,6 +63,7 @@ namespace Tizen.Security private static IDictionary s_responseMap = new Dictionary(); private static HashSet s_PrivilegesInProgress = new HashSet(); + private static Interop.PrivacyPrivilegeManager.RequestMultipleResponseCallback s_multipleCallback = MultipleRequestHandler; private static string[] CheckPrivilegesArgument(IEnumerable privileges, string methodName) { @@ -276,32 +278,14 @@ namespace Tizen.Security Log.Info(LogTag, "Sending request for permissions: " + string.Join(" ", privilegesArray)); + int requestId = 0; + lock (s_multipleRequestMap) + { + requestId = s_requestId++; + } TaskCompletionSource permissionResponsesTask = new TaskCompletionSource(); - int ret = (int)Interop.PrivacyPrivilegeManager.RequestPermissions(privilegesArray, (uint)privilegesArray.Length, - (Interop.PrivacyPrivilegeManager.CallCause cause, Interop.PrivacyPrivilegeManager.RequestResult[] results, - string[] requestedPrivileges, uint privilegesCount, IntPtr userData) => - { - Log.Info(LogTag, "Sending request for permissions: "); - RequestMultipleResponseEventArgs requestResponse = new RequestMultipleResponseEventArgs(); - PermissionRequestResponse[] permissionResponses = new PermissionRequestResponse[privilegesCount]; - - for (int iterator = 0; iterator < privilegesCount; ++iterator) - { - permissionResponses[iterator] = new PermissionRequestResponse - { - Privilege = requestedPrivileges[iterator], - Result = (RequestResult)results[iterator] - }; - } - requestResponse.Cause = (CallCause)cause; - requestResponse.Responses = permissionResponses; - - foreach (string privilege in requestedPrivileges) - { - s_PrivilegesInProgress.Remove(privilege); - } - permissionResponsesTask.SetResult(requestResponse); - }, IntPtr.Zero); + s_multipleRequestMap[requestId] = permissionResponsesTask; + int ret = (int)Interop.PrivacyPrivilegeManager.RequestPermissions(privilegesArray, (uint)privilegesArray.Length, s_multipleCallback, (IntPtr)requestId); if (ret != (int)Interop.PrivacyPrivilegeManager.ErrorCode.None) { @@ -310,6 +294,7 @@ namespace Tizen.Security { s_PrivilegesInProgress.Remove(privilege); } + s_multipleRequestMap.Remove(requestId); throw PrivacyPrivilegeManagerErrorFactory.GetException(ret); } else @@ -380,6 +365,38 @@ namespace Tizen.Security return s_responseWeakMap[privilege]; } + private static void MultipleRequestHandler(Interop.PrivacyPrivilegeManager.CallCause cause, Interop.PrivacyPrivilegeManager.RequestResult[] results, + string[] requestedPrivileges, uint privilegesCount, IntPtr userData) + { + int requestId = (int)userData; + if (!s_multipleRequestMap.ContainsKey(requestId)) + { + return; + } + + var tcs = s_multipleRequestMap[requestId]; + RequestMultipleResponseEventArgs requestResponse = new RequestMultipleResponseEventArgs(); + PermissionRequestResponse[] permissionResponses = new PermissionRequestResponse[privilegesCount]; + + for (int iterator = 0; iterator < privilegesCount; ++iterator) + { + permissionResponses[iterator] = new PermissionRequestResponse + { + Privilege = requestedPrivileges[iterator], + Result = (RequestResult)results[iterator] + }; + } + requestResponse.Cause = (CallCause)cause; + requestResponse.Responses = permissionResponses; + + foreach (string privilege in requestedPrivileges) + { + s_PrivilegesInProgress.Remove(privilege); + } + tcs.SetResult(requestResponse); + s_multipleRequestMap.Remove(requestId); + } + /// /// This class manages event handlers of the privilege permission requests. /// This class enables having event handlers for an individual privilege.