/* ======================================================================== * Copyright (c) 2005-2025 The OPC Foundation, Inc. All rights reserved. * * OPC Foundation MIT License 1.00 * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, * copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following * conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * The complete license agreement can be found here: * http://opcfoundation.org/License/MIT/1.00/ * ======================================================================*/ namespace Opc.Ua.SourceGeneration { /// /// Template strings /// internal static class NodeStateTemplates { /// /// Main file template for predefined nodes code generation /// public static readonly TemplateString File = TemplateString.Parse( $$""" {{Tokens.CodeHeader}} {{Tokens.ListOfImports}} namespace {{Tokens.NamespacePrefix}} { {{Tokens.ListOfTypes}} {{Tokens.ListOfTypeActivators}} } """); /// /// Main file template for predefined nodes code generation /// public static readonly TemplateString Extensions_File = TemplateString.Parse( $$""" {{Tokens.CodeHeader}} {{Tokens.ListOfImports}} namespace {{Tokens.NamespacePrefix}} { /// /// Extensions that add functionality from the {{Tokens.NamespaceUri}} namespace. /// public static partial class {{Tokens.Namespace}}Extensions { /// /// Creates and returns all node states for the {{Tokens.NamespaceUri}} namespace. /// /// The collection to add the node states to. /// The system context to use for initialization. /// Original collection with node states added. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public static global::Opc.Ua.NodeStateCollection Add{{Tokens.Namespace}}( this global::Opc.Ua.NodeStateCollection nodes, global::Opc.Ua.ISystemContext context) { {{Tokens.ListOfNodeStateInitializers}} return nodes; } /// /// Adds all nodestate activators of the {{Tokens.NamespaceUri}} /// namespace to a INodeStateFactoryBuilder. /// /// The node state factory builder. /// The builder passed as parameter for chaining. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public static global::Opc.Ua.INodeStateFactoryBuilder Add{{Tokens.Namespace}}( this global::Opc.Ua.INodeStateFactoryBuilder builder) { {{Tokens.ListOfActivatorRegistrations}} return builder; } {{Tokens.ListOfNodeStateInstanceFactories}} {{Tokens.ListOfNodeStateTypeFactories}} } } """); /// /// Object Type node state /// public static readonly TemplateString ObjectType_Class = TemplateString.Parse( $$""" /// /// The {{Tokens.ClassName}} ObjectType state. /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public partial class {{Tokens.ClassName}}State : {{Tokens.BaseClassName}}State{{Tokens.BaseT}} { /// /// Initializes a new instance of the class. /// public {{Tokens.ClassName}}State(global::Opc.Ua.NodeState? parent) : base(parent) { } {{Tokens.ListOfProperties}} {{Tokens.ListOfNonMandatoryChildren}} /// public override bool DeepEquals(global::Opc.Ua.NodeState node) { if (!(node is {{Tokens.ClassName}}State state) || !base.DeepEquals(state)) { return false; } {{Tokens.ListOfEqualityComparers}} return true; } /// public override int DeepGetHashCode() { int hashCode = base.DeepGetHashCode(); {{Tokens.ListOfChildHashes}} return hashCode; } {{Tokens.ListOfChildOperations}} /// protected override void CopyTo(global::Opc.Ua.NodeState target) { if (!(target is {{Tokens.ClassName}}State state)) { return; } {{Tokens.ListOfChildCopies}} base.CopyTo(target); } /// protected override global::Opc.Ua.NodeState CreateCopy() { return new {{Tokens.ClassName}}State(null); } /// protected override global::Opc.Ua.NodeId GetDefaultTypeDefinitionId( global::Opc.Ua.NamespaceTable namespaceUris) { return global::Opc.Ua.NodeId.Create( {{Tokens.NamespacePrefix}}.ObjectTypes.{{Tokens.TypeName}}, {{Tokens.NamespaceUri}}, namespaceUris); } /// protected override void Initialize(global::Opc.Ua.ISystemContext context) { base.Initialize(context); Initialize( context, context.CreateInstanceOf{{Tokens.SymbolicId}}()); InitializeOptionalChildren(context); } /// protected override void Initialize( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState source) { InitializeOptionalChildren(context); base.Initialize(context, source); } /// protected override void InitializeOptionalChildren( global::Opc.Ua.ISystemContext context) { base.InitializeOptionalChildren(context); {{Tokens.InitializeOptionalChildren}} } {{Tokens.ListOfFields}} } """); /// /// Method type node state /// public static readonly TemplateString MethodType_Class = TemplateString.Parse( $$""" /// /// The {{Tokens.ClassName}} MethodType. /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public partial class {{Tokens.ClassName}} : global::Opc.Ua.MethodState { /// /// Initializes a new instance of the class. /// public {{Tokens.ClassName}}(global::Opc.Ua.NodeState? parent) : base(parent) { } /// public new static global::Opc.Ua.NodeState Construct(global::Opc.Ua.NodeState parent) { return new {{Tokens.ClassName}}(parent); } /// public {{Tokens.ClassName}}MethodCallHandler? OnCall; /// public {{Tokens.ClassName}}MethodAsyncCallHandler? OnCallAsync; {{Tokens.ListOfProperties}} {{Tokens.ListOfNonMandatoryChildren}} /// public override bool DeepEquals(global::Opc.Ua.NodeState node) { if (!(node is {{Tokens.ClassName}} state) || !base.DeepEquals(state)) { return false; } {{Tokens.ListOfEqualityComparers}} return true; } /// public override int DeepGetHashCode() { int hashCode = base.DeepGetHashCode(); {{Tokens.ListOfChildHashes}} return hashCode; } {{Tokens.ListOfChildOperations}} /// protected override void CopyTo(global::Opc.Ua.NodeState target) { if (!(target is {{Tokens.ClassName}} state)) { return; } {{Tokens.ListOfChildCopies}} base.CopyTo(target); } /// protected override global::Opc.Ua.NodeState CreateCopy() { return new {{Tokens.ClassName}}(null); } /// protected override void Initialize(global::Opc.Ua.ISystemContext context) { base.Initialize(context); Initialize( context, context.CreateInstanceOf{{Tokens.SymbolicId}}()); InitializeOptionalChildren(context); } /// protected override void InitializeOptionalChildren( global::Opc.Ua.ISystemContext context) { base.InitializeOptionalChildren(context); {{Tokens.InitializeOptionalChildren}} } /// protected override global::Opc.Ua.ServiceResult? Call( global::Opc.Ua.ISystemContext _context, global::Opc.Ua.NodeId _objectId, global::Opc.Ua.ArrayOf _inputArguments, global::System.Collections.Generic.List _outputArguments) { if (OnCall == null) { return base.Call(_context, _objectId, _inputArguments, _outputArguments); } global::Opc.Ua.ServiceResult? _result = null; {{Tokens.ListOfInputArguments}} {{Tokens.ListOfOutputDeclarations}} if (OnCall != null) { {{Tokens.OnCallImplementation}} } {{Tokens.ListOfOutputArguments}} return _result; } /// protected override async global::System.Threading.Tasks.ValueTask CallAsync( global::Opc.Ua.ISystemContext _context, global::Opc.Ua.NodeId _objectId, global::Opc.Ua.ArrayOf _inputArguments, global::System.Collections.Generic.List _outputArguments, global::System.Threading.CancellationToken cancellationToken = default) { if (OnCall == null && OnCallAsync == null) { return await base.CallAsync( _context, _objectId, _inputArguments, _outputArguments, cancellationToken).ConfigureAwait(false); } {{Tokens.ClassName}}Result? _result = null; {{Tokens.ListOfInputArguments}} if (OnCallAsync != null) { {{Tokens.OnCallAsyncImplementation}} } else if (OnCall != null) { return Call(_context, _objectId, _inputArguments, _outputArguments); } {{Tokens.ListOfOutputArgumentsFromResult}} return _result?.ServiceResult; } {{Tokens.ListOfFields}} } /// /// Represents the result of a {{Tokens.ClassName}} method call. /// public partial class {{Tokens.ClassName}}Result { public global::Opc.Ua.ServiceResult ServiceResult { get; set; } {{Tokens.ListOfResultProperties}} } /// /// Handles the {{Tokens.ClassName}} method call. /// public delegate global::Opc.Ua.ServiceResult {{Tokens.ClassName}}MethodCallHandler( {{Tokens.OnCallDeclaration}} /// /// Handles the asynchronous {{Tokens.ClassName}} method call. /// public delegate global::System.Threading.Tasks.ValueTask<{{Tokens.ClassName}}Result> {{Tokens.ClassName}}MethodAsyncCallHandler( {{Tokens.OnCallAsyncDeclaration}} """); /// /// Variable type node state /// public static readonly TemplateString VariableType_Class = TemplateString.Parse( $$""" /// /// The {{Tokens.ClassName}} VariableType state. /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public partial class {{Tokens.ClassName}}State : {{Tokens.BaseClassName}}State{{Tokens.BaseT}} { /// /// Initializes a new instance of the class. /// public {{Tokens.ClassName}}State(global::Opc.Ua.NodeState? parent) : base(parent) { } {{Tokens.ListOfProperties}} {{Tokens.ListOfNonMandatoryChildren}} /// public override bool DeepEquals(global::Opc.Ua.NodeState node) { if (!(node is {{Tokens.ClassName}}State state) || !base.DeepEquals(state)) { return false; } {{Tokens.ListOfEqualityComparers}} return true; } /// public override int DeepGetHashCode() { int hashCode = base.DeepGetHashCode(); {{Tokens.ListOfChildHashes}} return hashCode; } {{Tokens.ListOfChildOperations}} /// protected override void CopyTo(global::Opc.Ua.NodeState target) { if (!(target is {{Tokens.ClassName}}State state)) { return; } {{Tokens.ListOfChildCopies}} base.CopyTo(target); } /// protected override global::Opc.Ua.NodeState CreateCopy() { return new {{Tokens.ClassName}}State(null); } /// protected override global::Opc.Ua.NodeId GetDefaultTypeDefinitionId( global::Opc.Ua.NamespaceTable namespaceUris) { return global::Opc.Ua.NodeId.Create( {{Tokens.NamespacePrefix}}.VariableTypes.{{Tokens.TypeName}}, {{Tokens.NamespaceUri}}, namespaceUris); } /// protected override global::Opc.Ua.NodeId GetDefaultDataTypeId( global::Opc.Ua.NamespaceTable namespaceUris) { return global::Opc.Ua.NodeId.Create( {{Tokens.DataTypeNamespacePrefix}}.DataTypes.{{Tokens.DataType}}, {{Tokens.DataTypeNamespaceUri}}, namespaceUris); } /// protected override int GetDefaultValueRank() { return {{Tokens.ValueRank}}; } /// protected override void Initialize(global::Opc.Ua.ISystemContext context) { base.Initialize(context); Initialize( context, context.CreateInstanceOf{{Tokens.SymbolicId}}()); // InitializeOptionalChildren(context); } /// protected override void Initialize( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState source) { InitializeOptionalChildren(context); base.Initialize(context, source); } /// protected override void InitializeOptionalChildren( global::Opc.Ua.ISystemContext context) { base.InitializeOptionalChildren(context); {{Tokens.InitializeOptionalChildren}} } {{Tokens.ListOfFields}} } {{Tokens.TypedVariableType}} {{Tokens.VariableTypeValue}} """); /// /// Factory methods for variable states with typed values /// public static readonly TemplateString FactoriesForVariableTypeWithTypedValue = TemplateString.Parse( $$""" /// /// Creates a new instance of the {{Tokens.ClassName}}State class with a built-in value type /// and associated TBuilder to extract the value from the Variant and create a new Variant /// from it. /// public static {{Tokens.ClassName}}State For(global::Opc.Ua.NodeState? parent) where TBuilder : struct, global::Opc.Ua.IVariantBuilder { return new {{Tokens.ClassName}}State.Implementation(parent); } """); /// /// Typed variable type node state /// public static readonly TemplateString VariableTypeWithTypedValue_Class = TemplateString.Parse( $$""" /// /// The {{Tokens.ClassName}} VariableType state. /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public abstract class {{Tokens.ClassName}}State : {{Tokens.ClassName}}State { /// /// Initializes a new instance of the class. /// protected {{Tokens.ClassName}}State(global::Opc.Ua.NodeState? parent) : base(parent) { } /// /// Creates a new instance of the /// class with a built-in value type and associated TBuilder to extract the /// value from the Variant and create a new Variant from it. /// /// The builder to use for T public static {{Tokens.ClassName}}State With( global::Opc.Ua.NodeState? parent = null) where TBuilder : struct, global::Opc.Ua.IVariantBuilder { return new Implementation(parent); } /// public new abstract T Value { get; set; } /// protected override void Initialize(global::Opc.Ua.ISystemContext context) { base.Initialize(context); base.Initialize(context); } /// protected override void Initialize( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState source) { InitializeOptionalChildren(context); base.Initialize(context, source); } /// /// Adds builder which extracts T from Variant or creates new Variant with type T /// This is public so it can be overridden by classes outside of the namespace /// /// The builder to use for T public class Implementation : {{Tokens.ClassName}}State where TBuilder : struct, global::Opc.Ua.IVariantBuilder { /// /// Initializes a new instance of the class. /// public Implementation(global::Opc.Ua.NodeState? parent) : base(parent) { m_builder = new TBuilder(); Value = default(T); } /// public override T Value { get => m_builder.GetValue(WrappedValue); set => WrappedValue = m_builder.WithValue(value); } /// protected override global::Opc.Ua.NodeState CreateCopy() { return new Implementation(Parent); } private readonly TBuilder m_builder; } } """); /// /// Variable type value field methods /// public static readonly TemplateString VariableType_ValueMethods = TemplateString.Parse( $$""" /// /// Handles the read of the {{Tokens.ChildName}} variable. /// private global::Opc.Ua.ServiceResult OnRead_{{Tokens.ChildName}}( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState node, global::Opc.Ua.NumericRange indexRange, global::Opc.Ua.QualifiedName dataEncoding, ref global::Opc.Ua.Variant value, ref global::Opc.Ua.StatusCode statusCode, ref global::Opc.Ua.DateTimeUtc timestamp) { lock (Lock) { DoBeforeReadProcessing(context, node); var childVariable = m_variable?.{{Tokens.ChildPath}}; if (childVariable != null && global::Opc.Ua.StatusCode.IsBad(childVariable.StatusCode)) { value = global::Opc.Ua.Variant.Null; statusCode = childVariable.StatusCode; return new global::Opc.Ua.ServiceResult(statusCode); } if (m_value != null) { value = global::Opc.Ua.Variant.{{Tokens.VariantFrom}}(({{Tokens.ChildDataType}})m_value.{{Tokens.ChildPath}}); } var result = Read(context, node, indexRange, dataEncoding, ref value, ref statusCode, ref timestamp); if (childVariable != null && global::Opc.Ua.ServiceResult.IsNotBad(result)) { timestamp = childVariable.Timestamp; if (statusCode != childVariable.StatusCode) { statusCode = childVariable.StatusCode; result = new global::Opc.Ua.ServiceResult(statusCode); } } return result; } } /// /// Handles the write of the {{Tokens.ChildName}} variable. /// private global::Opc.Ua.ServiceResult OnWrite_{{Tokens.ChildName}}( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState node, global::Opc.Ua.NumericRange indexRange, global::Opc.Ua.QualifiedName dataEncoding, ref global::Opc.Ua.Variant value, ref global::Opc.Ua.StatusCode statusCode, ref global::Opc.Ua.DateTimeUtc timestamp) { lock (Lock) { if (!value.{{Tokens.VariantTryGet}}(out {{Tokens.ChildDataType}} newValue)) { newValue = default; } UpdateChildVariableStatus(m_variable.{{Tokens.ChildPath}}, ref statusCode, ref timestamp); m_value.{{Tokens.ChildPath}} = {{Tokens.ValueWrite}}; UpdateParent(context, ref statusCode, ref timestamp); } return global::Opc.Ua.ServiceResult.Good; } """); /// /// Variable type node state /// public static readonly TemplateString VariableTypeValue_Class = TemplateString.Parse( $$""" /// /// The {{Tokens.ClassName}} VariableType value. /// [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public class {{Tokens.ClassName}}Value : global::Opc.Ua.BaseVariableValue { /// /// Initializes a new instance of the class. /// public {{Tokens.ClassName}}Value( {{Tokens.ClassName}}State variable, {{Tokens.DataType}}? value, object dataLock) : base(dataLock) { m_value = value; if (m_value == null) { m_value = new {{Tokens.DataType}}(); } Initialize(variable); } /// /// Gets the variable associated with the value. /// public {{Tokens.ClassName}}State Variable => m_variable; /// /// Gets or sets the value. /// public {{Tokens.DataType}} Value { get => m_value; set => m_value = value; } /// /// Initializes the value. /// private void Initialize({{Tokens.ClassName}}State variable) { lock (Lock) { m_variable = variable; variable.Value = m_value; variable.OnReadValue = OnReadValue; variable.OnWriteValue = OnWriteValue; global::Opc.Ua.BaseVariableState? instance = null; global::System.Collections.Generic.List updateList = new global::System.Collections.Generic.List(); updateList.Add(variable); {{Tokens.ListOfChildInitializers}} SetUpdateList(updateList); } } /// protected global::Opc.Ua.ServiceResult OnReadValue( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState node, global::Opc.Ua.NumericRange indexRange, global::Opc.Ua.QualifiedName dataEncoding, ref global::Opc.Ua.Variant value, ref global::Opc.Ua.StatusCode statusCode, ref global::Opc.Ua.DateTimeUtc timestamp) { lock (Lock) { DoBeforeReadProcessing(context, node); if (m_value != null) { value = global::Opc.Ua.Variant.{{Tokens.VariantFrom}}(m_value); } return Read(context, node, indexRange, dataEncoding, ref value, ref statusCode, ref timestamp); } } /// private global::Opc.Ua.ServiceResult OnWriteValue( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState node, global::Opc.Ua.NumericRange indexRange, global::Opc.Ua.QualifiedName dataEncoding, ref global::Opc.Ua.Variant value, ref global::Opc.Ua.StatusCode statusCode, ref global::Opc.Ua.DateTimeUtc timestamp) { lock (Lock) { if (!value.{{Tokens.VariantTryGet}}(out {{Tokens.DataType}} newValue)) { newValue = default; } if ({{Tokens.ValueComparison}}) { UpdateChildrenChangeMasks(context, ref newValue, ref statusCode, ref timestamp); Timestamp = timestamp; m_value = {{Tokens.ValueWrite}}; m_variable.UpdateChangeMasks(global::Opc.Ua.NodeStateChangeMasks.Value); } } return global::Opc.Ua.ServiceResult.Good; } /// /// Updates the change masks for the children. /// private void UpdateChildrenChangeMasks( global::Opc.Ua.ISystemContext context, ref {{Tokens.DataType}} newValue, ref global::Opc.Ua.StatusCode statusCode, ref global::Opc.Ua.DateTimeUtc timestamp) { {{Tokens.ListOfUpdateChildrenChangeMasks}} } /// /// Updates the parent variable status. /// private void UpdateParent( global::Opc.Ua.ISystemContext context, ref global::Opc.Ua.StatusCode statusCode, ref global::Opc.Ua.DateTimeUtc timestamp) { Timestamp = timestamp; m_variable.UpdateChangeMasks(global::Opc.Ua.NodeStateChangeMasks.Value); m_variable.ClearChangeMasks(context, false); } /// /// Updates the status of a child variable. /// private void UpdateChildVariableStatus( global::Opc.Ua.BaseVariableState child, ref global::Opc.Ua.StatusCode statusCode, ref global::Opc.Ua.DateTimeUtc timestamp) { if (child == null) { return; } child.StatusCode = statusCode; if (timestamp == global::Opc.Ua.DateTimeUtc.MinValue) { timestamp = global::Opc.Ua.DateTimeUtc.Now; } child.Timestamp = timestamp; } {{Tokens.ListOfChildMethods}} private {{Tokens.DataType}}? m_value; private {{Tokens.ClassName}}State? m_variable; } """); /// /// Initialize optional child /// public static readonly TemplateString InitializeOptionalChild = TemplateString.Parse( $$""" if ({{Tokens.ChildName}} != null) { {{Tokens.ChildName}}.Create( context, context.Create{{Tokens.SymbolicId}}(this, true)); } """); /// /// Property template /// public static readonly TemplateString Property = TemplateString.Parse( $$""" /// /// {{Tokens.ChildName}} property /// {{Tokens.AccessorSymbol}} {{Tokens.ClassName}}? {{Tokens.ChildName}} { get => {{Tokens.FieldName}}; set { if (!object.ReferenceEquals({{Tokens.FieldName}}, value)) { ChangeMasks |= global::Opc.Ua.NodeStateChangeMasks.Children; } {{Tokens.FieldName}} = value; } } """); /// /// Override property template /// public static readonly TemplateString PropertyOverride = TemplateString.Parse( $$""" /// /// {{Tokens.ChildName}} property /// {{Tokens.AccessorSymbol}} {{Tokens.ClassName}}? {{Tokens.ChildName}} { get => ({{Tokens.ClassName}})base.{{Tokens.ChildName}}; set => base.{{Tokens.ChildName}} = value; } """); /// /// Add Optional component template /// public static readonly TemplateString OptionalMethod = TemplateString.Parse( $$""" /// /// Add an optional {{Tokens.ChildName}} child /// {{Tokens.AccessorSymbol}} {{Tokens.ClassName}} Add{{Tokens.ChildName}}( global::Opc.Ua.ISystemContext context) { {{Tokens.ClassName}} state = context.Create{{Tokens.SymbolicId}}(this, true); {{Tokens.ChildName}} = state; return state; } """); /// /// Place holder method template /// public static readonly TemplateString PlaceHolderMethod = TemplateString.Parse( $$""" /// /// Add a placeholder {{Tokens.ChildName}} as child /// {{Tokens.AccessorSymbol}} {{Tokens.ClassName}} Add{{Tokens.ChildName}}( global::Opc.Ua.ISystemContext context, global::Opc.Ua.QualifiedName browseName) { {{Tokens.ClassName}} state = context.Create{{Tokens.SymbolicId}}(this, browseName); ReplaceChild(context, state); return state; } """); /// /// Find child methods /// public static readonly TemplateString ChildOperations = TemplateString.Parse( $$""" /// public override void GetChildren( global::Opc.Ua.ISystemContext context, global::System.Collections.Generic.IList children) { {{Tokens.ListOfFindChildren}} base.GetChildren(context, children); } {{Tokens.ListOfCreateOrReplaceChild}} /// protected override global::Opc.Ua.BaseInstanceState? FindChild( global::Opc.Ua.ISystemContext context, global::Opc.Ua.QualifiedName browseName, bool createOrReplace, global::Opc.Ua.BaseInstanceState replacement) { if (browseName.IsNull) { return null; } global::Opc.Ua.BaseInstanceState? instance = null; switch (browseName.Name) { {{Tokens.ListOfFindChildCase}} } if (instance != null) { return instance; } return base.FindChild(context, browseName, createOrReplace, replacement); } /// protected override void RemoveExplicitlyDefinedChild(global::Opc.Ua.BaseInstanceState child) { {{Tokens.ListOfRemoveChild}} base.RemoveExplicitlyDefinedChild(child); } """); /// /// Find child case template. Uses a literal string with the /// runtime browse name (which may differ from the symbolic /// name when the design overrides <opc:BrowseName>, /// as in Boiler.InputPipe → "PipeX001"). /// Avoids depending on {Namespace}.BrowseNames.{ChildName} /// constants so cross-namespace inherited children compile /// even when the foreign namespace's generated /// BrowseNames class doesn't carry a constant for that /// name. /// public static readonly TemplateString FindChildCase = TemplateString.Parse( $$""" case "{{Tokens.ChildBrowseName}}": { instance = !createOrReplace ? {{Tokens.ChildName}} : CreateOrReplace{{Tokens.ChildName}}(context, replacement); break; } """); /// /// Create or replace a child on the class /// public static readonly TemplateString CreateOrReplaceChild = TemplateString.Parse( $$""" /// /// Create or replace the mandatory {{Tokens.ChildName}} child /// {{Tokens.AccessorSymbol}} {{Tokens.ClassName}} CreateOrReplace{{Tokens.ChildName}}( global::Opc.Ua.ISystemContext context, global::Opc.Ua.BaseInstanceState replacement) { if ({{Tokens.ChildName}} == null) { {{Tokens.ClassName}}? child = replacement as {{Tokens.ClassName}}; if (child == null) { child = {{Tokens.ClassFactory}}(this); if (replacement != null) { child.Create(context, replacement); } } {{Tokens.ChildName}} = child; } return {{Tokens.ChildName}}; } """); /// /// Find children method template /// public static readonly TemplateString FindChildren = TemplateString.Parse( $$""" if ({{Tokens.FieldName}} != null) { children.Add({{Tokens.FieldName}}); } """); /// /// Remove child template /// public static readonly TemplateString RemoveChild = TemplateString.Parse( $$""" if (object.ReferenceEquals({{Tokens.FieldName}}, child)) { {{Tokens.FieldName}} = null; return; } """); /// /// Clone child template /// public static readonly TemplateString CloneChild = TemplateString.Parse( $$""" state.{{Tokens.BrowseName}} = ({{Tokens.ClassName}})global::Opc.Ua.CoreUtils.Clone({{Tokens.BrowseName}}); """); /// /// Compare child template /// public static readonly TemplateString CompareChild = TemplateString.Parse( $$""" if (!global::Opc.Ua.NodeStateComparer.Default.Equals( state.{{Tokens.BrowseName}}, {{Tokens.BrowseName}})) { return false; } """); /// /// Hash child template /// public static readonly TemplateString HashChild = TemplateString.Parse( $$""" hashCode = (hashCode * 16777619) ^ global::Opc.Ua.NodeStateComparer.Default.GetHashCode({{Tokens.BrowseName}}); """); /// /// Encodeable activator /// public static readonly TemplateString ActivatorClass = TemplateString.Parse( $$""" [global::System.CodeDom.Compiler.GeneratedCodeAttribute("{{Tokens.Tool}}", "{{Tokens.Version}}")] [global::System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute()] public sealed class {{Tokens.StateClassName}}Activator : global::Opc.Ua.NodeStateActivator { /// /// The singleton instance of the activator. /// public static readonly {{Tokens.StateClassName}}Activator Instance = new {{Tokens.StateClassName}}Activator(); /// protected override global::Opc.Ua.NodeState CreateInstance( global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent) { return context.CreateInstanceOf{{Tokens.SymbolicId}}(parent); } } """); /// /// Nodestate activator registration /// public static readonly TemplateString ActivatorRegistration = TemplateString.Parse( $$""" // Register node state factory for {{Tokens.BrowseName}} {{Tokens.NodeClass}} builder = builder.RegisterType( {{Tokens.NodeClass}}Ids.{{Tokens.SymbolicId}}, {{Tokens.StateClassName}}Activator.Instance); """); /// /// Template for a single node state creation call /// public static readonly TemplateString Add = TemplateString.Parse( $$""" // Add {{Tokens.SymbolicName}} predefined node { global::Opc.Ua.NodeState state = Create{{Tokens.SymbolicId}}(context); state.CreateAsPredefinedNode(context); nodes.Add(state); } """); /// /// Template for BaseObjectTypeState creation /// public static readonly TemplateString Create_ObjectType = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} ObjectType node state. /// internal static global::Opc.Ua.BaseObjectTypeState Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, bool forInstance = false) { var state = new global::Opc.Ua.BaseObjectTypeState(); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.SuperTypeId = {{Tokens.SuperTypeId}}; state.IsAbstract = {{Tokens.IsAbstract}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} if (forInstance) { {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} } {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { state.IsPartOfTypeHierarchy = true; {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for BaseDataVariableTypeState creation /// public static readonly TemplateString Create_VariableType = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} VariableType node state. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, bool forInstance = false) { var state = {{Tokens.StateClassFactory}}(); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.SuperTypeId = {{Tokens.SuperTypeId}}; state.IsAbstract = {{Tokens.IsAbstract}}; state.DataType = {{Tokens.DataTypeIdConstant}}; state.ValueRank = {{Tokens.ValueRank}}; {{Tokens.ArrayDimensions}} {{Tokens.ValueCode}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} if (forInstance) { {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} } {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { state.IsPartOfTypeHierarchy = true; {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for ReferenceTypeState creation /// public static readonly TemplateString Create_ReferenceType = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} ReferenceType node state. /// internal static global::Opc.Ua.ReferenceTypeState Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, bool forInstance = false) { var state = new global::Opc.Ua.ReferenceTypeState(); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.SuperTypeId = {{Tokens.SuperTypeId}}; state.IsAbstract = {{Tokens.IsAbstract}}; state.Symmetric = {{Tokens.SymmetricValue}}; {{Tokens.InverseNameValue}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} if (forInstance) { {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} } {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for DataTypeState creation /// public static readonly TemplateString Create_DataType = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} DataType node state. /// internal static global::Opc.Ua.DataTypeState Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, bool forInstance = false) { var state = new global::Opc.Ua.DataTypeState(); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.SuperTypeId = {{Tokens.SuperTypeId}}; state.IsAbstract = {{Tokens.IsAbstract}}; state.DataTypeDefinition = {{Tokens.DataTypeDefinition}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} if (forInstance) { {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} } {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for BaseObjectState creation /// public static readonly TemplateString Create_Object = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} Object node state. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, bool forInstance = true) { var state = {{Tokens.StateClassFactory}}(null); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.NumericId = {{Tokens.NumericIdValue}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; // {{Tokens.ModellingRuleId}} state.EventNotifier = {{Tokens.EventNotifier}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for BaseVariableState (Property or DataVariable) creation /// public static readonly TemplateString Create_Variable = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} Variable node state. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, bool forInstance = true) { var state = {{Tokens.StateClassFactory}}(null); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.NumericId = {{Tokens.NumericIdValue}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; // {{Tokens.ModellingRuleId}} state.DataType = {{Tokens.DataTypeIdConstant}}; state.ValueRank = {{Tokens.ValueRank}}; {{Tokens.ArrayDimensions}} state.AccessLevel = {{Tokens.AccessLevelValue}}; state.UserAccessLevel = {{Tokens.UserAccessLevelValue}}; state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}}; state.Historizing = {{Tokens.HistorizingValue}}; {{Tokens.ValueCode}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for ViewState creation /// public static readonly TemplateString Create_View = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} View node state. /// internal static global::Opc.Ua.ViewState Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context) { var state = new global::Opc.Ua.ViewState(); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText({{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.EventNotifier = {{Tokens.EventNotifier}}; state.ContainsNoLoops = {{Tokens.ContainsNoLoopsValue}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for MethodState creation /// public static readonly TemplateString Create_InstanceOfMethodType = TemplateString.Parse( $$""" /// /// Creates an instance of the {{Tokens.SymbolicName}} Method node state. /// public static {{Tokens.StateClassName}} CreateInstanceOf{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent = null, global::Opc.Ua.QualifiedName browseName = default) { var state = {{Tokens.StateClassFactory}}(parent); state.NodeId = {{Tokens.NodeIdConstant}}; if (!browseName.IsNull) { state.SymbolicName = browseName.Name; state.BrowseName = browseName; state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name); } else { state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); } {{Tokens.MethodDeclarationId}} {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; state.Executable = {{Tokens.ExecutableValue}}; state.UserExecutable = {{Tokens.ExecutableValue}}; {{Tokens.ListOfInputArguments}} {{Tokens.ListOfOutputArguments}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} return state; } """); /// /// Template for object type instance creation (instantiate an object type) /// public static readonly TemplateString Create_InstanceOfObjectType = TemplateString.Parse( $$""" /// /// Creates an instance of the {{Tokens.TypeName}} type. /// public static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent = null, global::Opc.Ua.QualifiedName browseName = default) { var state = {{Tokens.StateClassFactory}}(parent); state.NodeId = {{Tokens.NodeIdConstant}}; if (!browseName.IsNull) { state.SymbolicName = browseName.Name; state.BrowseName = browseName; state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name); } else { state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); } state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; state.EventNotifier = {{Tokens.EventNotifier}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} return state; } """); /// /// Template variable type instance creation (instantiate a variable type) /// public static readonly TemplateString Create_InstanceOfVariableType = TemplateString.Parse( $$""" /// /// Creates an instance of the {{Tokens.TypeName}} variable type. /// public static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent = null, global::Opc.Ua.QualifiedName browseName = default) { var state = {{Tokens.StateClassFactory}}(parent); state.NodeId = {{Tokens.NodeIdConstant}}; if (!browseName.IsNull) { state.SymbolicName = browseName.Name; state.BrowseName = browseName; state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name); } else { state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); } state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; {{Tokens.ModellingRuleId}} state.DataType = {{Tokens.DataTypeIdConstant}}; state.ValueRank = {{Tokens.ValueRank}}; {{Tokens.ArrayDimensions}} state.AccessLevel = {{Tokens.AccessLevelValue}}; state.UserAccessLevel = {{Tokens.UserAccessLevelValue}}; state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}}; state.Historizing = {{Tokens.HistorizingValue}}; {{Tokens.ValueCode}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} return state; } """); /// /// Template for child object state creation /// public static readonly TemplateString Create_ChildObject = TemplateString.Parse( $$""" /// /// Creates an instance of the {{Tokens.SymbolicName}} object node child component. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent, bool forInstance = false) { var state = {{Tokens.StateClassFactory}}(parent); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); state.NumericId = {{Tokens.NumericIdValue}}; {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; state.EventNotifier = {{Tokens.EventNotifier}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for child variable state creation /// public static readonly TemplateString Create_ChildVariable = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} child Variable node child component. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent, bool forInstance = false) { var state = {{Tokens.StateClassFactory}}(parent); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; state.NumericId = {{Tokens.NumericIdValue}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; state.DataType = {{Tokens.DataTypeIdConstant}}; state.ValueRank = {{Tokens.ValueRank}}; {{Tokens.ArrayDimensions}} state.AccessLevel = {{Tokens.AccessLevelValue}}; state.UserAccessLevel = {{Tokens.UserAccessLevelValue}}; state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}}; state.Historizing = {{Tokens.HistorizingValue}}; {{Tokens.ValueCode}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} {{Tokens.MethodDeclarationId}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for child method state creation /// public static readonly TemplateString Create_ChildMethod = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} child Method node child component. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent, bool forInstance = false) { var state = {{Tokens.StateClassFactory}}(parent); state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.NodeId = {{Tokens.NodeIdConstant}}; {{Tokens.MethodDeclarationId}} state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); state.NumericId = {{Tokens.NumericIdValue}}; {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; state.Executable = {{Tokens.ExecutableValue}}; state.UserExecutable = {{Tokens.ExecutableValue}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} if (forInstance) { {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} } {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for child object state creation /// public static readonly TemplateString Create_ChildObject_Placeholder = TemplateString.Parse( $$""" /// /// Creates an instance of the {{Tokens.SymbolicName}} object placeholder child. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent, global::Opc.Ua.QualifiedName browseName = default, bool forInstance = false) { var state = {{Tokens.StateClassFactory}}(parent); state.NodeId = {{Tokens.NodeIdConstant}}; if (!browseName.IsNull) { state.SymbolicName = browseName.Name; state.BrowseName = browseName; state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name); forInstance = true; } else { // Create the state for the type parent state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); } state.NumericId = {{Tokens.NumericIdValue}}; {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; state.EventNotifier = {{Tokens.EventNotifier}}; {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for child variable state creation /// public static readonly TemplateString Create_ChildVariable_Placeholder = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} child Variable object placeholder child. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent, global::Opc.Ua.QualifiedName browseName = default, bool forInstance = false) { var state = {{Tokens.StateClassFactory}}(parent); state.NodeId = {{Tokens.NodeIdConstant}}; if (!browseName.IsNull) { state.SymbolicName = browseName.Name; state.BrowseName = browseName; state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name); forInstance = true; } else { // Create the state for the type parent state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); } state.NumericId = {{Tokens.NumericIdValue}}; {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.TypeDefinitionId = {{Tokens.TypeDefinitionId}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; {{Tokens.ModellingRuleId}} state.DataType = {{Tokens.DataTypeIdConstant}}; state.ValueRank = {{Tokens.ValueRank}}; {{Tokens.ArrayDimensions}} state.AccessLevel = {{Tokens.AccessLevelValue}}; state.UserAccessLevel = {{Tokens.UserAccessLevelValue}}; state.MinimumSamplingInterval = {{Tokens.MinimumSamplingIntervalValue}}; state.Historizing = {{Tokens.HistorizingValue}}; {{Tokens.ValueCode}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for child method state creation /// public static readonly TemplateString Create_ChildMethod_Placeholder = TemplateString.Parse( $$""" /// /// Creates the {{Tokens.SymbolicName}} child Method object placeholder child. /// internal static {{Tokens.StateClassName}} Create{{Tokens.SymbolicId}}( this global::Opc.Ua.ISystemContext context, global::Opc.Ua.NodeState parent, global::Opc.Ua.QualifiedName browseName = default, bool forInstance = false) { var state = {{Tokens.StateClassFactory}}(parent); state.NodeId = {{Tokens.NodeIdConstant}}; if (!browseName.IsNull) { state.SymbolicName = browseName.Name; state.BrowseName = browseName; state.DisplayName = new global::Opc.Ua.LocalizedText(browseName.Name); forInstance = true; } else { // Create the state for the type parent state.SymbolicName = {{Tokens.SymbolicNameSymbol}}; state.BrowseName = new global::Opc.Ua.QualifiedName( {{Tokens.BrowseNameSymbol}}, context.NamespaceUris.GetIndexOrAppend({{Tokens.BrowseNameNamespaceUri}})); state.DisplayName = new global::Opc.Ua.LocalizedText( {{Tokens.DisplayName}}); } state.NumericId = {{Tokens.NumericIdValue}}; {{Tokens.DescriptionValue}} state.WriteMask = {{Tokens.WriteMaskValue}}; state.UserWriteMask = {{Tokens.UserWriteMaskValue}}; state.ReferenceTypeId = {{Tokens.ReferenceTypeId}}; state.Executable = {{Tokens.ExecutableValue}}; state.UserExecutable = {{Tokens.ExecutableValue}}; {{Tokens.MethodDeclarationId}} {{Tokens.ReleaseStatusValue}} {{Tokens.CategoriesValue}} {{Tokens.SpecificationValue}} {{Tokens.AccessRestrictionsValue}} {{Tokens.ListOfRolePermissions}} {{Tokens.ListOfReferences}} {{Tokens.ListOfChildNodeStates}} if (!forInstance) { {{Tokens.ModellingRuleId}} {{Tokens.ListOfOptionalChildNodeStates}} } return state; } """); /// /// Template for role permissions collection initialization /// public static readonly TemplateString ListOfRolePermissions = TemplateString.Parse( $$""" state.RolePermissions = new global::Opc.Ua.RolePermissionType[] { {{Tokens.ListOfRolePermissions}} }; """); /// /// Template for role permission /// public static readonly TemplateString RolePermission = TemplateString.Parse( $$""" new global::Opc.Ua.RolePermissionType { RoleId = {{Tokens.RoleIdConstant}}, Permissions = {{Tokens.PermissionsValue}} }, """); /// /// Template for description assignment /// public static readonly TemplateString Description = TemplateString.Parse( $$""" state.Description = new global::Opc.Ua.LocalizedText({{Tokens.DescriptionValue}}); """); /// /// Template for inverse name assignment /// public static readonly TemplateString InverseName = TemplateString.Parse( $$""" state.InverseName = new global::Opc.Ua.LocalizedText({{Tokens.InverseNameValue}}); """); /// /// Template for release status assignment /// public static readonly TemplateString ReleaseStatus = TemplateString.Parse( $$""" state.ReleaseStatus = {{Tokens.ReleaseStatusValue}}; """); /// /// Template for categories assignment /// public static readonly TemplateString Categories = TemplateString.Parse( $$""" state.Categories = {{Tokens.CategoriesValue}}; """); /// /// Template for specification assignment /// public static readonly TemplateString Specification = TemplateString.Parse( $$""" state.Specification = {{Tokens.SpecificationValue}}; """); /// /// Template for access restrictions assignment /// public static readonly TemplateString AccessRestrictions = TemplateString.Parse( $$""" state.AccessRestrictions = {{Tokens.AccessRestrictionsValue}}; """); /// /// Template for method declaration id assignment /// public static readonly TemplateString MethodDeclarationId = TemplateString.Parse( $$""" state.MethodDeclarationId = {{Tokens.MethodDeclarationId}}; """); /// /// Template for array dimensions assignment /// public static readonly TemplateString ArrayDimensions = TemplateString.Parse( $$""" state.ArrayDimensions = {{Tokens.ArrayDimensions}}; """); /// /// Template for value assignment /// public static readonly TemplateString VariantArrayOfValue = TemplateString.Parse( $$""" state.WrappedValue = global::Opc.Ua.Variant.FromStructure( global::Opc.Ua.ArrayOf.ToArrayOf(new {{Tokens.DataType}}[] { {{Tokens.ListOfValues}} })); """); /// /// Template for value assignment /// public static readonly TemplateString ArgumentValue = TemplateString.Parse( $$""" new global::Opc.Ua.Argument { Name = {{Tokens.Name}}, DataType = {{Tokens.DataType}}, ValueRank = {{Tokens.ValueRank}}, ArrayDimensions = {{Tokens.ArrayDimensions}}, Description = {{Tokens.Description}} }, """); } }