private MLResult RequestPrivilegeAsyncInternal(MLPrivileges.Id privilegeId, CallbackDelegate callback) { if (callback == null) { return(MLResult.Create(MLResult.Code.InvalidParam, "MLPrivileges.RequestPrivilegeAsync failed. Reason: Must send a valid callback.")); } if (!this.currentRequests.ContainsKey(privilegeId)) { IntPtr newRequest = IntPtr.Zero; MLResult.Code resultCode = NativeBindings.MLPrivilegesRequestPrivilegeAsync(privilegeId, ref newRequest); if (resultCode == MLResult.Code.Ok) { RequestPrivilegeQuery newQuery = new RequestPrivilegeQuery(callback, newRequest, privilegeId); this.currentRequests.Add(privilegeId, newQuery); } return(MLResult.Create(resultCode)); } else { return(MLResult.Create(MLResult.Code.Ok)); } }
/// <summary> /// Request the specified privileges. This may solicit consent from the end-user. /// Note: The asynchronous callback occurs within the main thread. /// </summary> /// <param name="privilegeId">The privilege to request.</param> /// <param name="callback">Callback to be executed when the privilege request has completed.</param> /// <returns> /// MLResult.Result will be <c>MLResult.Code.Ok</c> if the privilege request is in progress. /// MLResult.Result will be <c>MLResult.Code.InvalidParam</c> if the callback is null. /// MLResult.Result will be <c>MLResult.Code.UnspecifiedFailure</c> if the privilege system was not started. /// Callback MLResult.Result will be <c>MLResult.Code.PrivilegeGranted</c> if the privilege is granted. /// Callback MLResult.Result will be <c>MLResult.Code.PrivilegeNotGranted</c> if the privilege is denied. /// </returns> public static MLResult RequestPrivilegeAsync(MLPrivileges.Id privilegeId, CallbackDelegate callback) { try { if (MLPrivileges.IsValidInstance()) { if (callback == null) { return(MLResult.Create(MLResult.Code.InvalidParam, "MLPrivileges.RequestPrivilegeAsync failed. Reason: Must send a valid callback.")); } if (!_instance.currentRequests.ContainsKey(privilegeId)) { IntPtr newRequest = IntPtr.Zero; MLResult.Code resultCode = NativeBindings.MLPrivilegesRequestPrivilegeAsync(privilegeId, ref newRequest); if (resultCode == MLResult.Code.Ok) { RequestPrivilegeQuery newQuery = new RequestPrivilegeQuery(callback, newRequest, privilegeId); _instance.currentRequests.Add(privilegeId, newQuery); } return(MLResult.Create(resultCode)); } else { return(MLResult.Create(MLResult.Code.Ok)); } } else { MLPluginLog.ErrorFormat("MLPrivileges.RequestPrivilegeAsync failed. Reason: No Instance for MLPrivileges."); return(MLResult.Create(MLResult.Code.UnspecifiedFailure, "MLPrivileges.RequestPrivilegeAsync failed. Reason: No Instance for MLPrivileges.")); } } catch (System.EntryPointNotFoundException) { MLPluginLog.Error("MLPrivileges.RequestPrivilegeAsync failed. Reason: API symbols not found"); return(MLResult.Create(MLResult.Code.UnspecifiedFailure, "MLPrivileges.RequestPrivilegeAsync failed. Reason: API symbols not found.")); } }
/// <summary> /// Request the specified privilege asynchronously. This may solicit consent from the end-user. /// This async override uses Tasks instead of a callback. /// </summary> /// <param name="privilegeId">The privilege to request.</param> /// <returns> /// MLResult.Result will be <c>MLResult.Code.PrivilegeGranted</c> if the privilege is granted. /// MLResult.Result will be <c>MLResult.Code.PrivilegeNotGranted</c> if the privilege is denied. /// MLResult.Result will be <c>MLResult.Code.UnspecifiedFailure</c> if the privilege system was not started. /// </returns> private async Task <MLResult> RequestPrivilegeAsyncInternal(MLPrivileges.Id privilegeId) { var taskCompletionSource = new TaskCompletionSource <MLResult>(); if (this.currentRequests.ContainsKey(privilegeId)) { return(MLResult.Create(MLResult.Code.Ok)); } IntPtr newRequest = IntPtr.Zero; MLResult.Code resultCode = NativeBindings.MLPrivilegesRequestPrivilegeAsync(privilegeId, ref newRequest); if (!MLResult.IsOK(resultCode)) { return(MLResult.Create(resultCode)); } RequestPrivilegeQuery newQuery = new RequestPrivilegeQuery((result, id) => taskCompletionSource.SetResult(result), newRequest, privilegeId); this.currentRequests.Add(privilegeId, newQuery); return(await taskCompletionSource.Task); }