/// <summary> /// /// </summary> /// <param name="input"></param> /// <returns></returns> 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; }
/// <summary> /// /// </summary> /// <param name="input"></param> /// <returns></returns> public bool Parse( Stream input ) { BinaryReader2 br = new BinaryReader2( input ); bool parsingSuccess = true; UInt16 uselessButFiddelingWithBitsThanksAdobe = br.ReadUInt16(); if ( 0 != uselessButFiddelingWithBitsThanksAdobe ) { SwfFormatException sfe = new SwfFormatException( "Reserved 16Bit Field in CLIPACTION used" ); Log.Error(this, sfe ); throw sfe; } _ClipEventFlags = new ClipEventFlags( this.Version ); _ClipEventFlags.Parse( input ); _ClipActionRecords = new List<ClipActionRecord>(); // // The ClipActionEndFlag is Version dependent! // while ( 0 != ( this.Version <= 5 ? br.PeekUInt16() : br.PeekUInt32() ) ) { ClipActionRecord record = new ClipActionRecord( this.Version ); bool recordParsingResult = record.Parse( input ); _ClipActionRecords.Add( record ); parsingSuccess = recordParsingResult & parsingSuccess; } // // Get the EndRecord (Version dependent) and ignore // UInt32 endRecord = this.Version <= 5 ? br.ReadUInt16() : br.ReadUInt32(); if ( 0 != endRecord ) { SwfFormatException sfe = new SwfFormatException( "endRecord is not 0x00/0x0000" ); Log.Error(this, sfe ); throw sfe; } //Log.Debug(this, _ClipActionRecords.Count + " ClipActionRecords added" ); return parsingSuccess; }