def pack(x, forcetype=None): """Pack a python object into an AE descriptor""" if forcetype: if type(x) is StringType: return AE.AECreateDesc(forcetype, x) else: return pack(x).AECoerceDesc(forcetype) if x is None: return AE.AECreateDesc('null', '') if isinstance(x, AEDescType): return x if isinstance(x, FSSType): return AE.AECreateDesc('fss ', x.data) if isinstance(x, FSRefType): return AE.AECreateDesc('fsrf', x.data) if isinstance(x, AliasType): return AE.AECreateDesc('alis', x.data) if isinstance(x, IntType): return AE.AECreateDesc('long', struct.pack('l', x)) if isinstance(x, FloatType): return AE.AECreateDesc('doub', struct.pack('d', x)) if isinstance(x, StringType): return AE.AECreateDesc('TEXT', x) if isinstance(x, UnicodeType): data = x.encode('utf16') if data[:2] == '\xfe\xff': data = data[2:] return AE.AECreateDesc('utxt', data) if isinstance(x, ListType): list = AE.AECreateList('', 0) for item in x: list.AEPutDesc(0, pack(item)) return list if isinstance(x, DictionaryType): record = AE.AECreateList('', 1) for key, value in x.items(): packkey(record, key, value) #record.AEPutParamDesc(key, pack(value)) return record if type(x) == types.ClassType and issubclass(x, ObjectSpecifier): # Note: we are getting a class object here, not an instance return AE.AECreateDesc('type', x.want) if hasattr(x, '__aepack__'): return x.__aepack__() if hasattr(x, 'which'): return AE.AECreateDesc('TEXT', x.which) if hasattr(x, 'want'): return AE.AECreateDesc('TEXT', x.want) return AE.AECreateDesc('TEXT', repr(x)) # Copout
def pack(x, forcetype=None): if forcetype: if type(x) is StringType: return AE.AECreateDesc(forcetype, x) else: return pack(x).AECoerceDesc(forcetype) if x is None: return AE.AECreateDesc('null', '') elif isinstance(x, AEDescType): return x elif isinstance(x, FSSType): return AE.AECreateDesc('fss ', x.data) elif isinstance(x, FSRefType): return AE.AECreateDesc('fsrf', x.data) elif isinstance(x, AliasType): return AE.AECreateDesc('alis', x.data) elif isinstance(x, IntType): return AE.AECreateDesc('long', struct.pack('l', x)) elif isinstance(x, FloatType): return AE.AECreateDesc('doub', struct.pack('d', x)) elif isinstance(x, StringType): return AE.AECreateDesc('TEXT', x) elif isinstance(x, UnicodeType): data = x.encode('utf16') if data[:2] == '\xfe\xff': data = data[2:] return AE.AECreateDesc('utxt', data) elif isinstance(x, ListType): list = AE.AECreateList('', 0) for item in x: list.AEPutDesc(0, pack(item)) return list elif isinstance(x, DictionaryType): record = AE.AECreateList('', 1) for key, value in x.items(): packkey(record, key, value) return record elif type(x) == types.ClassType and issubclass(x, ObjectSpecifier): return AE.AECreateDesc('type', x.want) elif hasattr(x, '__aepack__'): return x.__aepack__() elif hasattr(x, 'which'): return AE.AECreateDesc('TEXT', x.which) else: return AE.AECreateDesc('TEXT', x.want) if hasattr( x, 'want') else AE.AECreateDesc('TEXT', repr(x))
"""Tools for use in AppleEvent clients and servers: