using System; using System.Collections.Generic; using System.Linq; using System.Net.NetworkInformation; using System.Net.Sockets; namespace SddpViewer; using System.Collections.ObjectModel; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Rssdp; public partial class MainWindowViewModel : ObservableObject { public MainWindowViewModel() { NetworkAdapters = NetworkAdapter.GetAvailableNetworkAdapter().ToArray(); SelectedNetworkAdapter = NetworkAdapters.FirstOrDefault(); } [ObservableProperty] private IReadOnlyList _networkAdapters; [ObservableProperty] private NetworkAdapter? _selectedNetworkAdapter; [ObservableProperty] private string _deviceIpAddress = "192.168.42.193"; [ObservableProperty] private string _notificationFilter = "upnp:rootdevice"; public ObservableCollection SddpDevices { get; } = new(); [RelayCommand(AllowConcurrentExecutions = false)] private async Task SearchDevicesNowAsync() { SddpDevices.Clear(); if (SelectedNetworkAdapter is null) { throw new NotSupportedException(); } var locator = new SsdpDeviceLocator(SelectedNetworkAdapter.IpAddress.ToString()); if (!string.IsNullOrWhiteSpace(NotificationFilter)) { locator.NotificationFilter = NotificationFilter; } var availableDevices = await locator.SearchAsync().ConfigureAwait(true); foreach (var ssdpDevice in availableDevices) { var discoveredDeviceViewModel = new DiscoveredDeviceViewModel(ssdpDevice); SddpDevices.Add(discoveredDeviceViewModel); } await Parallel .ForEachAsync( SddpDevices, async (device, token) => { await device.GetFurtherInformationAsync().ConfigureAwait(true); } ) .ConfigureAwait(true); } }