public virtual int encodeSet(object obj, Stream stream, ElementInfo elementInfo) { int resultSize = 0; PropertyInfo[] fields = null; if (elementInfo.hasPreparedInfo()) { fields = elementInfo.getProperties(obj.GetType()); } else { SortedList <int, PropertyInfo> fieldOrder = CoderUtils.getSetOrder(obj.GetType()); //TO DO Performance optimization need (unnecessary copy) fields = new PropertyInfo[fieldOrder.Count]; fieldOrder.Values.CopyTo(fields, 0); } resultSize += encodeSequencePreamble(obj, fields, stream, elementInfo); int fieldIdx = 0; foreach (PropertyInfo field in fields) { resultSize += encodeSequenceField(obj, fieldIdx++, field, stream, elementInfo); } return(resultSize); }
public override DecodedObject <object> decodeSequence(DecodedObject <object> decodedTag, Type objectClass, ElementInfo elementInfo, Stream stream) { BitArrayInputStream bitStream = (BitArrayInputStream)stream; int preambleLen = getSequencePreambleBitLen(objectClass, elementInfo); int preamble = bitStream.readBits(preambleLen); int preambleCurrentBit = 32 - preambleLen; skipAlignedBits(stream); object sequence = createInstanceForElement(objectClass, elementInfo); initDefaultValues(sequence); ElementInfo info = new ElementInfo(); int idx = 0; PropertyInfo[] fields = null; if (!CoderUtils.isSequenceSet(elementInfo) || elementInfo.hasPreparedInfo()) { fields = elementInfo.getProperties(objectClass); } else { SortedList <int, PropertyInfo> fieldOrder = CoderUtils.getSetOrder(sequence.GetType()); fields = new PropertyInfo[fieldOrder.Values.Count]; fieldOrder.Values.CopyTo(fields, 0); } foreach (PropertyInfo field in fields) { if (elementInfo.hasPreparedInfo()) { info.PreparedInfo = elementInfo.PreparedInfo.getPropertyMetadata(idx); } if (CoderUtils.isOptionalField(field, info)) { if ((preamble & (0x80000000 >> preambleCurrentBit)) != 0) { decodeSequenceField(null, sequence, idx, field, stream, elementInfo, true); } preambleCurrentBit++; } else { decodeSequenceField(null, sequence, idx, field, stream, elementInfo, true); } idx++; } return(new DecodedObject <object>(sequence)); /* } * else * return decodeSet(decodedTag, objectClass, elementInfo, stream);*/ }
public override int encodeSequence(Object obj, Stream stream, ElementInfo elementInfo) { if (!CoderUtils.isSequenceSet(elementInfo)) { return(base.encodeSequence(obj, stream, elementInfo)); } else { int resultSize = 0; PropertyInfo[] fields = null; if (elementInfo.hasPreparedInfo()) { fields = elementInfo.getProperties(obj.GetType()); } else { SortedList <int, PropertyInfo> fieldOrder = CoderUtils.getSetOrder(obj.GetType()); //TO DO Performance optimization need (unnecessary copy) fields = new PropertyInfo[fieldOrder.Count]; fieldOrder.Values.CopyTo(fields, 0); } for (int i = 0; i < fields.Length; i++) { PropertyInfo field = fields[fields.Length - 1 - i]; resultSize += encodeSequenceField(obj, fields.Length - 1 - i, field, stream, elementInfo); } resultSize += encodeHeader( BERCoderUtils.getTagValueForElement( elementInfo, TagClasses.Universal, ElementType.Constructed, UniversalTags.Set) , resultSize, stream); return(resultSize); } }