using AlarmInfoServerSim.Services; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using System.Net; namespace AlarmInfoServerSim.ViewModels; public partial class StatusBarViewModel : ObservableObject { private readonly ILogService _logService; private readonly ISharedConfig _sharedConfig; private readonly IInfoSendingService _infoSendingService; [ObservableProperty] private List _iPAddresses; [ObservableProperty] private bool _isSelectingEnable; [ObservableProperty] private IPAddress _selectedIP; [ObservableProperty] private int _selectedPort; [ObservableProperty] private string _buttonContent; [ObservableProperty] private IPAddress _remoteIp; [ObservableProperty] private int _remotePort; [ObservableProperty] private string _status; public StatusBarViewModel(ILogService logService, ISharedConfig sharedConfig, IInfoSendingService sendInfoService) { _logService = logService; _sharedConfig = sharedConfig; _infoSendingService = sendInfoService; _infoSendingService.TcpServerStatusChanged += OnTcpServerStatusChanged; _infoSendingService.ConnectionChanged += OnConnectionChanged; _iPAddresses = _sharedConfig.IPAddresses; _isSelectingEnable=true; _selectedIP = IPAddress.None; _selectedPort = -1; _buttonContent = "Open"; _remoteIp =IPAddress.None; _remotePort = -1; _status = "Disconnected"; } [RelayCommand] private void OpenOrClose() { if (ButtonContent == "Open") { if (SelectedIP == IPAddress.None || SelectedPort < 0) { _logService.Log($"IP or Port is not correct"); return; } _sharedConfig.SelectedIPAddress = SelectedIP; _sharedConfig.SelectedPort = SelectedPort; _infoSendingService.Open(); return; } if (ButtonContent == "Close") { _infoSendingService.Close(); return; } } private void OnTcpServerStatusChanged(object? sender, bool e) { App.Current.Dispatcher.Invoke(() => { ButtonContent = e ? "Close" : "Open"; IsSelectingEnable = !e; }); } private void OnConnectionChanged(object? sender, (bool, UniversalNetFrame451.IO.TcpConnection) e) { App.Current.Dispatcher.Invoke(() => { if (e.Item1) { Status = "Connected"; RemoteIp = e.Item2.RemoteEndPoint.Address; RemotePort = e.Item2.RemoteEndPoint.Port; _logService.Log($"Get a connection from {RemoteIp}:{RemotePort}"); } else { Status = "Disconnected"; RemoteIp = IPAddress.None; RemotePort = -1; _logService.Log($"The connection lost"); } }); } }