/// <summary> /// Process a message (in string form) from the counterparty /// </summary> /// <param name="msgStr"></param> private void NextMessage(string msgStr) { this.Log.OnIncoming(msgStr); MessageBuilder msgBuilder = new MessageBuilder( msgStr, this.ValidateLengthAndChecksum, this.SessionDataDictionary, this.ApplicationDataDictionary, this.msgFactory_); Next(msgBuilder); }
/// <summary> /// Process a message from the counterparty. /// </summary> /// <param name="message"></param> internal void Next(MessageBuilder msgBuilder) { if (!IsSessionTime) { Reset("Out of SessionTime (Session.Next(message))", "Message received outside of session time"); return; } if (IsNewSession) state_.Reset("New session (detected in Next(Message))"); Message message = null; // declared outside of try-block so that catch-blocks can use it try { message = msgBuilder.Build(); if (appDoesEarlyIntercept_) ((IApplicationExt)Application).FromEarlyIntercept(message, this.SessionID); Header header = message.Header; string msgType = msgBuilder.MsgType.Obj; string beginString = msgBuilder.BeginString; if (!beginString.Equals(this.SessionID.BeginString)) throw new UnsupportedVersion(); if (MsgType.LOGON.Equals(msgType)) { if (this.SessionID.IsFIXT) { targetDefaultApplVerID = new ApplVerID(message.GetString(Fields.Tags.DefaultApplVerID)); } else { targetDefaultApplVerID = Message.GetApplVerID(beginString); } } if (this.SessionID.IsFIXT && !Message.IsAdminMsgType(msgType)) { DataDictionary.DataDictionary.Validate(message, SessionDataDictionary, ApplicationDataDictionary, beginString, msgType); } else { this.SessionDataDictionary.Validate(message, beginString, msgType); } if (MsgType.LOGON.Equals(msgType)) NextLogon(message); else if (!IsLoggedOn) Disconnect(string.Format("Received msg type '{0}' when not logged on", msgType)); 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 (InvalidMessage e) { this.Log.OnEvent(e.Message); try { if (MsgType.LOGON.Equals(msgBuilder.MsgType.Obj)) Disconnect("Logon message is not valid"); } catch (MessageParseError) { } throw e; } catch (TagException e) { if (null != e.InnerException) this.Log.OnEvent(e.InnerException.Message); GenerateReject(msgBuilder, e.sessionRejectReason, e.Field); } catch (UnsupportedVersion) { if (MsgType.LOGOUT.Equals(msgBuilder.MsgType.Obj)) { 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); } catch (FieldNotFoundException e) { this.Log.OnEvent("Rejecting invalid message, field not found: " + e.Message); if ((SessionID.BeginString.CompareTo(FixValues.BeginString.FIX42) >= 0) && (message.IsApp())) { GenerateBusinessMessageReject(message, Fields.BusinessRejectReason.CONDITIONALLY_REQUIRED_FIELD_MISSING, e.Field); } else { if (MsgType.LOGON.Equals(msgBuilder.MsgType.Obj)) { this.Log.OnEvent("Required field missing from logon"); Disconnect("Required field missing from logon"); } else GenerateReject(msgBuilder, new QuickFix.FixValues.SessionRejectReason(SessionRejectReason.REQUIRED_TAG_MISSING, "Required Tag Missing"), e.Field); } } catch (RejectLogon e) { GenerateLogout(e.Message); Disconnect(e.ToString()); } Next(); }
internal bool GenerateReject(MessageBuilder msgBuilder, FixValues.SessionRejectReason reason, int field=0) { return GenerateReject(msgBuilder.RejectableMessage(), reason, field); }