/// <summary> /// Implements marshaling logic for most of the TPM object types. /// Can be overridden if a custom marshaling logic is required (e.g. when /// marshaling of a field depends on other field's value). /// </summary> /// <param name="m"></param> /// <returns></returns> internal virtual void ToNet(Marshaller m) { var members = GetFieldsToMarshal(); dbg.Indent(); for (int i = 0; i < members.Length; ++i) { var mem = members[i]; object memVal = Globs.GetMember(mem, this); dbg.Trace(i + ": " + mem.Name + " = " + memVal); if (mem.SizeLength > 0) { bool arr = mem.WireType == MarshalType.VariableLengthArray; int len = arr ? (memVal == null ? 0 : ((Array)memVal).Length) : Marshaller.GetTpmRepresentation(memVal).Length; dbg.Trace("Sending " + (arr ? "Array " : "Struct ") + mem.Name + " of size " + len); m.PutSizeTag(len, mem.SizeLength, mem.SizeName); } m.Put(memVal, mem.Name); } dbg.Unindent(); }