示例#1
0
        /// <summary>
        /// Aidan Chisholm  IRESS 23/10/2017
        /// Added to overload Message constrcutore to bypass message validation / re-ordering of body tags
        /// </summary>
        /// <param name="msgstr"></param>
        /// <param name="sessionDataDictionary"></param>
        /// <param name="appDD"></param>
        /// <param name="validateLengthAndChecksum"></param>
        /// <param name="ignoreBody"></param>
        public Message(string msgstr, DataDictionary.DataDictionary sessionDataDictionary, DataDictionary.DataDictionary appDD, bool validateLengthAndChecksum, bool ignoreBody)
            : this()
        {
            FromStringHeader(msgstr);

            FromString(msgstr, validateLengthAndChecksum, sessionDataDictionary, appDD, null, ignoreBody);
        }
示例#2
0
        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);
            if (settings.Has(SessionSettings.ALLOW_UNKNOWN_MSG_FIELDS))
                ddCopy.AllowUnknownMessageFields = settings.GetBool(SessionSettings.ALLOW_UNKNOWN_MSG_FIELDS);

            return ddCopy;
        }
示例#3
0
        protected DataDictionary.DataDictionary createDataDictionary(SessionID sessionID, QuickFix.Dictionary settings, string settingsKey)
        {
            DataDictionary.DataDictionary dd;
            string path = settings.GetString(settingsKey);

            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);
        }
示例#4
0
		public static void Validate(Message message, DataDictionary sessionDataDict, DataDictionary appDataDict, string beginString, string msgType)
		{
			bool bodyOnly = (null == sessionDataDict);

			if ((null != sessionDataDict) && (null != sessionDataDict.Version))
				if (!sessionDataDict.Version.Equals(beginString))
					throw new UnsupportedVersion();

			if (((null != sessionDataDict) && sessionDataDict.CheckFieldsOutOfOrder) || ((null != appDataDict) && appDataDict.CheckFieldsOutOfOrder))
			{
				int field;
				if (!message.HasValidStructure(out field))
					throw new TagOutOfOrder(field);
			}

			if ((null != appDataDict) && (null != appDataDict.Version))
			{
				appDataDict.CheckMsgType(msgType);
				appDataDict.CheckHasRequired(message, msgType);
			}
			
			if (!bodyOnly)
			{
				sessionDataDict.Iterate(message.Header, msgType);
				sessionDataDict.Iterate(message.Trailer, msgType);
			}

			appDataDict.Iterate(message, msgType);
		}
示例#5
0
        private static string FieldMapToXML(DataDictionary.DataDictionary dd, FieldMap fields, int space)
        {
            StringBuilder s    = new StringBuilder();
            string        name = string.Empty;

            // fields
            foreach (var f in fields)
            {
                s.Append("<field ");
                if ((dd != null) && (dd.FieldsByTag.ContainsKey(f.Key)))
                {
                    s.Append("name=\"" + dd.FieldsByTag[f.Key].Name + "\" ");
                }
                s.Append("number=\"" + f.Key.ToString() + "\">");
                s.Append("<![CDATA[" + f.Value.ToString() + "]]>");
                s.Append("</field>");
            }
            // now groups
            List <int> groupTags = fields.GetGroupTags();

            foreach (int groupTag in groupTags)
            {
                for (int counter = 1; counter <= fields.GroupCount(groupTag); counter++)
                {
                    s.Append("<group>");
                    s.Append(FieldMapToXML(dd, fields.GetGroup(counter, groupTag), space + 1));
                    s.Append("</group>");
                }
            }

            return(s.ToString());
        }
