/// <summary> /// Called on a background thread to raise an event indicating that a message has been picked up. /// </summary> /// <param name="message"></param> private void ProcessAndDispatchMessageQueueItem(MessageDispatch message) { if (message.Port30003MessageEventArgs != null) { OnPort30003MessageReceived(message.Port30003MessageEventArgs); } else if (message.RawBytesEventArgs != null) { OnRawBytesReceived(message.RawBytesEventArgs); } else if (message.ModeSBytesEventArgs != null) { OnModeSBytesReceived(message.ModeSBytesEventArgs); } else { var modeSMessageArgs = message.ModeSMessageEventArgs; OnModeSMessageReceived(modeSMessageArgs); BaseStationMessage cookedMessage; lock (_SyncLock) { cookedMessage = RawMessageTranslator == null ? null : RawMessageTranslator.Translate(modeSMessageArgs.ReceivedUtc, modeSMessageArgs.ModeSMessage, modeSMessageArgs.AdsbMessage); } if (cookedMessage != null) { OnPort30003MessageReceived(new BaseStationMessageEventArgs(cookedMessage)); } } }
/// <summary> /// See interface docs. /// </summary> /// <param name="connector"></param> /// <param name="bytesExtractor"></param> /// <param name="rawMessageTranslator"></param> public void ChangeSource(IConnector connector, IMessageBytesExtractor bytesExtractor, IRawMessageTranslator rawMessageTranslator) { var changed = false; var reconnect = false; lock (_SyncLock) { reconnect = Connector != null && Connector.EstablishingConnections; if (connector != Connector || bytesExtractor != BytesExtractor || rawMessageTranslator != RawMessageTranslator) { if (RawMessageTranslator != null && RawMessageTranslator != rawMessageTranslator) { RawMessageTranslator.Dispose(); } if (Connector != connector) { if (Connector != null) { UnhookConnector(); Connector.Dispose(); } Connector = connector; Connector.IsSingleConnection = true; HookConnector(); } BytesExtractor = bytesExtractor; RawMessageTranslator = rawMessageTranslator; if (RawMessageTranslator != null) { RawMessageTranslator.Statistics = Statistics; } TotalMessages = 0; TotalBadMessages = 0; changed = true; } } if (changed) { OnSourceChanged(EventArgs.Empty); if (reconnect) { Connect(); } } }
/// <summary> /// Disposes of or finalises the object. /// </summary> /// <param name="disposing"></param> private void Dispose(bool disposing) { _Disposed = true; if (disposing) { lock (_SyncLock) { if (Provider != null) { Provider.Close(); } if (_MessageProcessingAndDispatchQueue != null) { _MessageProcessingAndDispatchQueue.Dispose(); } if (RawMessageTranslator != null) { RawMessageTranslator.Dispose(); } } } }
/// <summary> /// Disposes of or finalises the object. /// </summary> /// <param name="disposing"></param> private void Dispose(bool disposing) { _Disposed = true; if (disposing) { lock (_SyncLock) { if (Connector != null) { Connector.CloseConnection(); UnhookConnector(); Connector.Dispose(); } if (_MessageProcessingAndDispatchQueue != null) { _MessageProcessingAndDispatchQueue.Dispose(); } if (RawMessageTranslator != null) { RawMessageTranslator.Dispose(); } } } }
/// <summary> /// See interface docs. /// </summary> /// <param name="provider"></param> /// <param name="bytesExtractor"></param> /// <param name="rawMessageTranslator"></param> /// <param name="autoReconnect"></param> public void ChangeSource(IListenerProvider provider, IMessageBytesExtractor bytesExtractor, IRawMessageTranslator rawMessageTranslator, bool autoReconnect) { lock (_SyncLock) { bool changed = false; if (provider != Provider || bytesExtractor != BytesExtractor || rawMessageTranslator != RawMessageTranslator) { if (Provider != null) { Disconnect(); } if (RawMessageTranslator != null && RawMessageTranslator != rawMessageTranslator) { RawMessageTranslator.Dispose(); } Provider = provider; BytesExtractor = bytesExtractor; RawMessageTranslator = rawMessageTranslator; TotalMessages = 0; TotalBadMessages = 0; changed = true; } if (changed) { OnSourceChanged(EventArgs.Empty); if (autoReconnect) { Connect(false); } } } }