import struct import dispatch from dispatch import strategy, functions, combiners, NoApplicableMethods from flashticle.util import StringIO, BitReader, BitWriter, msb_fromstring from flashticle.util import read_string, pack_string, Value, iter_only from flashticle.actions_simple import * def read_actionheader(f, header): code = ord(f.read(1)) if code >= 0x80: length = struct.unpack(')' % ( type(self).__name__, self.code, len(self.data)) @read_action.when(strategy.default) def read_action_UnknownAction(code, length, f, header): if length: data = f.read(length) else: try: cls = SIMPLEACTIONS_CODE[code] except KeyError: data = '' else: return cls() return UnknownAction(code, data) @serialize_action.when("isinstance(tag, UnknownAction)") def serialize_action_unknown(tag, header): return tag.code, tag.data @serialize_action.when(strategy.default) def serialize_action_default(tag, header): if 0x80 > getattr(tag, 'code', -1) >= 0: return (tag.code,) raise TypeError("%r can not be serialized" % (tag,)) class ActionStoreRegister(Value): code = 0x87 def __init__(self, register): self.register = register def __repr__(self): return '%s(%r)' % (type(self).__name__, self.register) @read_action.when("code == ActionStoreRegister.code") def read_action_ActionStoreRegister(code, length, f, header): register = ord(f.read(1)) return ActionStoreRegister(register) @serialize_action.when("isinstance(tag, ActionStoreRegister)") def serialize_action_ActionConstantPool(tag, header): register = chr(tag.register) return tag.code, register class ActionConstantPool(Value): code = 0x88 def __init__(self, constantPool): self.constantPool = constantPool def __call__(self, s): try: idx = self.constantPool.index(s) except ValueError: idx = len(self.constantPool) self.constantPool.append(s) return ConstantPoolIndex(idx) def __repr__(self): return '%s(%r)' % (type(self).__name__, self.constantPool) @read_action.when("code == ActionConstantPool.code") def read_action_ActionConstantPool(code, length, f, header): count = struct.unpack('= 0x80: length += 3 else: length += 1 maxbytes -= length if maxbytes == 0: break assert maxbytes > 0 class ClipEventFlags(Value): def __init__(self, keyUp=None, keyDown=None, mouseUp=None, mouseDown=None, mouseMove=None, unload=None, enterFrame=None, load=None, dragOver=None, rollOut=None, rollOver=None, releaseOutside=None, release=None, press=None, initialize=None, data=None, construct=None, keyPress=None, dragOut=None): self.keyUp = keyUp self.keyDown = keyDown self.mouseUp = mouseUp, self.mouseDown = mouseDown self.mouseMove = mouseMove self.unload = unload self.enterFrame = enterFrame, self.load = load self.dragOver = dragOver self.rollOut = rollOut self.rollOver = rollOver, self.releaseOutside = releaseOutside self.release = release self.press = press self.initialize = initialize, self.data = data self.construct = construct self.keyPress = keyPress self.dragOut = dragOut def unpack_ClipEventFlags(s, header): newstyle = header.sig.version >= 6 bits = msb_fromstring(s) keyUp, keyDown, mouseUp, mouseDown, \ mouseMove, unload, enterFrame, \ load, dragOver, rollOut, rollOver, \ releaseOutside, release, press, \ initialize, data = bits[:16] if newstyle: #ignore = br.readbits(5) construct, keyPress, dragOut = bits[16 + 5:16 + 8] #ignore = f.read(1) else: construct, keyPress, dragOut = None, None, None return ClipEventFlags(keyUp, keyDown, mouseUp, mouseDown, mouseMove, unload, enterFrame, load, dragOver, rollOut, rollOver, releaseOutside, release, press, initialize, data, construct, keyPress, dragOut) def pack_ClipEventFlags(self, header): bits = [ self.keyUp, self.keyDown, self.mouseUp, self.mouseDown, self.mouseMove, self.unload, self.enterFrame, self.load, self.dragOver, self.rollOut, self.rollOver, self.releaseOutside, self.release, self.press, self.initialize, self.data ] if header.sig.version >= 6: bits.extend([0] * 5) bits.extend([self.construct, self.keyPress, self.dragOut]) bits.extend([0] * 8) fmt = '>I' else: fmt = '>H' return struct.pack(fmt, msb_toint(bits)) def read_ClipEventFlags(f, header): newstyle = header.sig.version >= 6 if newstyle: return unpack_ClipEventFlags(f.read(4), header) else: return unpack_ClipEventFlags(f.read(2), header) class ClipActionRecord(Value): def __init__(self, flags, data): self.flags = flags # XXX: contains actions self.data = data def pack_ClipActionRecord(self, header): return ( pack_ClipEventFlags(self.flags, header) + struct.pack('= 6) and 4 or 2) def read_all_ClipActionRecord(f, header): count = (header.sig.version >= 6) and 4 or 2 endflag = '\x00' * count while True: flags = f.read(count) if flags == endflag: break flags = unpack_ClipEventFlags(flags, header) size = struct.unpack('