Example #1
0
        private void NotifyDevice(UpnpDevice dev, string type, bool logMessage)
        {
            const string header = "NOTIFY * HTTP/1.1";

            var values = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

            // If needed later for non-server devices, these headers will need to be dynamic
            values["HOST"]          = "239.255.255.250:1900";
            values["CACHE-CONTROL"] = "max-age = 600";
            values["LOCATION"]      = dev.Descriptor.ToString();
            values["SERVER"]        = _serverSignature;
            values["NTS"]           = "ssdp:" + type;
            values["NT"]            = dev.Type;
            values["USN"]           = dev.USN;

            if (logMessage)
            {
                _logger.Debug("{0} said {1}", dev.USN, type);
            }

            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            SendDatagram(msg, _ssdpEndp, new IPEndPoint(dev.Address, 0), true, 2);
            //SendUnicastRequest(msg, 1);
        }
        private void CreateNotifier(Socket socket)
        {
            Task.Factory.StartNew(async(o) =>
            {
                try
                {
                    var msg     = new SsdpMessageBuilder().BuildRendererDiscoveryMessage();
                    var request = Encoding.UTF8.GetBytes(msg);

                    while (true)
                    {
                        socket.SendTo(request, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900));

                        var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000;

                        await Task.Delay(delay).ConfigureAwait(false);
                    }
                }
                catch (OperationCanceledException)
                {
                }
                catch (Exception ex)
                {
                    _logger.ErrorException("Error in notifier", ex);
                }
            }, _tokenSource.Token, TaskCreationOptions.LongRunning);
        }
Example #3
0
        public void SendDatagram(string header,
                                 Dictionary <string, string> values,
                                 EndPoint endpoint,
                                 EndPoint localAddress,
                                 bool ignoreBindFailure,
                                 int sendCount)
        {
            var msg    = new SsdpMessageBuilder().BuildMessage(header, values);
            var queued = false;

            var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;

            for (var i = 0; i < sendCount; i++)
            {
                var dgram = new Datagram(endpoint, localAddress, _logger, msg, ignoreBindFailure, enableDebugLogging);

                if (_messageQueue.Count == 0)
                {
                    dgram.Send();
                }
                else
                {
                    _messageQueue.Enqueue(dgram);
                    queued = true;
                }
            }

            if (queued)
            {
                StartQueueTimer();
            }
        }
Example #4
0
        public void SendSearchMessage(EndPoint localIp)
        {
            var values = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

            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;

            values["MAN"] = "\"ssdp:discover\"";

            // Search target
            values["ST"] = "ssdp:all";

            // Seconds to delay response
            values["MX"] = "3";

            var header = "M-SEARCH * HTTP/1.1";

            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            // UDP is unreliable, so send 3 requests at a time (per Upnp spec, sec 1.1.2)
            SendDatagram(msg, _ssdpEndp, localIp, true);

            SendUnicastRequest(msg);
        }
