Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 60 additions & 4 deletions Opc.Ua.ModelCompiler/ModelGenerator2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3861,6 +3861,14 @@ private bool WriteTemplate_ListOfTypes(Template template, Context context)
new LoadTemplateEventHandler(LoadTemplate_ListOfEncodingMaskFields),
null);

AddTemplate(
template,
"// EncodingMaskProperty",
TemplatePath + "Version2.EncodingMaskProperty.cs",
new DataTypeDesign[] { dataType },
new LoadTemplateEventHandler(LoadTemplate_EncodingMaskProperty),
new WriteTemplateEventHandler(WriteTemplate_EncodingMaskProperty));

AddTemplate(
template,
"// ListOfEncodedFields",
Expand Down Expand Up @@ -4646,7 +4654,7 @@ private string LoadTemplate_ListOfEncodedFields(Template template, Context conte

if (field.IsOptional)
{
template.Write($"if ((EncodingMask & (uint){dataType.ClassName}Fields.{field.Name}) != 0) ");
template.Write($"if ((EncodingMask & {dataType.ClassName}Fields.{field.Name}) != 0) ");
}

string functionName = field.DataTypeNode.BasicDataType.ToString();
Expand Down Expand Up @@ -4817,7 +4825,7 @@ private string LoadTemplate_ListOfDecodedFields(Template template, Context conte

if (field.IsOptional)
{
template.Write($"if ((EncodingMask & (uint){dataType.ClassName}Fields.{field.Name}) != 0) ");
template.Write($"if ((EncodingMask & {dataType.ClassName}Fields.{field.Name}) != 0) ");
}

string functionName = field.DataTypeNode.BasicDataType.ToString();
Expand Down Expand Up @@ -4975,7 +4983,7 @@ private string LoadTemplate_ListOfComparedFields(Template template, Context cont

if (field.IsOptional)
{
template.Write($"if ((EncodingMask & (uint){dataType.ClassName}Fields.{field.Name}) != 0) ");
template.Write($"if ((EncodingMask & {dataType.ClassName}Fields.{field.Name}) != 0) ");
}

template.Write("if (!Utils.IsEqual({0}, value.{0})) return false;", GetChildFieldName(field));
Expand Down Expand Up @@ -5010,7 +5018,7 @@ private string LoadTemplate_ListOfClonedFields(Template template, Context contex

if (field.IsOptional)
{
template.Write($"if ((EncodingMask & (uint){dataType.ClassName}Fields.{field.Name}) != 0) ");
template.Write($"if ((EncodingMask & {dataType.ClassName}Fields.{field.Name}) != 0) ");
}

template.Write("clone.{0} = ({1})Utils.Clone(this.{0});", GetChildFieldName(field), GetSystemTypeName(field.DataTypeNode, field.ValueRank));
Expand Down Expand Up @@ -5277,6 +5285,54 @@ private bool WriteTemplate_InitializeOptionalChildren(Template template, Context
}
#endregion

#region "// EncodingMaskProperty"

private string LoadTemplate_EncodingMaskProperty(Template template, Context context)
{
if (context.Target is not DataTypeDesign _)
{
return null;
}

return TemplatePath + "Version2.DataTypes.EncodingMaskProperty.cs";
}

private bool WriteTemplate_EncodingMaskProperty(Template template, Context context)
{
if (context.Target is not DataTypeDesign dataType)
{
return false;
}

template.AddReplacement("_hide_by_new_", IsFirstDataTypeWithOptionalFields(dataType) ? string.Empty : "new ");
template.AddReplacement("_ClassName_", dataType.ClassName);

var result = template.WriteTemplate(context);
template.WriteLine(string.Empty);

return result;
}

private static bool HasOptionalFields(DataTypeDesign dataType)
{
return dataType.Fields?.Any(field => field.IsOptional) ?? false;
}

private static bool HasOptionalFieldsInherited(DataTypeDesign dataType)
{
return dataType.BaseTypeNode is DataTypeDesign baseDataType
&& (HasOptionalFields(baseDataType) || HasOptionalFieldsInherited(baseDataType));
}

private static bool IsFirstDataTypeWithOptionalFields(DataTypeDesign dataType)
{
return dataType.IsStructure
&& HasOptionalFields(dataType)
&& !HasOptionalFieldsInherited(dataType);
}

#endregion

#region "// ListOfPropertiesForType and // ListOfProperties"
private string LoadTemplate_ListOfPropertiesForType(Template template, Context context)
{
Expand Down
2 changes: 2 additions & 0 deletions Opc.Ua.ModelCompiler/Opc.Ua.ModelCompiler.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
<Compile Remove="Templates\Version2\DataTypes\CollectionClass.cs" />
<Compile Remove="Templates\Version2\DataTypes\DerivedClass.cs" />
<Compile Remove="Templates\Version2\DataTypes\DerivedClassWithOptionalFields.cs" />
<Compile Remove="Templates\Version2\DataTypes\EncodingMaskProperty.cs" />
<Compile Remove="Templates\Version2\DataTypes\Enumeration.cs" />
<Compile Remove="Templates\Version2\DataTypes\EnumerationValue.cs" />
<Compile Remove="Templates\Version2\DataTypes\Property.cs" />
Expand Down Expand Up @@ -437,6 +438,7 @@
<EmbeddedResource Include="Templates\Version2\DataTypes\DerivedClassWithOptionalFields.cs" />
<EmbeddedResource Include="Templates\Version2\DataTypes\Enumeration.cs" />
<EmbeddedResource Include="Templates\Version2\DataTypes\EnumerationValue.cs" />
<EmbeddedResource Include="Templates\Version2\DataTypes\EncodingMaskProperty.cs" />
<EmbeddedResource Include="Templates\Version2\DataTypes\Property.cs" />
<EmbeddedResource Include="Templates\Version2\DataTypes\Union.cs" />
<EmbeddedResource Include="Templates\Version2\File.cs" />
Expand Down
1 change: 1 addition & 0 deletions Opc.Ua.ModelCompiler/Templates/Version2/ConstantsFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
*
* The complete license agreement can be found here:
* http://opcfoundation.org/License/MIT/1.00/
* <auto-generated/>
* ======================================================================*/

using System;
Expand Down
57 changes: 48 additions & 9 deletions Opc.Ua.ModelCompiler/Templates/Version2/DataTypes/Class.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,33 @@ namespace X {
[DataContract(Namespace = _XmlNamespaceUri_)]
public _IsAbstract_partial class _BrowseName_ : IEncodeable, IJsonEncodeable
{
#region Fields

private readonly ExpandedNodeId _typeId;
private readonly ExpandedNodeId _binaryEncodingId;
private readonly ExpandedNodeId _xmlEncodingId;
private readonly ExpandedNodeId _jsonEncodingId;

#endregion

#region Constructors
/// <remarks />
public _BrowseName_()
public _BrowseName_() : this(
DataTypeIds._BrowseName_,
ObjectIds._BrowseName__Encoding_DefaultBinary,
ObjectIds._BrowseName__Encoding_DefaultXml,
ObjectIds._BrowseName__Encoding_DefaultJson)
{
}

/// <remarks />
protected _BrowseName_(ExpandedNodeId typeId, ExpandedNodeId binaryEncodingId, ExpandedNodeId xmlEncodingId, ExpandedNodeId jsonEncodingId)
{
_typeId = typeId;
_binaryEncodingId = binaryEncodingId;
_xmlEncodingId = xmlEncodingId;
_jsonEncodingId = jsonEncodingId;

Initialize();
}

Expand All @@ -33,37 +56,53 @@ private void Initialize()

#region IEncodeable Members
/// <summary cref="IEncodeable.TypeId" />
public virtual ExpandedNodeId TypeId => DataTypeIds._BrowseName_;
ExpandedNodeId IEncodeable.TypeId => _typeId;

/// <summary cref="IEncodeable.BinaryEncodingId" />
public virtual ExpandedNodeId BinaryEncodingId => ObjectIds._BrowseName__Encoding_DefaultBinary;
ExpandedNodeId IEncodeable.BinaryEncodingId => _binaryEncodingId;

/// <summary cref="IEncodeable.XmlEncodingId" />
public virtual ExpandedNodeId XmlEncodingId => ObjectIds._BrowseName__Encoding_DefaultXml;
ExpandedNodeId IEncodeable.XmlEncodingId => _xmlEncodingId;

/// <summary cref="IJsonEncodeable.JsonEncodingId" />
public virtual ExpandedNodeId JsonEncodingId => ObjectIds._BrowseName__Encoding_DefaultJson;
ExpandedNodeId IJsonEncodeable.JsonEncodingId => _jsonEncodingId;

/// <summary cref="IEncodeable.Encode(IEncoder)" />
public virtual void Encode(IEncoder encoder)
void IEncodeable.Encode(IEncoder encoder)
{
encoder.PushNamespace(_XmlNamespaceUri_);

// ListOfEncodedFields
OnWriteEncodingMask(encoder);
OnEncodeFields(encoder);

encoder.PopNamespace();
}

protected virtual void OnWriteEncodingMask(IEncoder encoder) { }

protected virtual void OnEncodeFields(IEncoder encoder)
{
// ListOfEncodedFields
}

/// <summary cref="IEncodeable.Decode(IDecoder)" />
public virtual void Decode(IDecoder decoder)
void IEncodeable.Decode(IDecoder decoder)
{
decoder.PushNamespace(_XmlNamespaceUri_);

// ListOfDecodedFields
OnReadEncodingMask(decoder);
OnDecodeFields(decoder);

decoder.PopNamespace();
}

protected virtual void OnReadEncodingMask(IDecoder decoder) { }

protected virtual void OnDecodeFields(IDecoder decoder)
{
// ListOfDecodedFields
}

/// <summary cref="IEncodeable.IsEqual(IEncodeable)" />
public virtual bool IsEqual(IEncodeable encodeable)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,33 @@ public enum _ClassName_Fields : uint
[DataContract(Namespace = _XmlNamespaceUri_)]
public partial class _BrowseName_ : IEncodeable, IJsonEncodeable
{
#region Fields

private readonly ExpandedNodeId _typeId;
private readonly ExpandedNodeId _binaryEncodingId;
private readonly ExpandedNodeId _xmlEncodingId;
private readonly ExpandedNodeId _jsonEncodingId;

#endregion

#region Constructors
/// <remarks />
public _BrowseName_()
public _BrowseName_() : this(
DataTypeIds._BrowseName_,
ObjectIds._BrowseName__Encoding_DefaultBinary,
ObjectIds._BrowseName__Encoding_DefaultXml,
ObjectIds._BrowseName__Encoding_DefaultJson)
{
}

/// <remarks />
protected _BrowseName_(ExpandedNodeId typeId, ExpandedNodeId binaryEncodingId, ExpandedNodeId xmlEncodingId, ExpandedNodeId jsonEncodingId)
{
_typeId = typeId;
_binaryEncodingId = binaryEncodingId;
_xmlEncodingId = xmlEncodingId;
_jsonEncodingId = jsonEncodingId;

Initialize();
}

Expand All @@ -36,55 +59,75 @@ private void Initialize(StreamingContext context)

private void Initialize()
{
EncodingMask = (uint)_ClassName_Fields.None;
EncodingMask = _ClassName_Fields.None;
// ListOfFieldInitializers
}
#endregion

#region Public Properties
/// <remarks />
[DataMember(Name = "EncodingMask", IsRequired = true, Order = 0)]
public virtual uint EncodingMask { get; set; }
public _ClassName_Fields EncodingMask { get; set; }

// ListOfProperties
#endregion

#region IEncodeable Members
/// <summary cref="IEncodeable.TypeId" />
public virtual ExpandedNodeId TypeId => DataTypeIds._BrowseName_;
ExpandedNodeId IEncodeable.TypeId => _typeId;

/// <summary cref="IEncodeable.BinaryEncodingId" />
public virtual ExpandedNodeId BinaryEncodingId => ObjectIds._BrowseName__Encoding_DefaultBinary;
ExpandedNodeId IEncodeable.BinaryEncodingId => _binaryEncodingId;

/// <summary cref="IEncodeable.XmlEncodingId" />
public virtual ExpandedNodeId XmlEncodingId => ObjectIds._BrowseName__Encoding_DefaultXml;
ExpandedNodeId IEncodeable.XmlEncodingId => _xmlEncodingId;

/// <summary cref="IJsonEncodeable.JsonEncodingId" />
public virtual ExpandedNodeId JsonEncodingId => ObjectIds._BrowseName__Encoding_DefaultJson;
ExpandedNodeId IJsonEncodeable.JsonEncodingId => _jsonEncodingId;

/// <summary cref="IEncodeable.Encode(IEncoder)" />
public virtual void Encode(IEncoder encoder)
void IEncodeable.Encode(IEncoder encoder)
{
encoder.PushNamespace(_XmlNamespaceUri_);
encoder.WriteEncodingMask((uint)EncodingMask);

// ListOfEncodedFields
OnWriteEncodingMask(encoder);
OnEncodeFields(encoder);

encoder.PopNamespace();
}

protected virtual void OnWriteEncodingMask(IEncoder encoder)
{
encoder.WriteEncodingMask((uint)EncodingMask);
}

protected virtual void OnEncodeFields(IEncoder encoder)
{
// ListOfEncodedFields
}


/// <summary cref="IEncodeable.Decode(IDecoder)" />
public virtual void Decode(IDecoder decoder)
void IEncodeable.Decode(IDecoder decoder)
{
decoder.PushNamespace(_XmlNamespaceUri_);

EncodingMask = decoder.ReadEncodingMask(m_FieldNames);

// ListOfDecodedFields
OnReadEncodingMask(decoder);
OnDecodeFields(decoder);

decoder.PopNamespace();
}

protected virtual void OnReadEncodingMask(IDecoder decoder)
{
EncodingMask = (_ClassName_Fields)decoder.ReadEncodingMask(m_FieldNames);
}

protected virtual void OnDecodeFields(IDecoder decoder)
{
// ListOfDecodedFields
}

/// <summary cref="IEncodeable.IsEqual(IEncodeable)" />
public virtual bool IsEqual(IEncodeable encodeable)
{
Expand Down
Loading
Loading