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;
}