diff --git a/ElectronNET.API/App.cs b/ElectronNET.API/App.cs index 68463e3..7a66589 100644 --- a/ElectronNET.API/App.cs +++ b/ElectronNET.API/App.cs @@ -464,40 +464,49 @@ namespace ElectronNET.API /// The current application directory. /// /// - public async Task GetAppPathAsync() + public async Task GetAppPathAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetAppPathCompleted", (path) => + using(cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetAppPathCompleted"); - taskCompletionSource.SetResult(path.ToString()); - }); + BridgeConnector.Socket.On("appGetAppPathCompleted", (path) => + { + BridgeConnector.Socket.Off("appGetAppPathCompleted"); + taskCompletionSource.SetResult(path.ToString()); + }); - BridgeConnector.Socket.Emit("appGetAppPath"); + BridgeConnector.Socket.Emit("appGetAppPath"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// /// You can request the following paths by the name. /// - /// /// A path to a special directory or file associated with name. - public async Task GetPathAsync(PathName pathName) + public async Task GetPathAsync(PathName pathName, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); + using(cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) + { + BridgeConnector.Socket.On("appGetPathCompleted", (path) => + { + BridgeConnector.Socket.Off("appGetPathCompleted"); - BridgeConnector.Socket.On("appGetPathCompleted", (path) => - { - BridgeConnector.Socket.Off("appGetPathCompleted"); + taskCompletionSource.SetResult(path.ToString()); + }); - taskCompletionSource.SetResult(path.ToString()); - }); + BridgeConnector.Socket.Emit("appGetPath", pathName.ToString()); - BridgeConnector.Socket.Emit("appGetPath", pathName.ToString()); - - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } @@ -522,19 +531,24 @@ namespace ElectronNET.API /// the version of the current bundle or executable is returned. /// /// - public async Task GetVersionAsync() + public async Task GetVersionAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetVersionCompleted", (version) => + using(cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetVersionCompleted"); - taskCompletionSource.SetResult(version.ToString()); - }); + BridgeConnector.Socket.On("appGetVersionCompleted", (version) => + { + BridgeConnector.Socket.Off("appGetVersionCompleted"); + taskCompletionSource.SetResult(version.ToString()); + }); - BridgeConnector.Socket.Emit("appGetVersion"); + BridgeConnector.Socket.Emit("appGetVersion"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -544,19 +558,24 @@ namespace ElectronNET.API /// name by Electron. /// /// The current application’s name, which is the name in the application’s package.json file. - public async Task GetNameAsync() + public async Task GetNameAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetNameCompleted", (name) => + using(cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetNameCompleted"); - taskCompletionSource.SetResult(name.ToString()); - }); + BridgeConnector.Socket.On("appGetNameCompleted", (name) => + { + BridgeConnector.Socket.Off("appGetNameCompleted"); + taskCompletionSource.SetResult(name.ToString()); + }); - BridgeConnector.Socket.Emit("appGetName"); + BridgeConnector.Socket.Emit("appGetName"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -574,19 +593,24 @@ namespace ElectronNET.API /// folder.Note: On Windows you have to call it after the ready events gets emitted. /// /// - public async Task GetLocaleAsync() + public async Task GetLocaleAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetLocaleCompleted", (locale) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetLocaleCompleted"); - taskCompletionSource.SetResult(locale.ToString()); - }); + BridgeConnector.Socket.On("appGetLocaleCompleted", (local) => + { + BridgeConnector.Socket.Off("appGetLocaleCompleted"); + taskCompletionSource.SetResult(local.ToString()); + }); - BridgeConnector.Socket.Emit("appGetLocale"); + BridgeConnector.Socket.Emit("appGetLocale"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -625,20 +649,26 @@ namespace ElectronNET.API /// The name of your protocol, without ://. /// If you want your app to handle electron:// links, /// call this method with electron as the parameter. + /// The cancellation token. /// Whether the call succeeded. - public async Task SetAsDefaultProtocolClientAsync(string protocol) + public async Task SetAsDefaultProtocolClientAsync(string protocol, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appSetAsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appSetAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appSetAsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appSetAsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appSetAsDefaultProtocolClient", protocol); + BridgeConnector.Socket.Emit("appSetAsDefaultProtocolClient", protocol); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -659,20 +689,26 @@ namespace ElectronNET.API /// If you want your app to handle electron:// links, /// call this method with electron as the parameter. /// Defaults to process.execPath + /// The cancellation token. /// Whether the call succeeded. - public async Task SetAsDefaultProtocolClientAsync(string protocol, string path) + public async Task SetAsDefaultProtocolClientAsync(string protocol, string path, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appSetAsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appSetAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appSetAsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appSetAsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appSetAsDefaultProtocolClient", protocol, path); + BridgeConnector.Socket.Emit("appSetAsDefaultProtocolClient", protocol, path); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -694,20 +730,26 @@ namespace ElectronNET.API /// call this method with electron as the parameter. /// Defaults to process.execPath /// Defaults to an empty array + /// The cancellation token. /// Whether the call succeeded. - public async Task SetAsDefaultProtocolClientAsync(string protocol, string path, string[] args) + public async Task SetAsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appSetAsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appSetAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appSetAsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appSetAsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appSetAsDefaultProtocolClient", protocol, path, args); + BridgeConnector.Socket.Emit("appSetAsDefaultProtocolClient", protocol, path, args); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -715,20 +757,26 @@ namespace ElectronNET.API /// protocol(aka URI scheme). If so, it will remove the app as the default handler. /// /// The name of your protocol, without ://. + /// The cancellation token. /// Whether the call succeeded. - public async Task RemoveAsDefaultProtocolClientAsync(string protocol) + public async Task RemoveAsDefaultProtocolClientAsync(string protocol, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appRemoveAsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appRemoveAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appRemoveAsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appRemoveAsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appRemoveAsDefaultProtocolClient", protocol); + BridgeConnector.Socket.Emit("appRemoveAsDefaultProtocolClient", protocol); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -737,20 +785,26 @@ namespace ElectronNET.API /// /// The name of your protocol, without ://. /// Defaults to process.execPath. + /// The cancellation token. /// Whether the call succeeded. - public async Task RemoveAsDefaultProtocolClientAsync(string protocol, string path) + public async Task RemoveAsDefaultProtocolClientAsync(string protocol, string path, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appRemoveAsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appRemoveAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appRemoveAsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appRemoveAsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appRemoveAsDefaultProtocolClient", protocol, path); + BridgeConnector.Socket.Emit("appRemoveAsDefaultProtocolClient", protocol, path); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -760,20 +814,26 @@ namespace ElectronNET.API /// The name of your protocol, without ://. /// Defaults to process.execPath. /// Defaults to an empty array. + /// The cancellation token. /// Whether the call succeeded. - public async Task RemoveAsDefaultProtocolClientAsync(string protocol, string path, string[] args) - { + public async Task RemoveAsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default(CancellationToken)) + { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appRemoveAsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appRemoveAsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appRemoveAsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appRemoveAsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appRemoveAsDefaultProtocolClient", protocol, path, args); + BridgeConnector.Socket.Emit("appRemoveAsDefaultProtocolClient", protocol, path, args); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -786,20 +846,26 @@ namespace ElectronNET.API /// the Windows Registry and LSCopyDefaultHandlerForURLScheme internally. /// /// The name of your protocol, without ://. + /// The cancellation token. /// Returns Boolean - public async Task IsDefaultProtocolClientAsync(string protocol) + public async Task IsDefaultProtocolClientAsync(string protocol, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appIsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appIsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appIsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appIsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appIsDefaultProtocolClient", protocol); + BridgeConnector.Socket.Emit("appIsDefaultProtocolClient", protocol); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -813,20 +879,26 @@ namespace ElectronNET.API /// /// The name of your protocol, without ://. /// Defaults to process.execPath. + /// The cancellation token. /// Returns Boolean - public async Task IsDefaultProtocolClientAsync(string protocol, string path) + public async Task IsDefaultProtocolClientAsync(string protocol, string path, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appIsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appIsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appIsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appIsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appIsDefaultProtocolClient", protocol, path); + BridgeConnector.Socket.Emit("appIsDefaultProtocolClient", protocol, path); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -841,20 +913,26 @@ namespace ElectronNET.API /// The name of your protocol, without ://. /// Defaults to process.execPath. /// Defaults to an empty array. + /// The cancellation token. /// Returns Boolean - public async Task IsDefaultProtocolClientAsync(string protocol, string path, string[] args) + public async Task IsDefaultProtocolClientAsync(string protocol, string path, string[] args, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appIsDefaultProtocolClientCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appIsDefaultProtocolClientCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appIsDefaultProtocolClientCompleted", (success) => + { + BridgeConnector.Socket.Off("appIsDefaultProtocolClientCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appIsDefaultProtocolClient", protocol, path, args); + BridgeConnector.Socket.Emit("appIsDefaultProtocolClient", protocol, path, args); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -863,39 +941,50 @@ namespace ElectronNET.API /// app.setJumpList(categories) instead. /// /// Array of Task objects. + /// The cancellation token. /// Whether the call succeeded. - public async Task SetUserTasksAsync(UserTask[] userTasks) + public async Task SetUserTasksAsync(UserTask[] userTasks, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appSetUserTasksCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appSetUserTasksCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appSetUserTasksCompleted", (success) => + { + BridgeConnector.Socket.Off("appSetUserTasksCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appSetUserTasks", JObject.FromObject(userTasks, _jsonSerializer)); + BridgeConnector.Socket.Emit("appSetUserTasks", JObject.FromObject(userTasks, _jsonSerializer)); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// /// Jump List settings for the application. /// /// - public async Task GetJumpListSettingsAsync() + public async Task GetJumpListSettingsAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetJumpListSettingsCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetJumpListSettingsCompleted"); - taskCompletionSource.SetResult(JObject.Parse(success.ToString()).ToObject()); - }); + BridgeConnector.Socket.On("appGetJumpListSettingsCompleted", (jumplistSettings) => + { + BridgeConnector.Socket.Off("appGetJumpListSettingsCompleted"); + taskCompletionSource.SetResult(JObject.Parse(jumplistSettings.ToString()).ToObject()); + }); - BridgeConnector.Socket.Emit("appGetJumpListSettings"); + BridgeConnector.Socket.Emit("appGetJumpListSettings"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -939,32 +1028,38 @@ namespace ElectronNET.API /// /// Lambda with an array of the second instance’s command line arguments. /// The second parameter is the working directory path. + /// The cancellation token. /// This method returns false if your process is the primary instance of /// the application and your app should continue loading. And returns true if your /// process has sent its parameters to another instance, and you should immediately quit. - public async Task MakeSingleInstanceAsync(Action newInstanceOpened) + public async Task MakeSingleInstanceAsync(Action newInstanceOpened, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appMakeSingleInstanceCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appMakeSingleInstanceCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appMakeSingleInstanceCompleted", (success) => + { + BridgeConnector.Socket.Off("appMakeSingleInstanceCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Off("newInstanceOpened"); - BridgeConnector.Socket.On("newInstanceOpened", (result) => - { - JArray results = (JArray)result; - string[] args = results.First.ToObject(); - string workdirectory = results.Last.ToObject(); + BridgeConnector.Socket.Off("newInstanceOpened"); + BridgeConnector.Socket.On("newInstanceOpened", (result) => + { + JArray results = (JArray)result; + string[] args = results.First.ToObject(); + string workdirectory = results.Last.ToObject(); - newInstanceOpened(args, workdirectory); - }); + newInstanceOpened(args, workdirectory); + }); - BridgeConnector.Socket.Emit("appMakeSingleInstance"); + BridgeConnector.Socket.Emit("appMakeSingleInstance"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1003,19 +1098,24 @@ namespace ElectronNET.API /// The type of the currently running activity. /// /// - public async Task GetCurrentActivityTypeAsync() + public async Task GetCurrentActivityTypeAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetCurrentActivityTypeCompleted", (activityType) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetCurrentActivityTypeCompleted"); - taskCompletionSource.SetResult(activityType.ToString()); - }); + BridgeConnector.Socket.On("appGetCurrentActivityTypeCompleted", (activityType) => + { + BridgeConnector.Socket.Off("appGetCurrentActivityTypeCompleted"); + taskCompletionSource.SetResult(activityType.ToString()); + }); - BridgeConnector.Socket.Emit("appGetCurrentActivityType"); + BridgeConnector.Socket.Emit("appGetCurrentActivityType"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1033,62 +1133,78 @@ namespace ElectronNET.API /// success while any other value indicates failure according to chromium net_error_list. /// /// + /// The cancellation token. /// Result of import. Value of 0 indicates success. - public async Task ImportCertificateAsync(ImportCertificateOptions options) + public async Task ImportCertificateAsync(ImportCertificateOptions options, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appImportCertificateCompleted", (result) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appImportCertificateCompleted"); - taskCompletionSource.SetResult((int)result); - }); + BridgeConnector.Socket.On("appImportCertificateCompleted", (result) => + { + BridgeConnector.Socket.Off("appImportCertificateCompleted"); + taskCompletionSource.SetResult((int)result); + }); - BridgeConnector.Socket.Emit("appImportCertificate", JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Socket.Emit("appImportCertificate", JObject.FromObject(options, _jsonSerializer)); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// /// Memory and cpu usage statistics of all the processes associated with the app. /// /// - public async Task GetAppMetricsAsync() + public async Task GetAppMetricsAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetAppMetricsCompleted", (result) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetAppMetricsCompleted"); - var processMetrics = ((JArray)result).ToObject(); + BridgeConnector.Socket.On("appGetAppMetricsCompleted", (result) => + { + BridgeConnector.Socket.Off("appGetAppMetricsCompleted"); + var processMetrics = ((JArray)result).ToObject(); - taskCompletionSource.SetResult(processMetrics); - }); + taskCompletionSource.SetResult(processMetrics); + }); - BridgeConnector.Socket.Emit("appGetAppMetrics"); + BridgeConnector.Socket.Emit("appGetAppMetrics"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// /// The Graphics Feature Status from chrome://gpu/. /// /// - public async Task GetGpuFeatureStatusAsync() + public async Task GetGpuFeatureStatusAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetGpuFeatureStatusCompleted", (result) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetGpuFeatureStatusCompleted"); - var gpuFeatureStatus = ((JObject)result).ToObject(); + BridgeConnector.Socket.On("appGetGpuFeatureStatusCompleted", (result) => + { + BridgeConnector.Socket.Off("appGetGpuFeatureStatusCompleted"); + var gpuFeatureStatus = ((JObject)result).ToObject(); - taskCompletionSource.SetResult(gpuFeatureStatus); - }); + taskCompletionSource.SetResult(gpuFeatureStatus); + }); - BridgeConnector.Socket.Emit("appGetGpuFeatureStatus"); + BridgeConnector.Socket.Emit("appGetGpuFeatureStatus"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1099,57 +1215,72 @@ namespace ElectronNET.API /// /// /// Whether the call succeeded. - public async Task SetBadgeCountAsync(int count) + public async Task SetBadgeCountAsync(int count, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appSetBadgeCountCompleted", (success) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appSetBadgeCountCompleted"); - taskCompletionSource.SetResult((bool)success); - }); + BridgeConnector.Socket.On("appSetBadgeCountCompleted", (success) => + { + BridgeConnector.Socket.Off("appSetBadgeCountCompleted"); + taskCompletionSource.SetResult((bool)success); + }); - BridgeConnector.Socket.Emit("appSetBadgeCount", count); + BridgeConnector.Socket.Emit("appSetBadgeCount"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// /// The current value displayed in the counter badge. /// /// - public async Task GetBadgeCountAsync() + public async Task GetBadgeCountAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetBadgeCountCompleted", (count) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetBadgeCountCompleted"); - taskCompletionSource.SetResult((int)count); - }); + BridgeConnector.Socket.On("appGetBadgeCountCompleted", (count) => + { + BridgeConnector.Socket.Off("appGetBadgeCountCompleted"); + taskCompletionSource.SetResult((int)count); + }); - BridgeConnector.Socket.Emit("appGetBadgeCount"); + BridgeConnector.Socket.Emit("appGetBadgeCount"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// /// Whether the current desktop environment is Unity launcher. /// /// - public async Task IsUnityRunningAsync() + public async Task IsUnityRunningAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appIsUnityRunningCompleted", (isUnityRunning) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appIsUnityRunningCompleted"); - taskCompletionSource.SetResult((bool)isUnityRunning); - }); + BridgeConnector.Socket.On("appIsUnityRunningCompleted", (isUnityRunning) => + { + BridgeConnector.Socket.Off("appIsUnityRunningCompleted"); + taskCompletionSource.SetResult((bool)isUnityRunning); + }); - BridgeConnector.Socket.Emit("appIsUnityRunning"); + BridgeConnector.Socket.Emit("appIsUnityRunning"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1158,19 +1289,24 @@ namespace ElectronNET.API /// API has no effect on MAS builds. /// /// - public async Task GetLoginItemSettingsAsync() + public async Task GetLoginItemSettingsAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetLoginItemSettingsCompleted", (loginItemSettings) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetLoginItemSettingsCompleted"); - taskCompletionSource.SetResult((LoginItemSettings)loginItemSettings); - }); + BridgeConnector.Socket.On("appGetLoginItemSettingsCompleted", (loginItemSettings) => + { + BridgeConnector.Socket.Off("appGetLoginItemSettingsCompleted"); + taskCompletionSource.SetResult((LoginItemSettings)loginItemSettings); + }); - BridgeConnector.Socket.Emit("appGetLoginItemSettings"); + BridgeConnector.Socket.Emit("appGetLoginItemSettings"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1179,20 +1315,26 @@ namespace ElectronNET.API /// API has no effect on MAS builds. /// /// + /// The cancellation token. /// - public async Task GetLoginItemSettingsAsync(LoginItemSettingsOptions options) + public async Task GetLoginItemSettingsAsync(LoginItemSettingsOptions options, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appGetLoginItemSettingsCompleted", (loginItemSettings) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appGetLoginItemSettingsCompleted"); - taskCompletionSource.SetResult((LoginItemSettings)loginItemSettings); - }); + BridgeConnector.Socket.On("appGetLoginItemSettingsCompleted", (loginItemSettings) => + { + BridgeConnector.Socket.Off("appGetLoginItemSettingsCompleted"); + taskCompletionSource.SetResult((LoginItemSettings)loginItemSettings); + }); - BridgeConnector.Socket.Emit("appGetLoginItemSettings", JObject.FromObject(options, _jsonSerializer)); + BridgeConnector.Socket.Emit("appGetLoginItemSettings", JObject.FromObject(options, _jsonSerializer)); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1212,19 +1354,24 @@ namespace ElectronNET.API /// See https://www.chromium.org/developers/design-documents/accessibility for more details. /// /// true if Chrome’s accessibility support is enabled, false otherwise. - public async Task IsAccessibilitySupportEnabledAsync() + public async Task IsAccessibilitySupportEnabledAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appIsAccessibilitySupportEnabledCompleted", (isAccessibilitySupportEnabled) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appIsAccessibilitySupportEnabledCompleted"); - taskCompletionSource.SetResult((bool)isAccessibilitySupportEnabled); - }); + BridgeConnector.Socket.On("appIsAccessibilitySupportEnabledCompleted", (isAccessibilitySupportEnabled) => + { + BridgeConnector.Socket.Off("appIsAccessibilitySupportEnabledCompleted"); + taskCompletionSource.SetResult((bool)isAccessibilitySupportEnabled); + }); - BridgeConnector.Socket.Emit("appIsAccessibilitySupportEnabled"); + BridgeConnector.Socket.Emit("appIsAccessibilitySupportEnabled"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1285,20 +1432,26 @@ namespace ElectronNET.API /// either the application becomes active or the request is canceled. /// /// + /// /// - public async Task DockBounceAsync(DockBounceType type) + public async Task DockBounceAsync(DockBounceType type, CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appDockBounceCompleted", (id) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appDockBounceCompleted"); - taskCompletionSource.SetResult((int)id); - }); + BridgeConnector.Socket.On("appDockBounceCompleted", (id) => + { + BridgeConnector.Socket.Off("appDockBounceCompleted"); + taskCompletionSource.SetResult((int)id); + }); - BridgeConnector.Socket.Emit("appDockBounce", type.ToString()); + BridgeConnector.Socket.Emit("appDockBounce", type.ToString()); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1332,19 +1485,24 @@ namespace ElectronNET.API /// Gets the string to be displayed in the dock’s badging area. /// /// - public async Task DockGetBadgeAsync() + public async Task DockGetBadgeAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appDockGetBadgeCompleted", (text) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appDockGetBadgeCompleted"); - taskCompletionSource.SetResult((string)text); - }); + BridgeConnector.Socket.On("appDockGetBadgeCompleted", (text) => + { + BridgeConnector.Socket.Off("appDockGetBadgeCompleted"); + taskCompletionSource.SetResult((string)text); + }); - BridgeConnector.Socket.Emit("appDockGetBadge"); + BridgeConnector.Socket.Emit("appDockGetBadge"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } /// @@ -1368,19 +1526,24 @@ namespace ElectronNET.API /// so this method might not return true immediately after that call. /// /// - public async Task DockIsVisibleAsync() + public async Task DockIsVisibleAsync(CancellationToken cancellationToken = default(CancellationToken)) { + cancellationToken.ThrowIfCancellationRequested(); + var taskCompletionSource = new TaskCompletionSource(); - - BridgeConnector.Socket.On("appDockIsVisibleCompleted", (isVisible) => + using (cancellationToken.Register(() => taskCompletionSource.TrySetCanceled())) { - BridgeConnector.Socket.Off("appDockIsVisibleCompleted"); - taskCompletionSource.SetResult((bool)isVisible); - }); + BridgeConnector.Socket.On("appDockIsVisibleCompleted", (isVisible) => + { + BridgeConnector.Socket.Off("appDockIsVisibleCompleted"); + taskCompletionSource.SetResult((bool)isVisible); + }); - BridgeConnector.Socket.Emit("appDockIsVisible"); + BridgeConnector.Socket.Emit("appDockIsVisible"); - return await taskCompletionSource.Task; + return await taskCompletionSource.Task + .ConfigureAwait(false); + } } // TODO: Menu lösung für macOS muss gemacht werden und imeplementiert