actionparser.java

来自「java和flash混合编程」· Java 代码 · 共 424 行 · 第 1/2 页

JAVA
424
字号
	                case RANDOM_NUMBER : mBlock.randomNumber(); break;
	
	                //--Flash 5                         
	                case INIT_ARRAY         : mBlock.initArray(); break;
	                case LOOKUP_TABLE       : parseLookupTable( mIn ); break;
	                case CALL_FUNCTION      : mBlock.callFunction(); break;
	                case CALL_METHOD        : mBlock.callMethod(); break;
	                case DEFINE_FUNCTION    : parseDefineFunction(mIn); break;
	                case DEFINE_LOCAL_VAL   : mBlock.defineLocalValue(); break;
	                case DEFINE_LOCAL       : mBlock.defineLocal(); break;
	                case DEL_VAR            : mBlock.deleteProperty(); break;
	                case DEL_THREAD_VARS    : mBlock.deleteThreadVars(); break;
	                case ENUMERATE          : mBlock.enumerate(); break;
	                case TYPED_EQUALS       : mBlock.typedEquals(); break;
	                case GET_MEMBER         : mBlock.getMember(); break;
	                case INIT_OBJECT        : mBlock.initObject(); break;
	                case CALL_NEW_METHOD    : mBlock.newMethod(); break;
	                case NEW_OBJECT         : mBlock.newObject(); break;
	                case SET_MEMBER         : mBlock.setMember(); break;
	                case GET_TARGET_PATH    : mBlock.getTargetPath(); break;
	                case WITH               : parseWith( mIn ); break;
	                case DUPLICATE          : mBlock.duplicate(); break;
	                case RETURN             : mBlock.returnValue(); break;
	                case SWAP               : mBlock.swap(); break;
	                case REGISTER           : mBlock.storeInRegister( mIn.readUI8() ); break;
	                case MODULO             : mBlock.modulo(); break;
	                case TYPEOF             : mBlock.typeOf(); break;
	                case TYPED_ADD          : mBlock.typedAdd(); break;
	                case TYPED_LESS_THAN    : mBlock.typedLessThan(); break;
	                case CONVERT_TO_NUMBER  : mBlock.convertToNumber(); break;
	                case CONVERT_TO_STRING  : mBlock.convertToString(); break;
	                case INCREMENT          : mBlock.increment(); break;
	                case DECREMENT          : mBlock.decrement(); break;
	                case BIT_AND            : mBlock.bitAnd(); break;
	                case BIT_OR             : mBlock.bitOr(); break;
	                case BIT_XOR            : mBlock.bitXor(); break;
	                case SHIFT_LEFT         : mBlock.shiftLeft(); break;
	                case SHIFT_RIGHT        : mBlock.shiftRight(); break;
	                case SHIFT_UNSIGNED     : mBlock.shiftRightUnsigned(); break;
	
	                //--Flash 6
	                case INSTANCE_OF        : mBlock.instanceOf(); break;
	                case ENUMERATE_OBJECT   : mBlock.enumerateObject(); break;
	                case GREATER            : mBlock.greaterThan(); break;
	                case STRICT_EQUALS      : mBlock.strictEquals(); break;
	                case STRING_GREATER     : mBlock.stringGreaterThan(); break;
	
	                //--Flash 7
	                case DEFINE_FUNCTION_2  : parseDefineFunction2(mIn); break;
	                case THROW              : mBlock._throw(); break;
	                case CAST_OP            : mBlock.cast(); break;
	                case EXTENDS            : mBlock._extends(); break;
	                case IMPLEMENTS_OP      : mBlock._implements(); break;
	                case TRY                : parseTry( mIn ); break;
	                
	                default: mBlock.unknown( code, mIn.read( dataLength ) ); break;
                }                            
            }
            
            if( ! foundEndAction ) {
            	applyWaitForFrameTargets();            	
                mBlock.end();
            }
        }

        private void parseTry( InStream in ) throws IOException 
        {           
            int flags       = in.readUI8();
            int trySize     = in.readUI16();
            int catchSize   = in.readUI16();
            int finallySize = in.readUI16();
            
            String catchVar = null;
            int    catchReg = -1;
            //if( (flags & TRY_HAS_CATCH) != 0 ) {
                if( (flags & TRY_CATCH_IN_REGISTER) != 0 ) {
                    catchReg = in.readUI8();
                } else {
                    catchVar = in.readString( mStringEncoding );
                }
            //}

            SWFActionBlock.TryCatchFinally tcf = (catchReg >= 0) ?  mBlock._try( catchReg ) : mBlock._try( catchVar );
                
            SWFActionBlock block = tcf.tryBlock();
            
            BlockParser parser = new BlockParser( block, trySize, in, mFlashVersion );
            parser.parse();
            
            if( (flags & TRY_HAS_CATCH) != 0 ) {
                block = tcf.catchBlock();                
                parser = new BlockParser( block, catchSize, in, mFlashVersion );
                parser.parse();
            }
            
            if( (flags & TRY_HAS_FINALLY) != 0 ) {
                block = tcf.finallyBlock();     
	            parser = new BlockParser( block, finallySize, in, mFlashVersion );
	            parser.parse();
            }
            
            tcf.endTry();
        }  
        
        private void parseWith( InStream in ) throws IOException 
        {
            int codesize = in.readUI16();

            SWFActionBlock withBlock = mBlock.startWith( );
            BlockParser parser = new BlockParser( withBlock, codesize, in, mFlashVersion );
            parser.parse();
        }    
        
        private void parseDefineFunction( InStream in ) throws IOException 
        {
            String name = in.readString(mStringEncoding);
            int paramCount = in.readUI16();
            
            String[] params = new String[ paramCount ];
            for( int i = 0; i < params.length; i++ )
            {
                params[i] = in.readString(mStringEncoding);
            }
            
            int codesize = in.readUI16();

            //System.out.println( "codesize=" + codesize ); System.out.flush();

            SWFActionBlock functionBlock = mBlock.startFunction( name, params );
            BlockParser parser = new BlockParser( functionBlock, codesize, in, mFlashVersion );
            parser.parse();
        }

        private void parseDefineFunction2( InStream in ) throws IOException 
        {
            String name = in.readString(mStringEncoding);
            int paramCount = in.readUI16();
            int numRegs    = in.readUI8();
            int flags      = in.readUI16(); 
            
            String[] params  = new String[ paramCount ];
            int[]    argRegs = new int[ paramCount ];
            for( int i = 0; i < params.length; i++ )
            {
                argRegs[i] = in.readUI8();
                params [i] = in.readString(mStringEncoding);
            }
            
            int codesize = in.readUI16();

            //System.out.println( "codesize=" + codesize ); System.out.flush();

            SWFActionBlock functionBlock = mBlock.startFunction2( name, numRegs, flags, params, argRegs );
            BlockParser parser = new BlockParser( functionBlock, codesize, in, mFlashVersion );
            parser.parse();
        }
        
        private void parseLookupTable( InStream in ) throws IOException 
        {
            String[] strings = new String[ in.readUI16() ];
            
            for( int i = 0; i < strings.length; i++ )
            {
                strings[i] = in.readString(mStringEncoding);
            }
            
            mBlock.lookupTable( strings );
        }
        
        private void parseGetURL2( int flags ) throws IOException
        {
            int sendVars = flags & 0x03;
            int mode = 0;
            
            switch( flags & 0xF0 )
            {
	            case 0x40: mode = SWFActions.GET_URL_MODE_LOAD_MOVIE_INTO_SPRITE; break;
	            case 0x80: mode = SWFActions.GET_URL_MODE_LOAD_VARS_INTO_LEVEL;   break;
	            case 0xC0: mode = SWFActions.GET_URL_MODE_LOAD_VARS_INTO_SPRITE;  break;
	            default:   mode = SWFActions.GET_URL_MODE_LOAD_MOVIE_INTO_LEVEL;  break;
            }
            
            mBlock.getURL( sendVars, mode );
        }        
        
        private void parsePush( int length, InStream in ) throws IOException 
        {
            int initCount = (int) in.getBytesRead();
            
            while( in.getBytesRead() - initCount < length )
            {
                int pushType = in.readUI8();
                
                switch( pushType )
                {
	                case PUSHTYPE_STRING   : mBlock.push( in.readString(mStringEncoding) ); break;
	                case PUSHTYPE_FLOAT    : mBlock.push( in.readFloat() ); break;
	                case PUSHTYPE_NULL     : mBlock.pushNull(); break;
	                case PUSHTYPE_UNDEFINED: mBlock.pushUndefined(); break;
	                case PUSHTYPE_REGISTER : mBlock.pushRegister( in.readUI8() ); break;
	                case PUSHTYPE_BOOLEAN  : mBlock.push( (in.readUI8() != 0) ? true : false ); break;
	                case PUSHTYPE_DOUBLE   : mBlock.push( in.readDouble() ); break;
	                case PUSHTYPE_INTEGER  : mBlock.push( in.readSI32() ); break;
	                case PUSHTYPE_LOOKUP8  : mBlock.lookup( in.readUI8() ); break;
	                case PUSHTYPE_LOOKUP16 : mBlock.lookup( in.readUI16() ); break;
	                default:
                }
            }
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?