public void WriteVariantContents(object value, TypeInfo typeInfo)
{
// check for null.
if (value == null)
{
m_writer.WriteStartElement("Null", Namespaces.OpcUaXsd);
m_writer.WriteEndElement();
return;
}
try
{
PushNamespace(Namespaces.OpcUaXsd);
// write scalar.
if (typeInfo.ValueRank < 0)
{
switch (typeInfo.BuiltInType)
{
case BuiltInType.Boolean: { WriteBoolean("Boolean", (bool)value); return; }
case BuiltInType.SByte: { WriteSByte("SByte", (sbyte)value); return; }
case BuiltInType.Byte: { WriteByte("Byte", (byte)value); return; }
case BuiltInType.Int16: { WriteInt16("Int16", (short)value); return; }
case BuiltInType.UInt16: { WriteUInt16("UInt16", (ushort)value); return; }
case BuiltInType.Int32: { WriteInt32("Int32", (int)value); return; }
case BuiltInType.UInt32: { WriteUInt32("UInt32", (uint)value); return; }
case BuiltInType.Int64: { WriteInt64("Int64", (long)value); return; }
case BuiltInType.UInt64: { WriteUInt64("UInt64", (ulong)value); return; }
case BuiltInType.Float: { WriteFloat("Float", (float)value); return; }
case BuiltInType.Double: { WriteDouble("Double", (double)value); return; }
case BuiltInType.String: { WriteString("String", (string)value); return; }
case BuiltInType.DateTime: { WriteDateTime("DateTime", (DateTime)value); return; }
case BuiltInType.Guid: { WriteGuid("Guid", (Uuid)value); return; }
case BuiltInType.ByteString: { WriteByteString("ByteString", (byte[])value); return; }
case BuiltInType.XmlElement: { WriteXmlElement("XmlElement", (XmlElement)value); return; }
case BuiltInType.NodeId: { WriteNodeId("NodeId", (NodeId)value); return; }
case BuiltInType.ExpandedNodeId: { WriteExpandedNodeId("ExpandedNodeId", (ExpandedNodeId)value); return; }
case BuiltInType.StatusCode: { WriteStatusCode("StatusCode", (StatusCode)value); return; }
case BuiltInType.QualifiedName: { WriteQualifiedName("QualifiedName", (QualifiedName)value); return; }
case BuiltInType.LocalizedText: { WriteLocalizedText("LocalizedText", (LocalizedText)value); return; }
case BuiltInType.ExtensionObject: { WriteExtensionObject("ExtensionObject", (ExtensionObject)value); return; }
case BuiltInType.DataValue: { WriteDataValue("DataValue", (DataValue)value); return; }
case BuiltInType.Enumeration: { WriteInt32("Int32", (int)value); return; }
}
}
// write array.
else if (typeInfo.ValueRank <= 1)
{
switch (typeInfo.BuiltInType)
{
case BuiltInType.Boolean: { WriteBooleanArray("ListOfBoolean", (bool[])value); return; }
case BuiltInType.SByte: { WriteSByteArray("ListOfSByte", (sbyte[])value); return; }
case BuiltInType.Byte: { WriteByteArray("ListOfByte", (byte[])value); return; }
case BuiltInType.Int16: { WriteInt16Array("ListOfInt16", (short[])value); return; }
case BuiltInType.UInt16: { WriteUInt16Array("ListOfUInt16", (ushort[])value); return; }
case BuiltInType.Int32: { WriteInt32Array("ListOfInt32", (int[])value); return; }
case BuiltInType.UInt32: { WriteUInt32Array("ListOfUInt32", (uint[])value); return; }
case BuiltInType.Int64: { WriteInt64Array("ListOfInt64", (long[])value); return; }
case BuiltInType.UInt64: { WriteUInt64Array("ListOfUInt64", (ulong[])value); return; }
case BuiltInType.Float: { WriteFloatArray("ListOfFloat", (float[])value); return; }
case BuiltInType.Double: { WriteDoubleArray("ListOfDouble", (double[])value); return; }
case BuiltInType.String: { WriteStringArray("ListOfString", (string[])value); return; }
case BuiltInType.DateTime: { WriteDateTimeArray("ListOfDateTime", (DateTime[])value); return; }
case BuiltInType.Guid: { WriteGuidArray("ListOfGuid", (Uuid[])value); return; }
case BuiltInType.ByteString: { WriteByteStringArray("ListOfByteString", (byte[][])value); return; }
case BuiltInType.XmlElement: { WriteXmlElementArray("ListOfXmlElement", (XmlElement[])value); return; }
case BuiltInType.NodeId: { WriteNodeIdArray("ListOfNodeId", (NodeId[])value); return; }
case BuiltInType.ExpandedNodeId: { WriteExpandedNodeIdArray("ListOfExpandedNodeId", (ExpandedNodeId[])value); return; }
case BuiltInType.StatusCode: { WriteStatusCodeArray("ListOfStatusCode", (StatusCode[])value); return; }
case BuiltInType.QualifiedName: { WriteQualifiedNameArray("ListOfQualifiedName", (QualifiedName[])value); return; }
case BuiltInType.LocalizedText: { WriteLocalizedTextArray("ListOfLocalizedText", (LocalizedText[])value); return; }
case BuiltInType.ExtensionObject: { WriteExtensionObjectArray("ListOfExtensionObject", (ExtensionObject[])value); return; }
case BuiltInType.DataValue: { WriteDataValueArray("ListOfDataValue", (DataValue[])value); return; }
case BuiltInType.Enumeration:
{
Enum[] enums = value as Enum[];
int[] ints = new int[enums.Length];
for (int ii = 0; ii < enums.Length; ii++)
{
ints[ii] = (int)(object)enums[ii];
}
WriteInt32Array("ListOfInt32", ints);
return;
}
case BuiltInType.Variant:
{
Variant[] variants = value as Variant[];
if (variants != null)
{
WriteVariantArray("ListOfVariant", variants);
return;
}
object[] objects = value as object[];
if (objects != null)
{
WriteObjectArray("ListOfVariant", objects);
return;
}
throw ServiceResultException.Create(
StatusCodes.BadEncodingError,
"Unexpected type encountered while encoding an array of Variants: {0}",
value.GetType());
}
}
}
// write matrix.
else if (typeInfo.ValueRank > 1)
{
WriteMatrix("Matrix", (Matrix)value);
return;
}
// oops - should never happen.
throw new ServiceResultException(
StatusCodes.BadEncodingError,
Utils.Format("Type '{0}' is not allowed in an Variant.", value.GetType().FullName));
}
finally
{
PopNamespace();
}
}