View Javadoc

1   // Copyright 2001, FreeHEP.
2   package org.freehep.graphicsio.swf;
3   
4   import java.io.EOFException;
5   import java.io.IOException;
6   import java.util.Vector;
7   
8   import org.freehep.util.io.Action;
9   import org.freehep.util.io.TaggedInputStream;
10  import org.freehep.util.io.TaggedOutputStream;
11  
12  /**
13   * SWF Abstract Action Class.
14   * 
15   * @author Mark Donszelmann
16   * @author Charles Loomis
17   * @version $Id: SWFAction.java 8584 2006-08-10 23:06:37Z duns $
18   */
19  public abstract class SWFAction extends Action {
20  
21      private int version;
22  
23      protected SWFAction(int code, int version) {
24          super(code);
25          this.version = version;
26      }
27  
28      public int getVersion() {
29          return version;
30      }
31  
32      public Action read(int actionCode, TaggedInputStream input, int length)
33              throws IOException {
34  
35          return read(actionCode, (SWFInputStream) input, length);
36      }
37  
38      public SWFAction read(int actionCode, SWFInputStream swf, int length)
39              throws IOException {
40  
41          return this;
42      }
43  
44      public void write(int actionCode, TaggedOutputStream input)
45              throws IOException {
46  
47          write(actionCode, (SWFOutputStream) input);
48      }
49  
50      public void write(int actionCode, SWFOutputStream swf) throws IOException {
51  
52          // empty
53      }
54  
55      /**
56       * Goto Frame Action.
57       */
58      public static class GotoFrame extends SWFAction {
59          private int frame;
60  
61          public GotoFrame(int frame) {
62              this();
63              this.frame = frame;
64          }
65  
66          public GotoFrame() {
67              super(0x81, 3);
68          }
69  
70          public SWFAction read(int actionCode, SWFInputStream swf, int length)
71                  throws IOException {
72  
73              GotoFrame action = new GotoFrame();
74              action.frame = swf.readUnsignedShort();
75              return action;
76          }
77  
78          public void write(int actionCode, SWFOutputStream swf)
79                  throws IOException {
80  
81              swf.writeUnsignedShort(frame);
82          }
83  
84          public String toString() {
85              return super.toString() + ", frame " + frame;
86          }
87      }
88  
89      /**
90       * Get URL Action.
91       */
92      public static class GetURL extends SWFAction {
93          private String url;
94  
95          private String window;
96  
97          public GetURL(String url, String window) {
98              this();
99              this.url = url;
100             this.window = window;
101         }
102 
103         public GetURL() {
104             super(0x83, 3);
105         }
106 
107         public SWFAction read(int actionCode, SWFInputStream swf, int length)
108                 throws IOException {
109 
110             GetURL action = new GetURL();
111             action.url = swf.readString();
112             action.window = swf.readString();
113             return action;
114         }
115 
116         public void write(int actionCode, SWFOutputStream swf)
117                 throws IOException {
118 
119             swf.writeString(url);
120             swf.writeString(window);
121         }
122 
123         public String toString() {
124             return super.toString() + ", URL " + url + ", window " + window;
125         }
126     }
127 
128     /**
129      * Next Frame Action.
130      */
131 
132     public static class NextFrame extends SWFAction {
133         public NextFrame() {
134             super(0x04, 3);
135         }
136     }
137 
138     /**
139      * Previous Frame Action.
140      */
141     public static class PreviousFrame extends SWFAction {
142         public PreviousFrame() {
143             super(0x05, 3);
144         }
145     }
146 
147     /**
148      * Play Action.
149      */
150     public static class Play extends SWFAction {
151         public Play() {
152             super(0x06, 3);
153         }
154     }
155 
156     /**
157      * Stop Action.
158      */
159     public static class Stop extends SWFAction {
160         public Stop() {
161             super(0x07, 3);
162         }
163     }
164 
165     /**
166      * Toggle Quality Action.
167      */
168     public static class ToggleQuality extends SWFAction {
169         public ToggleQuality() {
170             super(0x08, 3);
171         }
172     }
173 
174     /**
175      * Stop Sounds Action.
176      */
177     public static class StopSounds extends SWFAction {
178         public StopSounds() {
179             super(0x09, 3);
180         }
181     }
182 
183     /**
184      * Wait For Frame Action.
185      */
186     public static class WaitForFrame extends SWFAction {
187         private int frame;
188 
189         private int skip;
190 
191         public WaitForFrame(int frame, int skip) {
192             this();
193             this.frame = frame;
194             this.skip = skip;
195         }
196 
197         public WaitForFrame() {
198             super(0x8a, 3);
199         }
200 
201         public SWFAction read(int actionCode, SWFInputStream swf, int length)
202                 throws IOException {
203 
204             WaitForFrame action = new WaitForFrame();
205             action.frame = swf.readUnsignedShort();
206             action.skip = swf.readUnsignedByte();
207             return action;
208         }
209 
210         public void write(int actionCode, SWFOutputStream swf)
211                 throws IOException {
212 
213             swf.writeUnsignedShort(frame);
214             swf.writeUnsignedByte(skip);
215         }
216 
217         public String toString() {
218             return super.toString() + ", frame " + frame + ", skip " + skip;
219         }
220     }
221 
222     /**
223      * Set Target Action.
224      */
225     public static class SetTarget extends SWFAction {
226         private String target;
227 
228         public SetTarget(String target) {
229             this();
230             this.target = target;
231         }
232 
233         public SetTarget() {
234             super(0x8b, 3);
235         }
236 
237         public SWFAction read(int actionCode, SWFInputStream swf, int length)
238                 throws IOException {
239 
240             SetTarget action = new SetTarget();
241             action.target = swf.readString();
242             return action;
243         }
244 
245         public void write(int actionCode, SWFOutputStream swf)
246                 throws IOException {
247 
248             swf.writeString(target);
249         }
250 
251         public String toString() {
252             return super.toString() + ", target " + target;
253         }
254     }
255 
256     /**
257      * Goto Label Action.
258      */
259     public static class GotoLabel extends SWFAction {
260         private String label;
261 
262         public GotoLabel(String label) {
263             this();
264             this.label = label;
265         }
266 
267         public GotoLabel() {
268             super(0x8c, 3);
269         }
270 
271         public SWFAction read(int actionCode, SWFInputStream swf, int length)
272                 throws IOException {
273 
274             GotoLabel action = new GotoLabel();
275             action.label = swf.readString();
276             return action;
277         }
278 
279         public void write(int actionCode, SWFOutputStream swf)
280                 throws IOException {
281 
282             swf.writeString(label);
283         }
284 
285         public String toString() {
286             return super.toString() + ", label " + label;
287         }
288     }
289 
290     // Flash 4 Actions Set
291     /**
292      * Add Action.
293      */
294     public static class Add extends SWFAction {
295         public Add() {
296             super(0x0a, 4);
297         }
298     }
299 
300     /**
301      * Subtract Action.
302      */
303     public static class Subtract extends SWFAction {
304         public Subtract() {
305             super(0x0b, 4);
306         }
307     }
308 
309     /**
310      * Multiply Action.
311      */
312     public static class Multiply extends SWFAction {
313         public Multiply() {
314             super(0x0c, 4);
315         }
316     }
317 
318     /**
319      * Divide Action.
320      */
321     public static class Divide extends SWFAction {
322         public Divide() {
323             super(0x0d, 4);
324         }
325     }
326 
327     /**
328      * WaitForFrame2 Action.
329      */
330     public static class WaitForFrame2 extends SWFAction {
331         private int skip;
332 
333         public WaitForFrame2(int skip) {
334             this();
335             this.skip = skip;
336         }
337 
338         public WaitForFrame2() {
339             super(0x8D, 4);
340         }
341 
342         public SWFAction read(int actionCode, SWFInputStream swf, int length)
343                 throws IOException {
344 
345             WaitForFrame2 action = new WaitForFrame2();
346             action.skip = swf.readUnsignedByte();
347             return action;
348         }
349 
350         public void write(int actionCode, SWFOutputStream swf)
351                 throws IOException {
352 
353             swf.writeUnsignedByte(skip);
354         }
355 
356         public String toString() {
357             return super.toString() + ", skipCount:" + skip;
358         }
359     }
360 
361     /**
362      * Equals Action.
363      */
364     public static class Equals extends SWFAction {
365         public Equals() {
366             super(0x0e, 4);
367         }
368     }
369 
370     /**
371      * Less Action.
372      */
373     public static class Less extends SWFAction {
374         public Less() {
375             super(0x0f, 4);
376         }
377     }
378 
379     /**
380      * And Action.
381      */
382     public static class And extends SWFAction {
383         public And() {
384             super(0x10, 4);
385         }
386     }
387 
388     /**
389      * Or Action.
390      */
391     public static class Or extends SWFAction {
392         public Or() {
393             super(0x11, 4);
394         }
395     }
396 
397     /**
398      * Not Action.
399      */
400     public static class Not extends SWFAction {
401         public Not() {
402             super(0x12, 4);
403         }
404     }
405 
406     /**
407      * StringEquals Action.
408      */
409     public static class StringEquals extends SWFAction {
410         public StringEquals() {
411             super(0x13, 4);
412         }
413     }
414 
415     /**
416      * StringLength Action.
417      */
418     public static class StringLength extends SWFAction {
419         public StringLength() {
420             super(0x14, 4);
421         }
422     }
423 
424     /**
425      * StringExtract Action.
426      */
427     public static class StringExtract extends SWFAction {
428         public StringExtract() {
429             super(0x15, 4);
430         }
431     }
432 
433     /**
434      * Push Action.
435      */
436     public static class Push extends SWFAction {
437         public static final int STRING = 0;
438 
439         public static final int FLOAT = 1;
440 
441         public static final int NULL = 2;
442 
443         public static final int UNDEFINED = 3;
444 
445         public static final int REGISTER = 4;
446 
447         public static final int BOOLEAN = 5;
448 
449         public static final int DOUBLE = 6;
450 
451         public static final int INTEGER = 7;
452 
453         public static final int LOOKUP = 8;
454 
455         public static final int LOOKUP2 = 9;
456 
457         private Vector values;
458 
459         public static class Value {
460             private byte type;
461 
462             private Object value;
463 
464             private byte[] data;
465 
466             public Value(String s) {
467                 type = STRING;
468                 value = s;
469             }
470 
471             public Value(float f) {
472                 type = FLOAT;
473                 value = new Float(f);
474             }
475 
476             public Value(Object x) {
477                 type = NULL;
478                 value = null;
479             }
480 
481             public Value(byte r) {
482                 type = REGISTER;
483                 value = new Byte(r);
484             }
485 
486             public Value(boolean b) {
487                 type = BOOLEAN;
488                 value = new Boolean(b);
489             }
490 
491             public Value(double d) {
492                 type = DOUBLE;
493                 value = new Double(d);
494             }
495 
496             public Value(int i) {
497                 type = INTEGER;
498                 value = new Integer(i);
499             }
500 
501             public Value(short index) {
502                 type = LOOKUP;
503                 value = new Short(index);
504             }
505 
506             public Value(byte type, byte[] data) {
507                 this.type = type;
508                 this.data = data;
509             }
510 
511             public static Value read(SWFInputStream swf) throws IOException {
512                 byte type = swf.readByte();
513                 switch (type) {
514                 case STRING:
515                     return new Value(swf.readString());
516                 case FLOAT:
517                     return new Value(swf.readFloat());
518                 case NULL:
519                     return new Value(null);
520                 case REGISTER:
521                     return new Value((byte) swf.readUnsignedByte());
522                 case BOOLEAN:
523                     return new Value((swf.readByte() != 0) ? true : false);
524                 case DOUBLE:
525                     return new Value(swf.readDouble());
526                 case INTEGER:
527                     return new Value(swf.readInt());
528                 case LOOKUP:
529                     return new Value((short) swf.readUnsignedByte());
530                 case LOOKUP2:
531                     return new Value((byte) LOOKUP2, swf.readByte(2));
532                 default:
533                     return new Value(type, swf.readByte((int) swf.getLength()));
534                 }
535             }
536 
537             public void write(SWFOutputStream swf) throws IOException {
538                 swf.writeByte(type);
539                 switch (type) {
540                 case STRING:
541                     swf.writeString((String) value);
542                     break;
543                 case FLOAT:
544                     swf.writeFloat(((Float) value).floatValue());
545                     break;
546                 case NULL:
547                     break;
548                 case UNDEFINED:
549                     break;
550                 case REGISTER:
551                     swf.writeUnsignedByte(((Byte) value).byteValue());
552                     break;
553                 case BOOLEAN:
554                     swf.writeBoolean(((Boolean) value).booleanValue());
555                     break;
556                 case DOUBLE:
557                     swf.writeDouble(((Double) value).doubleValue());
558                     break;
559                 case INTEGER:
560                     swf.writeInt(((Integer) value).intValue());
561                     break;
562                 case LOOKUP:
563                     swf.writeUnsignedByte(((Short) value).shortValue());
564                     break;
565                 case LOOKUP2:
566                     swf.writeShort(((Short) value).shortValue());
567                     break;
568                 default:
569                     swf.writeByte(data);
570                     break;
571                 }
572             }
573 
574             public String toString() {
575                 StringBuffer s = new StringBuffer("PushValue ");
576                 if ((type < 0) || (type > 9)) {
577                     s.append("Unknown Data Type " + type + " with length "
578                             + data.length);
579                 } else {
580                     s.append(value);
581                 }
582                 return s.toString();
583             }
584         }
585 
586         public Push() {
587             super(0x96, 4);
588         }
589 
590         public SWFAction read(int actionCode, SWFInputStream swf, int length)
591                 throws IOException {
592 
593             Push action = new Push();
594             action.values = new Vector();
595 
596             try {
597                 while (true) {
598                     action.values.add(Value.read(swf));
599                 }
600             } catch (EOFException e) {
601             }
602             return action;
603         }
604 
605         public void write(int actionCode, SWFOutputStream swf)
606                 throws IOException {
607 
608             for (int i = 0; i < values.size(); i++) {
609                 ((Value) values.get(i)).write(swf);
610             }
611         }
612 
613         public String toString() {
614             StringBuffer s = new StringBuffer(super.toString());
615             s.append("\n");
616             for (int i = 0; i < values.size(); i++) {
617                 s.append("   ");
618                 s.append(values.get(i));
619                 s.append("\n");
620             }
621             return s.toString();
622         }
623     }
624 
625     /**
626      * Pop Action.
627      */
628     public static class Pop extends SWFAction {
629         public Pop() {
630             super(0x17, 4);
631         }
632     }
633 
634     /**
635      * ToInteger Action.
636      */
637     public static class ToInteger extends SWFAction {
638         public ToInteger() {
639             super(0x18, 4);
640         }
641     }
642 
643     /**
644      * Jump Action.
645      */
646     public static class Jump extends SWFAction {
647         private short offset;
648 
649         public Jump(short offset) {
650             this();
651             this.offset = offset;
652         }
653 
654         public Jump() {
655             super(0x99, 4);
656         }
657 
658         public SWFAction read(int actionCode, SWFInputStream swf, int length)
659                 throws IOException {
660 
661             Jump action = new Jump();
662             action.offset = swf.readShort();
663             return action;
664         }
665 
666         public void write(int actionCode, SWFOutputStream swf)
667                 throws IOException {
668 
669             swf.writeShort(offset);
670         }
671 
672         public String toString() {
673             return super.toString() + ", " + offset;
674         }
675     }
676 
677     /**
678      * GetURL2 Action.
679      */
680     public static class GetURL2 extends SWFAction {
681         private byte method;
682 
683         public static final int NONE = 0;
684 
685         public static final int GET = 1;
686 
687         public static final int POST = 2;
688 
689         public GetURL2(byte method) {
690             this();
691             this.method = method;
692         }
693 
694         public GetURL2() {
695             super(0x9A, 4);
696         }
697 
698         public SWFAction read(int actionCode, SWFInputStream swf, int length)
699                 throws IOException {
700 
701             GetURL2 action = new GetURL2();
702             action.method = swf.readByte();
703             return action;
704         }
705 
706         public void write(int actionCode, SWFOutputStream swf)
707                 throws IOException {
708 
709             swf.writeByte(method);
710         }
711 
712         public String toString() {
713             return super.toString() + ", " + method;
714         }
715     }
716 
717     /**
718      * GetVariable Action.
719      */
720     public static class GetVariable extends SWFAction {
721         public GetVariable() {
722             super(0x1c, 4);
723         }
724     }
725 
726     /**
727      * SetVariable Action.
728      */
729     public static class SetVariable extends SWFAction {
730         public SetVariable() {
731             super(0x1d, 4);
732         }
733     }
734 
735     /**
736      * If Action.
737      */
738     public static class If extends SWFAction {
739         private short offset;
740 
741         public If(short offset) {
742             this();
743             this.offset = offset;
744         }
745 
746         public If() {
747             super(0x9d, 4);
748         }
749 
750         public SWFAction read(int actionCode, SWFInputStream swf, int length)
751                 throws IOException {
752 
753             If action = new If();
754             action.offset = swf.readShort();
755             return action;
756         }
757 
758         public void write(int actionCode, SWFOutputStream swf)
759                 throws IOException {
760 
761             swf.writeShort(offset);
762         }
763 
764         public String toString() {
765             return super.toString() + ", " + offset;
766         }
767     }
768 
769     /**
770      * Call Action.
771      */
772     public static class Call extends SWFAction {
773         public Call() {
774             super(0x9e, 4);
775         }
776     }
777 
778     /**
779      * GotoFrame2 Action.
780      */
781     public static class GotoFrame2 extends SWFAction {
782         private byte play;
783 
784         public GotoFrame2(byte play) {
785             this();
786             this.play = play;
787         }
788 
789         public GotoFrame2() {
790             super(0x9f, 4);
791         }
792 
793         public SWFAction read(int actionCode, SWFInputStream swf, int length)
794                 throws IOException {
795 
796             GotoFrame2 action = new GotoFrame2();
797             action.play = swf.readByte();
798             return action;
799         }
800 
801         public void write(int actionCode, SWFOutputStream swf)
802                 throws IOException {
803 
804             swf.writeByte(play);
805         }
806 
807         public String toString() {
808             return super.toString() + ", " + play;
809         }
810     }
811 
812     /**
813      * SetTarget2 Action.
814      */
815     public static class SetTarget2 extends SWFAction {
816         public SetTarget2() {
817             super(0x20, 4);
818         }
819     }
820 
821     /**
822      * StringAdd Action.
823      */
824     public static class StringAdd extends SWFAction {
825         public StringAdd() {
826             super(0x21, 4);
827         }
828     }
829 
830     /**
831      * GetProperty Action.
832      */
833     public static class GetProperty extends SWFAction {
834         public GetProperty() {
835             super(0x22, 4);
836         }
837     }
838 
839     /**
840      * SetProperty Action.
841      */
842     public static class SetProperty extends SWFAction {
843         public SetProperty() {
844             super(0x23, 4);
845         }
846     }
847 
848     /**
849      * CloneSprite Action.
850      */
851     public static class CloneSprite extends SWFAction {
852         public CloneSprite() {
853             super(0x24, 4);
854         }
855     }
856 
857     /**
858      * RemoveSprite Action.
859      */
860     public static class RemoveSprite extends SWFAction {
861         public RemoveSprite() {
862             super(0x25, 4);
863         }
864     }
865 
866     /**
867      * Trace Action.
868      */
869     public static class Trace extends SWFAction {
870         public Trace() {
871             super(0x26, 4);
872         }
873     }
874 
875     /**
876      * StartDrag Action.
877      */
878     public static class StartDrag extends SWFAction {
879         public StartDrag() {
880             super(0x27, 4);
881         }
882     }
883 
884     /**
885      * EndDrag Action.
886      */
887     public static class EndDrag extends SWFAction {
888         public EndDrag() {
889             super(0x28, 4);
890         }
891     }
892 
893     /**
894      * StringLess Action.
895      */
896     public static class StringLess extends SWFAction {
897         public StringLess() {
898             super(0x29, 4);
899         }
900     }
901 
902     /**
903      * RandomNumber Action.
904      */
905     public static class RandomNumber extends SWFAction {
906         public RandomNumber() {
907             super(0x30, 4);
908         }
909     }
910 
911     /**
912      * MBStringLength Action.
913      */
914     public static class MBStringLength extends SWFAction {
915         public MBStringLength() {
916             super(0x31, 4);
917         }
918     }
919 
920     /**
921      * CharToAscii Action.
922      */
923     public static class CharToAscii extends SWFAction {
924         public CharToAscii() {
925             super(0x32, 4);
926         }
927     }
928 
929     /**
930      * AsciiToChar Action.
931      */
932     public static class AsciiToChar extends SWFAction {
933         public AsciiToChar() {
934             super(0x33, 4);
935         }
936     }
937 
938     /**
939      * GetTime Action.
940      */
941     public static class GetTime extends SWFAction {
942         public GetTime() {
943             super(0x34, 4);
944         }
945     }
946 
947     /**
948      * MBStringExtract Action.
949      */
950     public static class MBStringExtract extends SWFAction {
951         public MBStringExtract() {
952             super(0x35, 4);
953         }
954     }
955 
956     /**
957      * MBCharToAscii Action.
958      */
959     public static class MBCharToAscii extends SWFAction {
960         public MBCharToAscii() {
961             super(0x36, 4);
962         }
963     }
964 
965     /**
966      * MBAsciiToChar Action.
967      */
968     public static class MBAsciiToChar extends SWFAction {
969         public MBAsciiToChar() {
970             super(0x37, 4);
971         }
972     }
973 
974     // Flash 5 actions.
975     /**
976      * StoreRegister Action.
977      */
978     public static class StoreRegister extends SWFAction {
979         private byte number;
980 
981         public StoreRegister(byte number) {
982             this();
983             this.number = number;
984         }
985 
986         public StoreRegister() {
987             super(0x87, 5);
988         }
989 
990         public SWFAction read(int actionCode, SWFInputStream swf, int length)
991                 throws IOException {
992 
993             StoreRegister action = new StoreRegister();
994             action.number = swf.readByte();
995             return action;
996         }
997 
998         public void write(int actionCode, SWFOutputStream swf)
999                 throws IOException {
1000 
1001             swf.writeByte(number);
1002         }
1003 
1004         public String toString() {
1005             return super.toString() + ", " + number;
1006         }
1007     }
1008 
1009     /**
1010      * ConstantPool Action.
1011      */
1012     public static class ConstantPool extends SWFAction {
1013         private String[] pool;
1014 
1015         public ConstantPool(String[] pool) {
1016             this();
1017             this.pool = pool;
1018         }
1019 
1020         public ConstantPool() {
1021             super(0x88, 5);
1022         }
1023 
1024         public SWFAction read(int actionCode, SWFInputStream swf, int length)
1025                 throws IOException {
1026 
1027             ConstantPool action = new ConstantPool();
1028             action.pool = new String[swf.readUnsignedShort()];
1029             for (int i = 0; i < action.pool.length; i++) {
1030                 action.pool[i] = swf.readString();
1031             }
1032             return action;
1033         }
1034 
1035         public void write(int actionCode, SWFOutputStream swf)
1036                 throws IOException {
1037 
1038             swf.writeUnsignedShort(pool.length);
1039             for (int i = 0; i < pool.length; i++) {
1040                 swf.writeString(pool[i]);
1041             }
1042         }
1043 
1044         public String toString() {
1045             StringBuffer s = new StringBuffer(super.toString());
1046             s.append("[");
1047             for (int i = 0; i < pool.length; i++) {
1048                 if (i != 0)
1049                     s.append(", ");
1050                 s.append(pool[i]);
1051             }
1052             s.append("]");
1053             return s.toString();
1054         }
1055     }
1056 
1057     /**
1058      * With Action.
1059      */
1060     public static class With extends SWFAction {
1061         private int size;
1062 
1063         private String block;
1064 
1065         public With(int size, String block) {
1066             this();
1067             this.size = size;
1068             this.block = block;
1069         }
1070 
1071         public With() {
1072             super(0x94, 5);
1073         }
1074 
1075         public SWFAction read(int actionCode, SWFInputStream swf, int length)
1076                 throws IOException {
1077 
1078             With action = new With();
1079             action.size = swf.readUnsignedShort();
1080             action.block = swf.readString();
1081             return action;
1082         }
1083 
1084         public void write(int actionCode, SWFOutputStream swf)
1085                 throws IOException {
1086 
1087             swf.writeUnsignedShort(size);
1088             swf.writeString(block);
1089         }
1090 
1091         public String toString() {
1092             return super.toString() + ", " + size + ", " + block;
1093         }
1094     }
1095 
1096     /**
1097      * DefineFunction Action.
1098      */
1099     public static class DefineFunction extends SWFAction {
1100         private String name;
1101 
1102         private String[] params;
1103 
1104         private byte[] code;
1105 
1106         public DefineFunction(String name, String[] params, byte[] code) {
1107             this();
1108             this.name = name;
1109             this.params = params;
1110             this.code = code;
1111         }
1112 
1113         public DefineFunction() {
1114             super(0x9b, 5);
1115         }
1116 
1117         public SWFAction read(int actionCode, SWFInputStream swf, int length)
1118                 throws IOException {
1119 
1120             DefineFunction action = new DefineFunction();
1121             action.name = swf.readString();
1122             int n = swf.readUnsignedShort();
1123             for (int i = 0; i < n; i++) {
1124                 action.params[i] = swf.readString();
1125             }
1126             int cs = swf.readUnsignedShort();
1127             action.code = swf.readByte(cs);
1128             return action;
1129         }
1130 
1131         public void write(int actionCode, SWFOutputStream swf)
1132                 throws IOException {
1133 
1134             swf.writeString(name);
1135             swf.writeUnsignedShort(params.length);
1136             for (int i = 0; i < params.length; i++) {
1137                 swf.writeString(params[i]);
1138             }
1139             swf.writeUnsignedShort(code.length);
1140             swf.writeByte(code);
1141         }
1142 
1143         public String toString() {
1144             return super.toString() + ", " + name + ", " + (new String(code));
1145         }
1146     }
1147 
1148     /**
1149      * Delete Action.
1150      */
1151     public static class Delete extends SWFAction {
1152         public Delete() {
1153             super(0x3a, 5);
1154         }
1155     }
1156 
1157     /**
1158      * Delete2 Action.
1159      */
1160     public static class Delete2 extends SWFAction {
1161         public Delete2() {
1162             super(0x3b, 5);
1163         }
1164     }
1165 
1166     /**
1167      * DefineLocal Action.
1168      */
1169     public static class DefineLocal extends SWFAction {
1170         public DefineLocal() {
1171             super(0x3c, 5);
1172         }
1173     }
1174 
1175     /**
1176      * CallFunction Action.
1177      */
1178     public static class CallFunction extends SWFAction {
1179         public CallFunction() {
1180             super(0x3d, 5);
1181         }
1182     }
1183 
1184     /**
1185      * Return Action.
1186      */
1187     public static class Return extends SWFAction {
1188         public Return() {
1189             super(0x3e, 5);
1190         }
1191     }
1192 
1193     /**
1194      * Modulo Action.
1195      */
1196     public static class Modulo extends SWFAction {
1197         public Modulo() {
1198             super(0x3f, 5);
1199         }
1200     }
1201 
1202     /**
1203      * NewObject Action.
1204      */
1205     public static class NewObject extends SWFAction {
1206         public NewObject() {
1207             super(0x40, 5);
1208         }
1209     }
1210 
1211     /**
1212      * DefineLocal2 Action.
1213      */
1214     public static class DefineLocal2 extends SWFAction {
1215         public DefineLocal2() {
1216             super(0x41, 5);
1217         }
1218     }
1219 
1220     /**
1221      * InitArray Action.
1222      */
1223     public static class InitArray extends SWFAction {
1224         public InitArray() {
1225             super(0x42, 5);
1226         }
1227     }
1228 
1229     /**
1230      * InitObject Action.
1231      */
1232     public static class InitObject extends SWFAction {
1233         public InitObject() {
1234             super(0x43, 5);
1235         }
1236     }
1237 
1238     /**
1239      * TypeOf Action.
1240      */
1241     public static class TypeOf extends SWFAction {
1242         public TypeOf() {
1243             super(0x44, 5);
1244         }
1245     }
1246 
1247     /**
1248      * TargetPath Action.
1249      */
1250     public static class TargetPath extends SWFAction {
1251         public TargetPath() {
1252             super(0x45, 5);
1253         }
1254     }
1255 
1256     /**
1257      * Enumerate Action.
1258      */
1259     public static class Enumerate extends SWFAction {
1260         public Enumerate() {
1261             super(0x46, 5);
1262         }
1263     }
1264 
1265     /**
1266      * Add2 Action.
1267      */
1268     public static class Add2 extends SWFAction {
1269         public Add2() {
1270             super(0x47, 5);
1271         }
1272     }
1273 
1274     /**
1275      * Less2 Action.
1276      */
1277     public static class Less2 extends SWFAction {
1278         public Less2() {
1279             super(0x48, 5);
1280         }
1281     }
1282 
1283     /**
1284      * Equals2 Action.
1285      */
1286     public static class Equals2 extends SWFAction {
1287         public Equals2() {
1288             super(0x49, 5);
1289         }
1290     }
1291 
1292     /**
1293      * ToNumber Action.
1294      */
1295     public static class ToNumber extends SWFAction {
1296         public ToNumber() {
1297             super(0x4a, 5);
1298         }
1299     }
1300 
1301     /**
1302      * ToString Action.
1303      */
1304     public static class ToString extends SWFAction {
1305         public ToString() {
1306             super(0x4b, 5);
1307         }
1308     }
1309 
1310     /**
1311      * PushDuplicate Action.
1312      */
1313     public static class PushDuplicate extends SWFAction {
1314         public PushDuplicate() {
1315             super(0x4c, 5);
1316         }
1317     }
1318 
1319     /**
1320      * StackSwap Action.
1321      */
1322     public static class StackSwap extends SWFAction {
1323         public StackSwap() {
1324             super(0x4d, 5);
1325         }
1326     }
1327 
1328     /**
1329      * GetMember Action.
1330      */
1331     public static class GetMember extends SWFAction {
1332         public GetMember() {
1333             super(0x4e, 5);
1334         }
1335     }
1336 
1337     /**
1338      * SetMember Action.
1339      */
1340     public static class SetMember extends SWFAction {
1341         public SetMember() {
1342             super(0x4f, 5);
1343         }
1344     }
1345 
1346     /**
1347      * Increment Action.
1348      */
1349     public static class Increment extends SWFAction {
1350         public Increment() {
1351             super(0x50, 5);
1352         }
1353     }
1354 
1355     /**
1356      * Decrement Action.
1357      */
1358     public static class Decrement extends SWFAction {
1359         public Decrement() {
1360             super(0x51, 5);
1361         }
1362     }
1363 
1364     /**
1365      * CallMethod Action.
1366      */
1367     public static class CallMethod extends SWFAction {
1368         public CallMethod() {
1369             super(0x52, 5);
1370         }
1371     }
1372 
1373     /**
1374      * NewMethod Action.
1375      */
1376     public static class NewMethod extends SWFAction {
1377         public NewMethod() {
1378             super(0x53, 5);
1379         }
1380     }
1381 
1382     /**
1383      * BitAnd Action.
1384      */
1385     public static class BitAnd extends SWFAction {
1386         public BitAnd() {
1387             super(0x60, 5);
1388         }
1389     }
1390 
1391     /**
1392      * BitOr Action.
1393      */
1394     public static class BitOr extends SWFAction {
1395         public BitOr() {
1396             super(0x61, 5);
1397         }
1398     }
1399 
1400     /**
1401      * BitXor Action.
1402      */
1403     public static class BitXor extends SWFAction {
1404         public BitXor() {
1405             super(0x62, 5);
1406         }
1407     }
1408 
1409     /**
1410      * BitLShift Action.
1411      */
1412     public static class BitLShift extends SWFAction {
1413         public BitLShift() {
1414             super(0x63, 5);
1415         }
1416     }
1417 
1418     /**
1419      * BitRShift Action.
1420      */
1421     public static class BitRShift extends SWFAction {
1422         public BitRShift() {
1423             super(0x64, 5);
1424         }
1425     }
1426 
1427     /**
1428      * BitURShift Action.
1429      */
1430     public static class BitURShift extends SWFAction {
1431         public BitURShift() {
1432             super(0x65, 5);
1433         }
1434     }
1435 
1436     /**
1437      * InstanceOf Action.
1438      */
1439     public static class InstanceOf extends SWFAction {
1440         public InstanceOf() {
1441             super(0x54, 6);
1442         }
1443     }
1444 
1445     /**
1446      * Enumerate2 Action.
1447      */
1448     public static class Enumerate2 extends SWFAction {
1449         public Enumerate2() {
1450             super(0x55, 6);
1451         }
1452     }
1453 
1454     /**
1455      * StrictEquals Action.
1456      */
1457     public static class StrictEquals extends SWFAction {
1458         public StrictEquals() {
1459             super(0x66, 6);
1460         }
1461     }
1462 
1463     /**
1464      * Greater Action.
1465      */
1466     public static class Greater extends SWFAction {
1467         public Greater() {
1468             super(0x67, 6);
1469         }
1470     }
1471 
1472     /**
1473      * StringGreater Action.
1474      */
1475     public static class StringGreater extends SWFAction {
1476         public StringGreater() {
1477             super(0x68, 6);
1478         }
1479     }
1480 }