%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/waritko/yacy/libbuild/WebCat-swf/src/pt/tumba/parser/swf/
Upload File :
Create Path :
Current File : //home/waritko/yacy/libbuild/WebCat-swf/src/pt/tumba/parser/swf/ActionWriter.java

package pt.tumba.parser.swf;

import com.anotherbigidea.flash.SWFActionCodes;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Stack;

/**
 *  A writer that implements the SWFActions interface and writes action bytes to
 *  an OutStream
 *
 *@author     unknown
 *@created    15 de Setembro de 2002
 */
public class ActionWriter implements SWFActions, SWFActionCodes {

    protected TagWriter tagWriter;
    protected OutStream out;
    protected ByteArrayOutputStream bout;
    protected int count;
    protected int flashVersion;

    protected List pushValues;

    protected HashMap labels;
    protected List jumps;
    protected List skips;

    //--for fixing up functions and WITH blocks..
    protected List blocks;
    protected Stack blockStack;


    /**
     *  Constructor for the ActionWriter object
     *
     *@param  tagWriter     Description of the Parameter
     *@param  flashVersion  Description of the Parameter
     */
    public ActionWriter(TagWriter tagWriter, int flashVersion) {
        this.flashVersion = flashVersion;
        this.tagWriter = tagWriter;
    }


    /**
     *@param  code             Description of the Parameter
     *@return                  the code count
     *@exception  IOException  Description of the Exception
     */
    protected int writeCode(int code) throws IOException {
        if (pushValues.size() > 0) {
            flushPushValues();
        }
        out.writeUI8(code);
        count++;
        return count;
    }


    /**
     *  SWFActions interface
     *
     *@param  conditions       Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void start(int conditions) throws IOException {
        //ignore conditions

        count = 0;
        bout = new ByteArrayOutputStream();
        out = new OutStream(bout);
        pushValues = new ArrayList();
        labels = null;
        jumps = null;
        skips = null;
        blocks = null;
        blockStack = null;
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void end() throws IOException {
        writeCode(0);
        out.flush();
        byte[] bytes = bout.toByteArray();

        //--Fix up jumps and skips
        if (labels != null) {
            if (jumps != null) {
                fixupJumps(bytes);
            }
            if (skips != null) {
                fixupSkips(bytes);
            }
        }

        if (blocks != null) {
            fixupBlocks(bytes);
        }

        writeBytes(bytes);
    }


    /**
     *  Pass through a blob of actions
     *
     *@param  blob             Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void blob(byte[] blob) throws IOException {
        writeBytes(blob);
    }


    /**
     *  Description of the Method
     *
     *@param  bytes            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    protected void writeBytes(byte[] bytes) throws IOException {
        tagWriter.getOutStream().write(bytes);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void done() throws IOException {
        tagWriter.completeTag();
    }


    /**
     *  Description of the Method
     *
     *@param  bytes  Description of the Parameter
     */
    protected void fixupBlocks(byte[] bytes2) {
		byte[] bytes = bytes2;
        for (Iterator enumerator = blocks.iterator(); enumerator.hasNext(); ) {
            int[] info = (int[]) enumerator.next();

            int codeSize = info[1];
            int offset = info[0];
            byte[] sizeBytes = OutStream.sintTo2Bytes(codeSize);

            bytes[offset] = sizeBytes[0];
            bytes[offset + 1] = sizeBytes[1];
        }
    }


    /**
     *  Description of the Method
     *
     *@param  bytes  Description of the Parameter
     */
    protected void fixupJumps(byte[] bytes2) {
        byte[] bytes = bytes2;
        for (Iterator enumumerator = jumps.iterator(); enumumerator.hasNext(); ) {
            Object[] obja = (Object[]) enumumerator.next();
            String label = (String) obja[0];
            int target = ((Integer) obja[1]).intValue();

            int[] labelInfo = (int[]) labels.get(label);

            if (labelInfo == null) {
                System.out.println("Missing label '" + label + "' in action code");
                continue;
            }

            int absolute = labelInfo[0];
            //offset of the label
            int relative = absolute - (target + 2);
            //relative jump

            byte[] val = OutStream.sintTo2Bytes(relative);
            bytes[target] = val[0];
            bytes[target + 1] = val[1];
        }
    }


