00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "compat.h"
00021 #include "parsing/tags.h"
00022 #include "frame.h"
00023 #include "logger.h"
00024 #include <vector>
00025
00026 namespace lightspark
00027 {
00028
00029 class ExecutionContext
00030 {
00031 protected:
00032 int jumpOffset;
00033 public:
00034 std::vector<ASObject*> regs;
00035 ASObject* retValue;
00036 ExecutionContext():jumpOffset(0),regs(100){}
00037 void setJumpOffset(int offset)
00038 {
00039 jumpOffset=offset;
00040 }
00041 };
00042
00043 class ActionTag
00044 {
00045 public:
00046 int Length;
00047 ActionTag():Length(1){}
00048 virtual void Execute()=0;
00049 virtual void print()=0;
00050 virtual ~ActionTag(){}
00051 };
00052
00053 class DoActionTag: public DisplayListTag, public ExecutionContext, public DisplayObject
00054 {
00055 private:
00056 std::vector<ActionTag*> actions;
00057 public:
00058 DoActionTag(RECORDHEADER h, std::istream& in);
00059 void execute(MovieClip* parent, std::list < std::pair<PlaceInfo, DisplayObject*> >& list);
00060 void Render();
00061 bool getBounds(number_t& xmin, number_t& xmax, number_t& ymin, number_t& ymax) const
00062 {
00063 abort();
00064 return false;
00065 }
00066 };
00067
00068
00069 class DoInitActionTag: public DisplayListTag, public ExecutionContext, public DisplayObject
00070 {
00071 private:
00072 UI16 SpriteID;
00073
00074 std::vector<ActionTag*> actions;
00075 bool done;
00076 public:
00077 DoInitActionTag(RECORDHEADER h, std::istream& in);
00078 void execute(MovieClip* parent, std::list < std::pair<PlaceInfo, DisplayObject*> >& list);
00079 void Render();
00080 bool getBounds(number_t& xmin, number_t& xmax, number_t& ymin, number_t& ymax) const
00081 {
00082 abort();
00083 return false;
00084 }
00085 };
00086
00087 class ExportAssetsTag: public Tag
00088 {
00089 private:
00090 UI16 Count;
00091 std::vector<UI16> Tags;
00092 std::vector<STRING> Names;
00093 public:
00094 ExportAssetsTag(RECORDHEADER h, std::istream& in);
00095 };
00096
00097 class ACTIONRECORDHEADER
00098 {
00099 public:
00100 UI8 ActionCode;
00101 UI16 Length;
00102 ACTIONRECORDHEADER(std::istream& in);
00103 ActionTag* createTag(std::istream& in);
00104 };
00105
00106 class ActionGetMember:public ActionTag
00107 {
00108 public:
00109 void Execute();
00110 void print(){ LOG(LOG_TRACE,_("ActionGetMember"));}
00111 };
00112
00113 class ActionSetMember:public ActionTag
00114 {
00115 public:
00116 void Execute();
00117 void print(){ LOG(LOG_TRACE,_("ActionSetMember"));}
00118 };
00119
00120 class ActionPlay:public ActionTag
00121 {
00122 public:
00123 void Execute();
00124 void print(){ LOG(LOG_TRACE,_("ActionPlay"));}
00125 };
00126
00127 class ActionStop:public ActionTag
00128 {
00129 public:
00130 void Execute();
00131 void print(){ LOG(LOG_TRACE,_("ActionStop"));}
00132 };
00133
00134 class ActionDefineFunction:public ActionTag, public IFunction
00135 {
00136 private:
00137 STRING FunctionName;
00138 UI16 NumParams;
00139 std::vector<STRING> params;
00140 UI16 CodeSize;
00141
00142 std::vector<ActionTag*> functionActions;
00143 public:
00144 ActionDefineFunction(std::istream& in,ACTIONRECORDHEADER* h);
00145 void Execute();
00146 void print(){ LOG(LOG_TRACE,_("ActionDefineFunction"));}
00147 ASObject* call(ASObject* obj, ASObject* const* args, uint32_t num_args, bool thisOverride=false)
00148 {
00149 abort();
00150 return false;
00151 }
00152 STRING getName(){ return FunctionName; }
00153 };
00154
00155 class REGISTERPARAM
00156 {
00157 public:
00158 UI8 Register;
00159 STRING ParamName;
00160 };
00161
00162 class ActionDefineFunction2:public ActionTag, public IFunction, public ExecutionContext
00163 {
00164 private:
00165 STRING FunctionName;
00166 UI16 NumParams;
00167 UI8 RegisterCount;
00168 UB PreloadParentFlag;
00169 UB PreloadRootFlag;
00170 UB SuppressSuperFlag;
00171 UB PreloadSuperFlag;
00172 UB SuppressArgumentsFlag;
00173 UB PreloadArgumentsFlag;
00174 UB SuppressThisFlag;
00175 UB PreloadThisFlag;
00176 UB PreloadGlobalFlag;
00177 std::vector<REGISTERPARAM> Parameters;
00178 UI16 CodeSize;
00179
00180 std::vector<ActionTag*> functionActions;
00181 public:
00182 ActionDefineFunction2(std::istream& in,ACTIONRECORDHEADER* h);
00183 void Execute();
00184 void print(){ LOG(LOG_TRACE,_("ActionDefineFunction2"));}
00185 ASObject* call(ASObject* obj, ASObject* const* args, uint32_t num_args, bool thisOverride=false)
00186 {
00187 abort();
00188 return false;
00189 }
00190 STRING getName(){ return FunctionName; }
00191 IFunction* toFunction(){ return this; }
00192 };
00193
00194 class ActionJump:public ActionTag
00195 {
00196 private:
00197 SI16 BranchOffset;
00198 public:
00199 ActionJump(std::istream& in);
00200 void Execute();
00201 void print(){ LOG(LOG_TRACE,_("ActionJump"));}
00202 };
00203
00204 class ActionWith:public ActionTag
00205 {
00206 private:
00207 UI16 Size;
00208 public:
00209 ActionWith(std::istream& in);
00210 void Execute();
00211 void print(){ LOG(LOG_TRACE,_("ActionWith"));}
00212 };
00213
00214 class ActionIf:public ActionTag
00215 {
00216 private:
00217 SI16 Offset;
00218 public:
00219 ActionIf(std::istream& in);
00220 void Execute();
00221 void print(){ LOG(LOG_TRACE,_("ActionIf"));}
00222 };
00223
00224 class ActionGotoFrame:public ActionTag
00225 {
00226 private:
00227 UI16 Frame;
00228 public:
00229 ActionGotoFrame(std::istream& in);
00230 void Execute();
00231 void print(){ LOG(LOG_TRACE,_("ActionGotoFrame"));}
00232 };
00233
00234 class ActionGetURL2:public ActionTag
00235 {
00236 private:
00237 UI8 Reserved;
00238 public:
00239 ActionGetURL2(std::istream& in);
00240 void Execute();
00241 void print(){ LOG(LOG_TRACE,_("ActionGetURL2"));}
00242 };
00243
00244 class ActionGetURL:public ActionTag
00245 {
00246 private:
00247 STRING UrlString;
00248 STRING TargetString;
00249 public:
00250 ActionGetURL(std::istream& in);
00251 void Execute();
00252 void print(){ LOG(LOG_TRACE,_("ActionGetURL"));}
00253 };
00254
00255 class ActionConstantPool : public ActionTag
00256 {
00257 private:
00258 UI16 Count;
00259 std::vector<STRING> ConstantPool;
00260 public:
00261 ActionConstantPool(std::istream& in);
00262 void Execute();
00263 void print(){ LOG(LOG_TRACE,_("ActionConstantPool"));}
00264 };
00265
00266 class ActionSetTarget: public ActionTag
00267 {
00268 private:
00269 STRING TargetName;
00270 public:
00271 ActionSetTarget(std::istream& in);
00272 void Execute();
00273 void print(){ LOG(LOG_TRACE,_("ActionSetTarget"));}
00274 };
00275
00276 class ActionGoToLabel : public ActionTag
00277 {
00278 private:
00279 STRING Label;
00280 public:
00281 ActionGoToLabel(std::istream& in);
00282 void Execute();
00283 void print(){ LOG(LOG_TRACE,_("ActionGoToLabel"));}
00284 };
00285
00286 class ActionStringAdd: public ActionTag
00287 {
00288 public:
00289 void Execute();
00290 void print(){ LOG(LOG_TRACE,_("ActionStringAdd"));}
00291 };
00292
00293 class ActionStringExtract: public ActionTag
00294 {
00295 public:
00296 void Execute();
00297 void print(){ LOG(LOG_TRACE,_("ActionStringExtract"));}
00298 };
00299
00300 class ActionNewObject: public ActionTag
00301 {
00302 public:
00303 void Execute();
00304 void print(){ LOG(LOG_TRACE,_("ActionNewObject"));}
00305 };
00306
00307 class ActionAdd2: public ActionTag
00308 {
00309 public:
00310 void Execute();
00311 void print(){ LOG(LOG_TRACE,_("ActionAdd2"));}
00312 };
00313
00314 class ActionModulo: public ActionTag
00315 {
00316 public:
00317 void Execute();
00318 void print(){ LOG(LOG_TRACE,_("ActionModulo"));}
00319 };
00320
00321 class ActionDivide: public ActionTag
00322 {
00323 public:
00324 void Execute();
00325 void print(){ LOG(LOG_TRACE,_("ActionDivide"));}
00326 };
00327
00328 class ActionPushDuplicate: public ActionTag
00329 {
00330 public:
00331 void Execute();
00332 void print(){ LOG(LOG_TRACE,_("ActionPushDuplicate"));}
00333 };
00334
00335 class ActionGetProperty: public ActionTag
00336 {
00337 public:
00338 void Execute();
00339 void print(){ LOG(LOG_TRACE,_("ActionGetProperty"));}
00340 };
00341
00342 class ActionReturn: public ActionTag
00343 {
00344 public:
00345 void Execute();
00346 void print(){ LOG(LOG_TRACE,_("ActionReturn"));}
00347 };
00348
00349 class ActionDefineLocal: public ActionTag
00350 {
00351 public:
00352 void Execute();
00353 void print(){ LOG(LOG_TRACE,_("ActionDefineLocal"));}
00354 };
00355
00356 class ActionMultiply: public ActionTag
00357 {
00358 public:
00359 void Execute();
00360 void print(){ LOG(LOG_TRACE,_("ActionMultiply"));}
00361 };
00362
00363 class ActionSubtract: public ActionTag
00364 {
00365 public:
00366 void Execute();
00367 void print(){ LOG(LOG_TRACE,_("ActionSubtract"));}
00368 };
00369
00370 class ActionPop: public ActionTag
00371 {
00372 public:
00373 void Execute();
00374 void print(){ LOG(LOG_TRACE,_("ActionPop"));}
00375 };
00376
00377 class ActionToInteger: public ActionTag
00378 {
00379 public:
00380 void Execute();
00381 void print(){ LOG(LOG_TRACE,_("ActionToInteger"));}
00382 };
00383
00384 class ActionNot: public ActionTag
00385 {
00386 public:
00387 void Execute();
00388 void print(){ LOG(LOG_TRACE,_("ActionNot"));}
00389 };
00390
00391 class ActionCallMethod: public ActionTag
00392 {
00393 public:
00394 void Execute();
00395 void print(){ LOG(LOG_TRACE,_("ActionCallMethod"));}
00396 };
00397
00398 class ActionCallFunction: public ActionTag
00399 {
00400 public:
00401 void Execute();
00402 void print(){ LOG(LOG_TRACE,_("ActionCallFunction"));}
00403 };
00404
00405 class ActionCloneSprite: public ActionTag
00406 {
00407 public:
00408 void Execute();
00409 void print(){ LOG(LOG_TRACE,_("ActionCloneSprite"));}
00410 };
00411
00412 class ActionTrace: public ActionTag
00413 {
00414 public:
00415 void Execute();
00416 void print(){ LOG(LOG_TRACE,_("ActionTrace"));}
00417 };
00418
00419 class ActionImplementsOp: public ActionTag
00420 {
00421 public:
00422 void Execute();
00423 void print(){ LOG(LOG_TRACE,_("ActionImplementsOp"));}
00424 };
00425
00426 class ActionExtends: public ActionTag
00427 {
00428 public:
00429 void Execute();
00430 void print(){ LOG(LOG_TRACE,_("ActionExtends"));}
00431 };
00432
00433 class ActionDecrement: public ActionTag
00434 {
00435 public:
00436 void Execute();
00437 void print(){ LOG(LOG_TRACE,_("ActionDecrement"));}
00438 };
00439
00440 class ActionInitObject: public ActionTag
00441 {
00442 public:
00443 void Execute();
00444 void print(){ LOG(LOG_TRACE,_("ActionInitObject"));}
00445 };
00446
00447 class ActionNewMethod: public ActionTag
00448 {
00449 public:
00450 void Execute();
00451 void print(){ LOG(LOG_TRACE,_("ActionNewMethod"));}
00452 };
00453
00454 class ActionDelete: public ActionTag
00455 {
00456 public:
00457 void Execute();
00458 void print(){ LOG(LOG_TRACE,_("ActionDelete"));}
00459 };
00460
00461 class ActionInitArray: public ActionTag
00462 {
00463 public:
00464 void Execute();
00465 void print(){ LOG(LOG_TRACE,_("ActionInitArray"));}
00466 };
00467
00468 class ActionTypeOf: public ActionTag
00469 {
00470 public:
00471 void Execute();
00472 void print(){ LOG(LOG_TRACE,_("ActionTypeOf"));}
00473 };
00474
00475 class ActionEnumerate: public ActionTag
00476 {
00477 public:
00478 void Execute();
00479 void print(){ LOG(LOG_TRACE,_("ActionEnumerate"));}
00480 };
00481
00482 class ActionGetTime: public ActionTag
00483 {
00484 public:
00485 void Execute();
00486 void print(){ LOG(LOG_TRACE,_("ActionGetTime"));}
00487 };
00488
00489 class ActionInstanceOf: public ActionTag
00490 {
00491 public:
00492 void Execute();
00493 void print(){ LOG(LOG_TRACE,_("ActionInstanceOf"));}
00494 };
00495
00496 class ActionSetProperty: public ActionTag
00497 {
00498 public:
00499 void Execute();
00500 void print(){ LOG(LOG_TRACE,_("ActionSetProperty"));}
00501 };
00502
00503 class ActionEnumerate2: public ActionTag
00504 {
00505 public:
00506 void Execute();
00507 void print(){ LOG(LOG_TRACE,_("ActionEnumerate2"));}
00508 };
00509
00510 class ActionToString: public ActionTag
00511 {
00512 public:
00513 void Execute();
00514 void print(){ LOG(LOG_TRACE,_("ActionToString"));}
00515 };
00516
00517 class ActionToNumber: public ActionTag
00518 {
00519 public:
00520 void Execute();
00521 void print(){ LOG(LOG_TRACE,_("ActionToNumber"));}
00522 };
00523
00524 class ActionCastOp: public ActionTag
00525 {
00526 public:
00527 void Execute();
00528 void print(){ LOG(LOG_TRACE,_("ActionCastOp"));}
00529 };
00530
00531 class ActionBitAnd: public ActionTag
00532 {
00533 public:
00534 void Execute();
00535 void print(){ LOG(LOG_TRACE,_("ActionBitAnd"));}
00536 };
00537
00538 class ActionBitOr: public ActionTag
00539 {
00540 public:
00541 void Execute();
00542 void print(){ LOG(LOG_TRACE,_("ActionBitOr"));}
00543 };
00544
00545 class ActionBitXor: public ActionTag
00546 {
00547 public:
00548 void Execute();
00549 void print(){ LOG(LOG_TRACE,_("ActionBitXor"));}
00550 };
00551
00552 class ActionBitLShift: public ActionTag
00553 {
00554 public:
00555 void Execute();
00556 void print(){ LOG(LOG_TRACE,_("ActionBitLShift"));}
00557 };
00558
00559 class ActionBitRShift: public ActionTag
00560 {
00561 public:
00562 void Execute();
00563 void print(){ LOG(LOG_TRACE,_("ActionBitRShift"));}
00564 };
00565
00566 class ActionIncrement: public ActionTag
00567 {
00568 public:
00569 void Execute();
00570 void print(){ LOG(LOG_TRACE,_("ActionIncrement"));}
00571 };
00572
00573 class ActionGreater: public ActionTag
00574 {
00575 public:
00576 void Execute();
00577 void print(){ LOG(LOG_TRACE,_("ActionGreater"));}
00578 };
00579
00580 class ActionStringGreater: public ActionTag
00581 {
00582 public:
00583 void Execute();
00584 void print(){ LOG(LOG_TRACE,_("ActionStringGreater"));}
00585 };
00586
00587 class ActionLess2: public ActionTag
00588 {
00589 public:
00590 void Execute();
00591 void print(){ LOG(LOG_TRACE,_("ActionLess2"));}
00592 };
00593
00594 class ActionAsciiToChar: public ActionTag
00595 {
00596 public:
00597 void Execute();
00598 void print(){ LOG(LOG_TRACE,_("ActionAsciiToChar"));}
00599 };
00600
00601 class ActionStrictEquals: public ActionTag
00602 {
00603 public:
00604 void Execute();
00605 void print(){ LOG(LOG_TRACE,_("ActionStrictEquals"));}
00606 };
00607
00608 class ActionEquals2: public ActionTag
00609 {
00610 public:
00611 void Execute();
00612 void print(){ LOG(LOG_TRACE,_("ActionEquals2"));}
00613 };
00614
00615 class ActionStringEquals: public ActionTag
00616 {
00617 public:
00618 void Execute();
00619 void print(){ LOG(LOG_TRACE,_("ActionStringEquals"));}
00620 };
00621
00622 class ActionSetVariable: public ActionTag
00623 {
00624 public:
00625 void Execute();
00626 void print(){ LOG(LOG_TRACE,_("ActionSetVariable"));}
00627 };
00628
00629 class ActionSetTarget2: public ActionTag
00630 {
00631 public:
00632 void Execute();
00633 void print(){ LOG(LOG_TRACE,_("ActionSetTarget2"));}
00634 };
00635
00636 class ActionNotImplemented: public ActionTag
00637 {
00638 public:
00639 void Execute();
00640 void print(){ LOG(LOG_TRACE,_("Not implemented action"));}
00641 };
00642
00643 class ActionGetVariable: public ActionTag
00644 {
00645 public:
00646 void Execute();
00647 void print(){ LOG(LOG_TRACE,_("ActionGetVariable"));}
00648 };
00649
00650 class ActionToggleQuality: public ActionTag
00651 {
00652 public:
00653 void Execute();
00654 };
00655
00656 class ActionStoreRegister : public ActionTag
00657 {
00658 private:
00659 UI8 RegisterNumber;
00660 public:
00661 ActionStoreRegister(std::istream& in);
00662 void Execute();
00663 void print(){ LOG(LOG_TRACE,_("ActionStoreRegister"));}
00664 };
00665
00666 class ActionPush : public ActionTag
00667 {
00668 private:
00669 UI8 Type;
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679 std::vector<ASObject*> Objects;
00680 public:
00681 ActionPush(std::istream& in,ACTIONRECORDHEADER* h);
00682 void Execute();
00683 void print();
00684 };
00685
00686 class BUTTONCONDACTION
00687 {
00688 public:
00689 UI16 CondActionSize;
00690 UB CondIdleToOverDown;
00691 UB CondOutDownToIdle;
00692 UB CondOutDownToOverDown;
00693 UB CondOverDownToOutDown;
00694 UB CondOverDownToOverUp;
00695 UB CondOverUpToOverDown;
00696 UB CondOverUpToIdle;
00697 UB CondIdleToOverUp;
00698 UB CondKeyPress;
00699 UB CondOverDownToIdle;
00700 std::vector<ActionTag*> Actions;
00701
00702 bool isLast()
00703 {
00704 return !CondActionSize;
00705 }
00706 };
00707
00708 std::istream& operator>>(std::istream& stream, BUTTONCONDACTION& v);
00709
00710 };