/// <summary> /// </summary> /// <param name="settings"></param> public SessionSchedule(QuickFix.Dictionary settings) { this.WeeklySession = false; if (!settings.Has(SessionSettings.START_DAY) && settings.Has(SessionSettings.END_DAY)) { throw new QuickFix.ConfigError("EndDay used without StartDay"); } if(settings.Has(SessionSettings.START_DAY) && !settings.Has(SessionSettings.END_DAY)) { throw new QuickFix.ConfigError("StartDay used without EndDay"); } if (settings.Has(SessionSettings.START_DAY) && settings.Has(SessionSettings.END_DAY)) { StartDay = settings.GetDay(SessionSettings.START_DAY); EndDay = settings.GetDay(SessionSettings.END_DAY); WeeklySession = true; } try { this.StartTime = System.TimeSpan.Parse( settings.GetString(SessionSettings.START_TIME)); this.EndTime = System.TimeSpan.Parse( settings.GetString(SessionSettings.END_TIME)); } catch (System.FormatException e) { throw new ConfigError(e.Message); } }
/// <summary> /// </summary> /// <param name="settings"></param> public SessionSchedule(QuickFix.Dictionary settings) { this.WeeklySession = false; if (!settings.Has(SessionSettings.START_DAY) && settings.Has(SessionSettings.END_DAY)) { throw new QuickFix.ConfigError("EndDay used without StartDay"); } if (settings.Has(SessionSettings.START_DAY) && !settings.Has(SessionSettings.END_DAY)) { throw new QuickFix.ConfigError("StartDay used without EndDay"); } if (settings.Has(SessionSettings.START_DAY) && settings.Has(SessionSettings.END_DAY)) { StartDay = settings.GetDay(SessionSettings.START_DAY); EndDay = settings.GetDay(SessionSettings.END_DAY); WeeklySession = true; } if (settings.Has(SessionSettings.USE_LOCAL_TIME)) { UseLocalTime = settings.GetBool(SessionSettings.USE_LOCAL_TIME); } if (settings.Has(SessionSettings.TIME_ZONE)) { if (UseLocalTime) { throw new ConfigError( SessionSettings.TIME_ZONE + " conflicts with " + SessionSettings.USE_LOCAL_TIME); } string id = settings.GetString(SessionSettings.TIME_ZONE); TimeZone = System.TimeZoneInfo.FindSystemTimeZoneById(id); } try { this.StartTime = System.TimeSpan.Parse( settings.GetString(SessionSettings.START_TIME)); this.EndTime = System.TimeSpan.Parse( settings.GetString(SessionSettings.END_TIME)); } catch (System.FormatException e) { throw new ConfigError(e.Message); } }
/// <summary> /// Creates a ClientHandlerThread /// </summary> /// <param name="tcpClient"></param> /// <param name="clientId"></param> /// <param name="debugLogFilePath">path where thread log will go</param> public ClientHandlerThread(TcpClient tcpClient, long clientId, QuickFix.Dictionary settingsDict, SocketSettings socketSettings) { string debugLogFilePath = "log"; if (settingsDict.Has(SessionSettings.DEBUG_FILE_LOG_PATH)) debugLogFilePath = settingsDict.GetString(SessionSettings.DEBUG_FILE_LOG_PATH); else if (settingsDict.Has(SessionSettings.FILE_LOG_PATH)) debugLogFilePath = settingsDict.GetString(SessionSettings.FILE_LOG_PATH); // FIXME - do something more flexible than hardcoding a filelog log_ = new FileLog(debugLogFilePath, new SessionID("ClientHandlerThread", clientId.ToString(), "Debug")); this.Id = clientId; socketReader_ = new SocketReader(tcpClient, socketSettings, this); }
protected void Validate(QuickFix.Dictionary dictionary) { string beginString = dictionary.GetString(BEGINSTRING); if (beginString != Values.BeginString_FIX40 && beginString != Values.BeginString_FIX41 && beginString != Values.BeginString_FIX42 && beginString != Values.BeginString_FIX43 && beginString != Values.BeginString_FIX44 && beginString != Values.BeginString_FIXT11) { throw new ConfigError(BEGINSTRING + " (" + beginString + ") must be FIX.4.0 to FIX.4.4 or FIXT.1.1"); } string connectionType = dictionary.GetString(CONNECTION_TYPE); if (!"initiator".Equals(connectionType) && !"acceptor".Equals(connectionType)) { throw new ConfigError(CONNECTION_TYPE + " must be 'initiator' or 'acceptor'"); } }
public void ProcessNews(QuickFix.Message msg, SessionID sessionID) { if (msg.IsSetField(QuickFix.Fields.Tags.Headline) && (msg.GetString(QuickFix.Fields.Tags.Headline) == "STOPME")) { if (this.StopMeEvent != null) StopMeEvent(); } else Echo(msg, sessionID); }
public Session Create(SessionID sessionID, QuickFix.Dictionary settings) { string connectionType = settings.GetString(SessionSettings.CONNECTION_TYPE); if (!"acceptor".Equals(connectionType) && !"initiator".Equals(connectionType)) throw new ConfigError("Invalid ConnectionType"); if ("acceptor".Equals(connectionType) && settings.Has(SessionSettings.SESSION_QUALIFIER)) throw new ConfigError("SessionQualifier cannot be used with acceptor."); bool useDataDictionary = true; if (settings.Has(SessionSettings.USE_DATA_DICTIONARY)) useDataDictionary = settings.GetBool(SessionSettings.USE_DATA_DICTIONARY); QuickFix.Fields.ApplVerID defaultApplVerID = null; if (sessionID.IsFIXT) { if (!settings.Has(SessionSettings.DEFAULT_APPLVERID)) { throw new ConfigError("ApplVerID is required for FIXT transport"); } defaultApplVerID = Message.GetApplVerID(settings.GetString(SessionSettings.DEFAULT_APPLVERID)); } DataDictionaryProvider dd = new DataDictionaryProvider(); if (useDataDictionary) { if (sessionID.IsFIXT) ProcessFixTDataDictionaries(sessionID, settings, dd); else ProcessFixDataDictionary(sessionID, settings, dd); } int heartBtInt = 0; if ( connectionType == "initiator" ) { heartBtInt = System.Convert.ToInt32(settings.GetLong( SessionSettings.HEARTBTINT )); if ( heartBtInt <= 0 ) throw new ConfigError( "Heartbeat must be greater than zero" ); } string senderDefaultApplVerId = ""; if(defaultApplVerID != null) senderDefaultApplVerId = defaultApplVerID.Obj; Session session = new Session( application_, messageStoreFactory_, sessionID, dd, new SessionSchedule(settings), heartBtInt, logFactory_, messageFactory_, senderDefaultApplVerId); if (settings.Has(SessionSettings.SEND_REDUNDANT_RESENDREQUESTS)) session.SendRedundantResendRequests = settings.GetBool(SessionSettings.SEND_REDUNDANT_RESENDREQUESTS); if (settings.Has(SessionSettings.RESEND_SESSION_LEVEL_REJECTS)) session.ResendSessionLevelRejects = settings.GetBool(SessionSettings.RESEND_SESSION_LEVEL_REJECTS); /** FIXME - implement optional settings if (settings.Has(SessionSettings.CHECK_COMPID)) session.SetCheckCompId(settings.GetBool(SessionSettings.CHECK_COMPID)); */ if (settings.Has(SessionSettings.CHECK_LATENCY)) session.CheckLatency = settings.GetBool(SessionSettings.CHECK_LATENCY); if (settings.Has(SessionSettings.MAX_LATENCY)) session.MaxLatency = settings.GetInt(SessionSettings.MAX_LATENCY); if (settings.Has(SessionSettings.LOGON_TIMEOUT)) session.LogonTimeout = settings.GetInt(SessionSettings.LOGON_TIMEOUT); if (settings.Has(SessionSettings.LOGOUT_TIMEOUT)) session.LogoutTimeout = settings.GetInt(SessionSettings.LOGOUT_TIMEOUT); if (settings.Has(SessionSettings.RESET_ON_LOGON)) session.ResetOnLogon = settings.GetBool(SessionSettings.RESET_ON_LOGON); if (settings.Has(SessionSettings.RESET_ON_LOGOUT)) session.ResetOnLogout = settings.GetBool(SessionSettings.RESET_ON_LOGOUT); if (settings.Has(SessionSettings.RESET_ON_DISCONNECT)) session.ResetOnDisconnect = settings.GetBool(SessionSettings.RESET_ON_DISCONNECT); if (settings.Has(SessionSettings.REFRESH_ON_LOGON)) session.RefreshOnLogon = settings.GetBool(SessionSettings.REFRESH_ON_LOGON); if (settings.Has(SessionSettings.PERSIST_MESSAGES)) session.PersistMessages = settings.GetBool(SessionSettings.PERSIST_MESSAGES); if (settings.Has(SessionSettings.MILLISECONDS_IN_TIMESTAMP)) session.MillisecondsInTimeStamp = settings.GetBool(SessionSettings.MILLISECONDS_IN_TIMESTAMP); if (settings.Has(SessionSettings.ENABLE_LAST_MSG_SEQ_NUM_PROCESSED)) session.EnableLastMsgSeqNumProcessed = settings.GetBool(SessionSettings.ENABLE_LAST_MSG_SEQ_NUM_PROCESSED); if (settings.Has(SessionSettings.MAX_MESSAGES_IN_RESEND_REQUEST)) session.MaxMessagesInResendRequest = settings.GetInt(SessionSettings.MAX_MESSAGES_IN_RESEND_REQUEST); if (settings.Has(SessionSettings.SEND_LOGOUT_BEFORE_TIMEOUT_DISCONNECT)) session.SendLogoutBeforeTimeoutDisconnect = settings.GetBool(SessionSettings.SEND_LOGOUT_BEFORE_TIMEOUT_DISCONNECT); if (settings.Has(SessionSettings.IGNORE_POSSDUP_RESEND_REQUESTS)) session.IgnorePossDupResendRequests = settings.GetBool(SessionSettings.IGNORE_POSSDUP_RESEND_REQUESTS); if (settings.Has(SessionSettings.VALIDATE_LENGTH_AND_CHECKSUM)) session.ValidateLengthAndChecksum = settings.GetBool(SessionSettings.VALIDATE_LENGTH_AND_CHECKSUM); if (settings.Has(SessionSettings.RESETSEQUENCE_MESSAGE_REQUIRES_ORIGSENDINGTIME)) session.RequiresOrigSendingTime = settings.GetBool(SessionSettings.RESETSEQUENCE_MESSAGE_REQUIRES_ORIGSENDINGTIME); return session; }
protected DataDictionary.DataDictionary createDataDictionary(SessionID sessionID, QuickFix.Dictionary settings, string settingsKey, string beginString) { DataDictionary.DataDictionary dd; string path; if (settings.Has(settingsKey)) path = settings.GetString(settingsKey); else path = beginString.Replace("\\.", "") + ".xml"; if (!dictionariesByPath_.TryGetValue(path, out dd)) { dd = new DataDictionary.DataDictionary(path); dictionariesByPath_[path] = dd; } DataDictionary.DataDictionary ddCopy = new DataDictionary.DataDictionary(dd); if (settings.Has(SessionSettings.VALIDATE_FIELDS_OUT_OF_ORDER)) ddCopy.CheckFieldsOutOfOrder = settings.GetBool(SessionSettings.VALIDATE_FIELDS_OUT_OF_ORDER); if (settings.Has(SessionSettings.VALIDATE_FIELDS_HAVE_VALUES)) ddCopy.CheckFieldsHaveValues = settings.GetBool(SessionSettings.VALIDATE_FIELDS_HAVE_VALUES); if (settings.Has(SessionSettings.VALIDATE_USER_DEFINED_FIELDS)) ddCopy.CheckUserDefinedFields = settings.GetBool(SessionSettings.VALIDATE_USER_DEFINED_FIELDS); return ddCopy; }
private IPEndPoint GetNextSocketEndPoint(SessionID sessionID, QuickFix.Dictionary settings) { int num; if (!sessionToHostNum_.TryGetValue(sessionID, out num)) num = 0; string hostKey = SessionSettings.SOCKET_CONNECT_HOST + num; string portKey = SessionSettings.SOCKET_CONNECT_PORT + num; if (!settings.Has(hostKey) || !settings.Has(portKey)) { num = 0; hostKey = SessionSettings.SOCKET_CONNECT_HOST; portKey = SessionSettings.SOCKET_CONNECT_PORT; } try { IPAddress[] addrs = Dns.GetHostAddresses(settings.GetString(hostKey)); int port = System.Convert.ToInt32(settings.GetLong(portKey)); sessionToHostNum_[sessionID] = ++num; return new IPEndPoint(addrs[0], port); } catch (System.Exception e) { throw new ConfigError(e.Message, e); } }
public Session Create(SessionID sessionID, QuickFix.Dictionary settings) { string connectionType = settings.GetString(SessionSettings.CONNECTION_TYPE); if (!"acceptor".Equals(connectionType) && !"initiator".Equals(connectionType)) throw new ConfigError("Invalid ConnectionType"); if ("acceptor".Equals(connectionType) && settings.Has(SessionSettings.SESSION_QUALIFIER)) throw new ConfigError("SessionQualifier cannot be used with acceptor."); bool useDataDictionary = true; if (settings.Has(SessionSettings.USE_DATA_DICTIONARY)) useDataDictionary = settings.GetBool(SessionSettings.USE_DATA_DICTIONARY); string defaultApplVerID = ""; if (sessionID.IsFIXT) { throw new System.NotImplementedException("FIXME - SessionFactory cannot handle FIXT Sessions!"); /* if (!settings.Has(SessionSettings.DEFAULT_APPLVERID)) { throw new ConfigError("ApplVerID is required for FIXT transport"); } defaultApplVerID = Message.ToApplVerID(settings.GetString(SessionSettings.DEFAULT_APPLVERID)); */ } DataDictionaryProvider dd = new DataDictionaryProvider(); if (useDataDictionary) { if (sessionID.IsFIXT) throw new System.NotImplementedException("FIXME - SessionFactory cannot handle 'UseDataDictionary=Y' for 'FIXT' sessions!"); else ProcessFixDataDictionary(sessionID, settings, dd); } int heartBtInt = 0; if ( connectionType == "initiator" ) { heartBtInt = System.Convert.ToInt32(settings.GetLong( SessionSettings.HEARTBTINT )); if ( heartBtInt <= 0 ) throw new ConfigError( "Heartbeat must be greater than zero" ); } Session session = new Session( application_, messageStoreFactory_, sessionID, dd, new SessionSchedule(settings, sessionID), heartBtInt, logFactory_, new DefaultMessageFactory()); session.SenderDefaultApplVerID = defaultApplVerID; /** FIXME - implement optional settings if (settings.Has(SessionSettings.SEND_REDUNDANT_RESENDREQUESTS)) session.SetSendRedundantResendRequests(settings.GetBool(SessionSettings.SEND_REDUNDANT_RESENDREQUESTS)); if (settings.Has(SessionSettings.CHECK_COMPID)) session.SetCheckCompId(settings.GetBool(SessionSettings.CHECK_COMPID)); if (settings.Has(SessionSettings.CHECK_LATENCY)) session.SetCheckLatency(settings.GetBool(SessionSettings.CHECK_LATENCY)); if (settings.Has(SessionSettings.MAX_LATENCY)) session.SetMaxLatency(settings.GetLong(SessionSettings.MAX_LATENCY)); if (settings.Has(SessionSettings.LOGON_TIMEOUT)) session.SetLogonTimeout(settings.GetLong(SessionSettings.LOGON_TIMEOUT)); if (settings.Has(SessionSettings.LOGOUT_TIMEOUT)) session.SetLogoutTimeout(settings.GetLong(SessionSettings.LOGOUT_TIMEOUT)); */ // FIXME to get from config if available session.MaxLatency = 120; session.CheckLatency = true; if (settings.Has(SessionSettings.RESET_ON_LOGON)) session.ResetOnLogon = settings.GetBool(SessionSettings.RESET_ON_LOGON); if (settings.Has(SessionSettings.RESET_ON_LOGOUT)) session.ResetOnLogout = settings.GetBool(SessionSettings.RESET_ON_LOGOUT); if (settings.Has(SessionSettings.RESET_ON_DISCONNECT)) session.ResetOnDisconnect = settings.GetBool(SessionSettings.RESET_ON_DISCONNECT); if (settings.Has(SessionSettings.REFRESH_ON_LOGON)) session.RefreshOnLogon = settings.GetBool(SessionSettings.REFRESH_ON_LOGON); /** FIXME - implement optional settings if (settings.Has(SessionSettings.MILLISECONDS_IN_TIMESTAMP)) session.SetMillisecondsInTimeStamp(settings.GetBool(SessionSettings.MILLISECONDS_IN_TIMESTAMP)); if (settings.Has(SessionSettings.PERSIST_MESSAGES)) session.SetPersistMessages(settings.GetBool(SessionSettings.PERSIST_MESSAGES)); if (settings.Has(SessionSettings.VALIDATE_LENGTH_AND_CHECKSUM)) session.SetValidateLengthAndChecksum(settings.GetBool(SessionSettings.VALIDATE_LENGTH_AND_CHECKSUM)); */ return session; }
/// <summary> /// Setup socket settings based on setttings specified in dictionary /// </summary> /// <remarks> /// used "Configure" as name since it is used in a lot of other places, /// alternative names are ReadSettings or FromDictionary /// </remarks> /// <param name="dictionary">the dictionary to read the settings from</param> public void Configure(QuickFix.Dictionary dictionary) { if (dictionary.Has(SessionSettings.SOCKET_NODELAY)) SocketNodelay = dictionary.GetBool(SessionSettings.SOCKET_NODELAY); if (dictionary.Has(SessionSettings.SSL_SERVERNAME)) ServerCommonName = dictionary.GetString(SessionSettings.SSL_SERVERNAME); if (dictionary.Has(SessionSettings.SSL_CA_CERTIFICATE)) CACertificatePath = dictionary.GetString(SessionSettings.SSL_CA_CERTIFICATE); if (dictionary.Has(SessionSettings.SSL_CERTIFICATE)) CertificatePath = dictionary.GetString(SessionSettings.SSL_CERTIFICATE); if (dictionary.Has(SessionSettings.SSL_CERTIFICATE_PASSWORD)) CertificatePassword = dictionary.GetString(SessionSettings.SSL_CERTIFICATE_PASSWORD); if (dictionary.Has(SessionSettings.SSL_VALIDATE_CERTIFICATES)) ValidateCertificates = dictionary.GetBool(SessionSettings.SSL_VALIDATE_CERTIFICATES); if (dictionary.Has(SessionSettings.SSL_CHECK_CERTIFICATE_REVOCATION)) CheckCertificateRevocation = dictionary.GetBool(SessionSettings.SSL_CHECK_CERTIFICATE_REVOCATION); // Use setting for client certificate check if one exist // otherwise enable client certificate check if a ca certificate is specified if (dictionary.Has(SessionSettings.SSL_REQUIRE_CLIENT_CERTIFICATE)) RequireClientCertificate = dictionary.GetBool(SessionSettings.SSL_REQUIRE_CLIENT_CERTIFICATE); // Use setting for SSL if one exist // otherwise enable ssl if certificate path is specified if (dictionary.Has(SessionSettings.SSL_ENABLE)) UseSSL = dictionary.GetBool(SessionSettings.SSL_ENABLE); else UseSSL = !string.IsNullOrEmpty(CertificatePath); if (dictionary.Has(SessionSettings.SSL_PROTOCOLS)) { var protocolString = dictionary.GetString(SessionSettings.SSL_PROTOCOLS); try { SslProtocol = (System.Security.Authentication.SslProtocols) Enum.Parse(typeof(System.Security.Authentication.SslProtocols), protocolString, ignoreCase: true); } catch (Exception) { // TODO: figure out a way to log this somehow (even though it's not likely to occur) } } }