示例#6
0
        protected void ProcessFixTDataDictionaries(SessionID sessionID, Dictionary settings, DataDictionaryProvider provider)
        {
            provider.AddTransportDataDictionary(sessionID.BeginString, createDataDictionary(sessionID, settings, SessionSettings.TRANSPORT_DATA_DICTIONARY, sessionID.BeginString));

            foreach (KeyValuePair <string, string> setting in settings)
            {
                if (setting.Key.StartsWith(SessionSettings.APP_DATA_DICTIONARY, System.StringComparison.CurrentCultureIgnoreCase))
                {
                    if (setting.Key.Equals(SessionSettings.APP_DATA_DICTIONARY, System.StringComparison.CurrentCultureIgnoreCase))
                    {
                        Fields.ApplVerID applVerId       = Message.GetApplVerID(settings.GetString(SessionSettings.DEFAULT_APPLVERID));
                        DataDictionary.DataDictionary dd = createDataDictionary(sessionID, settings, SessionSettings.APP_DATA_DICTIONARY, sessionID.BeginString);
                        provider.AddApplicationDataDictionary(applVerId.Obj, dd);
                    }
                    else
                    {
                        int offset = setting.Key.IndexOf(".");
                        if (offset == -1)
                        {
                            throw new System.ArgumentException(string.Format("Malformed {0} : {1}", SessionSettings.APP_DATA_DICTIONARY, setting.Key));
                        }

                        string beginStringQualifier      = setting.Key.Substring(offset);
                        DataDictionary.DataDictionary dd = createDataDictionary(sessionID, settings, setting.Key, beginStringQualifier);
                        provider.AddApplicationDataDictionary(Message.GetApplVerID(beginStringQualifier).Obj, dd);
                    }
                }
            }
        }
示例#7
0
 public static void LoadDictionary(string sFIXDictionary)
 {
     if (!string.IsNullOrEmpty(sFIXDictionary))
     {
         dataDictionary = new FIXDictionary.DataDictionary();
         dataDictionary.Load(sFIXDictionary);
     }
 }
示例#8
0
 public static bool IsTrailerField(int tag, DataDictionary.DataDictionary dd)
 {
     if (IsTrailerField(tag))
     {
         return(true);
     }
     if (null != dd)
     {
         return(dd.IsTrailerField(tag));
     }
     return(false);
 }
示例#9
0
 public Message(string msgstr, DataDictionary.DataDictionary sessionDataDictionary, DataDictionary.DataDictionary appDD, bool validate)
     : this()
 {
     FromStringHeader(msgstr);
     if (IsAdmin())
     {
         FromString(msgstr, validate, sessionDataDictionary, sessionDataDictionary, null);
     }
     else
     {
         FromString(msgstr, validate, sessionDataDictionary, appDD, null);
     }
 }
示例#10
0
        public static StringField ExtractField(string msgstr, ref int pos, DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD)
        {
            try
            {
                int tagend = msgstr.IndexOf('=', pos);
                int tag    = Convert.ToInt32(msgstr.Substring(pos, tagend - pos));
                pos = tagend + 1;
                int         fieldvalend = msgstr.IndexOf((char)1, pos);
                StringField field       = new StringField(tag, msgstr.Substring(pos, fieldvalend - pos));

                /*
                 * TODO data dict stuff
                 * if (((null != sessionDD) && sessionDD.IsDataField(field.Tag)) || ((null != appDD) && appDD.IsDataField(field.Tag)))
                 * {
                 *  string fieldLength = "";
                 *  // Assume length field is 1 less
                 *  int lenField = field.Tag - 1;
                 *  // Special case for Signature which violates above assumption
                 *  if (Tags.Signature.Equals(field.Tag))
                 *      lenField = Tags.SignatureLength;
                 *
                 *  if ((null != group) && group.isSetField(lenField))
                 *  {
                 *      fieldLength = group.GetField(lenField);
                 *      soh = equalSign + 1 + atol(fieldLength.c_str());
                 *  }
                 *  else if (isSetField(lenField))
                 *  {
                 *      fieldLength = getField(lenField);
                 *      soh = equalSign + 1 + atol(fieldLength.c_str());
                 *  }
                 * }
                 */

                pos = fieldvalend + 1;
                return(field);
            }
            catch (System.ArgumentOutOfRangeException e)
            {
                throw new MessageParseError("Error at position (" + pos + ") while parsing msg (" + msgstr + ")", e);
            }
            catch (System.OverflowException e)
            {
                throw new MessageParseError("Error at position (" + pos + ") while parsing msg (" + msgstr + ")", e);
            }
            catch (System.FormatException e)
            {
                throw new MessageParseError("Error at position (" + pos + ") while parsing msg (" + msgstr + ")", e);
            }
        }