Example #5
0
        private void RespondToSearch(EndPoint endpoint, string deviceType)
        {
            var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLog;

            var isLogged = false;

            const string header = "HTTP/1.1 200 OK";

            foreach (var d in RegisteredDevices)
            {
                if (string.Equals(deviceType, "ssdp:all", StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(deviceType, d.Type, StringComparison.OrdinalIgnoreCase))
                {
                    if (!isLogged)
                    {
                        if (enableDebugLogging)
                        {
                            _logger.Debug("Responding to search from {0} for {1}", endpoint, deviceType);
                        }
                        isLogged = true;
                    }

                    var values = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

                    values["CACHE-CONTROL"] = "max-age = 600";
                    values["DATE"]          = DateTime.Now.ToString("R");
                    values["EXT"]           = "";
                    values["LOCATION"]      = d.Descriptor.ToString();
                    values["SERVER"]        = _serverSignature;
                    values["ST"]            = d.Type;
                    values["USN"]           = d.USN;

                    var msg = new SsdpMessageBuilder().BuildMessage(header, values);

                    SendDatagram(msg, endpoint, null, false, 2);
                    SendDatagram(msg, endpoint, new IPEndPoint(d.Address, 0), false, 2);
                    //SendDatagram(header, values, endpoint, null, true);

                    if (enableDebugLogging)
                    {
                        _logger.Debug("{1} - Responded to a {0} request to {2}", d.Type, endpoint, d.Address.ToString());
                    }
                }
            }
        }
Example #6
0
        public void SendDatagram(string header,
                                 Dictionary <string, string> values,
                                 IPEndPoint endpoint,
                                 IPEndPoint localAddress,
                                 int sendCount = 1)
        {
            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            var dgram = new Datagram(endpoint, localAddress, _logger, msg, sendCount);

            if (_messageQueue.Count == 0)
            {
                dgram.Send();
                return;
            }

            _messageQueue.Enqueue(dgram);
            StartQueueTimer();
        }
Example #7
0
        public async void SendDatagram(string header,
                                       Dictionary <string, string> values,
                                       EndPoint endpoint,
                                       EndPoint localAddress,
                                       bool isBroadcast,
                                       int sendCount)
        {
            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;

            for (var i = 0; i < sendCount; i++)
            {
                if (i > 0)
                {
                    await Task.Delay(500).ConfigureAwait(false);
                }

                var dgram = new Datagram(endpoint, localAddress, _logger, msg, isBroadcast, enableDebugLogging);
                dgram.Send();
            }
        }
Example #8
0
        public async void SendDatagram(string header,
            Dictionary<string, string> values,
            EndPoint endpoint,
            EndPoint localAddress,
            bool isBroadcast,
            int sendCount)
        {
            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;

            for (var i = 0; i < sendCount; i++)
            {
                if (i > 0)
                {
                    await Task.Delay(500).ConfigureAwait(false);
                }

                var dgram = new Datagram(endpoint, localAddress, _logger, msg, isBroadcast, enableDebugLogging);
                dgram.Send();
            }
        }
Example #9
0
        public void SendDatagram(string header,
            Dictionary<string, string> values,
            EndPoint endpoint,
            EndPoint localAddress,
            bool ignoreBindFailure,
            int sendCount)
        {
            var msg = new SsdpMessageBuilder().BuildMessage(header, values);
            var queued = false;

            var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLogging;

            for (var i = 0; i < sendCount; i++)
            {
                var dgram = new Datagram(endpoint, localAddress, _logger, msg, ignoreBindFailure, enableDebugLogging);

                if (_messageQueue.Count == 0)
                {
                    dgram.Send();
                }
                else
                {
                    _messageQueue.Enqueue(dgram);
                    queued = true;
                }
            }

            if (queued)
            {
                StartQueueTimer();
            }
        }
Example #10
0
        public void SendDatagram(string header,
            Dictionary<string, string> values,
            IPEndPoint endpoint,
            IPEndPoint localAddress,
            int sendCount = 1)
        {
            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            var dgram = new Datagram(endpoint, localAddress, _logger, msg, sendCount);
            if (_messageQueue.Count == 0)
            {
                dgram.Send();
                return;
            }

            _messageQueue.Enqueue(dgram);
            StartQueueTimer();
        }
Example #11
0
        private void NotifyDevice(UpnpDevice dev, string type, bool logMessage)
        {
            const string header = "NOTIFY * HTTP/1.1";

            var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

            // If needed later for non-server devices, these headers will need to be dynamic 
            values["HOST"] = "239.255.255.250:1900";
            values["CACHE-CONTROL"] = "max-age = 600";
            values["LOCATION"] = dev.Descriptor.ToString();
            values["SERVER"] = _serverSignature;
            values["NTS"] = "ssdp:" + type;
            values["NT"] = dev.Type;
            values["USN"] = dev.USN;

            if (logMessage)
            {
                _logger.Debug("{0} said {1}", dev.USN, type);
            }

            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            SendDatagram(msg, _ssdpEndp, new IPEndPoint(dev.Address, 0), true, 2);
            //SendUnicastRequest(msg, 1);
        }
Example #12
0
        private void RespondToSearch(EndPoint endpoint, string deviceType)
        {
            var enableDebugLogging = _config.GetDlnaConfiguration().EnableDebugLog;

            var isLogged = false;

            const string header = "HTTP/1.1 200 OK";

            foreach (var d in RegisteredDevices)
            {
                if (string.Equals(deviceType, "ssdp:all", StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(deviceType, d.Type, StringComparison.OrdinalIgnoreCase))
                {
                    if (!isLogged)
                    {
                        if (enableDebugLogging)
                        {
                            _logger.Debug("Responding to search from {0} for {1}", endpoint, deviceType);
                        }
                        isLogged = true;
                    }

                    var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

                    values["CACHE-CONTROL"] = "max-age = 600";
                    values["DATE"] = DateTime.Now.ToString("R");
                    values["EXT"] = "";
                    values["LOCATION"] = d.Descriptor.ToString();
                    values["SERVER"] = _serverSignature;
                    values["ST"] = d.Type;
                    values["USN"] = d.USN;

                    var msg = new SsdpMessageBuilder().BuildMessage(header, values);

                    SendDatagram(msg, endpoint, null, false, 2);
                    SendDatagram(msg, endpoint, new IPEndPoint(d.Address, 0), false, 2);
                    //SendDatagram(header, values, endpoint, null, true);

                    if (enableDebugLogging)
                    {
                        _logger.Debug("{1} - Responded to a {0} request to {2}", d.Type, endpoint, d.Address.ToString());
                    }
                }
            }
        }
Example #13
0
        public void SendSearchMessage(EndPoint localIp)
        {
            var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

            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;

            values["MAN"] = "\"ssdp:discover\"";

            // Search target
            values["ST"] = "ssdp:all";

            // Seconds to delay response
            values["MX"] = "3";

            var header = "M-SEARCH * HTTP/1.1";

            var msg = new SsdpMessageBuilder().BuildMessage(header, values);

            // UDP is unreliable, so send 3 requests at a time (per Upnp spec, sec 1.1.2)
            SendDatagram(msg, _ssdpEndp, localIp, true);

            SendUnicastRequest(msg);
        }
        private void CreateNotifier(Socket socket)
        {
            Task.Factory.StartNew(async (o) =>
            {
                try
                {
                    var msg = new SsdpMessageBuilder().BuildRendererDiscoveryMessage();
                    var request = Encoding.UTF8.GetBytes(msg);

                    while (true)
                    {
                        socket.SendTo(request, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900));

                        var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000;

                        await Task.Delay(delay).ConfigureAwait(false);
                    }
                }
                catch (OperationCanceledException)
                {
                }
                catch (Exception ex)
                {
                    _logger.ErrorException("Error in notifier", ex);
                }

            }, _tokenSource.Token, TaskCreationOptions.LongRunning);

        }