123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- class Action(object):
- def __init__(self, code, length):
- self._code = code
- self._length = length
-
- @property
- def code(self):
- return self._code
-
- @property
- def length(self):
- return self._length;
-
- @property
- def version(self):
- return 3
-
- def parse(self, data):
- # Do nothing. Many Actions don't have a payload.
- # For the ones that have one we override this method.
- pass
-
- def __repr__(self):
- return "[Action] Code: 0x%x, Length: %d" % (self._code, self._length)
- class ActionUnknown(Action):
- ''' Dummy class to read unknown actions '''
- def __init__(self, code, length):
- super(ActionUnknown, self).__init__(code, length)
-
- def parse(self, data):
- if self._length > 0:
- #print "skipping %d bytes..." % self._length
- data.skip_bytes(self._length)
-
- def __repr__(self):
- return "[ActionUnknown] Code: 0x%x, Length: %d" % (self._code, self._length)
-
- class Action4(Action):
- ''' Base class for SWF 4 actions '''
- def __init__(self, code, length):
- super(Action4, self).__init__(code, length)
-
- @property
- def version(self):
- return 4
- class Action5(Action):
- ''' Base class for SWF 5 actions '''
- def __init__(self, code, length):
- super(Action5, self).__init__(code, length)
- @property
- def version(self):
- return 5
-
- class Action6(Action):
- ''' Base class for SWF 6 actions '''
- def __init__(self, code, length):
- super(Action6, self).__init__(code, length)
- @property
- def version(self):
- return 6
-
- class Action7(Action):
- ''' Base class for SWF 7 actions '''
- def __init__(self, code, length):
- super(Action7, self).__init__(code, length)
- @property
- def version(self):
- return 7
-
- # =========================================================
- # SWF 3 actions
- # =========================================================
- class ActionGetURL(Action):
- CODE = 0x83
- def __init__(self, code, length):
- self.urlString = None
- self.targetString = None
- super(ActionGetURL, self).__init__(code, length)
-
- def parse(self, data):
- self.urlString = data.readString()
- self.targetString = data.readString()
-
- class ActionGotoFrame(Action):
- CODE = 0x81
- def __init__(self, code, length):
- self.frame = 0
- super(ActionGotoFrame, self).__init__(code, length)
- def parse(self, data):
- self.frame = data.readUI16()
-
- class ActionGotoLabel(Action):
- CODE = 0x8c
- def __init__(self, code, length):
- self.label = None
- super(ActionGotoLabel, self).__init__(code, length)
- def parse(self, data):
- self.label = data.readString()
-
- class ActionNextFrame(Action):
- CODE = 0x04
- def __init__(self, code, length):
- super(ActionNextFrame, self).__init__(code, length)
- class ActionPlay(Action):
- CODE = 0x06
- def __init__(self, code, length):
- super(ActionPlay, self).__init__(code, length)
-
- def __repr__(self):
- return "[ActionPlay] Code: 0x%x, Length: %d" % (self._code, self._length)
-
- class ActionPreviousFrame(Action):
- CODE = 0x05
- def __init__(self, code, length):
- super(ActionPreviousFrame, self).__init__(code, length)
-
- class ActionSetTarget(Action):
- CODE = 0x8b
- def __init__(self, code, length):
- self.targetName = None
- super(ActionSetTarget, self).__init__(code, length)
- def parse(self, data):
- self.targetName = data.readString()
-
- class ActionStop(Action):
- CODE = 0x07
- def __init__(self, code, length):
- super(ActionStop, self).__init__(code, length)
-
- def __repr__(self):
- return "[ActionStop] Code: 0x%x, Length: %d" % (self._code, self._length)
-
- class ActionStopSounds(Action):
- CODE = 0x09
- def __init__(self, code, length):
- super(ActionStopSounds, self).__init__(code, length)
-
- class ActionToggleQuality(Action):
- CODE = 0x08
- def __init__(self, code, length):
- super(ActionToggleQuality, self).__init__(code, length)
-
- class ActionWaitForFrame(Action):
- CODE = 0x8a
- def __init__(self, code, length):
- self.frame = 0
- self.skipCount = 0
- super(ActionWaitForFrame, self).__init__(code, length)
- def parse(self, data):
- self.frame = data.readUI16()
- self.skipCount = data.readUI8()
-
- # =========================================================
- # SWF 4 actions
- # =========================================================
- class ActionAdd(Action4):
- CODE = 0x0a
- def __init__(self, code, length):
- super(ActionAdd, self).__init__(code, length)
- class ActionAnd(Action4):
- CODE = 0x10
- def __init__(self, code, length):
- super(ActionAnd, self).__init__(code, length)
-
- # urgh! some 100 to go...
- ActionTable = {}
- for name, value in dict(locals()).items():
- if type(value) == type and issubclass(value, Action) and hasattr(value, 'CODE'):
- ActionTable[value.CODE] = value
- class SWFActionFactory(object):
- @classmethod
- def create(cls, code, length):
- return ActionTable.get(code, ActionUnknown)(code, length)
-
|