public BaseInstanceState Next(ISystemContext context, ushort namespaceIndex)
{
// check if already completed.
if (m_completed)
{
return null;
}
// create the browser.
if (base.Unknown == null)
{
base.Unknown = m_client.CreateBrowser();
if (base.Unknown == null)
{
return null;
}
if (!String.IsNullOrEmpty(m_itemId))
{
if (!ChangeBrowsePosition(OPCHDA_BROWSEDIRECTION.OPCHDA_BROWSE_DIRECT, m_itemId))
{
return null;
}
}
}
// create the enumerator if not already created.
if (m_enumerator == null)
{
m_enumerator = CreateEnumerator(true);
m_branches = true;
// a null indicates an error.
if (m_enumerator == null)
{
m_completed = true;
return null;
}
}
// need a loop in case errors occur fetching element metadata.
BaseInstanceState node = null;
do
{
// fetch the next name.
string name = m_enumerator.Next();
// a null indicates the end of list.
if (name == null)
{
if (m_branches)
{
m_enumerator.Dispose();
m_enumerator = CreateEnumerator(false);
m_branches = false;
// a null indicates an error.
if (m_enumerator != null)
{
continue;
}
}
m_completed = true;
return null;
}
// create the node.
if (m_branches)
{
string itemId = GetBranchPosition(m_itemId, name);
node = new HdaBranchState(itemId, name, namespaceIndex);
}
else
{
string itemId = GetItemId(name);
node = new HdaItemState(itemId, name, namespaceIndex);
}
break;
}
while (node == null);
// return node.
return node;
}