示例#11
0
        static void Main(string[] args)
        {
            DataDictionary dd = new QuickFix.DataDictionary.DataDictionary("fix\\FIX50SP2.xml");
            StreamReader   file = new StreamReader(@"C:\secdef.dat");
            int            count = 0; string line;

            while (((line = file.ReadLine()) != null && count++ < MAX_LINES))
            {
                QuickFix.FIX50.SecurityDefinition secDef = new QuickFix.FIX50.SecurityDefinition();
                secDef.FromString(line, false, dd, dd);
                Console.WriteLine(secDef.SecurityDesc);
            }
            file.Close();
        }
示例#12
0
        internal MessageBuilder(
            string msgStr,
            bool validateLengthAndChecksum,
            DataDictionary.DataDictionary sessionDD,
            DataDictionary.DataDictionary appDD,
            IMessageFactory msgFactory)
        {
            _msgStr = msgStr;
            _validateLengthAndChecksum = validateLengthAndChecksum;
            _sessionDD  = sessionDD;
            _appDD      = appDD;
            _msgFactory = msgFactory;

            _msgType     = Message.IdentifyType(_msgStr);
            _beginString = Message.ExtractBeginString(_msgStr);
        }
示例#13
0
        internal MessageBuilder(
            string msgStr,
            bool validateLengthAndChecksum,
            DataDictionary.DataDictionary sessionDD,
            DataDictionary.DataDictionary appDD,
            IMessageFactory msgFactory)
        {
            _msgStr = msgStr;
            _validateLengthAndChecksum = validateLengthAndChecksum;
            _sessionDD = sessionDD;
            _appDD = appDD;
            _msgFactory = msgFactory;

            _msgType = Message.IdentifyType(_msgStr);
            _beginString = Message.ExtractBeginString(_msgStr);
        }
示例#14
0
        public static FIXConverter CreateInstance(string sFIXDictionary)
        {
            if (Instance == null)
            {
                Instance = new FIXConverter();

                if (!string.IsNullOrEmpty(sFIXDictionary))
                {
                    dataDictionary = new FIXDictionary.DataDictionary();
                    dataDictionary.Load(sFIXDictionary);
                }

                fixClasses = FIXClassesInfo.CreateInstance();
                fixClasses.LoadQuickFIXTypesInfo("QuickFix.FIX");
            }
            return(Instance);
        }
 /// <summary>
 /// Copy a data dictionary
 /// </summary>
 /// <param name="src">the source dictionary that will be copied into this dictionary</param>
 public DataDictionary(DataDictionary src)
     : this()
 {
     this.Messages = src.Messages;
     this.FieldsByName = src.FieldsByName;
     this.FieldsByTag = src.FieldsByTag;
     if (null != src.MajorVersion)
         this.MajorVersion = string.Copy(src.MajorVersion);
     if (null != src.MinorVersion)
         this.MinorVersion = string.Copy(src.MinorVersion);
     if (null != src.Version)
         this.Version = string.Copy(src.Version);
     this.CheckFieldsHaveValues = src.CheckFieldsHaveValues;
     this.CheckFieldsOutOfOrder = src.CheckFieldsOutOfOrder;
     this.CheckUserDefinedFields = src.CheckUserDefinedFields;
     this.Header = src.Header;
     this.Trailer = src.Trailer;
 }
示例#16
0
        void LoadDictionaryAndFields()
        {
            InsightCalculator.InsightsDatabase =
                JsonConvert.DeserializeObject <InsightsDatabase>(
                    File.ReadAllText(Path.Combine(Application.StartupPath, "insights.json")));
            dd = new QuickFix.DataDictionary.DataDictionary();

            Stream stream = new FileStream(Path.Combine(Application.StartupPath, "spec", "FIX42.xml"), FileMode.Open, FileAccess.Read);

            dd.Load(stream);

            foreach (var ddField in dd.FieldsByTag)
            {
                var c = new ComboBoxItem();
                c.Text = ddField.Value.Name + $" ({ddField.Key})";
                c.Tag  = ddField.Value;
                _fieldsBoxItems.Add(ddField.Key, c);
                FieldCol.Items.Add(c);
            }
        }
