new VisualizerTargetType("Frame Array Visualizer", "Num.Roto.Visualization.Math.Geometry.Frame[]
66 lines
2.5 KiB
C#
66 lines
2.5 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Threading.Tasks;
|
|
using PipeMethodCalls;
|
|
|
|
namespace NamedPipes;
|
|
|
|
public class NamedPipeClient (string pipeName,string? serverLocation = null, string? serverName = null,Action<string>? logger = null): IDebugVisualizer, IDisposable
|
|
{
|
|
private bool IsConnected => PipeClient.State == PipeState.Connected;
|
|
private PipeClient<IDebugVisualizer> PipeClient { get; } = new(new PipeSerializer(), pipeName);
|
|
private string ServerLocation { get; } = serverLocation ?? Environment.GetEnvironmentVariable("USERPROFILE") + @"\Documents\Visual Studio 2026\Visualizers\Server\NrxVisualizer\";
|
|
private string ServerName { get; } = serverName ?? "Num.Roto.Nrx.VisualizerServer";
|
|
private Action<string> Logger { get;} = logger ??((m) => Trace.WriteLine(m));
|
|
|
|
private async Task StartServerAsync()
|
|
{
|
|
if (IsConnected) return;
|
|
PipeClient.SetLogger((m) => Trace.WriteLine(m));
|
|
var serverAvailable = Process.GetProcessesByName(ServerName).Length > 0;
|
|
Logger($"Server available: {serverAvailable}");
|
|
if (!serverAvailable)
|
|
{
|
|
var serverPath = ServerLocation + ServerName + ".exe";
|
|
if (!File.Exists(serverPath)) throw new FileNotFoundException($"{nameof(StartServerAsync)}, Server does not exist, Path = {serverPath}");
|
|
var server = new Process { StartInfo = { FileName = serverPath } };
|
|
server.Start();
|
|
}
|
|
try
|
|
{
|
|
await PipeClient.ConnectAsync().ConfigureAwait(true);
|
|
Logger("NamedPipeClient.StartServerAsync succeded.");
|
|
return;
|
|
}
|
|
catch(Exception e)
|
|
{
|
|
Logger(e.ToString());
|
|
throw;
|
|
}
|
|
}
|
|
|
|
public async Task<bool> SetDebugObjectAsync(DebugObject debugObject)
|
|
{
|
|
await StartServerAsync().ConfigureAwait(true);
|
|
var result = await PipeClient.InvokeAsync(server => server.SetDebugObjectAsync(debugObject));
|
|
Logger("NamedPipeClient.SetDebugObjectAsync: result = " + result);
|
|
return result;
|
|
}
|
|
|
|
public async Task<bool> SetMessageAsync(string message)
|
|
{
|
|
await StartServerAsync().ConfigureAwait(true);
|
|
var result = await PipeClient.InvokeAsync(server => server.SetMessageAsync(message));
|
|
Logger("NamedPipeClient.SetMessageAsync: result = " + result);
|
|
return result;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
GC.SuppressFinalize(this);
|
|
PipeClient.Dispose();
|
|
}
|
|
}
|
|
|