Ejemplo n.º 1
0
 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);
     }
 }
Ejemplo n.º 2
0
        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);
        }