示例#17
0
        public StringField ExtractFieldCustom(string msgstr, ref int pos, DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD)
        {
            int equalsOffSet = 0;
            int tag          = 0;
            int sohOffSet    = 0;

            try
            {
                equalsOffSet = msgstr.IndexOf("=", pos);
                tag          = Convert.ToInt32(msgstr.Substring(pos, equalsOffSet - pos));
                sohOffSet    = msgstr.IndexOf("\u0001", equalsOffSet + 1);

                // Assume length field is 1 less
                int tagLengthField = tag - 1;
                // Special case for Signature which violates above assumption
                //if (Tags.Signature.Equals(tag))
                //    tagLengthField = Tags.SignatureLength;

                if (tag == Tags.RawData && tagLengthField == Tags.RawDataLength)
                {
                    int fieldLength = Convert.ToInt32(this.GetField(tagLengthField));
                    sohOffSet = equalsOffSet + 1 + fieldLength;
                }
                pos = sohOffSet + 1;

                return(new StringField(tag, msgstr.Substring(equalsOffSet + 1, sohOffSet - (equalsOffSet + 1))));
            }
            catch (System.ArgumentOutOfRangeException e)
            {
                throw new MessageParseError("1.Custom - Error at position (" + pos + ") while parsing msg (" + msgstr + ")", e);
            }
            catch (System.OverflowException e)
            {
                throw new MessageParseError("2.Custom - Error at position (" + pos + ") while parsing msg (" + msgstr + ")", e);
            }
            catch (System.FormatException e)
            {
                throw new MessageParseError("3.Custom - Error at position (" + pos + ") while parsing msg (" + msgstr + ") equalsOffSet(" + equalsOffSet + ") pos(" + pos + ") sohOffSet(" + sohOffSet + ") parse(" + msgstr.Substring(pos, equalsOffSet - pos) + ")", e);
            }
        }
示例#18
0
        public Message TryParseMessage(string line, IMessageFactory messageFactory, QuickFix.DataDictionary.DataDictionary dd)
        {
            Message m   = null;
            int     pos = 0;

            try
            {
                StringField protocol = Message.ExtractField(line, ref pos);
                StringField t        = Message.ExtractField(line, ref pos);
                StringField type     = Message.ExtractField(line, ref pos);
                m = messageFactory.Create(protocol.getValue(), type.getValue());
                while (pos < line.Length)
                {
                    m.SetField(Message.ExtractField(line, ref pos));
                }

                m.FromString(line, false, dd, dd, messageFactory);
            }
            catch
            {
            }
            return(m);
        }
示例#19
0
 public Message(string msgstr, DataDictionary.DataDictionary dataDictionary, bool validate)
     : this()
 {
     FromString(msgstr, validate, dataDictionary, dataDictionary, null);
 }
