public ExpandedNodeId ReadExpandedNodeId(string fieldName)
{
object token = null;
if (!ReadField(fieldName, out token))
{
return null;
}
var value = token as Dictionary<string, object>;
if (value == null)
{
return null;
}
int index = -1;
string uri = null;
int serverIndex = -1;
object field = null;
if (!value.TryGetValue("Id", out field))
{
return null;
}
var nid = NodeId.Parse(field as string);
if (value.TryGetValue("ServerUri", out field))
{
serverIndex = m_context.NamespaceUris.GetIndex(field as string);
}
else if (value.TryGetValue("ServerIndex", out field))
{
var number = field as long?;
if (number != null)
{
serverIndex = (int)number;
}
}
if (serverIndex > 0)
{
if (m_serverMappings != null && index < m_serverMappings.Length)
{
serverIndex = m_serverMappings[serverIndex];
}
}
if (value.TryGetValue("Uri", out field))
{
uri = field as string;
if (serverIndex <= 0)
{
index = m_context.NamespaceUris.GetIndex(uri);
}
}
if (serverIndex == 0)
{
if (index < 0)
{
index = nid.NamespaceIndex;
}
if (index > 0)
{
if (m_namespaceMappings != null && index < m_namespaceMappings.Length)
{
index = m_namespaceMappings[index];
}
}
return new NodeId(nid.Identifier, (ushort)index);
}
return new ExpandedNodeId(nid.Identifier, 0, uri, (uint)serverIndex);
}