Add remote desktop start/stop commands and process with server support

This commit is contained in:
Stone_Red
2026-06-17 00:02:33 +02:00
parent 67852bb344
commit 8d1cd6d369
5 changed files with 118 additions and 2 deletions
+3 -1
View File
@@ -28,7 +28,9 @@ public class Kernel : Sys.Kernel
new StartGuiCommand(),
new StopGuiCommand(),
new ViewProcessLogs(),
new YesNtCommand()
new YesNtCommand(),
new StartRemoteDesktopCommand(),
new StopRemoteDesktopCommand()
]);
Sys.Graphics.Canvas canvas = Sys.Graphics.FullScreenCanvas.GetFullScreenCanvas();
+58
View File
@@ -0,0 +1,58 @@
using RemSox.Networking;
using RemSox.Processing;
using RemSox.UI.GUI.Rendering;
using RemSox.UI.GUI.Windows;
namespace RemSox.Processes;
internal sealed class RemoteDesktopProcess() : Process("Remote Desktop Server")
{
private TcpRpcServer? server;
private NetworkRenderSource? networkSource;
private CancellationTokenSource? cts;
public int Port { get; private set; }
internal override void Start(string[] args)
{
if (args.Length == 0 || !int.TryParse(args[0], out int port) || port <= 0 || port > 65535)
{
Logger.Log("Invalid port. Usage: rdp-start <port> (1-65535)", Logging.LogSeverity.Error);
RequestStop();
return;
}
Port = port;
cts = new CancellationTokenSource();
server = new TcpRpcServer();
networkSource = new NetworkRenderSource(server);
server.ListenTo<string>("SyncRequest", async _ =>
{
WindowManager.InvalidateAll();
});
_ = Task.Run(() => server.StartAsync(port, cts.Token));
WindowManager.AddRenderSource(networkSource);
Logger.Log($"Remote desktop server started on port {port}.", Logging.LogSeverity.Info);
}
internal override void Tick()
{
}
internal override void Stop()
{
cts?.Cancel();
server?.Stop();
if (networkSource is not null)
{
WindowManager.RemoveRenderSource(networkSource);
}
Logger.Log("Remote desktop server stopped.", Logging.LogSeverity.Info);
}
}
+2 -1
View File
@@ -15,7 +15,8 @@ public static class ProcessManifest
private static readonly Dictionary<Type, ProcessManifestFlags> map = new()
{
{ typeof(DesktopProcess), ProcessManifestFlags.Singleton | ProcessManifestFlags.System },
{ typeof(CliProcess), ProcessManifestFlags.Singleton | ProcessManifestFlags.System }
{ typeof(CliProcess), ProcessManifestFlags.Singleton | ProcessManifestFlags.System },
{ typeof(RemoteDesktopProcess), ProcessManifestFlags.Singleton }
};
public static bool HasFlag<T>(ProcessManifestFlags flag) where T : Process
@@ -0,0 +1,29 @@
using RemSox.Processes;
using RemSox.Processing;
namespace RemSox.UI.CLI.Commands;
public class StartRemoteDesktopCommand : ICommand
{
public string Name => "rdp-start";
public string Description => "Starts the remote desktop server on the specified port (rdp-start <port>)";
public Task ExecuteAsync(string? arguments, Action<string> printLine)
{
if (string.IsNullOrWhiteSpace(arguments) || !int.TryParse(arguments.Trim(), out int port) || port <= 0 || port > 65535)
{
printLine("Usage: rdp-start <port> (1-65535)");
return Task.CompletedTask;
}
if (ProcessManager.IsProcessRunning<RemoteDesktopProcess>())
{
printLine("Remote desktop server is already running.");
return Task.CompletedTask;
}
_ = ProcessManager.SpawnProcess<RemoteDesktopProcess>([port.ToString()]);
printLine($"Remote desktop server started on port {port}.");
return Task.CompletedTask;
}
}
@@ -0,0 +1,26 @@
using RemSox.Processes;
using RemSox.Processing;
namespace RemSox.UI.CLI.Commands;
public class StopRemoteDesktopCommand : ICommand
{
public string Name => "rdp-stop";
public string Description => "Stops the remote desktop server";
public async Task ExecuteAsync(string? arguments, Action<string> printLine)
{
if (!ProcessManager.IsProcessRunning<RemoteDesktopProcess>())
{
printLine("Remote desktop server is not running.");
return;
}
foreach (RemoteDesktopProcess process in ProcessManager.GetProcessesOfType<RemoteDesktopProcess>())
{
await ProcessManager.StopProcessAndWaitAsync(process.Id);
}
printLine("Remote desktop server stopped.");
}
}