public override DecodedObject <object> decodeObjectIdentifier(DecodedObject <object> decodedTag, Type objectClass, ElementInfo elementInfo, Stream stream) { DecodedObject <int> len = BERCoderUtils.decodeLength(stream); byte[] byteBuf = new byte[len.value]; stream.Read(byteBuf, 0, byteBuf.Length); string dottedDecimal = BERObjectIdentifier.Decode(byteBuf); return(new DecodedObject <object>(new ObjectIdentifier(dottedDecimal))); }
public override int encodeObjectIdentifier(Object obj, Stream stream, ElementInfo elementInfo) { ObjectIdentifier oid = (ObjectIdentifier)obj; int[] ia = oid.getIntArray(); byte[] buffer = BERObjectIdentifier.Encode(ia); if (buffer.Length < 1) { return(0); } int resultSize = 0; // size of tag resultSize += BERCoderUtils.encodeLength(buffer.Length, stream); stream.Write(buffer, 0, buffer.Length); resultSize += buffer.Length; // size of buffer return(resultSize); }
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); } }