示例#20
0
        /// <summary>
        /// Constructs a group and stores it in this Message object
        /// </summary>
        /// <param name="grpNoFld">the group's counter field</param>
        /// <param name="msgstr">full message string</param>
        /// <param name="pos">starting character position of group</param>
        /// <param name="fieldMap">full message as FieldMap</param>
        /// <param name="dd">group definition structure from dd</param>
        /// <param name="sessionDataDictionary"></param>
        /// <param name="appDD"></param>
        /// <param name="msgFactory">if null, then this method will use the generic Group class constructor</param>
        /// <returns></returns>
        protected int SetGroup(
            StringField grpNoFld, string msgstr, int pos, FieldMap fieldMap, DataDictionary.IGroupSpec dd,
            DataDictionary.DataDictionary sessionDataDictionary, DataDictionary.DataDictionary appDD, IMessageFactory msgFactory)
        {
            int   grpEntryDelimiterTag = dd.Delim;
            int   grpPos = pos;
            Group grp    = null; // the group entry being constructed

            while (pos < msgstr.Length)
            {
                grpPos = pos;
                StringField f = ExtractField(msgstr, ref pos, sessionDataDictionary, appDD);
                if (f.Tag == grpEntryDelimiterTag)
                {
                    // This is the start of a group entry.

                    if (grp != null)
                    {
                        // We were already building an entry, so the delimiter means it's done.
                        fieldMap.AddGroup(grp, false);
                        grp = null; // prepare for new Group
                    }

                    // Create a new group!
                    if (msgFactory != null)
                    {
                        grp = msgFactory.Create(Message.ExtractBeginString(msgstr), Message.GetMsgType(msgstr), grpNoFld.Tag);
                    }

                    //If above failed (shouldn't ever happen), just use a generic Group.
                    if (grp == null)
                    {
                        grp = new Group(grpNoFld.Tag, grpEntryDelimiterTag);
                    }
                }
                else if (!dd.IsField(f.Tag))
                {
                    // This field is not in the group, thus the repeating group is done.

                    if (grp != null)
                    {
                        fieldMap.AddGroup(grp, false);
                    }
                    return(grpPos);
                }

                if (grp == null)
                {
                    // This means we got into the group's fields without finding a delimiter tag.
                    throw new GroupDelimiterTagException(grpNoFld.Tag, grpEntryDelimiterTag);
                }

                // f is just a field in our group entry.  Add it and iterate again.
                grp.SetField(f);
                if (dd.IsGroup(f.Tag))
                {
                    // f is a counter for a nested group.  Recurse!
                    pos = SetGroup(f, msgstr, pos, grp, dd.GetGroupSpec(f.Tag), sessionDataDictionary, appDD, msgFactory);
                }
            }

            return(grpPos);
        }
示例#21
0
 protected int SetGroup(StringField grpNoFld, string msgstr, int pos, FieldMap fieldMap, DataDictionary.IGroupSpec dd,
                        DataDictionary.DataDictionary sessionDataDictionary, DataDictionary.DataDictionary appDD)
 {
     return(SetGroup(grpNoFld, msgstr, pos, fieldMap, dd, sessionDataDictionary, appDD, null));
 }
示例#22
0
        /// <summary>
        /// Creates a Message from a FIX string
        /// </summary>
        /// <param name="msgstr"></param>
        /// <param name="validate"></param>
        /// <param name="sessionDD"></param>
        /// <param name="appDD"></param>
        /// <param name="msgFactory">If null, any groups will be constructed as generic Group objects</param>
        /// <param name="ignoreBody">(default false) if true, ignores all non-header non-trailer fields.
        ///   Intended for callers that only need rejection-related information from the header.
        ///   </param>
        public void FromString(string msgstr, bool validate,
                               DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD, IMessageFactory msgFactory,
                               bool ignoreBody)
        {
            Clear();

            string msgType         = "";
            bool   expectingHeader = true;
            bool   expectingBody   = true;
            int    count           = 0;
            int    pos             = 0;

            DataDictionary.IFieldMapSpec msgMap = null;

            while (pos < msgstr.Length)
            {
                StringField f = ExtractField(msgstr, ref pos, sessionDD, appDD);

                if (validate && (count < 3) && (Header.HEADER_FIELD_ORDER[count++] != f.Tag))
                {
                    throw new InvalidMessage("Header fields out of order");
                }

                if (IsHeaderField(f.Tag, sessionDD))
                {
                    if (!expectingHeader)
                    {
                        if (0 == field_)
                        {
                            field_ = f.Tag;
                        }
                        validStructure_ = false;
                    }

                    if (Tags.MsgType.Equals(f.Tag))
                    {
                        msgType = string.Copy(f.Obj);
                        if (appDD != null)
                        {
                            msgMap = appDD.GetMapForMessage(msgType);
                        }
                    }

                    if (!this.Header.SetField(f, false))
                    {
                        this.Header.RepeatedTags.Add(f);
                    }

                    if ((null != sessionDD) && sessionDD.Header.IsGroup(f.Tag))
                    {
                        pos = SetGroup(f, msgstr, pos, this.Header, sessionDD.Header.GetGroupSpec(f.Tag), sessionDD, appDD, msgFactory);
                    }
                }
                else if (IsTrailerField(f.Tag, sessionDD))
                {
                    expectingHeader = false;
                    expectingBody   = false;
                    if (!this.Trailer.SetField(f, false))
                    {
                        this.Trailer.RepeatedTags.Add(f);
                    }

                    if ((null != sessionDD) && sessionDD.Trailer.IsGroup(f.Tag))
                    {
                        pos = SetGroup(f, msgstr, pos, this.Trailer, sessionDD.Trailer.GetGroup(f.Tag), sessionDD, appDD, msgFactory);
                    }
                }
                else if (ignoreBody == false)
                {
                    if (!expectingBody)
                    {
                        if (0 == field_)
                        {
                            field_ = f.Tag;
                        }
                        validStructure_ = false;
                    }

                    expectingHeader = false;
                    if (!SetField(f, false))
                    {
                        this.RepeatedTags.Add(f);
                    }


                    if ((null != msgMap) && (msgMap.IsGroup(f.Tag)))
                    {
                        pos = SetGroup(f, msgstr, pos, this, msgMap.GetGroupSpec(f.Tag), sessionDD, appDD, msgFactory);
                    }
                }
            }

            if (validate)
            {
                Validate();
            }
        }
