public Message Create(string beginString, QuickFix.Fields.ApplVerID applVerID, string msgType) { _factories.TryGetValue(beginString, out IMessageFactory messageFactory); if (beginString == QuickFix.Values.BeginString_FIXT11 && !Message.IsAdminMsgType(msgType)) { if (applVerID == null) { applVerID = _defaultApplVerId; } _factories.TryGetValue( QuickFix.FixValues.ApplVerID.ToBeginString(applVerID.Obj), out messageFactory); } if (messageFactory != null) { return(messageFactory.Create(beginString, applVerID, msgType)); } // didn't find a factory, so return a generic Message object var message = new Message(); message.Header.SetField(new StringField(QuickFix.Fields.Tags.MsgType, msgType)); return(message); }
/// <summary> /// This constructor will /// 1. Dynamically load all QuickFix.*.dll assemblies into the current appdomain /// 2. Find all IMessageFactory implementations in these assemblies (must have parameterless constructor) /// 3. Use them based on begin strings they support /// </summary> /// <param name="defaultApplVerId">ApplVerID value used by default in Create methods that don't explicitly specify it (only relevant for FIX5+)</param> public DefaultMessageFactory(string defaultApplVerId = QuickFix.FixValues.ApplVerID.FIX50SP2) { _defaultApplVerId = new ApplVerID(defaultApplVerId); var assemblies = GetAppDomainAssemblies(); var factories = GetMessageFactories(assemblies); _factories = ConvertToDictionary(factories); }
internal MessageBuilder( string msgStr, string defaultApplVerId, bool validateLengthAndChecksum, DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD, IMessageFactory msgFactory) { _msgStr = msgStr; _defaultApplVerId = new ApplVerID(defaultApplVerId); _validateLengthAndChecksum = validateLengthAndChecksum; _sessionDD = sessionDD; _appDD = appDD; _msgFactory = msgFactory; _msgType = Message.IdentifyType(_msgStr); _beginString = Message.ExtractBeginString(_msgStr); }
public void Next(Message message) { if (!IsSessionTime) { Reset(); return; } 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 (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); } //End Refactor 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); } 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.Equals(Fields.MsgType.LOGON)) { this.Log.OnEvent("Required field missing from logon"); Disconnect("Required field missing from logon"); } else GenerateReject(message, new QuickFix.FixValues.SessionRejectReason(SessionRejectReason.REQUIRED_TAG_MISSING, "Required Tag Missing"), e.Field); } } catch (RejectLogon e) { GenerateLogout(e.Message); Disconnect(e.ToString()); } NextQueued(); Next(); }
/// <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(); }