internal TcAdsDataType(string name, string elementType, uint elementSize, AdsDatatypeArrayInfo[] dims, IDataTypeResolver resolver) : this(name, AdsDatatypeId.ADST_BIGTYPE, 0, AdsDataTypeFlags.DataType, DataTypeCategory.Array, elementType, null, resolver) { if (dims == null) { throw new ArgumentNullException("dims"); } this._arrayInfo = dims; this._size = (uint)(AdsArrayDimensionsInfo.GetArrayElementCount(dims) * elementSize); this._baseTypeName = elementType; if (string.IsNullOrEmpty(this._baseTypeName)) { string message = $"Base type of ARRAY '{name}' not defined!"; Module.Trace.TraceWarning(message); } }
internal void WriteArray(object value, ITcAdsDataType arrayType, AdsBinaryWriter writer, int writerOffset) { Array array = value as Array; if (array == null) { throw new ArgumentException($"Cannot convert data type of symbol to this type. Expected an array, actual type is {value.GetType()}", "type"); } AdsDatatypeArrayInfo[] arrayInfo = ((TcAdsDataType)arrayType).ArrayInfo; checkArrayDimensions(array, arrayInfo, false); AdsArrayDimensionsInfo info = new AdsArrayDimensionsInfo(arrayInfo); int elements = info.Elements; int byteSize = arrayType.ByteSize / elements; DataTypeCategory category = arrayType.BaseType.Category; int num3 = 0; foreach (int[] numArray in new ArrayIndexIterator(info.LowerBounds, info.UpperBounds, true)) { if ((array.Rank == 1) && (num3 >= array.Length)) { break; } if (category == DataTypeCategory.Primitive) { this.WritePrimitiveValue(arrayType.BaseType.Name, array.GetValue(numArray), ((TcAdsDataType)arrayType.BaseType).ManagedType, arrayType.DataTypeId, byteSize, writer, writerOffset); } else if (category == DataTypeCategory.Enum) { this.WriteEnumValue(arrayType.BaseType.Name, array.GetValue(numArray), (TcAdsDataType)arrayType, writer, writerOffset); } else if (category == DataTypeCategory.Struct) { this.WriteStruct(array.GetValue(numArray), arrayType.BaseType.SubItems, writer, writerOffset); } else { if (category != DataTypeCategory.Array) { throw new ArgumentException("Cannot convert ads array type of symbol to this type.", "type"); } this.WriteArray(array.GetValue(numArray), arrayType.BaseType, writer, writerOffset); } writerOffset += byteSize; num3++; } }
internal int InitializeArray(Type managedType, TcAdsDataType adsType, AdsBinaryReader reader, int readerOffset, int jagLevel, out object value) { int num2; if (managedType == null) { throw new ArgumentNullException("managedType"); } if (adsType == null) { throw new ArgumentNullException("adsType"); } if (reader == null) { throw new ArgumentNullException("reader"); } int num = readerOffset; if (!managedType.IsArray) { throw new ArgumentException($"Cannot convert datatype of symbol to this type. Expected an array, actual type is {managedType.ToString()}", "type"); } Type elementType = managedType.GetElementType(); AdsDatatypeArrayInfo[] arrayInfo = adsType.ArrayInfo; Type baseElementType = null; bool flag = PrimitiveTypeConverter.TryJaggedArray(managedType, out num2, out baseElementType); int arrayElementCount = AdsArrayDimensionsInfo.GetArrayElementCount(arrayInfo); int byteLength = adsType.ByteSize / arrayElementCount; if (flag) { if (arrayInfo.Length != 1) { throw new ArgumentException($"Cannot convert datatype of symbol to this type. Expected an array rank of {arrayInfo.Length}, actual rank is {num2}", "type"); } } else { int length = arrayInfo.Length; if (length != managedType.GetArrayRank()) { throw new ArgumentException($"Cannot convert datatype of symbol to this type. Expected an array rank of {length}, actual rank is {managedType.GetArrayRank()}", "type"); } } AdsArrayDimensionsInfo info = new AdsArrayDimensionsInfo(arrayInfo); Array array = null; if (flag) { jagLevel++; array = Array.CreateInstance(elementType, info.DimensionElements[jagLevel]); int[] lowerBounds = new int[] { info.LowerBounds[jagLevel] }; int[] upperBounds = new int[] { info.UpperBounds[jagLevel] }; foreach (int[] numArray in new ArrayIndexIterator(lowerBounds, upperBounds, true)) { object obj2 = null; readerOffset += this.InitializeArray(elementType, (TcAdsDataType)adsType.BaseType, reader, readerOffset, jagLevel, out obj2); array.SetValue(obj2, numArray); } } else { DataTypeCategory category = adsType.BaseType.Category; array = Array.CreateInstance(elementType, info.DimensionElements); foreach (int[] numArray2 in new ArrayIndexIterator(info.LowerBounds, info.UpperBounds, true)) { object obj3 = null; if (category == DataTypeCategory.Primitive) { if (elementType != ((TcAdsDataType)adsType.BaseType).ManagedType) { throw new ArgumentException("Cannot convert data type of symbol to this type.", "type"); } readerOffset += this.InitializePrimitiveType(adsType.BaseType.Name, elementType, adsType.DataTypeId, byteLength, reader, readerOffset, out obj3); array.SetValue(obj3, numArray2); continue; } if (category == DataTypeCategory.Enum) { if (elementType != ((TcAdsDataType)adsType.BaseType).ManagedType) { throw new ArgumentException("Cannot convert data type of symbol to this type.", "type"); } readerOffset += this.InitializeEnum(adsType.BaseType.Name, elementType, adsType.DataTypeId, byteLength, reader, readerOffset, out obj3); array.SetValue(obj3, numArray2); continue; } if (adsType.BaseType.Category == DataTypeCategory.Struct) { readerOffset += this.InitializeStruct(adsType.BaseType.SubItems, elementType, reader, readerOffset, out obj3); array.SetValue(obj3, numArray2); continue; } if (adsType.BaseType.Category == DataTypeCategory.Array) { readerOffset += this.InitializeArray(elementType, (TcAdsDataType)adsType.BaseType, reader, readerOffset, jagLevel, out obj3); array.SetValue(obj3, numArray2); } } } value = array; return(readerOffset - num); }