Files
Electron.NET/ElectronNET.API/Shell.cs

200 lines
7.3 KiB
C#
Raw Normal View History

using ElectronNET.API.Entities;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using System.Threading.Tasks;
using ElectronNET.API.Extensions;
namespace ElectronNET.API
{
/// <summary>
/// Manage files and URLs using their default applications.
/// </summary>
public sealed class Shell
{
private static Shell _shell;
private static object _syncRoot = new object();
internal Shell() { }
internal static Shell Instance
{
get
{
if (_shell == null)
{
2017-11-04 00:16:14 +01:00
lock (_syncRoot)
{
if (_shell == null)
{
_shell = new Shell();
}
}
}
return _shell;
}
}
/// <summary>
/// Show the given file in a file manager. If possible, select the file.
/// </summary>
/// <param name="fullPath">The full path to the directory / file.</param>
public Task ShowItemInFolderAsync(string fullPath)
{
var taskCompletionSource = new TaskCompletionSource<object>();
2021-07-12 19:50:39 +02:00
BridgeConnector.On("shell-showItemInFolderCompleted", () =>
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Off("shell-showItemInFolderCompleted");
});
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-showItemInFolder", fullPath);
return taskCompletionSource.Task;
}
/// <summary>
/// Open the given file in the desktop's default manner.
/// </summary>
/// <param name="path">The path to the directory / file.</param>
/// <returns>The error message corresponding to the failure if a failure occurred, otherwise <see cref="string.Empty"/>.</returns>
public Task<string> OpenPathAsync(string path)
{
var taskCompletionSource = new TaskCompletionSource<string>();
2021-07-12 21:27:40 +02:00
BridgeConnector.On<string>("shell-openPathCompleted", (errorMessage) =>
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Off("shell-openPathCompleted");
2021-07-12 21:33:35 +02:00
taskCompletionSource.SetResult(errorMessage);
});
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-openPath", path);
return taskCompletionSource.Task;
}
/// <summary>
/// Open the given external protocol URL in the desktops default manner.
/// (For example, mailto: URLs in the users default mail agent).
/// </summary>
/// <param name="url">Max 2081 characters on windows.</param>
/// <returns>The error message corresponding to the failure if a failure occurred, otherwise <see cref="string.Empty"/>.</returns>
public Task<string> OpenExternalAsync(string url)
{
return OpenExternalAsync(url, null);
}
/// <summary>
/// Open the given external protocol URL in the desktops default manner.
/// (For example, mailto: URLs in the users default mail agent).
/// </summary>
/// <param name="url">Max 2081 characters on windows.</param>
/// <param name="options">Controls the behavior of OpenExternal.</param>
/// <returns>The error message corresponding to the failure if a failure occurred, otherwise <see cref="string.Empty"/>.</returns>
public Task<string> OpenExternalAsync(string url, OpenExternalOptions options)
{
var taskCompletionSource = new TaskCompletionSource<string>();
2021-07-12 21:27:40 +02:00
BridgeConnector.On<string>("shell-openExternalCompleted", (error) =>
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Off("shell-openExternalCompleted");
2021-07-12 21:33:35 +02:00
taskCompletionSource.SetResult(error);
});
if (options == null)
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-openExternal", url);
}
else
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-openExternal", url, JObject.FromObject(options, _jsonSerializer));
}
return taskCompletionSource.Task;
}
/// <summary>
/// Move the given file to trash and returns a <see cref="bool"/> status for the operation.
/// </summary>
/// <param name="fullPath">The full path to the directory / file.</param>
/// <returns> Whether the item was successfully moved to the trash.</returns>
public Task<bool> TrashItemAsync(string fullPath)
{
var taskCompletionSource = new TaskCompletionSource<bool>();
2021-07-12 21:27:40 +02:00
BridgeConnector.On<bool>("shell-trashItem-completed", (success) =>
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Off("shell-trashItem-completed");
2021-07-12 21:33:35 +02:00
taskCompletionSource.SetResult(success);
});
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-trashItem", fullPath);
return taskCompletionSource.Task;
}
/// <summary>
/// Play the beep sound.
/// </summary>
public void Beep()
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-beep");
}
/// <summary>
/// Creates or updates a shortcut link at shortcutPath.
/// </summary>
/// <param name="shortcutPath">The path to the shortcut.</param>
/// <param name="operation">Default is <see cref="ShortcutLinkOperation.Create"/></param>
/// <param name="options">Structure of a shortcut.</param>
/// <returns>Whether the shortcut was created successfully.</returns>
public Task<bool> WriteShortcutLinkAsync(string shortcutPath, ShortcutLinkOperation operation, ShortcutDetails options)
{
var taskCompletionSource = new TaskCompletionSource<bool>();
2021-07-12 21:27:40 +02:00
BridgeConnector.On<bool>("shell-writeShortcutLinkCompleted", (success) =>
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Off("shell-writeShortcutLinkCompleted");
2021-07-12 21:33:35 +02:00
taskCompletionSource.SetResult(success);
});
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-writeShortcutLink", shortcutPath, operation.GetDescription(), JObject.FromObject(options, _jsonSerializer));
return taskCompletionSource.Task;
}
/// <summary>
/// Resolves the shortcut link at shortcutPath.
/// An exception will be thrown when any error happens.
/// </summary>
/// <param name="shortcutPath">The path tot the shortcut.</param>
/// <returns><see cref="ShortcutDetails"/> of the shortcut.</returns>
public Task<ShortcutDetails> ReadShortcutLinkAsync(string shortcutPath)
{
var taskCompletionSource = new TaskCompletionSource<ShortcutDetails>();
2021-07-12 21:27:40 +02:00
BridgeConnector.On<ShortcutDetails>("shell-readShortcutLinkCompleted", (shortcutDetails) =>
{
2021-07-12 19:50:39 +02:00
BridgeConnector.Off("shell-readShortcutLinkCompleted");
2021-07-12 21:27:40 +02:00
taskCompletionSource.SetResult(shortcutDetails);
});
2021-07-12 19:50:39 +02:00
BridgeConnector.Emit("shell-readShortcutLink", shortcutPath);
return taskCompletionSource.Task;
}
private readonly JsonSerializer _jsonSerializer = new JsonSerializer()
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore,
DefaultValueHandling = DefaultValueHandling.Ignore
};
}
2020-05-27 01:06:31 +02:00
}