/// <summary> /// Loads and applies the configuration. /// </summary> private IConfigurationStorage LoadConfiguration() { var result = Factory.Singleton.Resolve <IConfigurationStorage>().Singleton; var configuration = result.Load(); var unusedServers = new List <IRebroadcastServer>(RebroadcastServers); foreach (var rebroadcastSettings in configuration.RebroadcastSettings) { if (rebroadcastSettings.Enabled) { int indexExistingServer = unusedServers.FindIndex(r => r.Format == rebroadcastSettings.Format && r.BroadcastProvider.Port == rebroadcastSettings.Port); if (indexExistingServer != -1) { unusedServers.RemoveAt(indexExistingServer); } else { var server = Factory.Singleton.Resolve <IRebroadcastServer>(); server.Listener = Listener; server.BroadcastProvider = Factory.Singleton.Resolve <IBroadcastProvider>(); server.BroadcastProvider.Port = rebroadcastSettings.Port; server.BroadcastProvider.BroadcastSent += BroadcastProvider_BroadcastSent; server.BroadcastProvider.ClientConnected += BroadcastProvider_ClientConnected; server.BroadcastProvider.ClientDisconnected += BroadcastProvider_ClientDisconnected; server.BroadcastProvider.ExceptionCaught += BroadcastProvider_ExceptionCaught; server.Format = rebroadcastSettings.Format; RebroadcastServers.Add(server); server.Initialise(); if (Online) { server.Online = true; } } } } foreach (var unusedServer in unusedServers) { RebroadcastServers.Remove(unusedServer); ReleaseServer(unusedServer); } return(result); }
/// <summary> /// Finalises or disposes of the object. /// </summary> /// <param name="disposing"></param> private void Dispose(bool disposing) { if (disposing) { if (_HookedConfigurationChanged) { Factory.Singleton.Resolve <IConfigurationStorage>().Singleton.ConfigurationChanged -= ConfigurationStorage_ConfigurationChanged; _HookedConfigurationChanged = false; } foreach (var server in RebroadcastServers) { ReleaseServer(server); } RebroadcastServers.Clear(); } }
/// <summary> /// Loads and applies the configuration. /// </summary> private IConfigurationStorage LoadConfiguration() { var result = Factory.Singleton.ResolveSingleton <IConfigurationStorage>(); var configuration = result.Load(); var feedManager = Factory.Singleton.ResolveSingleton <IFeedManager>(); var unusedServers = new List <IRebroadcastServer>(RebroadcastServers); var newServers = new List <RebroadcastSettings>(); foreach (var rebroadcastSettings in configuration.RebroadcastSettings) { var feed = feedManager.GetByUniqueId(rebroadcastSettings.ReceiverId, ignoreInvisibleFeeds: false); if (feed != null && rebroadcastSettings.Enabled) { var server = RebroadcastServers.FirstOrDefault(r => r.UniqueId == rebroadcastSettings.UniqueId); if (server != null) { if (server.SendIntervalMilliseconds != rebroadcastSettings.SendIntervalMilliseconds) { server.SendIntervalMilliseconds = rebroadcastSettings.SendIntervalMilliseconds; } } if (server != null && server.Connector != null) { var milliseconds = rebroadcastSettings.StaleSeconds * 1000; if (server.Connector.StaleMessageTimeout != milliseconds) { server.Connector.StaleMessageTimeout = milliseconds; } } int indexExistingServer = unusedServers.FindIndex(r => r.Format == rebroadcastSettings.Format && r.Connector.Port == rebroadcastSettings.Port && r.UniqueId == rebroadcastSettings.UniqueId && r.Feed.UniqueId == feed.UniqueId && r.Connector.IsPassive == !rebroadcastSettings.IsTransmitter && (!rebroadcastSettings.IsTransmitter || r.Connector.Address == rebroadcastSettings.TransmitAddress) && (rebroadcastSettings.IsTransmitter || Object.Equals(r.Connector.Access, rebroadcastSettings.Access)) && r.Connector.UseKeepAlive == rebroadcastSettings.UseKeepAlive && (r.Connector.UseKeepAlive || r.Connector.IdleTimeout == rebroadcastSettings.IdleTimeoutMilliseconds) ); if (indexExistingServer == -1) { newServers.Add(rebroadcastSettings); } else { var existingServer = unusedServers[indexExistingServer]; existingServer.Name = rebroadcastSettings.Name; ConfigureAuthentication(rebroadcastSettings, existingServer); unusedServers.RemoveAt(indexExistingServer); } } } foreach (var unusedServer in unusedServers) { RebroadcastServers.Remove(unusedServer); ReleaseServer(unusedServer); } foreach (var rebroadcastSettings in newServers) { var feed = feedManager.GetByUniqueId(rebroadcastSettings.ReceiverId, ignoreInvisibleFeeds: false); var server = Factory.Singleton.Resolve <IRebroadcastServer>(); server.UniqueId = rebroadcastSettings.UniqueId; server.Name = rebroadcastSettings.Name; server.Feed = feed; server.Connector = Factory.Singleton.Resolve <INetworkConnector>(); server.Connector.Name = rebroadcastSettings.Name; server.Connector.Port = rebroadcastSettings.Port; server.Connector.StaleMessageTimeout = rebroadcastSettings.StaleSeconds * 1000; server.Connector.Access = rebroadcastSettings.Access; server.Connector.ConnectionEstablished += Connector_ClientConnected; server.Connector.ConnectionClosed += Connector_ClientDisconnected; server.Connector.UseKeepAlive = rebroadcastSettings.UseKeepAlive; server.Format = rebroadcastSettings.Format; server.SendIntervalMilliseconds = rebroadcastSettings.SendIntervalMilliseconds; ConfigureAuthentication(rebroadcastSettings, server); if (!rebroadcastSettings.UseKeepAlive) { server.Connector.IdleTimeout = rebroadcastSettings.IdleTimeoutMilliseconds; } if (!rebroadcastSettings.IsTransmitter) { server.Connector.IsPassive = true; server.Connector.IsSingleConnection = false; } else { server.Connector.IsPassive = false; server.Connector.IsSingleConnection = true; server.Connector.Address = rebroadcastSettings.TransmitAddress; } RebroadcastServers.Add(server); server.Initialise(); if (Online) { server.Online = true; } } return(result); }