public override void OnNewMessage()

in FixAntenna/NetCore/FixEngine/Session/MessageHandler/PerType/SequenceResetMessageHandler.cs [27:101]


		public override void OnNewMessage(FixMessage message)
		{
			Log.Debug("SequenceReset message handler");

			var newSeqNo = message.GetTagValueAsLong(Tags.NewSeqNo);
			var msgSeqNum = message.GetTagValueAsLong(Tags.MsgSeqNum);
			var session = Session;
			var runtimeState = session.RuntimeState;
			var currentIncomingSeqNum = (long?) session.GetAndRemoveAttribute(ExtendedFixSessionAttribute.SequenceWasDecremented.Name);
			if (currentIncomingSeqNum == null || FixMessageUtil.IsPosDup(message))
			{
				currentIncomingSeqNum = runtimeState.InSeqNum;
				// decrement for Sequence Reset (Reset) if it wasn't decremented before (MsgNum(43) is expected)
				// if NewSeqNo>=expected - reset will be applied and new sequences will be set
				// if NewSeqNo<expected - message should be rejected without incrementing session' sequences
				if (!FixMessageUtil.IsGapFill(message))
				{
					//OutOfSequenceMessageHandler decrements sequence if it is not equal to expected, otherwise it has to be decremented here.
					runtimeState.DecrementInSeqNum();
				}
			}

			if (FixMessageUtil.IsGapFill(message))
			{
				if (msgSeqNum < currentIncomingSeqNum.Value && FixMessageUtil.IsPosDup(message))
				{
					runtimeState.DecrementInSeqNum();
					return;
				}
				session.FixSessionOutOfSyncListener.OnGapFillReceived(message);
				if (newSeqNo <= currentIncomingSeqNum.Value)
				{
					var problemDescription = "Attempt to lower sequence number, invalid value NewSeqNum=" + newSeqNo;
					var list = session.MessageFactory.GetRejectForMessageTag(message, Tags.NewSeqNo, 5, problemDescription);
					session.ErrorHandler.OnWarn(problemDescription, new InvalidMessageException(message, problemDescription));
					session.SendMessageOutOfTurn(MsgType.Reject, list);
					return;
				}
			}
			else
			{
				if (newSeqNo < currentIncomingSeqNum.Value)
				{
					var problemDescription = "Value " + newSeqNo + " is incorrect (out of range) for this tag " + Tags.NewSeqNo;
					var list = session.MessageFactory.GetRejectForMessageTag(message, Tags.NewSeqNo, 5, problemDescription);
					session.ErrorHandler.OnWarn(problemDescription, new InvalidMessageException(message, problemDescription));
					session.SendMessageOutOfTurn(MsgType.Reject, list);
					return;
				}
				else if (newSeqNo == currentIncomingSeqNum.Value)
				{
					Log.Warn("Your counterparty sent sequence reset with the new sequence number equal to the currently expected sequence number for session " + session + ". It may indicate possible error");
				}
			}

			var endOfRrRange = session.GetAttributeAsLong(ExtendedFixSessionAttribute.EndOfRrRange);
			var requestedEndOfRr = session.GetAttributeAsLong(ExtendedFixSessionAttribute.RequestedEndRrRange);
			var sequenceManager = GetSequenceManager();
			var enhancedResendLogic = session.Parameters.Configuration
				.GetPropertyAsBoolean(Config.EnhancedCmeResendLogic);

			if (enhancedResendLogic && requestedEndOfRr > 0 && endOfRrRange > requestedEndOfRr && newSeqNo > requestedEndOfRr)
			{
				sequenceManager.SeqResendManager.SendRequestForResend(requestedEndOfRr + 1, false);
				runtimeState.LastProcessedSeqNum = requestedEndOfRr;
				return;
			}

			if (Log.IsInfoEnabled)
			{
				Log.Info("Seq reset to: " + newSeqNo);
			}

			sequenceManager.ResetSequencesOnRequest(newSeqNo);
		}