public void Next(Message message)
{
Header header = message.Header;
string msgType = "";
try
{
msgType = header.GetField(Fields.Tags.MsgType);
string beginString = header.GetField(Fields.Tags.BeginString);
if (!beginString.Equals(this.SessionID.BeginString))
{
throw new UnsupportedVersion();
}
if (this.SessionID.IsFIXT && !Message.IsAdminMsgType(msgType))
{
throw new UnsupportedVersion("'FIXT' Sessions are not implemented yet!");
}
else
{
this.SessionDataDictionary.Validate(message, beginString, msgType);
}
if (MsgType.LOGON.Equals(msgType))
{
NextLogon(message);
}
else if (MsgType.HEARTBEAT.Equals(msgType))
{
NextHeartbeat(message);
}
else if (MsgType.TEST_REQUEST.Equals(msgType))
{
NextTestRequest(message);
}
else if (MsgType.SEQUENCE_RESET.Equals(msgType))
{
NextSequenceReset(message);
}
else if (MsgType.LOGOUT.Equals(msgType))
{
NextLogout(message);
}
else if (MsgType.RESEND_REQUEST.Equals(msgType))
{
NextResendRequest(message);
}
else
{
if (!Verify(message))
{
return;
}
state_.IncrNextTargetMsgSeqNum();
}
}
catch (TagException e)
{
if (null != e.InnerException)
{
this.Log.OnEvent(e.InnerException.Message);
}
GenerateReject(message, e.sessionRejectReason, e.field);
}
catch (UnsupportedVersion)
{
if (MsgType.LOGOUT.Equals(msgType))
{
NextLogout(message);
}
else
{
GenerateLogout("Incorrect BeginString");
state_.IncrNextTargetMsgSeqNum();
}
}
catch (UnsupportedMessageType e)
{
this.Log.OnEvent("Unsupported message type: " + e.Message);
GenerateBusinessMessageReject(message, Fields.BusinessRejectReason.UNKNOWN_MESSAGE_TYPE, 0);
}
NextQueued();
}