DlnaServerEntryPoint.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using MediaBrowser.Common;
  2. using MediaBrowser.Common.Extensions;
  3. using MediaBrowser.Common.Net;
  4. using MediaBrowser.Controller.Configuration;
  5. using MediaBrowser.Controller.Plugins;
  6. using MediaBrowser.Model.Logging;
  7. using System;
  8. using System.Net;
  9. namespace MediaBrowser.Dlna.Server
  10. {
  11. public class DlnaServerEntryPoint : IServerEntryPoint
  12. {
  13. private readonly IServerConfigurationManager _config;
  14. private readonly ILogger _logger;
  15. private SsdpHandler _ssdpHandler;
  16. private readonly IApplicationHost _appHost;
  17. private readonly INetworkManager _network;
  18. public DlnaServerEntryPoint(IServerConfigurationManager config, ILogManager logManager, IApplicationHost appHost, INetworkManager network)
  19. {
  20. _config = config;
  21. _appHost = appHost;
  22. _network = network;
  23. _logger = logManager.GetLogger("DlnaServer");
  24. }
  25. public void Run()
  26. {
  27. _config.ConfigurationUpdated += ConfigurationUpdated;
  28. ReloadServer();
  29. }
  30. void ConfigurationUpdated(object sender, EventArgs e)
  31. {
  32. ReloadServer();
  33. }
  34. private void ReloadServer()
  35. {
  36. var isStarted = _ssdpHandler != null;
  37. if (_config.Configuration.DlnaOptions.EnableServer && !isStarted)
  38. {
  39. StartServer();
  40. }
  41. else if (!_config.Configuration.DlnaOptions.EnableServer && isStarted)
  42. {
  43. DisposeServer();
  44. }
  45. }
  46. private readonly object _syncLock = new object();
  47. private void StartServer()
  48. {
  49. var signature = GenerateServerSignature();
  50. lock (_syncLock)
  51. {
  52. try
  53. {
  54. _ssdpHandler = new SsdpHandler(_logger, _config, signature);
  55. RegisterEndpoints();
  56. }
  57. catch (Exception ex)
  58. {
  59. _logger.ErrorException("Error starting Dlna server", ex);
  60. }
  61. }
  62. }
  63. private void RegisterEndpoints()
  64. {
  65. foreach (var address in _network.GetLocalIpAddresses())
  66. {
  67. var guid = address.GetMD5();
  68. var descriptorURI = "/mediabrowser/dlna/" + guid.ToString("N") + "/description.xml";
  69. var uri = new Uri(string.Format("http://{0}:{1}{2}", address, _config.Configuration.HttpServerPortNumber, descriptorURI));
  70. _ssdpHandler.RegisterNotification(guid, uri, IPAddress.Parse(address));
  71. }
  72. }
  73. private void DisposeServer()
  74. {
  75. lock (_syncLock)
  76. {
  77. if (_ssdpHandler != null)
  78. {
  79. try
  80. {
  81. _ssdpHandler.Dispose();
  82. }
  83. catch (Exception ex)
  84. {
  85. _logger.ErrorException("Error disposing Dlna server", ex);
  86. }
  87. _ssdpHandler = null;
  88. }
  89. }
  90. }
  91. private string GenerateServerSignature()
  92. {
  93. var os = Environment.OSVersion;
  94. var pstring = os.Platform.ToString();
  95. switch (os.Platform)
  96. {
  97. case PlatformID.Win32NT:
  98. case PlatformID.Win32S:
  99. case PlatformID.Win32Windows:
  100. pstring = "WIN";
  101. break;
  102. }
  103. return String.Format(
  104. "{0}{1}/{2}.{3} UPnP/1.0 DLNADOC/1.5 MediaBrowser/{4}",
  105. pstring,
  106. IntPtr.Size * 8,
  107. os.Version.Major,
  108. os.Version.Minor,
  109. _appHost.ApplicationVersion
  110. );
  111. }
  112. public void Dispose()
  113. {
  114. DisposeServer();
  115. }
  116. }
  117. }