if ( tlv == null )
{
String msg = I18n.err( I18n.ERR_00007_TLV_NULL );
LOG.error( msg );
throw new DecoderException( msg );
}
int length = tlv.getLength();
// We will check the length here. What we must control is
// that the enclosing constructed TLV expected length is not
// exceeded by the current TLV.
TLV parentTLV = container.getParentTLV();
if ( IS_DEBUG )
{
LOG.debug( "Parent length : {}", getParentLength( parentTLV ) );
}
if ( parentTLV == null )
{
// This is the first TLV, so we can't check anything. We will
// just store this TLV as the root of the PDU
tlv.setExpectedLength( length );
container.setParentTLV( tlv );
if ( IS_DEBUG )
{
LOG.debug( "Root TLV[{}]", Integer.valueOf( length ) );
}
}
else
{
// We have a parent, so we will check that its expected length is
// not exceeded.
int expectedLength = parentTLV.getExpectedLength();
int currentLength = tlv.getSize();
if ( expectedLength < currentLength )
{
// The expected length is lower than the Value length of the
// current TLV. This is an error...
LOG.debug( "tlv[{}, {}]", Integer.valueOf( expectedLength ), Integer.valueOf( currentLength ) );
throw new DecoderException( I18n.err( I18n.ERR_00008_VALUE_LENGTH_ABOVE_EXPECTED_LENGTH, Integer
.valueOf( currentLength ), Integer.valueOf( expectedLength ) ) );
}
// deal with the particular case where expected length equal
// the current length, which means that the parentTLV has been