示例#23
0
 public Message(string msgstr, DataDictionary.DataDictionary dataDictionary, bool validate)
     : this(msgstr, dataDictionary, validate, Encoding.UTF8)
 {
 }
示例#24
0
 public void AddTransportDataDictionary(string beginString, DataDictionary.DataDictionary dataDictionary)
 {
     transportDataDictionaries_[beginString] = dataDictionary;
 }
 /// TODO need to make deeper copy?
 public DataDictionaryProvider(DataDictionaryProvider src)
 {
     transportDataDictionaries_ = new Dictionary<string, DataDictionary.DataDictionary>(src.transportDataDictionaries_);
     applicationDataDictionaries_ = new Dictionary<string, DataDictionary.DataDictionary>(src.applicationDataDictionaries_);
     emptyDataDictionary_ = new DataDictionary.DataDictionary(src.emptyDataDictionary_);
 }
示例#26
0
 protected bool InitializeXML(string url)
 {
     try
     {
         DataDictionary.DataDictionary p = new DataDictionary.DataDictionary(url);
         dataDictionary_ = p;
         return true;
     }
     catch
     {
         return false;
     }
 }
示例#27
0
        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;
        }
示例#28
0
        /// <summary>
        /// Creates a Message from a FIX string
        /// </summary>
        /// <param name="msgstr"></param>
        /// <param name="validate"></param>
        /// <param name="sessionDD"></param>
        /// <param name="appDD"></param>
        /// <param name="msgFactory">If null, any groups will be constructed as generic Group objects</param>
        /// <param name="ignoreBody">(default false) if true, ignores all non-header non-trailer fields.
        ///   Intended for callers that only need rejection-related information from the header.
        ///   </param>
        public void FromString(string msgstr, bool validate,
                               DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD, IMessageFactory msgFactory,
                               bool ignoreBody)
        {
            Clear();

            string msgType         = "";
            bool   expectingHeader = true;
            bool   expectingBody   = true;
            int    count           = 0;
            int    pos             = 0;

            DataDictionary.IFieldMapSpec msgMap = null;

            while (pos < msgstr.Length)
            {
                StringField f = ExtractField(msgstr, ref pos, sessionDD, appDD);

                if (validate && (count < 3) && (Header.HEADER_FIELD_ORDER[count++] != f.Tag))
                {
                    throw new InvalidMessage("Header fields out of order");
                }

                if (IsHeaderField(f.Tag, sessionDD))
                {
                    if (!expectingHeader)
                    {
                        if (0 == field_)
                        {
                            field_ = f.Tag;
                        }
                        validStructure_ = false;
                    }

                    if (Tags.MsgType.Equals(f.Tag))
                    {
                        msgType = string.Copy(f.Obj);
                        if (appDD != null)
                        {
                            msgMap = appDD.GetMapForMessage(msgType);
                        }
                    }

                    if (!this.Header.SetField(f, false))
                    {
                        this.Header.RepeatedTags.Add(f);
                    }

                    if ((null != sessionDD) && sessionDD.Header.IsGroup(f.Tag))
                    {
                        pos = SetGroup(f, msgstr, pos, this.Header, sessionDD.Header.GetGroupSpec(f.Tag), sessionDD, appDD, msgFactory);
                    }
                }
                else if (IsTrailerField(f.Tag, sessionDD))
                {
                    expectingHeader = false;
                    expectingBody   = false;
                    if (!this.Trailer.SetField(f, false))
                    {
                        this.Trailer.RepeatedTags.Add(f);
                    }

                    if ((null != sessionDD) && sessionDD.Trailer.IsGroup(f.Tag))
                    {
                        pos = SetGroup(f, msgstr, pos, this.Trailer, sessionDD.Trailer.GetGroup(f.Tag), sessionDD, appDD, msgFactory);
                    }
                }
                else if (ignoreBody == false)
                {
                    if (!expectingBody)
                    {
                        if (0 == field_)
                        {
                            field_ = f.Tag;
                        }
                        validStructure_ = false;
                    }

                    expectingHeader = false;
                    if (!SetField(f, false))
                    {
                        this.RepeatedTags.Add(f);
                    }


                    if ((null != msgMap) && (msgMap.IsGroup(f.Tag)))
                    {
                        pos = SetGroup(f, msgstr, pos, this, msgMap.GetGroupSpec(f.Tag), sessionDD, appDD, msgFactory);
                    }
                }
                // Aidan Chisholm  IRESS 23/10/2017
                // Bypassing body validation so need to keep fields in original order due to FieldMap re-ordering combined with unknown tags/repeating-groups
                else if (ignoreBody == true)
                {
                    if (!expectingBody)
                    {
                        if (0 == field_)
                        {
                            field_ = f.Tag;
                        }
                        validStructure_ = false;
                    }

                    expectingHeader = false;
                    SetUnorderedField(f);
                    //Console.WriteLine("{0} - {1}", f.Tag.ToString(), f.ToString());
                }
            }

            if (validate)
            {
                Validate();
            }
        }
