using System; using System.Linq; using H.Formatters; using H.Pipes; using InABox.Logikal; namespace PRSLogikal { public class LogikalListener : IDisposable { private PipeServer _server; public LogikalServer Server { get; set; } public event LogikalLogEvent Log; private void DoLog(string message) => Log?.Invoke(this, new LogikalLogArguments(message)); public event EventHandler Disconnecting; public LogikalListener() { _server = new PipeServer("$logikal", formatter: new NewtonsoftJsonFormatter()); _server.ClientConnected += (o, args) => { DoLog($@"Client {args.Connection.PipeName} is now connected!"); }; _server.ClientDisconnected += (o, args) => { DoLog($@"Client {args.Connection.PipeName} disconnected"); }; _server.MessageReceived += (sender, args) => { DoLog($@"Client {args.Connection.PipeName} says: {args.Message.Method}: {args.Message.Payload}"); var _request = LogikalRequest.FromMessage(args.Message); if (_request is LogikalConnectRequest _connectrequest) Connect(_connectrequest); else if (_request is LogikalLoginRequest _loginrequest) Login(_loginrequest); else if (_request is LogikalProjectsRequest _projectsrequest) ProjectList(_projectsrequest); else if (_request is LogikalProjectRequest _projectrequest) ProjectDetails(_projectrequest); else if (_request is LogikalElevationRequest _elevationrequest) ElevationDetails(_elevationrequest); else if (_request is LogikalLogoutRequest) Logout(); else if (_request is LogikalDisconnectRequest) Disconnect(); }; _server.ExceptionOccurred += (sender, args) => { DoLog($@"Exception: {args.Exception.Message}"); }; } public void Start() => _server.StartAsync(); public void Stop() => _server.StopAsync(); private void Connect(LogikalConnectRequest request) { var _response = new LogikalConnectResponse() { Status = Server.Connect(request.Path) }; _server.WriteAsync(_response.ToMessage()); } private void Disconnect() { var _response = new LogikalDisconnectResponse() { Status = Server.Logout() }; _server.WriteAsync(_response.ToMessage()); Disconnecting?.Invoke(this,EventArgs.Empty); } private void Login(LogikalLoginRequest request) { var _response = new LogikalLoginResponse() { Status = Server.Login(request.UserID, request.Password) }; _server.WriteAsync(_response.ToMessage()); } private void Logout() { var _response = new LogikalLogoutResponse() { Status = Server.Logout() }; _server.WriteAsync(_response.ToMessage()); } private void ProjectList(LogikalProjectsRequest request) { var _response = new LogikalProjectsResponse(); try { if (Server.IsLoggedIn()) { _response.Projects = Server.GetProjects().ToArray(); _response.Status = LogikalStatus.Ok; } else _response.Status = LogikalStatus.Failed; } catch (Exception e) { DoLog($"ProjectList: e.Message"); _response.Status = LogikalStatus.Error; } _server.WriteAsync(_response.ToMessage()); } private void ProjectDetails(LogikalProjectRequest request) { var _response = new LogikalProjectResponse(); try { if (Server.IsLoggedIn()) { _response.Project = Server.GetProject(request.ID); _response.Status = LogikalStatus.Ok; } else _response.Status = LogikalStatus.Failed; } catch (Exception e) { DoLog($"ProjectList: e.Message"); _response.Status = LogikalStatus.Error; } _server.WriteAsync(_response.ToMessage()); } private void ElevationDetails(LogikalElevationRequest elevationdetailsrequest) { var _response = new LogikalElevationResponse(); try { if (Server.IsLoggedIn()) { _response.Elevation = Server.GetElevation(elevationdetailsrequest.ID); _response.Status = LogikalStatus.Ok; } else _response.Status = LogikalStatus.Failed; } catch (Exception e) { _response.Status = LogikalStatus.Error; } _server.WriteAsync(_response.ToMessage()); } public void Dispose() { if (_server != null) _ = _server.DisposeAsync().AsTask(); } } }