aboutsummaryrefslogtreecommitdiff
path: root/RSSDP/SsdpDeviceLocator.cs
diff options
context:
space:
mode:
Diffstat (limited to 'RSSDP/SsdpDeviceLocator.cs')
-rw-r--r--RSSDP/SsdpDeviceLocator.cs136
1 files changed, 66 insertions, 70 deletions
diff --git a/RSSDP/SsdpDeviceLocator.cs b/RSSDP/SsdpDeviceLocator.cs
index 7afd32581..d6fad4b9d 100644
--- a/RSSDP/SsdpDeviceLocator.cs
+++ b/RSSDP/SsdpDeviceLocator.cs
@@ -1,11 +1,11 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
-
namespace Rssdp.Infrastructure
{
/// <summary>
@@ -17,7 +17,11 @@ namespace Rssdp.Infrastructure
private ISsdpCommunicationsServer _CommunicationsServer;
private Timer _BroadcastTimer;
- private object _timerLock = new object();
+ private object _timerLock = new();
+
+ private string _OSName;
+
+ private string _OSVersion;
private readonly TimeSpan DefaultSearchWaitTime = TimeSpan.FromSeconds(4);
private readonly TimeSpan OneSecond = TimeSpan.FromSeconds(1);
@@ -25,13 +29,17 @@ namespace Rssdp.Infrastructure
/// <summary>
/// Default constructor.
/// </summary>
- public SsdpDeviceLocator(ISsdpCommunicationsServer communicationsServer)
+ public SsdpDeviceLocator(
+ ISsdpCommunicationsServer communicationsServer,
+ string osName,
+ string osVersion)
{
- if (communicationsServer == null)
- {
- throw new ArgumentNullException(nameof(communicationsServer));
- }
+ ArgumentNullException.ThrowIfNull(communicationsServer);
+ ArgumentNullException.ThrowIfNullOrEmpty(osName);
+ ArgumentNullException.ThrowIfNullOrEmpty(osVersion);
+ _OSName = osName;
+ _OSVersion = osVersion;
_CommunicationsServer = communicationsServer;
_CommunicationsServer.ResponseReceived += CommsServer_ResponseReceived;
@@ -72,7 +80,7 @@ namespace Rssdp.Infrastructure
{
lock (_timerLock)
{
- if (_BroadcastTimer == null)
+ if (_BroadcastTimer is null)
{
_BroadcastTimer = new Timer(OnBroadcastTimerCallback, null, dueTime, period);
}
@@ -87,7 +95,7 @@ namespace Rssdp.Infrastructure
{
lock (_timerLock)
{
- if (_BroadcastTimer != null)
+ if (_BroadcastTimer is not null)
{
_BroadcastTimer.Dispose();
_BroadcastTimer = null;
@@ -148,7 +156,7 @@ namespace Rssdp.Infrastructure
private Task SearchAsync(string searchTarget, TimeSpan searchWaitTime, CancellationToken cancellationToken)
{
- if (searchTarget == null)
+ if (searchTarget is null)
{
throw new ArgumentNullException(nameof(searchTarget));
}
@@ -187,7 +195,7 @@ namespace Rssdp.Infrastructure
{
_CommunicationsServer.RequestReceived -= CommsServer_RequestReceived;
_CommunicationsServer.RequestReceived += CommsServer_RequestReceived;
- _CommunicationsServer.BeginListeningForBroadcasts();
+ _CommunicationsServer.BeginListeningForMulticast();
}
/// <summary>
@@ -211,21 +219,18 @@ namespace Rssdp.Infrastructure
/// Raises the <see cref="DeviceAvailable"/> event.
/// </summary>
/// <seealso cref="DeviceAvailable"/>
- protected virtual void OnDeviceAvailable(DiscoveredSsdpDevice device, bool isNewDevice, IPAddress IpAddress)
+ protected virtual void OnDeviceAvailable(DiscoveredSsdpDevice device, bool isNewDevice, IPAddress IPAddress)
{
- if (this.IsDisposed)
+ if (IsDisposed)
{
return;
}
- var handlers = this.DeviceAvailable;
- if (handlers != null)
+ var handlers = DeviceAvailable;
+ handlers?.Invoke(this, new DeviceAvailableEventArgs(device, isNewDevice)
{
- handlers(this, new DeviceAvailableEventArgs(device, isNewDevice)
- {
- RemoteIpAddress = IpAddress
- });
- }
+ RemoteIPAddress = IPAddress
+ });
}
/// <summary>
@@ -236,16 +241,13 @@ namespace Rssdp.Infrastructure
/// <seealso cref="DeviceUnavailable"/>
protected virtual void OnDeviceUnavailable(DiscoveredSsdpDevice device, bool expired)
{
- if (this.IsDisposed)
+ if (IsDisposed)
{
return;
}
- var handlers = this.DeviceUnavailable;
- if (handlers != null)
- {
- handlers(this, new DeviceUnavailableEventArgs(device, expired));
- }
+ var handlers = DeviceUnavailable;
+ handlers?.Invoke(this, new DeviceUnavailableEventArgs(device, expired));
}
/// <summary>
@@ -281,21 +283,21 @@ namespace Rssdp.Infrastructure
var commsServer = _CommunicationsServer;
_CommunicationsServer = null;
- if (commsServer != null)
+ if (commsServer is not null)
{
- commsServer.ResponseReceived -= this.CommsServer_ResponseReceived;
- commsServer.RequestReceived -= this.CommsServer_RequestReceived;
+ commsServer.ResponseReceived -= CommsServer_ResponseReceived;
+ commsServer.RequestReceived -= CommsServer_RequestReceived;
}
}
}
- private void AddOrUpdateDiscoveredDevice(DiscoveredSsdpDevice device, IPAddress IpAddress)
+ private void AddOrUpdateDiscoveredDevice(DiscoveredSsdpDevice device, IPAddress IPAddress)
{
bool isNewDevice = false;
lock (_Devices)
{
var existingDevice = FindExistingDeviceNotification(_Devices, device.NotificationType, device.Usn);
- if (existingDevice == null)
+ if (existingDevice is null)
{
_Devices.Add(device);
isNewDevice = true;
@@ -307,17 +309,17 @@ namespace Rssdp.Infrastructure
}
}
- DeviceFound(device, isNewDevice, IpAddress);
+ DeviceFound(device, isNewDevice, IPAddress);
}
- private void DeviceFound(DiscoveredSsdpDevice device, bool isNewDevice, IPAddress IpAddress)
+ private void DeviceFound(DiscoveredSsdpDevice device, bool isNewDevice, IPAddress IPAddress)
{
if (!NotificationTypeMatchesFilter(device))
{
return;
}
- OnDeviceAvailable(device, isNewDevice, IpAddress);
+ OnDeviceAvailable(device, isNewDevice, IPAddress);
}
private bool NotificationTypeMatchesFilter(DiscoveredSsdpDevice device)
@@ -329,12 +331,12 @@ namespace Rssdp.Infrastructure
private Task BroadcastDiscoverMessage(string serviceType, TimeSpan mxValue, CancellationToken cancellationToken)
{
- var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+ const string header = "M-SEARCH * HTTP/1.1";
- values["HOST"] = "239.255.255.250:1900";
- values["USER-AGENT"] = "UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2";
- // values["X-EMBY-SERVERID"] = _appHost.SystemId;
+ var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+ values["HOST"] = string.Format(CultureInfo.InvariantCulture, "{0}:{1}", SsdpConstants.MulticastLocalAdminAddress, SsdpConstants.MulticastPort);
+ values["USER-AGENT"] = string.Format(CultureInfo.InvariantCulture, "{0}/{1} UPnP/1.0 RSSDP/{2}", _OSName, _OSVersion, SsdpConstants.ServerVersion);
values["MAN"] = "\"ssdp:discover\"";
// Search target
@@ -343,14 +345,12 @@ namespace Rssdp.Infrastructure
// Seconds to delay response
values["MX"] = "3";
- var header = "M-SEARCH * HTTP/1.1";
-
var message = BuildMessage(header, values);
return _CommunicationsServer.SendMulticastMessage(message, null, cancellationToken);
}
- private void ProcessSearchResponseMessage(HttpResponseMessage message, IPAddress IpAddress)
+ private void ProcessSearchResponseMessage(HttpResponseMessage message, IPAddress IPAddress)
{
if (!message.IsSuccessStatusCode)
{
@@ -358,7 +358,7 @@ namespace Rssdp.Infrastructure
}
var location = GetFirstHeaderUriValue("Location", message);
- if (location != null)
+ if (location is not null)
{
var device = new DiscoveredSsdpDevice()
{
@@ -370,32 +370,32 @@ namespace Rssdp.Infrastructure
ResponseHeaders = message.Headers
};
- AddOrUpdateDiscoveredDevice(device, IpAddress);
+ AddOrUpdateDiscoveredDevice(device, IPAddress);
}
}
- private void ProcessNotificationMessage(HttpRequestMessage message, IPAddress IpAddress)
+ private void ProcessNotificationMessage(HttpRequestMessage message, IPAddress IPAddress)
{
- if (String.Compare(message.Method.Method, "Notify", StringComparison.OrdinalIgnoreCase) != 0)
+ if (string.Compare(message.Method.Method, "Notify", StringComparison.OrdinalIgnoreCase) != 0)
{
return;
}
var notificationType = GetFirstHeaderStringValue("NTS", message);
- if (String.Compare(notificationType, SsdpConstants.SsdpKeepAliveNotification, StringComparison.OrdinalIgnoreCase) == 0)
+ if (string.Compare(notificationType, SsdpConstants.SsdpKeepAliveNotification, StringComparison.OrdinalIgnoreCase) == 0)
{
- ProcessAliveNotification(message, IpAddress);
+ ProcessAliveNotification(message, IPAddress);
}
- else if (String.Compare(notificationType, SsdpConstants.SsdpByeByeNotification, StringComparison.OrdinalIgnoreCase) == 0)
+ else if (string.Compare(notificationType, SsdpConstants.SsdpByeByeNotification, StringComparison.OrdinalIgnoreCase) == 0)
{
ProcessByeByeNotification(message);
}
}
- private void ProcessAliveNotification(HttpRequestMessage message, IPAddress IpAddress)
+ private void ProcessAliveNotification(HttpRequestMessage message, IPAddress IPAddress)
{
var location = GetFirstHeaderUriValue("Location", message);
- if (location != null)
+ if (location is not null)
{
var device = new DiscoveredSsdpDevice()
{
@@ -407,14 +407,14 @@ namespace Rssdp.Infrastructure
ResponseHeaders = message.Headers
};
- AddOrUpdateDiscoveredDevice(device, IpAddress);
+ AddOrUpdateDiscoveredDevice(device, IPAddress);
}
}
private void ProcessByeByeNotification(HttpRequestMessage message)
{
var notficationType = GetFirstHeaderStringValue("NT", message);
- if (!String.IsNullOrEmpty(notficationType))
+ if (!string.IsNullOrEmpty(notficationType))
{
var usn = GetFirstHeaderStringValue("USN", message);
@@ -441,11 +441,10 @@ namespace Rssdp.Infrastructure
private string GetFirstHeaderStringValue(string headerName, HttpResponseMessage message)
{
string retVal = null;
- IEnumerable<string> values;
if (message.Headers.Contains(headerName))
{
- message.Headers.TryGetValues(headerName, out values);
- if (values != null)
+ message.Headers.TryGetValues(headerName, out var values);
+ if (values is not null)
{
retVal = values.FirstOrDefault();
}
@@ -457,11 +456,10 @@ namespace Rssdp.Infrastructure
private string GetFirstHeaderStringValue(string headerName, HttpRequestMessage message)
{
string retVal = null;
- IEnumerable<string> values;
if (message.Headers.Contains(headerName))
{
- message.Headers.TryGetValues(headerName, out values);
- if (values != null)
+ message.Headers.TryGetValues(headerName, out var values);
+ if (values is not null)
{
retVal = values.FirstOrDefault();
}
@@ -473,11 +471,10 @@ namespace Rssdp.Infrastructure
private Uri GetFirstHeaderUriValue(string headerName, HttpRequestMessage request)
{
string value = null;
- IEnumerable<string> values;
if (request.Headers.Contains(headerName))
{
- request.Headers.TryGetValues(headerName, out values);
- if (values != null)
+ request.Headers.TryGetValues(headerName, out var values);
+ if (values is not null)
{
value = values.FirstOrDefault();
}
@@ -490,11 +487,10 @@ namespace Rssdp.Infrastructure
private Uri GetFirstHeaderUriValue(string headerName, HttpResponseMessage response)
{
string value = null;
- IEnumerable<string> values;
if (response.Headers.Contains(headerName))
{
- response.Headers.TryGetValues(headerName, out values);
- if (values != null)
+ response.Headers.TryGetValues(headerName, out var values);
+ if (values is not null)
{
value = values.FirstOrDefault();
}
@@ -506,7 +502,7 @@ namespace Rssdp.Infrastructure
private TimeSpan CacheAgeFromHeader(System.Net.Http.Headers.CacheControlHeaderValue headerValue)
{
- if (headerValue == null)
+ if (headerValue is null)
{
return TimeSpan.Zero;
}
@@ -523,7 +519,7 @@ namespace Rssdp.Infrastructure
foreach (var device in expiredDevices)
{
- if (this.IsDisposed)
+ if (IsDisposed)
{
return;
}
@@ -537,7 +533,7 @@ namespace Rssdp.Infrastructure
// problems.
foreach (var expiredUsn in (from expiredDevice in expiredDevices select expiredDevice.Usn).Distinct())
{
- if (this.IsDisposed)
+ if (IsDisposed)
{
return;
}
@@ -554,7 +550,7 @@ namespace Rssdp.Infrastructure
existingDevices = FindExistingDeviceNotifications(_Devices, deviceUsn);
foreach (var existingDevice in existingDevices)
{
- if (this.IsDisposed)
+ if (IsDisposed)
{
return true;
}
@@ -563,7 +559,7 @@ namespace Rssdp.Infrastructure
}
}
- if (existingDevices != null && existingDevices.Count > 0)
+ if (existingDevices is not null && existingDevices.Count > 0)
{
foreach (var removedDevice in existingDevices)
{
@@ -619,7 +615,7 @@ namespace Rssdp.Infrastructure
private void CommsServer_ResponseReceived(object sender, ResponseReceivedEventArgs e)
{
- ProcessSearchResponseMessage(e.Message, e.LocalIpAddress);
+ ProcessSearchResponseMessage(e.Message, e.LocalIPAddress);
}
private void CommsServer_RequestReceived(object sender, RequestReceivedEventArgs e)