using System; using System.Collections.Generic; using System.Linq; using System.Text; using Rssdp.Infrastructure; namespace Rssdp { /// /// Allows publishing devices both as notification and responses to search requests. /// /// /// This is the 'server' part of the system. You add your devices to an instance of this class so clients can find them. /// public class SsdpDevicePublisher : SsdpDevicePublisherBase { #region Constructors /// /// Default constructor. /// /// /// Uses the default implementation and network settings for Windows and the SSDP specification. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "No way to do this here, and we don't want to dispose it except in the (rare) case of an exception anyway.")] public SsdpDevicePublisher() : this(new SsdpCommunicationsServer(new SocketFactory(null))) { } /// /// Full constructor. /// /// /// Allows the caller to specify their own implementation for full control over the networking, or for mocking/testing purposes.. /// public SsdpDevicePublisher(ISsdpCommunicationsServer communicationsServer) : base(communicationsServer, GetOSName(), GetOSVersion()) { } /// /// Partial constructor. /// /// The local port to use for socket communications, specify 0 to have the system choose it's own. /// /// Uses the default implementation and network settings for Windows and the SSDP specification, but specifies the local port to use for socket communications. Specify 0 to indicate the system should choose it's own port. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "No way to do this here, and we don't want to dispose it except in the (rare) case of an exception anyway.")] public SsdpDevicePublisher(int localPort) : this(new SsdpCommunicationsServer(new SocketFactory(null), localPort)) { } /// /// Partial constructor. /// /// The local port to use for socket communications, specify 0 to have the system choose it's own. /// The number of hops a multicast packet can make before it expires. Must be 1 or greater. /// /// Uses the default implementation and network settings for Windows and the SSDP specification, but specifies the local port to use and multicast time to live setting for socket communications. /// Specify 0 for the argument to indicate the system should choose it's own port. /// The is actually a number of 'hops' on the network and not a time based argument. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "No way to do this here, and we don't want to dispose it except in the (rare) case of an exception anyway.")] public SsdpDevicePublisher(int localPort, int multicastTimeToLive) : this(new SsdpCommunicationsServer(new SocketFactory(null), localPort, multicastTimeToLive)) { } #endregion #region Private Methods private static string GetOSName() { #if NET46 return Environment.OSVersion.Platform.ToString(); #elif NETSTANDARD1_6 return System.Runtime.InteropServices.RuntimeInformation.OSDescription; #endif return "Operating System"; } private static string GetOSVersion() { #if NET46 return Environment.OSVersion.Version.ToString() + " " + Environment.OSVersion.ServicePack.ToString(); #elif NETSTANDARD1_6 return System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription; #endif return "1.0"; } #endregion } }