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 + -
显示快捷键?