/// <summary>
        /// Closes the ETP server.
        /// </summary>
        private void CloseEtpServer()
        {
            if (SelfHostedWebServer == null)
            {
                return;
            }

            OnServerSessionClosed(this, _server);

            SelfHostedWebServer.SessionConnected -= OnServerSessionConnected;
            SelfHostedWebServer.SessionClosed    -= OnServerSessionClosed;
            SelfHostedWebServer.Dispose();
            SelfHostedWebServer = null;
        }
        private bool _disposedValue; // To detect redundant calls

        /// <summary>
        /// Releases unmanaged and - optionally - managed resources.
        /// </summary>
        /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
        void Dispose(bool disposing)
        {
            if (!_disposedValue)
            {
                if (disposing)
                {
                    // NOTE: dispose managed state (managed objects).
                    Client?.Dispose();
                    SelfHostedWebServer?.Dispose();
                }

                // NOTE: free unmanaged resources (unmanaged objects) and override a finalizer below.
                // NOTE: set large fields to null.

                _disposedValue = true;
            }
        }
        /// <summary>
        /// Initializes the ETP client.
        /// </summary>
        public void InitEtpServer()
        {
            try
            {
                Runtime.Invoke(() => Runtime.Shell.StatusBarText = "Listening...");

                var message = $"Listening for ETP connections on port {Model.PortNumber}...";
                LogClientOutput(message, true);
                _log.Debug(message);

                SelfHostedWebServer = EtpFactory.CreateSelfHostedWebServer(Model.PortNumber, Model.ApplicationName, Model.ApplicationVersion);
                SelfHostedWebServer.SessionConnected += OnServerSessionConnected;
                SelfHostedWebServer.SessionClosed    += OnServerSessionClosed;
                SelfHostedWebServer.Start();
            }
            catch (Exception ex)
            {
                Runtime.Invoke(() => Runtime.Shell.StatusBarText = "Error");
                Runtime.ShowError("Error initializing ETP server.", ex);
            }
        }