Example #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);
     }
 }
Example #2
0
        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++;
            }
        }
Example #3
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);
        }