    /**
     *  Description of the Method
     *
     *@param  bytes  Description of the Parameter
     */
    protected void fixupSkips(byte[] bytes2) {
		byte[] bytes = bytes2;
        for (Iterator enumerator = skips.iterator(); enumerator.hasNext(); ) {
            Object[] obja = (Object[]) enumerator.next();
            String label = (String) obja[0];

            int[] skipInfo = (int[]) obja[1];
            int skipIndex = skipInfo[0];
            int skipLoc = skipInfo[1];

            int[] labelInfo = (int[]) labels.get(label);

            if (labelInfo == null) {
                System.out.println("Missing label '" + label + "' in action code");
                continue;
            }

            int labelIndex = labelInfo[1];
            //index of the labelled action
            int skip = labelIndex - skipIndex - 1;

            byte val = OutStream.uintToByte(skip);
            bytes[skipLoc] = val;
        }
    }


    /**
     *  SWFActions interface
     *
     *@param  comment          Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void comment(String comment) throws IOException {
        //ignore comments
    }


    /**
     *  SWFActions interface
     *
     *@param  code             Description of the Parameter
     *@param  data             Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void unknown(int code, byte[] data) throws IOException {
        writeCode(code);

        int length = (data != null) ? data.length : 0;

        if (code >= 0x80 || length > 0) {
            out.writeUI16(length);
        }

        if (length > 0) {
            out.write(data);
        }
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void initArray() throws IOException {
        writeCode(INIT_ARRAY);
    }


    /**
     *  SWFActions interface
     *
     *@param  label            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void jumpLabel(String label) throws IOException {
        if (pushValues.size() > 0) {
            flushPushValues();
        }

        int offset = (int) out.getBytesWritten();

        if (labels == null) {
            labels = new HashMap();
        }
        labels.put(label, new int[]{offset, count + 1});
    }


    /**
     *  SWFActions interface
     *
     *@param  frameNumber      Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void gotoFrame(int frameNumber) throws IOException {
        writeCode(GOTO_FRAME);
        out.writeUI16(2);
        out.writeUI16(frameNumber);
    }


    /**
     *  SWFActions interface
     *
     *@param  label            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void gotoFrame(String label) throws IOException {
        writeCode(GOTO_LABEL);
        out.writeUI16(OutStream.getStringLength(label));
        out.writeString(label);
    }


    /**
     *  SWFActions interface
     *
     *@param  url              Description of the Parameter
     *@param  target           Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void getURL(String url, String target) throws IOException {
        writeCode(GET_URL);
        out.writeUI16(OutStream.getStringLength(url) + OutStream.getStringLength(target));
        out.writeString(url);
        out.writeString(target);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void nextFrame() throws IOException {
        writeCode(NEXT_FRAME);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void prevFrame() throws IOException {
        writeCode(PREVIOUS_FRAME);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void play() throws IOException {
        writeCode(PLAY);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void stop() throws IOException {
        writeCode(STOP);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void toggleQuality() throws IOException {
        writeCode(TOGGLE_QUALITY);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void stopSounds() throws IOException {
        writeCode(STOP_SOUNDS);
    }


    /**
     *  SWFActions interface
     *
     *@param  target           The new target value
     *@exception  IOException  Description of the Exception
     */
    public void setTarget(String target) throws IOException {
        writeCode(SET_TARGET);
        out.writeUI16(OutStream.getStringLength(target));
        out.writeString(target);
    }


    /**
     *  Description of the Method
     *
     *@param  label            Description of the Parameter
     *@param  code             Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    protected void writeJump(String label, int code) throws IOException {
        writeCode(code);
        out.writeUI16(2);

        int here = (int) out.getBytesWritten();
        out.writeUI16(0);
        //will be fixed up later

        //--save jump info for later fix-up logic
        if (jumps == null) {
            jumps = new ArrayList();
        }
        jumps.add(new Object[]{label, new Integer(here)});
    }


    /**
     *  SWFActions interface
     *
     *@param  jumpLabel        Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void jump(String jumpLabel) throws IOException {
        writeJump(jumpLabel, JUMP);
    }


    /**
     *  SWFActions interface
     *
     *@param  jumpLabel        Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void ifJump(String jumpLabel) throws IOException {
        writeJump(jumpLabel, IF);
    }


    /**
     *  SWFActions interface
     *
     *@param  frameNumber      Description of the Parameter
     *@param  jumpLabel        Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void waitForFrame(int frameNumber, String jumpLabel) throws IOException {
        writeCode(WAIT_FOR_FRAME);
        out.writeUI16(3);
        out.writeUI16(frameNumber);

        int here = (int) out.getBytesWritten();
        out.writeUI8(0);
        //will be fixed up later

        //--save skip info for later fix-up logic
        if (skips == null) {
            skips = new ArrayList();
        }
        skips.add(new Object[]{jumpLabel, new int[]{count, here}});
    }


    /**
     *  SWFActions interface
     *
     *@param  jumpLabel        Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void waitForFrame(String jumpLabel) throws IOException {
        writeCode(WAIT_FOR_FRAME_2);
        out.writeUI16(1);

        int here = (int) out.getBytesWritten();
        out.writeUI8(0);
        //will be fixed up later

        //--save skip info for later fix-up logic
        if (skips == null) {
            skips = new ArrayList();
        }
        skips.add(new Object[]{jumpLabel, new int[]{count, here}});
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void pop() throws IOException {
        writeCode(POP);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void add() throws IOException {
        writeCode(ADD);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void substract() throws IOException {
        writeCode(SUBTRACT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void multiply() throws IOException {
        writeCode(MULTIPLY);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void divide() throws IOException {
        writeCode(DIVIDE);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void equals() throws IOException {
        writeCode(EQUALS);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void lessThan() throws IOException {
        writeCode(LESS);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void and() throws IOException {
        writeCode(AND);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void or() throws IOException {
        writeCode(OR);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void not() throws IOException {
        writeCode(NOT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void stringEquals() throws IOException {
        writeCode(STRING_EQUALS);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void stringLength() throws IOException {
        writeCode(STRING_LENGTH);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void concat() throws IOException {
        writeCode(STRING_ADD);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void substring() throws IOException {
        writeCode(STRING_EXTRACT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void stringLessThan() throws IOException {
        writeCode(STRING_LESS);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void stringLengthMB() throws IOException {
        writeCode(MB_STRING_LENGTH);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void substringMB() throws IOException {
        writeCode(MB_STRING_EXTRACT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void toInteger() throws IOException {
        writeCode(TO_INTEGER);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void charToAscii() throws IOException {
        writeCode(CHAR_TO_ASCII);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void asciiToChar() throws IOException {
        writeCode(ASCII_TO_CHAR);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void charMBToAscii() throws IOException {
        writeCode(MB_CHAR_TO_ASCII);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void asciiToCharMB() throws IOException {
        writeCode(MB_ASCII_TO_CHAR);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void call() throws IOException {
        writeCode(CALL);
        out.writeUI16(0);
        //SWF File Format anomaly
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void getVariable() throws IOException {
        writeCode(GET_VARIABLE);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void setVariable() throws IOException {
        writeCode(SET_VARIABLE);
    }


    /**
     *  SWFActions interface
     *
     *@param  sendVars         Description of the Parameter
     *@param  loadMode         Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void getURL(int sendVars, int loadMode) throws IOException {
        writeCode(GET_URL_2);
        out.writeUI16(1);

        int flags = 0;

        //String sendVars_ = null;
        switch (sendVars) {
            case GET_URL_SEND_VARS_GET:
                flags = 1;
                break;
            case GET_URL_SEND_VARS_POST:
                flags = 2;
                break;
            case GET_URL_SEND_VARS_NONE:
            default:
                break;
        }

        //String mode = null;
        switch (loadMode) {
            case GET_URL_MODE_LOAD_MOVIE_INTO_LEVEL:
                break;
            case GET_URL_MODE_LOAD_MOVIE_INTO_SPRITE:
                flags |= 0x40;
                break;
            case GET_URL_MODE_LOAD_VARS_INTO_LEVEL:
                flags |= 0x80;
                break;
            case GET_URL_MODE_LOAD_VARS_INTO_SPRITE:
                flags |= 0xC0;
                break;
            default:
                break;
        }

        out.writeUI8(flags);
    }


    /**
     *  SWFActions interface
     *
     *@param  play             Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void gotoFrame(boolean play) throws IOException {
        writeCode(GOTO_FRAME_2);
        out.writeUI16(1);
        out.writeUI8(play ? 1 : 0);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void setTarget() throws IOException {
        writeCode(SET_TARGET_2);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void getProperty() throws IOException {
        writeCode(GET_PROPERTY);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void setProperty() throws IOException {
        writeCode(SET_PROPERTY);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void cloneSprite() throws IOException {
        writeCode(CLONE_SPRITE);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void removeSprite() throws IOException {
        writeCode(REMOVE_SPRITE);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void startDrag() throws IOException {
        writeCode(START_DRAG);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void endDrag() throws IOException {
        writeCode(END_DRAG);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void trace() throws IOException {
        writeCode(TRACE);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void getTime() throws IOException {
        writeCode(GET_TIME);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void randomNumber() throws IOException {
        writeCode(RANDOM_NUMBER);
    }


    /**
     *  SWFActions interface
     *
     *@param  values           Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void lookupTable(String[] values) throws IOException {
        writeCode(LOOKUP_TABLE);

        ByteArrayOutputStream baout = new ByteArrayOutputStream();
        OutStream bout = new OutStream(baout);

        bout.writeUI16(values.length);

        for (int i = 0; i < values.length; i++) {
            bout.writeString(values[i]);
        }

        bout.flush();
        byte[] data = baout.toByteArray();
        out.writeUI16(data.length);
        out.write(data);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void callFunction() throws IOException {
        writeCode(CALL_FUNCTION);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void callMethod() throws IOException {
        writeCode(CALL_METHOD);
    }


    /**
     *  SWFActions interface
     *
     *@param  name             Description of the Parameter
     *@param  paramNames       Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void startFunction(String name, String[] paramNames) throws IOException {
        if (blockStack == null) {
            blockStack = new Stack();
        }

        writeCode(DEFINE_FUNCTION);

        ByteArrayOutputStream baout = new ByteArrayOutputStream();
        OutStream bout = new OutStream(baout);

        bout.writeString(name);
        bout.writeUI16(paramNames.length);

        for (int i = 0; i < paramNames.length; i++) {
            bout.writeString(paramNames[i]);
        }

        bout.writeUI16(0);
        //code size - will be fixed up later

        bout.flush();
        byte[] data = baout.toByteArray();
        out.writeUI16(data.length);
        out.write(data);

        blockStack.push(new int[]{(int) out.getBytesWritten(), 0});
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void endBlock() throws IOException {
        if (blockStack == null || blockStack.isEmpty()) {
            return;
        }
        //nothing to do
        int[] blockInfo = (int[]) blockStack.pop();

        if (blocks == null) {
            blocks = new ArrayList();
        }

        int offset = blockInfo[0];
        int codeSize = ((int) out.getBytesWritten()) - offset;

        //--store this info for later fix-up
        blockInfo[0] = offset - 2;
        blockInfo[1] = codeSize;
        blocks.add(blockInfo);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void defineLocalValue() throws IOException {
        writeCode(DEFINE_LOCAL_VAL);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void defineLocal() throws IOException {
        writeCode(DEFINE_LOCAL);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void deleteProperty() throws IOException {
        writeCode(DEL_VAR);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void deleteThreadVars() throws IOException {
        writeCode(DEL_THREAD_VARS);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void enumerate() throws IOException {
        writeCode(ENUMERATE);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void typedEquals() throws IOException {
        writeCode(TYPED_EQUALS);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void getMember() throws IOException {
        writeCode(GET_MEMBER);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void initObject() throws IOException {
        writeCode(INIT_OBJECT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void newMethod() throws IOException {
        writeCode(CALL_NEW_METHOD);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void newObject() throws IOException {
        writeCode(NEW_OBJECT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void setMember() throws IOException {
        writeCode(SET_MEMBER);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void getTargetPath() throws IOException {
        writeCode(GET_TARGET_PATH);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void startWith() throws IOException {
        writeCode(WITH);
        out.writeUI16(2);
        out.writeUI16(0);
        //codeSize - will be fixed up later

        //--push the block start info
        if (blockStack == null) {
            blockStack = new Stack();
        }
        blockStack.push(new int[]{(int) out.getBytesWritten(), 0});
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void duplicate() throws IOException {
        writeCode(DUPLICATE);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void returnValue() throws IOException {
        writeCode(RETURN);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void swap() throws IOException {
        writeCode(SWAP);
    }


    /**
     *  SWFActions interface
     *
     *@param  registerNumber   Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void storeInRegister(int registerNumber) throws IOException {
        writeCode(REGISTER);
        out.writeUI16(1);
        out.writeUI8(registerNumber);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void convertToNumber() throws IOException {
        writeCode(CONVERT_TO_NUMBER);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void convertToString() throws IOException {
        writeCode(CONVERT_TO_STRING);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void typeOf() throws IOException {
        writeCode(TYPEOF);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void typedAdd() throws IOException {
        writeCode(TYPED_ADD);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void typedLessThan() throws IOException {
        writeCode(TYPED_LESS_THAN);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void modulo() throws IOException {
        writeCode(MODULO);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void bitAnd() throws IOException {
        writeCode(BIT_AND);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void bitOr() throws IOException {
        writeCode(BIT_OR);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void bitXor() throws IOException {
        writeCode(BIT_XOR);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void shiftLeft() throws IOException {
        writeCode(SHIFT_LEFT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void shiftRight() throws IOException {
        writeCode(SHIFT_RIGHT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void shiftRightUnsigned() throws IOException {
        writeCode(SHIFT_UNSIGNED);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void decrement() throws IOException {
        writeCode(DECREMENT);
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void increment() throws IOException {
        writeCode(INCREMENT);
    }


    /**
     *  Description of the Method
     *
     *@exception  IOException  Description of the Exception
     */
    protected void flushPushValues() throws IOException {
        out.writeUI8(PUSH);
        count++;

        ByteArrayOutputStream baout = new ByteArrayOutputStream();
        OutStream bout = new OutStream(baout);

        for (Iterator enumerator = pushValues.iterator(); enumerator.hasNext(); ) {
            Object value = enumerator.next();

            if (value instanceof String) {
                bout.writeUI8(PUSHTYPE_STRING);
                bout.writeString(value.toString());
            } else if (value instanceof Boolean) {
                bout.writeUI8(PUSHTYPE_BOOLEAN);
                bout.writeUI8(((Boolean) value).booleanValue() ? 1 : 0);
            } else if (value instanceof Integer) {
                bout.writeUI8(PUSHTYPE_INTEGER);
                bout.writeSI32(((Integer) value).intValue());
            } else if (value instanceof Short) {
                bout.writeUI8(PUSHTYPE_LOOKUP);
                bout.writeUI8(((Short) value).intValue());
            } else if (value instanceof Byte) {
                bout.writeUI8(SWFActionCodes.PUSHTYPE_REGISTER);
                bout.writeUI8(((Byte) value).intValue());
            } else if (value instanceof Float) {
                bout.writeUI8(PUSHTYPE_FLOAT);
                bout.writeFloat(((Float) value).floatValue());
            } else if (value instanceof Double) {
                bout.writeUI8(PUSHTYPE_DOUBLE);
                bout.writeDouble(((Double) value).doubleValue());
            } else {
                bout.writeUI8(PUSHTYPE_NULL);
            }
        }

        pushValues.clear();

        bout.flush();
        byte[] data = baout.toByteArray();
        out.writeUI16(data.length);
        out.write(data);
    }


