]> granicus.if.org Git - python/commitdiff
Subclasses of ObjectSpecifier can now be packed and unpacked. This allows
authorJack Jansen <jack.jansen@cwi.nl>
Mon, 31 Mar 2003 13:32:59 +0000 (13:32 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Mon, 31 Mar 2003 13:32:59 +0000 (13:32 +0000)
you to say something like "talker.count(want=Address_Book.people)" in
stead of having to manually create the aetypes.Type(Address_Book.people.want)
OSA type.

Lib/plat-mac/aepack.py

index 17a7e7050de2f23de91718a881ad8b7104930bf4..5dd95b84506effacec69c41393505ca484e29ba0 100644 (file)
@@ -23,7 +23,7 @@ import MacOS
 import Carbon.File
 import StringIO
 import aetypes
-from aetypes import mkenum, mktype
+from aetypes import mkenum, ObjectSpecifier
 import os
 
 # These ones seem to be missing from AppleEvents
@@ -99,7 +99,7 @@ def pack(x, forcetype = None):
        if isinstance(x, StringType):
                return AE.AECreateDesc('TEXT', x)
        if isinstance(x, UnicodeType):
-               data = t.encode('utf16')
+               data = x.encode('utf16')
                if data[:2] == '\xfe\xff':
                        data = data[2:]
                return AE.AECreateDesc('utxt', data)
@@ -114,6 +114,9 @@ def pack(x, forcetype = None):
                        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'):
@@ -231,7 +234,7 @@ def unpack(desc, formodulename=""):
        if t == typeTrue:
                return 1
        if t == typeType:
-               return mktype(desc.data)
+               return mktype(desc.data, formodulename)
        #
        # The following are special
        #
@@ -339,11 +342,25 @@ def mkobject(dict):
 # to __class__ is safe. Moreover, shouldn't there be a better
 # initializer for the classes in the suites?
 def mkobjectfrommodule(dict, modulename):
+       if type(dict['want']) == types.ClassType and issubclass(dict['want'], ObjectSpecifier):
+               # The type has already been converted to Python. Convert back:-(
+               classtype = dict['want']
+               dict['want'] = aetypes.mktype(classtype.want)
        want = dict['want'].type
        module = __import__(modulename)
        codenamemapper = module._classdeclarations
        classtype = codenamemapper.get(want, None)
        newobj = mkobject(dict)
        if classtype:
+               assert issubclass(classtype, ObjectSpecifier)
                newobj.__class__ = classtype
        return newobj
+       
+def mktype(typecode, modulename=None):
+       if modulename:
+               module = __import__(modulename)
+               codenamemapper = module._classdeclarations
+               classtype = codenamemapper.get(typecode, None)
+               if classtype:
+                       return classtype
+       return aetypes.mktype(typecode)