public virtual FixMessage PrepareMessage()

in FixAntenna/NetCore/FixEngine/PreparedMessageUtil.cs [186:288]


		public virtual FixMessage PrepareMessage(FixMessage template, byte[] msgType,
			MessageStructure userStructure, bool fromPool)
		{
			var ms = PrepareFullMessageStructure(template, msgType, userStructure);

			foreach (var field in template)
			{
				if (!ms.ContainsTagId(field.TagId))
				{
					throw new PreparedMessageException("MessageStructure doesn't contain all necessary fields " +
														"uniquetempvar.");
				}
			}

			var headerTagSet = PrepareHeaderTagSet(msgType);

			var length = CalculateLength(ms);
			var list = FixMessageFactory.NewInstance(fromPool, true);
			list.IsPreparedMessage = true;
			var msgBuffer = new byte[length];
			msgBuffer.Fill((byte)' ');
			list.SetBuffer(msgBuffer, 0, length);

			var offset = 0;
			var size = ms.Size;
			var templateValue = new TagValue();
			var templateCopy = template.DeepClone(true, false);
			for (var i = 0; i < size; i++)
			{
				var tag = ms.GetTagId(i);
				var tagLength = ms.GetLength(i);
				var type = ms.GetType(i);

				var templateValuePresent = false;
				if (templateCopy.IsTagExists(tag))
				{
					templateValue = templateCopy.GetTag(tag);
					templateCopy.RemoveTag(tag);
					templateValuePresent = true;
				}

				if (MessageStructure.VariableLength != tagLength)
				{
					offset += FixTypes.FormatInt(tag, msgBuffer, offset);
					msgBuffer[offset++] = (byte)'=';
					list.AddPrepared(tag, offset, tagLength);
					offset += tagLength;
					msgBuffer[offset++] = (byte)'\u0001';
					if (!headerTagSet.Contains(tag) && templateValuePresent)
					{
						if (type == ValueType.Double)
						{
							try
							{
								var v = FixTypes.ParseFloat(templateValue.Buffer, templateValue.Offset,
									templateValue.Length);
								//TODO: fix precision
								list.SetAtIndex(i, v, tagLength);
							}
							catch (Exception)
							{
								Log.Warn("Can't init tag " + tag + " for prepared message. Template value '" +
										StringHelper.NewString(templateValue.Buffer, templateValue.Offset,
											templateValue.Length) + "' isn't a double");
							}
						}
						else if (type == ValueType.Long)
						{
							try
							{
								var v = FixTypes.ParseInt(templateValue.Buffer, templateValue.Offset,
									templateValue.Length);
								list.SetAtIndex(i, v);
							}
							catch (Exception)
							{
								Log.Warn("Can't init tag " + tag + " for prepared message. Template value '" +
										StringHelper.NewString(templateValue.Buffer, templateValue.Offset,
											templateValue.Length) + "' isn't a number");
							}
						}
						else
						{
							list.SetAtIndex(i, templateValue);
						}
					}
				}
				else
				{
					if (templateValuePresent)
					{
						list.AddTag(tag, templateValue.Buffer, templateValue.Offset, templateValue.Length);
					}
					else
					{
						list.AddTag(tag, EmptyBytes);
					}
				}
			}

			FillHeaderAndTrailer(msgType, list, ms);
			return list;
		}