/// <inheritdoc /> protected override void OnInnerAdapterNewOutMessage(Message message) { Message extra = null; switch (message.Type) { case MessageTypes.SubscriptionResponse: { var responseMsg = (SubscriptionResponseMessage)message; var originId = responseMsg.OriginalTransactionId; lock (_syncObject) { if (_liveRequests.TryGetAndRemove(originId, out var isPartial)) { if (responseMsg.IsOk()) { if (!this.IsOutMessageSupported(MessageTypes.SubscriptionOnline)) { if (isPartial) { // reply was sent previously for the first partial request, // now sending "online" message message = new SubscriptionOnlineMessage { OriginalTransactionId = originId }; } else { extra = new SubscriptionOnlineMessage { OriginalTransactionId = originId }; } } } break; } if (!_partialRequests.TryGetValue(originId, out var info)) { break; } var requestId = info.Origin.TransactionId; if (!responseMsg.IsOk()) { _original.Remove(requestId); _partialRequests.RemoveWhere(p => p.Value == info); if (info.ReplyReceived) { // unexpected subscription stop responseMsg.OriginalTransactionId = requestId; break; } } if (info.ReplyReceived) { return; } info.ReplyReceived = true; responseMsg.OriginalTransactionId = requestId; } break; } case MessageTypes.SubscriptionFinished: { var finishMsg = (SubscriptionFinishedMessage)message; lock (_syncObject) { if (_partialRequests.TryGetAndRemove(finishMsg.OriginalTransactionId, out var info)) { var origin = info.Origin; if (info.LastIteration) { _original.Remove(origin.TransactionId); _partialRequests.RemoveWhere(p => p.Value == info); finishMsg.OriginalTransactionId = origin.TransactionId; } else { message = new PartialDownloadMessage { OriginalTransactionId = origin.TransactionId }.LoopBack(this); } } } break; } case MessageTypes.Execution: { var execMsg = (ExecutionMessage)message; if (!execMsg.IsMarketData()) { break; } TryUpdateSubscriptionResult(execMsg); break; } case MessageTypes.Level1Change: { TryUpdateSubscriptionResult((Level1ChangeMessage)message); break; } case MessageTypes.QuoteChange: { TryUpdateSubscriptionResult((QuoteChangeMessage)message); break; } default: { if (message is CandleMessage candleMsg) { TryUpdateSubscriptionResult(candleMsg); } break; } } base.OnInnerAdapterNewOutMessage(message); if (extra != null) { base.OnInnerAdapterNewOutMessage(extra); } }
/// <inheritdoc /> protected override void OnInnerAdapterNewOutMessage(Message message) { Message extra = null; switch (message.Type) { case MessageTypes.PortfolioLookupResult: case MessageTypes.OrderStatus: { var responseMsg = (IOriginalTransactionIdMessage)message; var originId = responseMsg.OriginalTransactionId; lock (_syncObject) { if (_liveRequests.TryGetAndRemove(originId, out var isPartial)) { if (isPartial) { if (((IErrorMessage)responseMsg).Error == null) { // reply was sent prev for first partial request, // now sending "online" message message = new SubscriptionOnlineMessage { OriginalTransactionId = originId }; } } else { extra = new SubscriptionOnlineMessage { OriginalTransactionId = originId }; } } } break; } case MessageTypes.SubscriptionResponse: { var responseMsg = (SubscriptionResponseMessage)message; var originId = responseMsg.OriginalTransactionId; lock (_syncObject) { if (_liveRequests.TryGetAndRemove(originId, out var isPartial)) { if (responseMsg.IsOk()) { if (isPartial) { // reply was sent prev for first partial request, // now sending "online" message message = new SubscriptionOnlineMessage { OriginalTransactionId = originId }; } else { extra = new SubscriptionOnlineMessage { OriginalTransactionId = originId }; } } break; } if (!_partialRequests.TryGetValue(originId, out var info)) { break; } if (info.ReplyReceived) { return; } info.ReplyReceived = true; var requestId = info.Origin.TransactionId; if (!responseMsg.IsOk()) { _original.Remove(requestId); _partialRequests.RemoveWhere(p => p.Value == info); } responseMsg.OriginalTransactionId = requestId; } break; } case MessageTypes.SubscriptionFinished: { var finishMsg = (SubscriptionFinishedMessage)message; lock (_syncObject) { if (_partialRequests.TryGetAndRemove(finishMsg.OriginalTransactionId, out var info)) { var origin = info.Origin; if (info.LastIteration) { _original.Remove(origin.TransactionId); _partialRequests.RemoveWhere(p => p.Value == info); finishMsg.OriginalTransactionId = origin.TransactionId; } else { message = new PartialDownloadMessage { OriginalTransactionId = origin.TransactionId }.LoopBack(this); } } } break; } case MessageTypes.CandleTimeFrame: case MessageTypes.CandlePnF: case MessageTypes.CandleRange: case MessageTypes.CandleRenko: case MessageTypes.CandleTick: case MessageTypes.CandleVolume: { TryUpdateSubscriptionResult((CandleMessage)message); break; } case MessageTypes.Execution: { var execMsg = (ExecutionMessage)message; if (!execMsg.IsMarketData()) { break; } TryUpdateSubscriptionResult(execMsg); break; } case MessageTypes.Level1Change: { TryUpdateSubscriptionResult((Level1ChangeMessage)message); break; } case MessageTypes.QuoteChange: { TryUpdateSubscriptionResult((QuoteChangeMessage)message); break; } } base.OnInnerAdapterNewOutMessage(message); if (extra != null) { base.OnInnerAdapterNewOutMessage(extra); } }