示例#29
0
        /// <summary>
        /// Constructs a group and stores it in this Message object
        /// </summary>
        /// <param name="grpNoFld"></param>
        /// <param name="msgstr"></param>
        /// <param name="pos"></param>
        /// <param name="fieldMap"></param>
        /// <param name="dd"></param>
        /// <param name="sessionDataDictionary"></param>
        /// <param name="appDD"></param>
        /// <param name="msgFactory">if this is null, then this method will use the generic Group class constructor</param>
        /// <returns></returns>
        protected int SetGroup(StringField grpNoFld, string msgstr, int pos, FieldMap fieldMap, DataDictionary.IGroupSpec dd, DataDictionary.DataDictionary sessionDataDictionary, DataDictionary.DataDictionary appDD, IMessageFactory msgFactory)
        {
            int   delim  = dd.Delim;
            int   grpPos = pos;
            Group grp    = null;

            while (pos < msgstr.Length)
            {
                grpPos = pos;
                StringField f = ExtractField(msgstr, ref pos, sessionDataDictionary, appDD);
                if (f.Tag == delim)
                {
                    if (grp != null)
                    {
                        fieldMap.AddGroup(grp, false);
                    }

                    if (msgFactory != null)
                    {
                        grp = msgFactory.Create(Message.ExtractBeginString(msgstr), Message.GetMsgType(msgstr), grpNoFld.Tag);
                    }

                    //If above failed, just use a generic Group.
                    if (grp == null)
                    {
                        grp = new Group(grpNoFld.Tag, delim);
                    }
                }
                else if (!dd.IsField(f.Tag))
                {
                    if (grp != null)
                    {
                        fieldMap.AddGroup(grp, false);
                    }
                    return(grpPos);
                }
                grp.SetField(f);
                if (dd.IsGroup(f.Tag))
                {
                    pos = SetGroup(f, msgstr, pos, grp, dd.GetGroupSpec(f.Tag), sessionDataDictionary, appDD, msgFactory);
                }
            }

            return(grpPos);
        }
