private List <UpnpEngineDevice> SearchDevices(UpnpNt nt) { List <UpnpEngineDevice> foundDevices = new List <UpnpEngineDevice>(); lock (this.deviceLock) { foreach (UpnpEngineDevice device in this.devices) { if (nt == null || device.Device.DeviceNt.IsMatch(nt)) { foundDevices.Add(device); } } } return(foundDevices); }
private void OnRunnerDiscovery(HttpRequest request, IPEndPoint remoteEndpoint, IPEndPoint localEndpoint, IPAddress localInterfaceIpOfRemoteAddress) { HttpHeader searchFor = request.Headers.Get("ST", true); if (searchFor == null) { throw new Exception("Invaild m-search quary (missing ST header)"); } UpnpNt searchItem = UpnpNt.Parse(searchFor.Value); Console.WriteLine($"Ssdp discovery search for {searchItem.ToString()} detected from {remoteEndpoint.ToString()} to {localEndpoint.ToString()} can response using {localInterfaceIpOfRemoteAddress?.ToString()}"); List <UpnpEngineDevice> foundDevices = this.SearchDevices(searchItem); foreach (UpnpEngineDevice singleFoundDevice in foundDevices) { OnRunnerDisocveryForDevice(request, singleFoundDevice, searchItem, remoteEndpoint, localEndpoint, localInterfaceIpOfRemoteAddress); } }
public virtual bool IsMatch(UpnpNt searchObject) => this.UpnpType.Equal(searchObject);
internal UpnpFragmentWithType(UpnpNt upnpType) { UpnpType = upnpType; }
public override bool IsMatch(UpnpNt searchObject) => (this.UpnpId.Equal(searchObject)) ? true : base.IsMatch(searchObject);
internal UpnpFragmentWithId(UpnpNt upnpType, UpnpNt upnpId) : base(upnpType) { UpnpId = upnpId; }
private void OnRunnerDisocveryForDevice(HttpRequest request, UpnpEngineDevice device, UpnpNt searchId, IPEndPoint remoteEndpoint, IPEndPoint localEndpoint, IPAddress localInterfaceIpOfRemoteEndpoint) { Console.WriteLine("Sending response for disconvery"); HttpHeader sendDelay = request.Headers.Get("MX", true); if (sendDelay != null && int.TryParse(sendDelay.Value, out int maxDelay)) { int currentSleep = random.Next(1, maxDelay * 1000); System.Threading.Thread.Sleep(currentSleep); } UpnpSsdpQueryResponse response = new UpnpSsdpQueryResponse( (int)device.Device.NotificationInterval.TotalSeconds, searchId, device.Device.IdUsn, this.GetDeviceHttpAddress(device, localInterfaceIpOfRemoteEndpoint)); this.Send(response, remoteEndpoint); }
internal UpnpFragmentWithRoot(UpnpNt upnpType, UpnpNt upnpId, UpnpNt upnpRoot) : base(upnpType, upnpId) { UpnpRoot = upnpRoot; }