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