private void WriteUnionHeader(IndentedTextWriter writer, ClassDefinition c, string name) { writer.WriteLine($"public sealed class {name} : Workstation.ServiceModel.Ua.Union"); }
public bool ParentHasOptionalProperties(ClassDefinition c) { var p = Definitions.OfType <ClassDefinition>().FirstOrDefault(d => d.DataTypeId == c.ParentDataTypeId); return(p != null && (p.OptionalPropertyCount != 0 || ParentHasOptionalProperties(p))); }
private void WriteDecodeMethod(IndentedTextWriter writer, ClassDefinition c, bool isDerived, bool parentIsStructure, bool parentHasOptionalFields) { var hasOptionalFields = c.OptionalPropertyCount != 0; var modifier = isDerived ? "override" : "virtual"; WriteInheritDoc(writer); writer.WriteLine($"public {modifier} void Decode(Workstation.ServiceModel.Ua.IDecoder decoder)"); writer.Begin("{"); if (hasOptionalFields && parentHasOptionalFields) { writer.WriteLine("int offset = base.OptionalFieldCount;"); writer.WriteLine(); } if (isDerived && !parentIsStructure) { writer.WriteLine("base.Decode(decoder);"); } writer.WriteLine($"decoder.PushNamespace({ToStringLiteral(c.Namespace)});"); writer.WriteLine(); if (hasOptionalFields) { if (!parentHasOptionalFields) { writer.WriteLine("var encodingMask = decoder.ReadUInt32(null);"); writer.WriteLine("EncodingMask = encodingMask;"); } else { writer.WriteLine("var encodingMask = EncodingMask;"); } writer.WriteLine(); } var index = 0; foreach (var p in c.Properties) { var netType = _typeSet.GetNetType(p.DataTypeId); var suffix = RenderMethodSuffix(netType, p.Rank); var type = RenderType(p, isOptional: true); if (p.IsOptional) { if (parentHasOptionalFields) { writer.WriteLine($"{p.SymbolicName} = (encodingMask & (1u << ({index} + offset))) != 0"); } else { writer.WriteLine($"{p.SymbolicName} = (encodingMask & (1u << {index})) != 0"); } writer.Indent++; writer.WriteLine($"? decoder.Read{suffix}({ToStringLiteral(p.OpcUaName)})"); writer.WriteLine($": default({type});"); writer.Indent--; index++; } else { writer.WriteLine($"{p.SymbolicName} = decoder.Read{suffix}({ToStringLiteral(p.OpcUaName)});"); } } writer.WriteLine(); writer.WriteLine("decoder.PopNamespace();"); writer.End("}"); }