using EgwMultiEngineManager; using Lux.Data; using Lux.Data.Services; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; namespace Lux.API.Controllers { [Route("api/[controller]")] [ApiController] public class WindowController : ControllerBase { #region Public Constructors public WindowController(IConfiguration config, ILogger logger, ImageCacheService imgServ, ExecProcessManager? EgwProcManager = null) { _logger = logger; _config = config; // verifico se usare engine enableEgwEng = _config.GetValue("ServerConf:EgwEngineEnab"); if (enableEgwEng && EgwProcManager != null) { ProcessMan = EgwProcManager; ProcessMan.m_AnswerReceived += ProcessMan_m_AnswerReceived; } ImgService = imgServ; } #endregion Public Constructors #region Public Methods /// /// Chiamata POST: riceve Json in formato JWD serializzato, lo ripete come risposta /// PUT: api/calc/svg/00000000-0000-0000-0000-000000000000 /// /// id oggetto /// [HttpPost("calc/{id}")] public async Task> calc(string id, [FromBody] string currJwd) { Stopwatch sw = new Stopwatch(); sw.Start(); lastSvg = ""; string svgContent = ""; // ...se ricevo percorso --> leggo jwd/svg cablato if (!string.IsNullOrEmpty(currJwd)) { if (enableEgwEng && ProcessMan != null) { Dictionary DictExec = new Dictionary(); DictExec.Add("Mode", "1"); DictExec.Add("Jwd", currJwd); int nId = 1; ProcessArgs currArgs = new ProcessArgs(nId, DictExec); bool done = ProcessMan.ArgumentsEnqueue(currArgs); waitResult = true; int numWait = 200; while (numWait > 0 && waitResult) { numWait--; await Task.Delay(waitDelay); } } // se ho risultato mostro... if (!string.IsNullOrEmpty(lastSvg)) { svgContent = lastSvg; // salvo! ImgService.SaveSvg(id, svgContent); } else { svgContent = "EMPTY"; } } sw.Stop(); _logger.LogInformation($"svgString | {sw.Elapsed.TotalMilliseconds:N3} ms"); return Ok(svgContent); } /// /// Chiamata POST: riceve Json in formato JWD serializzato, lo ripete come risposta /// PUT: api/calc/svg/00000000-0000-0000-0000-000000000000 /// /// id oggetto /// [HttpGet("svg/{id}")] public async Task> svg(string id) { Stopwatch sw = new Stopwatch(); sw.Start(); string svgContent = ""; // ...se ricevo percorso --> leggo jwd/svg cablato if (!string.IsNullOrEmpty(id)) { svgContent = ImgService.LoadSvg(id); } sw.Stop(); _logger.LogInformation($"svgString | {sw.Elapsed.TotalMilliseconds:N3} ms"); return Ok(svgContent); } #endregion Public Methods #region Private Fields private readonly ILogger _logger; private IConfiguration _config; private bool enableEgwEng = true; //private Dictionary listSvg = new Dictionary(); private string lastSvg = ""; private int waitDelay = 10; private bool waitResult = false; #endregion Private Fields #region Private Properties private ImageCacheService ImgService { get; set; } /// /// Esecutore di processi generico /// private ExecProcessManager? ProcessMan { get; set; } #endregion Private Properties #region Private Methods /// /// Restituisce una risposta all'esecuzione /// /// private void ProcessMan_m_AnswerReceived(ProcessArgsResult result) { // verifico che sia la mia richeista con id immagine... FARE!!! // salvo il risultato... if (result.Args != null && result.Args.Count > 0) { if (result.Args.ContainsKey("Svg")) { // salvo SVG string newSvg = result.Args["Svg"]; // salvo nel dizionario lastSvg = newSvg; waitResult = false; } } } #endregion Private Methods } }