using ColorControl.Shared.Common; using ColorControl.Shared.Contracts; using System.Diagnostics; namespace ColorControl.Shared.Services; public class RpcClientService { private readonly WinElevatedProcessManager _elevatedProcessManager; private readonly WinApiService _winApiService; private readonly RpcServerService _rpcServerService; public string Name { get; set; } public RpcClientService(WinElevatedProcessManager elevatedProcessManager, WinApiService winApiService/*, RpcServerService rpcServerService*/) { _elevatedProcessManager = elevatedProcessManager; _winApiService = winApiService; //_rpcServerService = rpcServerService; } public T Call(string method, params object[] arguments) { if (!_winApiService.IsServiceRunning()) { // Last resort: try via elevated process return ExecuteViaElevatedProcess(method, arguments); } var rpcMessage = new SvcRpcMessage { ServiceName = Name, MethodName = method, Arguments = arguments }; //var json = JsonConvert.SerializeObject(rpcMessage); //var msg = JsonConvert.DeserializeObject(json); //var _ = _rpcServerService.ExecuteRpcAsync(msg); //return default; return PipeUtils.SendRpcMessage(rpcMessage); } public T Call(SvcRpcMessage message) { message.ServiceName = Name; if (Debugger.IsAttached && !_winApiService.IsServiceRunning()) { //return PipeUtils.SendRpcMessage(message, pipeName: PipeUtils.ElevatedPipe); return ExecuteViaElevatedProcess(message); } if (!_winApiService.IsServiceRunning()) { // Last resort: try via elevated process return ExecuteViaElevatedProcess(message); } return PipeUtils.SendRpcMessage(message); } private T ExecuteViaElevatedProcess(string method, params object[] arguments) { return _elevatedProcessManager.ExecuteElevated(method, arguments); } private T ExecuteViaElevatedProcess(SvcRpcMessage message) { return _elevatedProcessManager.ExecuteElevated(message); } }