// MsgType returns MsgType (tag 35) field's value func (m *Message) MsgType() (enum.MsgType, MessageRejectError) { s, err := m.Header.GetString(tagMsgType) if err != nil { return enum.MsgType(""), err } return enum.MsgType(s), nil }
func (s *session) prepMessageForSend(msg, inReplyTo *Message) error { s.fillDefaultHeader(*msg, inReplyTo) seqNum := s.store.NextSenderMsgSeqNum() msg.Header.SetField(tagMsgSeqNum, FIXInt(seqNum)) var msgType FIXString if err := msg.Header.GetField(tagMsgType, &msgType); err != nil { return err } if isAdminMessageType(string(msgType)) { s.application.ToAdmin(*msg, s.sessionID) if enum.MsgType(msgType) == enum.MsgType_LOGON { var resetSeqNumFlag FIXBoolean if msg.Body.Has(tagResetSeqNumFlag) { if err := msg.Body.GetField(tagResetSeqNumFlag, &resetSeqNumFlag); err != nil { return err } } if resetSeqNumFlag.Bool() { if err := s.store.Reset(); err != nil { return err } s.sentReset = true seqNum = s.store.NextSenderMsgSeqNum() msg.Header.SetField(tagMsgSeqNum, FIXInt(seqNum)) } } } else { if err := s.application.ToApp(*msg, s.sessionID); err != nil { return err } } msgBytes, err := msg.Build() if err == nil { err = s.persist(seqNum, msgBytes) } return err }
func (s logonState) FixMsgIn(session *session, msg Message) (nextState sessionState) { var msgType FIXString if err := msg.Header.GetField(tagMsgType, &msgType); err != nil { return handleStateError(session, err) } if enum.MsgType(msgType) != enum.MsgType_LOGON { session.log.OnEventf("Invalid Session State: Received Msg %s while waiting for Logon", msg) return latentState{} } if err := session.handleLogon(msg); err != nil { switch err := err.(type) { case RejectLogon: session.log.OnEvent(err.Text) logout := session.buildLogout(err.Text) if err := session.dropAndSendInReplyTo(logout, false, &msg); err != nil { session.logError(err) } if err := session.store.IncrNextTargetMsgSeqNum(); err != nil { session.logError(err) } return latentState{} case targetTooHigh: var tooHighErr error if nextState, tooHighErr = session.doTargetTooHigh(err); tooHighErr != nil { return handleStateError(session, tooHighErr) } return default: return handleStateError(session, err) } } return inSession{} }
func (state inSession) FixMsgIn(session *session, msg Message) sessionState { var msgType FIXString if err := msg.Header.GetField(tagMsgType, &msgType); err != nil { return handleStateError(session, err) } switch enum.MsgType(msgType) { case enum.MsgType_LOGON: if err := session.handleLogon(msg); err != nil { if err := session.initiateLogoutInReplyTo("", &msg); err != nil { return handleStateError(session, err) } return logoutState{} } return state case enum.MsgType_LOGOUT: return state.handleLogout(session, msg) case enum.MsgType_RESEND_REQUEST: return state.handleResendRequest(session, msg) case enum.MsgType_SEQUENCE_RESET: return state.handleSequenceReset(session, msg) case enum.MsgType_TEST_REQUEST: return state.handleTestRequest(session, msg) default: if err := session.verify(msg); err != nil { return state.processReject(session, msg, err) } } if err := session.store.IncrNextTargetMsgSeqNum(); err != nil { return handleStateError(session, err) } return state }