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