示例#30
0
 public Message(string msgstr, DataDictionary.DataDictionary sessionDataDictionary,
                DataDictionary.DataDictionary appDD, bool validate)
     : this(msgstr, sessionDataDictionary, appDD, validate, Encoding.UTF8)
 {
 }
示例#31
0
        protected int SetGroup(StringField grpNoFld, string msgstr, int pos, FieldMap fieldMap, DataDictionary.IGroupSpec dd, DataDictionary.DataDictionary sessionDataDictionary, DataDictionary.DataDictionary appDD)
        {
            int   delim  = dd.Delim;
            int   grpPos = pos;
            Group grp    = null;

            while (pos < msgstr.Length)
            {
                grpPos = pos;
                StringField f = ExtractField(msgstr, ref pos, sessionDataDictionary, appDD);
                if (f.Tag == delim)
                {
                    if (grp != null)
                    {
                        fieldMap.AddGroup(grp);
                    }
                    grp = new Group(grpNoFld.Tag, delim);
                }
                else if (!dd.IsField(f.Tag))
                {
                    if (grp != null)
                    {
                        fieldMap.AddGroup(grp);
                    }
                    return(grpPos);
                }
                grp.SetField(f);
                if (dd.IsGroup(f.Tag))
                {
                    pos = SetGroup(f, msgstr, pos, grp, dd.GetGroupSpec(f.Tag), sessionDataDictionary, appDD);
                }
            }

            return(grpPos);
        }
示例#32
0
        private DataDictionary.DataDictionary LoadDataDictionaryFromStream(Dictionary settings, Stream dictionaryStream)
        {
            DataDictionary.DataDictionary dd;
            string path = settings.GetString(SessionSettings.DATA_DICTIONARY_STREAM);

            if (!dictionariesByPath_.TryGetValue(path, out dd))
            {
                dd = new DataDictionary.DataDictionary(dictionaryStream);
                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;
        }
 public DataDictionaryProvider()
 {
     transportDataDictionaries_ = new Dictionary<string, DataDictionary.DataDictionary>();
     applicationDataDictionaries_ = new Dictionary<string, DataDictionary.DataDictionary>();
     emptyDataDictionary_ = new DataDictionary.DataDictionary();
 }
示例#34
0
 /// <summary>
 /// Creates a Message from a FIX string
 /// </summary>
 /// <param name="msgstr"></param>
 /// <param name="validate"></param>
 /// <param name="sessionDD"></param>
 /// <param name="appDD"></param>
 public void FromString(string msgstr, bool validate, DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD)
 {
     FromString(msgstr, validate, sessionDD, appDD, null);
 }
示例#35
0
 public void AddApplicationDataDictionary(string applVerID, DataDictionary.DataDictionary dataDictionary)
 {
     applicationDataDictionaries_[applVerID] = dataDictionary;
 }
示例#36
0
 /// <summary>
 /// Create a Message from a FIX string
 /// </summary>
 /// <param name="msgstr"></param>
 /// <param name="validate"></param>
 /// <param name="sessionDD"></param>
 /// <param name="appDD"></param>
 /// <param name="msgFactory">If null, any groups will be constructed as generic Group objects</param>
 public void FromString(string msgstr, bool validate,
                        DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD, IMessageFactory msgFactory)
 {
     FromString(msgstr, validate, sessionDD, appDD, msgFactory, false);
 }
示例#37
0
 protected void ProcessFixDataDictionary(SessionID sessionID, Dictionary settings, DataDictionaryProvider provider)
 {
     DataDictionary.DataDictionary dataDictionary = createDataDictionary(sessionID, settings, SessionSettings.DATA_DICTIONARY, sessionID.BeginString);
     provider.AddTransportDataDictionary(sessionID.BeginString, dataDictionary);
     provider.AddApplicationDataDictionary(FixValues.ApplVerID.FromBeginString(sessionID.BeginString), dataDictionary);
 }
示例#38
0
 public void FromString(string msgstr, bool validate,
                        DataDictionary.DataDictionary sessionDD, DataDictionary.DataDictionary appDD, IMessageFactory msgFactory,
                        bool ignoreBody)
 {
     FromString(msgstr, validate, sessionDD, appDD, msgFactory, false, Encoding.UTF8);
 }