    /**
     *  SWFActions interface
     *
     *@param  value            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void push(String value) throws IOException {
        pushValues.add(value);
        if (flashVersion < 5) {
            flushPushValues();
        }
    }


    /**
     *  SWFActions interface
     *
     *@param  value            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void push(float value) throws IOException {
        pushValues.add(new Float(value));
        if (flashVersion < 5) {
            flushPushValues();
        }
    }


    /**
     *  SWFActions interface
     *
     *@param  value            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void push(double value) throws IOException {
        pushValues.add(new Double(value));
        if (flashVersion < 5) {
            flushPushValues();
        }
    }


    /**
     *  SWFActions interface
     *
     *@exception  IOException  Description of the Exception
     */
    public void pushNull() throws IOException {
        pushValues.add(new Object());
        if (flashVersion < 5) {
            flushPushValues();
        }
    }


    /**
     *  SWFActions interface
     *
     *@param  registerNumber   Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void pushRegister(int registerNumber) throws IOException {
        pushValues.add(new Byte((byte) registerNumber));
        if (flashVersion < 5) {
            flushPushValues();
        }
    }


    /**
     *  SWFActions interface
     *
     *@param  value            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void push(boolean value) throws IOException {
        pushValues.add(Boolean.valueOf(value));
        if (flashVersion < 5) {
            flushPushValues();
        }
    }


    /**
     *  SWFActions interface
     *
     *@param  value            Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void push(int value) throws IOException {
        pushValues.add(new Integer(value));
        if (flashVersion < 5) {
            flushPushValues();
        }
    }


    /**
     *  SWFActions interface
     *
     *@param  dictionaryIndex  Description of the Parameter
     *@exception  IOException  Description of the Exception
     */
    public void lookup(int dictionaryIndex) throws IOException {
        pushValues.add(new Short((short) dictionaryIndex));
        if (flashVersion < 5) {
            flushPushValues();
        }
    }
}

Zerion Mini Shell 1.0