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) { int resultSize = 0; if (!CoderUtils.isSequenceSet(elementInfo)) { resultSize += encodeSequencePreamble(obj, elementInfo.getProperties(obj.GetType()), stream, elementInfo); resultSize += base.encodeSequence(obj, stream, elementInfo); } else { resultSize += encodeSet(obj, stream, elementInfo); } return(resultSize); }
public override DecodedObject <object> decodeSequence(DecodedObject <object> decodedTag, System.Type objectClass, ElementInfo elementInfo, System.IO.Stream stream) { bool isSet = false; if (!CoderUtils.isSequenceSet(elementInfo)) { if (!checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Constructed, UniversalTags.Sequence, elementInfo)) { return(null); } } else { if (checkTagForObject(decodedTag, TagClasses.Universal, ElementType.Constructed, UniversalTags.Set, elementInfo)) { isSet = true; } else { return(null); } } DecodedObject <int> len = decodeLength(stream); int saveMaxAvailableLen = elementInfo.MaxAvailableLen; elementInfo.MaxAvailableLen = (len.Value); DecodedObject <object> result = null; if (!isSet) { result = base.decodeSequence(decodedTag, objectClass, elementInfo, stream); } else { result = decodeSet(decodedTag, objectClass, elementInfo, len.Value, stream); } if (result.Size != len.Value) { throw new System.ArgumentException("Sequence '" + objectClass.ToString() + "' size is incorrect!"); } result.Size = result.Size + len.Size; elementInfo.MaxAvailableLen = (saveMaxAvailableLen); return(result); }
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); } }