Files
DebugVisualizerExtension/NamedPipes/NamedPipeServer.cs
T

73 lines
2.3 KiB
C#
Raw Normal View History

2026-04-07 13:38:08 +02:00
using CommunityToolkit.Mvvm.ComponentModel;
using PipeMethodCalls;
using System;
2026-04-01 12:46:48 +02:00
using System.Diagnostics;
2026-04-08 16:06:35 +02:00
using System.Threading;
2026-04-01 12:46:48 +02:00
using System.Threading.Tasks;
namespace NamedPipes;
public partial class NamedPipesServer(string pipeName,Action<string>? logger = null) : ObservableObject,IDebugVisualizer, IDisposable
{
~NamedPipesServer()
{
Logger(@"~NamedPipesServer called!");
}
2026-04-01 12:46:48 +02:00
public bool IsConnected => PipeServer is { State: PipeState.Connected };
private PipeServer<IDebugVisualizer>? PipeServer {get; set;}
private string PipeName { get; } = pipeName;
private Action<string> Logger { get; } = logger ?? ((m) => Trace.WriteLine(m));
public async Task WaitForConnectionAsync()
{
if(IsConnected) return;
if (PipeServer == null || PipeServer.State != PipeState.Connected)
2026-04-01 12:46:48 +02:00
{
PipeServer?.Dispose();
2026-04-08 08:20:33 +02:00
PipeServer = new PipeServer<IDebugVisualizer>(new PipeSerializer(), PipeName, () => this);
2026-04-01 12:46:48 +02:00
PipeServer.SetLogger((m) => Trace.WriteLine(m));
}
Logger("Waiting for client connection...");
await PipeServer.WaitForConnectionAsync().ConfigureAwait(true);
}
2026-04-08 16:06:35 +02:00
public async Task RunAsync(CancellationToken cancellationToken)
{
2026-04-08 16:06:35 +02:00
while(!cancellationToken.IsCancellationRequested)
{
await WaitForConnectionAsync().ConfigureAwait(true);
Logger("Client connected.");
while (IsConnected)
{
2026-04-08 16:06:35 +02:00
await Task.Delay(100, cancellationToken).ConfigureAwait(true);
}
Logger("Client disconnected.");
}
2026-04-01 12:46:48 +02:00
}
[ObservableProperty]
2026-04-07 12:21:37 +02:00
public partial VisualizerModel? VisualizerModel { get; private set; }
2026-04-01 12:46:48 +02:00
2026-04-07 12:21:37 +02:00
public async Task<bool> SetVisualizerModelAsync(VisualizerModel visualizerModel)
2026-04-01 12:46:48 +02:00
{
await Task.Delay(1);
2026-04-07 12:21:37 +02:00
VisualizerModel = visualizerModel;
Logger("NamedPipesServer, received object of type: " + visualizerModel.GetType());
2026-04-01 12:46:48 +02:00
return true;
}
public async Task<bool> SetMessageAsync(string message)
{
await Task.Delay(1);
Logger("Received message: " + message);
return true;
}
public void Dispose()
{
GC.SuppressFinalize(this);
PipeServer?.Dispose();
PipeServer = null;
}
}