/// <summary> /// Constructs a NodeId from the BrowseName of an internal node. /// </summary> /// <param name="browseName">The browse name.</param> /// <param name="namespaceIndex">Index of the namespace.</param> /// <returns>The node id.</returns> public static NodeId ConstructIdForInternalNode(QualifiedName browseName, ushort namespaceIndex) { ParsedNodeId parsedNodeId = new ParsedNodeId(); parsedNodeId.RootId = browseName.Name; parsedNodeId.NamespaceIndex = namespaceIndex; parsedNodeId.RootType = InternalNode; return(parsedNodeId.Construct()); }
/// <summary> /// Constructs a NodeId from the ItemId for a DA branch. /// </summary> /// <param name="itemId">The item id.</param> /// <param name="propertyId">The property id.</param> /// <param name="namespaceIndex">Index of the namespace.</param> /// <returns>The node id.</returns> public static NodeId ConstructIdForDaElement(string itemId, int propertyId, ushort namespaceIndex) { ParsedNodeId parsedNodeId = new ParsedNodeId(); parsedNodeId.RootId = itemId; parsedNodeId.NamespaceIndex = namespaceIndex; parsedNodeId.RootType = DaElement; if (propertyId >= 0) { parsedNodeId.PropertyId = propertyId; parsedNodeId.RootType = DaProperty; } return(parsedNodeId.Construct()); }
/// <summary> /// Parses the specified node identifier. /// </summary> /// <param name="nodeId">The node identifier.</param> /// <returns>The parsed node identifier. Null if the identifier cannot be parsed.</returns> public static new ParsedNodeId Parse(NodeId nodeId) { // can only parse non-null string node identifiers. if (NodeId.IsNull(nodeId)) { return(null); } string identifier = nodeId.Identifier as string; if (String.IsNullOrEmpty(identifier)) { return(null); } ParsedNodeId parsedNodeId = new ParsedNodeId(); parsedNodeId.NamespaceIndex = nodeId.NamespaceIndex; // extract the type of identifier. parsedNodeId.RootType = 0; int start = 0; for (int ii = 0; ii < identifier.Length; ii++) { if (!Char.IsDigit(identifier[ii])) { start = ii; break; } parsedNodeId.RootType *= 10; parsedNodeId.RootType += (byte)(identifier[ii] - '0'); } if (start >= identifier.Length || identifier[start] != ':') { return(null); } // extract any component path. StringBuilder buffer = new StringBuilder(); int index = start + 1; int end = identifier.Length; bool escaped = false; while (index < end) { char ch = identifier[index++]; // skip any escape character but keep the one after it. if (ch == '&') { escaped = true; continue; } if (!escaped && ch == '?') { end = index; break; } buffer.Append(ch); escaped = false; } // extract any component. parsedNodeId.RootId = buffer.ToString(); parsedNodeId.ComponentPath = null; if (parsedNodeId.RootType == ModelUtils.DaProperty) { // must have the property id. if (end >= identifier.Length) { return(null); } // extract the property id. for (int ii = end; ii < identifier.Length; ii++) { end++; if (!Char.IsDigit(identifier[ii])) { // check for terminator. if (identifier[ii] != ':') { return(null); } break; } parsedNodeId.PropertyId *= 10; parsedNodeId.PropertyId += (byte)(identifier[ii] - '0'); } } // extract the component path. if (end < identifier.Length) { parsedNodeId.ComponentPath = identifier.Substring(end); } return(parsedNodeId); }