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)); }
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); }