using System.Diagnostics; using Decal.Interop.Net; namespace Decal.Adapter.NetParser; /// /// IMessageIterator base implementation /// public class MessageRootImpl : MessageRoot, IMessageIterator { protected MessageWrapper Wrapped; protected MessageStruct Data; protected int FieldIndex; protected const int Error = -1; public object Current => Data.Value(FieldIndex); public string FieldName => Data.Name(FieldIndex); public int Index => FieldIndex; public IMessage Message => Wrapped; public MessageRoot NextObjectIndex { [DebuggerNonUserCode] get { if (FieldIndex < Data.mCount) { MessageMemberWrapper result = new MessageMemberWrapper(Data.Struct(FieldIndex), Wrapped); FieldIndex++; return result; } throw new COMHResultException(HResults.E_FAIL); } } protected MessageRootImpl() { } protected MessageRootImpl(MessageStruct data, MessageWrapper wrapper) : this() { Wrapped = wrapper; Data = data; if (!Data.mParsed) { Data.Parse(); } } public void Reset() { FieldIndex = 0; } [DebuggerNonUserCode] private T GetNext(string name) { FieldIndex = Data.IndexFromName(name); if (FieldIndex != -1) { return Data.Value(FieldIndex); } throw new COMHResultException(HResults.E_FAIL); } [DebuggerNonUserCode] private T GetNext(int index) { if (index >= 0 && index < Data.mCount) { FieldIndex = index; return Data.Value(FieldIndex); } throw new COMHResultException(HResults.E_FAIL); } [DebuggerNonUserCode] public object get_Next(object vIndex) { return GetNext(Data.ObjectToIndex(vIndex)); } [DebuggerNonUserCode] public double get_NextFloat(string Name) { return GetNext(Name); } [DebuggerNonUserCode] public int get_NextInt(string Name) { return GetNext(Name); } [DebuggerNonUserCode] public MessageRoot get_NextObject(string Name) { FieldIndex = Data.IndexFromName(Name); if (FieldIndex != -1) { return new MessageMemberWrapper(Data.Struct(FieldIndex), Wrapped); } throw new COMHResultException(HResults.E_FAIL); } [DebuggerNonUserCode] public ulong get_NextQWord(string Name) { return GetNext(Name); } [DebuggerNonUserCode] public string get_NextString(string Name) { return GetNext(Name); } }