public bool Parse( Stream input )
{
AVM1InstructionSequence bytecode;
_ParsingFailures = false;
_ClipEventFlags = new ClipEventFlags( this.Version );
_ClipEventFlags.Parse( input );
BinaryReader br = new BinaryReader( input );
_length = br.ReadUInt32();
_codeSize = _length;
if ( _ClipEventFlags.ClipEventKeyPress )
{
if ( 1 > _length )
{
throw new SwfFormatException( "ClipActionRecord length=0 but KeyCode indicated by ClipEventKeyPress" );
}
_KeyCode = br.ReadByte();
_codeSize--;
}
long before = br.BaseStream.Position;
try
{
bytecode = Helper.SwfCodeReader.GetCode( _codeSize, br, this.Version );
if ( br.BaseStream.Position != ( before + _codeSize ) )
{
throw new SwfFormatException( "ClipActionRecord code reader consumed more than length indicated (" +
( ( uint )( br.BaseStream.Position - before ) ).ToString() + " consumed, " +
_codeSize + " length)" );
}
}
catch ( AVM1ExceptionByteCodeFormat ave )
{
Log.Error(this, ave );
_ParsingFailures = true;
if (SwfFile.Configuration.AVM1DeleteInvalidBytecode)
{
bytecode = new AVM1InstructionSequence();
}
else
{
SwfFormatException swfe = new SwfFormatException( "ClipActionRecord parsing error", ave );
throw swfe;
}
}
finally
{
//
// make sure that the input stream is at the right position
// it would have if code reading would have been successful
//
long diff = ( before + _codeSize ) - br.BaseStream.Position;
if ( 0 != diff )
br.BaseStream.Seek( diff, SeekOrigin.Current );
}
_Code = new AVM1Code( bytecode );
return _ParsingFailures;
}