/// <inheritdoc cref="IEncodeable.Encode(IEncoder)" /> public void Encode(IEncoder encoder) { if (NamespaceUris != null && NamespaceUris.Count > 1) { string[] uris = new string[NamespaceUris.Count - 1]; for (int ii = 1; ii < NamespaceUris.Count; ii++) { uris[ii - 1] = NamespaceUris.GetString((uint)ii); } encoder.WriteStringArray("NamespaceUris", uris); } else { encoder.WriteStringArray("NamespaceUris", new string[0]); } if (ServerUris != null && ServerUris.Count > 1) { string[] uris = new string[ServerUris.Count - 1]; for (int ii = 1; ii < NamespaceUris.Count; ii++) { uris[ii - 1] = ServerUris.GetString((uint)ii); } encoder.WriteStringArray("ServerUris", uris); } else { encoder.WriteStringArray("ServerUris", new string[0]); } if (Message != null) { encoder.SetMappingTables(NamespaceUris, ServerUris); if (Message.TypeId == null || Message.TypeId.IdType != IdType.Numeric) { throw ServiceResultException.Create(StatusCodes.BadEncodingError, "SessionLessServiceMessage message body must have a numeric TypeId defined. ({0})", Message.TypeId); } encoder.WriteUInt32("ServiceId", (uint)Message.TypeId.Identifier); encoder.WriteEncodeable("Body", Message, null); } else { encoder.WriteUInt32("TypeId", (uint)0); } }
/// <summary> /// Initializes the mapper. /// </summary> /// <param name="localNamespaceUris"></param> /// <param name="remoteNamespaceUris"></param> public void Initialize(StringTable localNamespaceUris, StringTable remoteNamespaceUris, string applicationUri) { m_localNamespaceIndexes = new int[remoteNamespaceUris.Count]; for (int ii = 1; ii < remoteNamespaceUris.Count; ii++) { string namespaceUri = remoteNamespaceUris.GetString((uint)ii); bool isTypeSystemUri = false; if (TypeSystemNamespaceUris != null) { for (int jj = 0; jj < TypeSystemNamespaceUris.Length; jj++) { if (TypeSystemNamespaceUris[jj] == namespaceUri) { isTypeSystemUri = true; break; } } } if (!isTypeSystemUri) { namespaceUri = applicationUri + ":" + namespaceUri; } m_localNamespaceIndexes[ii] = localNamespaceUris.GetIndexOrAppend(namespaceUri); } m_remoteNamespaceIndexes = new int[localNamespaceUris.Count]; for (int ii = 0; ii < m_localNamespaceIndexes.Length; ii++) { if (m_remoteNamespaceIndexes.Length > m_localNamespaceIndexes[ii]) { m_remoteNamespaceIndexes[m_localNamespaceIndexes[ii]] = ii; } } }
/// <summary> /// Saves a string table from an XML stream. /// </summary> /// <param name="tableName">Name of the table.</param> /// <param name="elementName">Name of the element.</param> /// <param name="stringTable">The string table.</param> public void SaveStringTable(string tableName, string elementName, StringTable stringTable) { if (stringTable == null || stringTable.Count <= 1) { return; } PushNamespace(Namespaces.OpcUaXsd); try { Push(tableName, Namespaces.OpcUaXsd); for (ushort ii = 1; ii < stringTable.Count; ii++) { WriteString(elementName, stringTable.GetString(ii)); } Pop(); } finally { PopNamespace(); } }
/// <summary> /// Reads the schema information from a XML document. /// </summary> public void LoadFromXml(ISystemContext context, Stream istrm, bool updateTables) { ServiceMessageContext messageContext = new ServiceMessageContext(); messageContext.NamespaceUris = context.NamespaceUris; messageContext.ServerUris = context.ServerUris; messageContext.Factory = context.EncodeableFactory; using (XmlReader reader = XmlReader.Create(istrm)) { XmlQualifiedName root = new XmlQualifiedName("ListOfNodeState", Namespaces.OpcUaXsd); XmlDecoder decoder = new XmlDecoder(null, reader, messageContext); NamespaceTable namespaceUris = new NamespaceTable(); if (!decoder.LoadStringTable("NamespaceUris", "NamespaceUri", namespaceUris)) { namespaceUris = null; } // update namespace table. if (updateTables) { if (namespaceUris != null && context.NamespaceUris != null) { for (int ii = 0; ii < namespaceUris.Count; ii++) { context.NamespaceUris.GetIndexOrAppend(namespaceUris.GetString((uint)ii)); } } } StringTable serverUris = new StringTable(); if (!decoder.LoadStringTable("ServerUris", "ServerUri", context.ServerUris)) { serverUris = null; } // update server table. if (updateTables) { if (serverUris != null && context.ServerUris != null) { for (int ii = 0; ii < serverUris.Count; ii++) { context.ServerUris.GetIndexOrAppend(serverUris.GetString((uint)ii)); } } } // set mapping. decoder.SetMappingTables(namespaceUris, serverUris); decoder.PushNamespace(Namespaces.OpcUaXsd); NodeState state = NodeState.LoadNode(context, decoder); while (state != null) { this.Add(state); state = NodeState.LoadNode(context, decoder); } decoder.Close(); } }
/// <summary> /// Reads the schema information from a XML document. /// </summary> public void LoadFromBinary(ISystemContext context, Stream istrm, bool updateTables) { ServiceMessageContext messageContext = new ServiceMessageContext(); messageContext.NamespaceUris = context.NamespaceUris; messageContext.ServerUris = context.ServerUris; messageContext.Factory = context.EncodeableFactory; using (BinaryDecoder decoder = new BinaryDecoder(istrm, messageContext)) { // check if a namespace table was provided. NamespaceTable namespaceUris = new NamespaceTable(); if (!decoder.LoadStringTable(namespaceUris)) { namespaceUris = null; } // update namespace table. if (updateTables) { if (namespaceUris != null && context.NamespaceUris != null) { for (int ii = 0; ii < namespaceUris.Count; ii++) { context.NamespaceUris.GetIndexOrAppend(namespaceUris.GetString((uint)ii)); } } } // check if a server uri table was provided. StringTable serverUris = new StringTable(); if (namespaceUris != null && namespaceUris.Count > 1) { serverUris.Append(namespaceUris.GetString(1)); } if (!decoder.LoadStringTable(serverUris)) { serverUris = null; } // update server table. if (updateTables) { if (serverUris != null && context.ServerUris != null) { for (int ii = 0; ii < serverUris.Count; ii++) { context.ServerUris.GetIndexOrAppend(serverUris.GetString((uint)ii)); } } } // setup the mappings to use during decoding. decoder.SetMappingTables(namespaceUris, serverUris); int count = decoder.ReadInt32(null); for (int ii = 0; ii < count; ii++) { NodeState state = NodeState.LoadNode(context, decoder); this.Add(state); } } }
/// <summary> /// Updates the nodeset string tables and returns a NodeId that references those tables. /// </summary> /// <param name="nodeId">The node identifier.</param> /// <param name="targetNamespaceUris">The target namespace URIs.</param> /// <param name="targetServerUris">The target server URIs.</param> /// <param name="sourceNamespaceUris">The source namespace URIs.</param> /// <param name="sourceServerUris">The source server URIs.</param> /// <returns>A NodeId that references those tables.</returns> private static ExpandedNodeId Translate( ExpandedNodeId nodeId, NamespaceTable targetNamespaceUris, StringTable targetServerUris, NamespaceTable sourceNamespaceUris, StringTable sourceServerUris) { if (targetNamespaceUris == null) { throw new ArgumentNullException("targetNamespaceUris"); } if (sourceNamespaceUris == null) { throw new ArgumentNullException("sourceNamespaceUris"); } if (nodeId.ServerIndex > 0) { if (targetServerUris == null) { throw new ArgumentNullException("targetServerUris"); } if (sourceServerUris == null) { throw new ArgumentNullException("sourceServerUris"); } } if (NodeId.IsNull(nodeId)) { return(nodeId); } if (!nodeId.IsAbsolute) { return(Translate((NodeId)nodeId, targetNamespaceUris, sourceNamespaceUris)); } string namespaceUri = nodeId.NamespaceUri; if (nodeId.ServerIndex > 0) { if (String.IsNullOrEmpty(namespaceUri)) { namespaceUri = sourceNamespaceUris.GetString(nodeId.NamespaceIndex); } string serverUri = sourceServerUris.GetString(nodeId.ServerIndex); int index = targetServerUris.GetIndex(serverUri); if (index == -1) { index = targetServerUris.Append(serverUri); } return(new ExpandedNodeId(new NodeId(nodeId.Identifier, 0), namespaceUri, (uint)index)); } ushort namespaceIndex = 0; if (!String.IsNullOrEmpty(namespaceUri)) { int index = targetNamespaceUris.GetIndex(namespaceUri); if (index == -1) { index = targetNamespaceUris.Append(namespaceUri); } namespaceIndex = (ushort)index; } return(new NodeId(nodeId.Identifier, namespaceIndex)); }