Пример #1
0
        public override DecodedObject <object> decodeSequenceOf(DecodedObject <object> decodedTag, Type objectClass, ElementInfo elementInfo, Stream stream)
        {
            Type   paramType         = (Type)objectClass.GetGenericArguments()[0];
            Type   collectionType    = typeof(List <>);
            Type   genCollectionType = collectionType.MakeGenericType(paramType);
            Object param             = Activator.CreateInstance(genCollectionType);

            int countOfElements = decodeLength(elementInfo, stream);

            MethodInfo method = param.GetType().GetMethod("Add");

            for (int i = 0; i < countOfElements; i++)
            {
                ElementInfo elementItemInfo = new ElementInfo();
                elementItemInfo.ParentAnnotatedClass = elementInfo.AnnotatedClass;
                elementItemInfo.AnnotatedClass       = paramType;
                if (elementInfo.hasPreparedInfo())
                {
                    ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                    elementItemInfo.PreparedInfo = seqOfMeta.getItemClassMetadata();
                }
                else
                {
                    elementItemInfo.ASN1ElementInfo = null;
                }

                DecodedObject <object> item = decodeClassType(null, paramType, elementItemInfo, stream);
                if (item != null)
                {
                    method.Invoke(param, new[] { item.Value });
                }
            }

            return(new DecodedObject <object>(param));
        }
Пример #2
0
        public override DecodedObject <object> decodeSequenceOf(DecodedObject <object> decodedTag, System.Type objectClass, ElementInfo elementInfo, System.IO.Stream stream)
        {
            if (!CoderUtils.isSequenceSetOf(elementInfo))
            {
                if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Constructed, UniversalTags.Sequence, elementInfo))
                {
                    return(null);
                }
            }
            else
            {
                if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Constructed, UniversalTags.Set, elementInfo))
                {
                    return(null);
                }
            }

            Type   paramType         = (System.Type)objectClass.GetGenericArguments()[0];
            Type   collectionType    = typeof(List <>);
            Type   genCollectionType = collectionType.MakeGenericType(paramType);
            Object param             = Activator.CreateInstance(genCollectionType);

            DecodedObject <int> len = decodeLength(stream);

            if (len.Value != 0)
            {
                int lenOfItems = 0;
                int itemsCnt   = 0;
                do
                {
                    ElementInfo info = new ElementInfo();
                    info.ParentAnnotatedClass = elementInfo.AnnotatedClass;
                    info.AnnotatedClass       = paramType;

                    if (elementInfo.hasPreparedInfo())
                    {
                        ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                        info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                    }

                    DecodedObject <object> itemTag = decodeTag(stream);
                    DecodedObject <object> item    = decodeClassType(itemTag, paramType, info, stream);
                    MethodInfo             method  = param.GetType().GetMethod("Add");
                    if (item != null)
                    {
                        lenOfItems += item.Size + itemTag.Size;
                        method.Invoke(param, new object[] { item.Value });
                        itemsCnt++;
                    }
                }while (lenOfItems < len.Value);
                CoderUtils.checkConstraints(itemsCnt, elementInfo);
            }
            return(new DecodedObject <object>(param, len.Value + len.Size));
        }
Пример #3
0
        public override int encodeSequenceOf(object obj, System.IO.Stream stream, ElementInfo elementInfo)
        {
            int    resultSize = 0;
            string s          = "";

            if (elementInfo.hasPreparedInfo() && elementInfo.hasPreparedASN1ElementInfo())
            {
                s = elementInfo.PreparedASN1ElementInfo.Name;
            }
            if (s == "")
            {
                s = "unnamedSequenceOf" + unknown.ToString("D3");
                unknown++;
            }
            resultSize += printString(stream, "<" + s + " type=\"SequenceOf\">\r\n");
            indent     += indOfs;
            System.Collections.IList collection = (System.Collections.IList)obj;
            CoderUtils.checkConstraints(collection.Count, elementInfo);

            int sizeOfCollection = 0;

            //for (int i = 0; i < collection.Count; i++)
            for (int i = collection.Count - 1; i >= 0; i--)
            {
                object      item = collection[collection.Count - 1 - i];
                ElementInfo info = new ElementInfo();
                info.AnnotatedClass       = item.GetType();
                info.ParentAnnotatedClass = elementInfo.AnnotatedClass;

                if (elementInfo.hasPreparedInfo() && elementInfo.PreparedInfo.TypeMetadata != null)
                {
                    ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                    info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                }

                sizeOfCollection += encodeClassType(item, stream, info);
            }
            resultSize += sizeOfCollection;
            indent     -= indOfs;
            resultSize += printString(stream, "</" + s + ">\r\n");
            return(resultSize);
        }
Пример #4
0
        public override int encodeSequenceOf(object obj, Stream stream, ElementInfo elementInfo)
        {
            IList collection = (IList)obj;
            int   resultSize = encodeLength(collection.Count, elementInfo, stream);

            for (int i = 0; i < collection.Count; i++)
            {
                object      itemObj = collection[i];
                ElementInfo info    = new ElementInfo();
                info.AnnotatedClass       = itemObj.GetType();
                info.ParentAnnotatedClass = elementInfo.AnnotatedClass;

                if (elementInfo.hasPreparedInfo())
                {
                    ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                    info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                }

                resultSize += encodeClassType(itemObj, stream, info);
            }
            return(resultSize);
        }
Пример #5
0
        public override int encodeSequenceOf(object obj, Stream stream, ElementInfo elementInfo)
        {
            int   resultSize = 0;
            IList collection = (IList)obj;

            CoderUtils.checkConstraints(collection.Count, elementInfo);

            int sizeOfCollection = 0;

            for (int i = 0; i < collection.Count; i++)
            {
                object      item = collection[collection.Count - 1 - i];
                ElementInfo info = new ElementInfo();
                info.AnnotatedClass       = item.GetType();
                info.ParentAnnotatedClass = elementInfo.AnnotatedClass;

                if (elementInfo.hasPreparedInfo())
                {
                    ASN1SequenceOfMetadata seqOfMeta = (ASN1SequenceOfMetadata)elementInfo.PreparedInfo.TypeMetadata;
                    info.PreparedInfo = (seqOfMeta.getItemClassMetadata());
                }

                sizeOfCollection += encodeClassType(item, stream, info);
            }
            resultSize += sizeOfCollection;
            resultSize += encodeLength(sizeOfCollection, stream);

            if (!CoderUtils.isSequenceSetOf(elementInfo))
            {
                resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Constructed, UniversalTags.Sequence), stream);
            }
            else
            {
                resultSize += encodeTag(BERCoderUtils.getTagValueForElement(elementInfo, TagClasses.Universal, ElementType.Constructed, UniversalTags.Set), stream);
            }
            return(resultSize);
        }