#region ParseTags
private void ParseTags()
{
SwfActionId id = ((SwfActionId)r.GetByte());
while(id != SwfActionId.End)
{
switch(id)
{
// Version 3 Tags
case SwfActionId.GotoFrame :
{
ParseGotoFrame();
break;
}
case SwfActionId.GetURL :
{
ParseGetURL();
break;
}
case SwfActionId.NextFrame :
{
actions.Add(new NextFrameAction());
break;
}
case SwfActionId.PreviousFrame :
{
actions.Add(new PreviousFrameAction());
break;
}
case SwfActionId.Play :
{
actions.Add(new PlayAction());
break;
}
case SwfActionId.Stop :
{
actions.Add(new StopAction());
break;
}
case SwfActionId.ToggleQuality :
{
actions.Add(new ToggleQualityAction());
break;
}
case SwfActionId.StopSounds :
{
actions.Add(new StopSoundsAction());
break;
}
case SwfActionId.WaitForFrame :
{
ParseWaitForFrame();
break;
}
case SwfActionId.SetTarget :
{
ParseSetTarget();
break;
}
case SwfActionId.GoToLabel :
{
ParseGoToLabel();
break;
}
// Version 4 Tags
case SwfActionId.Add :
{
actions.Add(new AddAction());
break;
}
case SwfActionId.Divide :
{
actions.Add(new DivideAction());
break;
}
case SwfActionId.Multiply :
{
actions.Add(new MultiplyAction());
break;
}
case SwfActionId.Subtract :
{
actions.Add(new SubtractAction());
break;
}
case SwfActionId.Equals :
{
actions.Add(new EqualsAction());
break;
}
case SwfActionId.Less :
{
actions.Add(new LessAction());
break;
}
case SwfActionId.And :
{
actions.Add(new AndAction());
break;
}
case SwfActionId.Not :
{
actions.Add(new NotAction());
break;
}
case SwfActionId.Or :
{
actions.Add(new OrAction());
break;
}
case SwfActionId.StringAdd :
{
actions.Add(new StringAddAction());
break;
}
case SwfActionId.StringEquals :
{
actions.Add(new StringEqualsAction());
break;
}
case SwfActionId.StringExtract :
{
actions.Add(new StringExtractAction());
break;
}
case SwfActionId.StringLength :
{
actions.Add(new StringLengthAction());
break;
}
case SwfActionId.MBStringExtract :
{
actions.Add(new MBStringExtractAction());
break;
}
case SwfActionId.MBStringLength :
{
actions.Add(new MBStringLengthAction());
break;
}
case SwfActionId.StringLess :
{
actions.Add(new StringLessAction());
break;
}
case SwfActionId.Pop :
{
actions.Add(new PopAction());
break;
}
case SwfActionId.Push :
{
ParsePush();
break;
}
case SwfActionId.AsciiToChar :
{
actions.Add(new AsciiToCharAction());
break;
}
case SwfActionId.CharToAscii :
{
actions.Add(new CharToAsciiAction());
break;
}
case SwfActionId.ToInteger :
{
actions.Add(new ToIntegerAction());
break;
}
case SwfActionId.MBAsciiToChar :
{
actions.Add(new MBAsciiToCharAction());
break;
}
case SwfActionId.MBCharToAscii :
{
actions.Add(new MBCharToAsciiAction());
break;
}
case SwfActionId.If :
{
ParseIf();
break;
}
case SwfActionId.Jump :
{
ParseJump();
break;
}
case SwfActionId.Call :
{
actions.Add(new CallAction());
break;
}
case SwfActionId.GetVariable :
{
actions.Add(new GetVariableAction());
break;
}
case SwfActionId.SetVariable :
{
actions.Add(new SetVariableAction());
break;
}
case SwfActionId.GetURL2 :
{
ParseGetURL2();
break;
}
case SwfActionId.GetProperty :
{
actions.Add(new GetPropertyAction());
break;
}
case SwfActionId.GotoFrame2 :
{
ParseGotoFrame2();
break;
}
case SwfActionId.RemoveSprite :
{
actions.Add(new RemoveSpriteAction());
break;
}
case SwfActionId.SetProperty :
{
actions.Add(new SetPropertyAction());
break;
}
case SwfActionId.SetTarget2 :
{
actions.Add(new SetTarget2Action());
break;
}
case SwfActionId.StartDrag :
{
actions.Add(new StartDragAction());
break;
}
case SwfActionId.WaitForFrame2 :
{
ParseWaitForFrame2();
break;
}
case SwfActionId.CloneSprite :
{
actions.Add(new CloneSpriteAction());
break;
}
case SwfActionId.EndDrag :
{
actions.Add(new EndDragAction());
break;
}
case SwfActionId.GetTime :
{
actions.Add(new GetTimeAction());
break;
}
case SwfActionId.RandomNumber :
{
actions.Add(new RandomNumberAction());
break;
}
case SwfActionId.Trace :
{
actions.Add(new TraceAction());
break;
}
// Version 5 Tags
case SwfActionId.CallFunction :
{
actions.Add(new CallFunctionAction());
break;
}
case SwfActionId.CallMethod :
{
actions.Add(new CallMethodAction());
break;
}
case SwfActionId.ConstantPool :
{
ParseConstantPool();
break;
}
case SwfActionId.DefineFunction :
{
ParseDefineFunction();
break;
}
case SwfActionId.DefineLocal :
{
actions.Add(new DefineLocalAction());
break;
}
case SwfActionId.DefineLocal2 :
{
actions.Add(new DefineLocal2Action());
break;
}
case SwfActionId.Delete :
{
actions.Add(new DeleteAction());
break;
}
case SwfActionId.Delete2 :
{
actions.Add(new Delete2Action());
break;
}
case SwfActionId.Enumerate :
{
actions.Add(new EnumerateAction());
break;
}
case SwfActionId.Equals2 :
{
actions.Add(new Equals2Action());
break;
}
case SwfActionId.GetMember :
{
actions.Add(new GetMemberAction());
break;
}
case SwfActionId.InitArray :
{
actions.Add(new InitArrayAction());
break;
}
case SwfActionId.InitObject :
{
actions.Add(new InitObjectAction());
break;
}
case SwfActionId.NewMethod :
{
actions.Add(new NewMethodAction());
break;
}
case SwfActionId.NewObject :
{
actions.Add(new NewObjectAction());
break;
}
case SwfActionId.SetMember :
{
actions.Add(new SetMemberAction());
break;
}
case SwfActionId.TargetPath :
{
actions.Add(new TargetPathAction());
break;
}
case SwfActionId.With :
{
ParseWith();
break;
}
case SwfActionId.ToNumber :
{
actions.Add(new ToNumberAction());
break;
}
case SwfActionId.ToString :
{
actions.Add(new ToStringAction());
break;
}
case SwfActionId.TypeOf :
{
actions.Add(new TypeOfAction());
break;
}
case SwfActionId.Add2 :
{
actions.Add(new Add2Action());
break;
}
case SwfActionId.Less2 :
{
actions.Add(new Less2Action());
break;
}
case SwfActionId.Modulo :
{
actions.Add(new ModuloAction());
break;
}
case SwfActionId.BitAnd :
{
actions.Add(new BitAndAction());
break;
}
case SwfActionId.BitLShift :
{
actions.Add(new BitLShiftAction());
break;
}
case SwfActionId.BitOr :
{
actions.Add(new BitOrAction());
break;
}
case SwfActionId.BitRShift :
{
actions.Add(new BitRShiftAction());
break;
}
case SwfActionId.BitURShift :
{
actions.Add(new BitURShiftAction());
break;
}
case SwfActionId.BitXor :
{
actions.Add(new BitXorAction());
break;
}
case SwfActionId.Decrement :
{
actions.Add(new DecrementAction());
break;
}
case SwfActionId.Increment :
{
actions.Add(new IncrementAction());
break;
}
case SwfActionId.PushDuplicate :
{
actions.Add(new PushDuplicateAction());
break;
}
case SwfActionId.Return :
{
actions.Add(new ReturnAction());
break;
}
case SwfActionId.StackSwap :
{
actions.Add(new StackSwapAction());
break;
}
case SwfActionId.StoreRegister :
{
ParseStoreRegister();
break;
}
// Version 6 Tags
case SwfActionId.DoInitAction :
{
ParseDoInitAction();
break;
}
case SwfActionId.InstanceOf :
{
actions.Add(new InstanceOfAction());
break;
}
case SwfActionId.Enumerate2 :
{
actions.Add(new Enumerate2Action());
break;
}
case SwfActionId.StrictEquals :
{
actions.Add(new StrictEqualsAction());
break;
}
case SwfActionId.Greater :
{
actions.Add(new GreaterAction());
break;
}
case SwfActionId.StringGreater :
{
actions.Add(new StringGreaterAction());
break;
}
// Version 7 Tags
case SwfActionId.DefineFunction2 :
{
ParseDefineFunction2();
break;
}
case SwfActionId.Extends :
{
actions.Add(new ExtendsAction());
break;
}
case SwfActionId.CastOp :
{
actions.Add(new CastOpAction());
break;
}
case SwfActionId.ImplementsOp :
{
actions.Add(new ImplementsOpAction());
break;
}
case SwfActionId.Try :
{
ParseTry();
break;
}
case SwfActionId.Throw :
{
actions.Add(new ThrowAction());
break;
}
default :
{
throw(new InvalidCastException(
"Invalid swf action tag: 0x" + ((byte)id).ToString("X2") ));
}
}
id = ((SwfActionId)r.GetByte());
}
}
#endregion
// temp
private object todo = new object();
#region ParseGotoFrame
private void ParseGotoFrame()
{
GotoFrameAction tag = new GotoFrameAction();
tag.Length = r.GetUI16();
tag.Frame = r.GetUI16();
actions.Add(tag);
}
#endregion
#region ParseGetURL
private void ParseGetURL()
{
GetURLAction tag = new GetURLAction();
tag.Length = r.GetUI16();
tag.UrlString = r.GetString();
tag.TargetString = r.GetString();
actions.Add(tag);
}
#endregion
#region ParseWaitForFrame
private void ParseWaitForFrame()
{
WaitForFrameAction tag = new WaitForFrameAction();
tag.Length = r.GetUI16();
tag.Frame = r.GetUI16();
tag.SkipCount = r.GetByte();
actions.Add(tag);
}
#endregion
#region ParseSetTarget
private void ParseSetTarget()
{
SetTargetAction tag = new SetTargetAction();
tag.Length = r.GetUI16();
tag.TargetName = r.GetString();
actions.Add(tag);
}
#endregion
#region ParseGoToLabel
private void ParseGoToLabel()
{
GoToLabelAction tag = new GoToLabelAction();
tag.Length = r.GetUI16();
tag.Label = r.GetString();
actions.Add(tag);
}
#endregion
#region ParsePush
private void ParsePush()
{
PushAction tag = new PushAction();
//tag.Type = r.GetBytes();
tag.StringValue = r.GetString();
//tag.FloatValue = r.GetFixedBits(bits);
tag.RegisterNumber = r.GetByte();
tag.BooleanValue = r.GetBit();
//tag.DoubleValue = r.GetBytes();
tag.IntegerValue = r.GetUI16();
tag.Constant8Value = r.GetByte();
tag.Constant16Value = r.GetUI16();
actions.Add(tag);
}
#endregion
#region ParseIf
private void ParseIf()
{
IfAction tag = new IfAction();
tag.BranchOffset = r.GetUI16();
actions.Add(tag);
}
#endregion
#region ParseJump
private void ParseJump()
{
JumpAction tag = new JumpAction();
tag.BranchOffset = r.GetUI16();
actions.Add(tag);
}
#endregion
#region ParseGetURL2
private void ParseGetURL2()
{
GetURL2Action tag = new GetURL2Action();
//tag.SendVarsMethod = r.GetBytes();
//tag.LoadTarget = r.GetBytes();
tag.LoadVariables = r.GetBit();
actions.Add(tag);
}
#endregion
#region ParseGotoFrame2
private void ParseGotoFrame2()
{
GotoFrame2Action tag = new GotoFrame2Action();
tag.SceneBiasFlag = r.GetBit();
tag.Play = r.GetBit();
tag.SceneBias = r.GetUI16();
actions.Add(tag);
}
#endregion
#region ParseWaitForFrame2
private void ParseWaitForFrame2()
{
WaitForFrame2Action tag = new WaitForFrame2Action();
tag.SkipCount = r.GetByte();
actions.Add(tag);
}
#endregion
#region ParseConstantPool
private void ParseConstantPool()
{
ConstantPoolAction tag = new ConstantPoolAction();
tag.Count = r.GetUI16();
while(false)
{
//tag.ConstantPool = r.GetString();
}
actions.Add(tag);
}
#endregion
#region ParseDefineFunction
private void ParseDefineFunction()
{
DefineFunctionAction tag = new DefineFunctionAction();
tag.FunctionName = r.GetString();
tag.NumParams = r.GetUI16();
while(false)
{
//tag.Params = r.GetString();
}
tag.CodeSize = r.GetUI16();
//tag.Statements = r.GetBytes();
actions.Add(tag);
}
#endregion
#region ParseWith
private void ParseWith()
{
WithAction tag = new WithAction();
tag.Size = r.GetUI16();
tag.WithBlock = r.GetString();
//tag.Statements = r.GetBytes();
actions.Add(tag);
}
#endregion
#region ParseStoreRegister
private void ParseStoreRegister()
{
StoreRegisterAction tag = new StoreRegisterAction();
tag.Register = r.GetUI16();
actions.Add(tag);
}
#endregion
#region ParseDoInitAction
private void ParseDoInitAction()
{
DoInitActionAction tag = new DoInitActionAction();
tag.Sprite = r.GetUI16();
//tag.Actions = r.GetBytes();
actions.Add(tag);
}
#endregion
#region ParseDefineFunction2
private void ParseDefineFunction2()
{
DefineFunction2Action tag = new DefineFunction2Action();
tag.FunctionName = r.GetString();
tag.NumParams = r.GetUI16();
tag.RegisterCount = r.GetByte();
tag.PreloadParent = r.GetBit();
tag.PreloadRoot = r.GetBit();
tag.SuppressSuper = r.GetBit();
tag.PreloadSuper = r.GetBit();
tag.SuppressArguments = r.GetBit();
tag.PreloadArguments = r.GetBit();
tag.SuppressThis = r.GetBit();
tag.PreloadThis = r.GetBit();
tag.PreloadGlobal = r.GetBit();
//tag.Parameters = r.GetBytes();
tag.codeSize = r.GetUI16();
actions.Add(tag);
}
#endregion
#region ParseTry
private void ParseTry()
{
TryAction tag = new TryAction();
tag.CatchInRegister = r.GetBit();
tag.FinallyBlock = r.GetBit();
tag.CatchBlock = r.GetBit();
tag.TrySize = r.GetUI16();
tag.CatchSize = r.GetUI16();
tag.FinallySize = r.GetUI16();
tag.CatchName = r.GetString();
tag.CatchRegister = r.GetUI16();
//tag.TryBody = r.GetBytes();
//tag.CatchBody = r.GetBytes();
//tag.FinallyBody = r.GetBytes();
actions.Add(tag);
}
#endregion