summaryrefslogtreecommitdiffstats
path: root/Mac/Lib
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2002-08-07 14:49:00 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2002-08-07 14:49:00 (GMT)
commit8b77767094ba4bf3fb497ce974261366470d6aa3 (patch)
treee4283696eb5272d0aaff19cf4c0832bc57321575 /Mac/Lib
parentb2bb87300bd5db23216d5f339e1cdb6e4c613b42 (diff)
downloadcpython-8b77767094ba4bf3fb497ce974261366470d6aa3.zip
cpython-8b77767094ba4bf3fb497ce974261366470d6aa3.tar.gz
cpython-8b77767094ba4bf3fb497ce974261366470d6aa3.tar.bz2
Donovan Preston's patch #538395, with some mods by me.
This patch makes inheritance for OSA classes work. The implementation is a bit convoluted, but I don't immedeately see a simpler way of doing it. I added calls to ascii() everywhere we output strings that may contain non-ascii characters (Python has gotten very picky since the encoding patch:-). I also removed Donovan's different way of opening resource files: I don't seem to need it.
Diffstat (limited to 'Mac/Lib')
-rw-r--r--Mac/Lib/aepack.py53
-rw-r--r--Mac/Lib/aetools.py40
-rw-r--r--Mac/Lib/aetypes.py24
3 files changed, 97 insertions, 20 deletions
diff --git a/Mac/Lib/aepack.py b/Mac/Lib/aepack.py
index f58dd33..dfb2953 100644
--- a/Mac/Lib/aepack.py
+++ b/Mac/Lib/aepack.py
@@ -24,6 +24,7 @@ import macfs
import StringIO
import aetypes
from aetypes import mkenum, mktype
+import os
# These ones seem to be missing from AppleEvents
# (they're in AERegistry.h)
@@ -61,6 +62,15 @@ AEDescType = AE.AEDescType
FSSType = macfs.FSSpecType
AliasType = macfs.AliasType
+def packkey(ae, key, value):
+ if hasattr(key, 'which'):
+ keystr = key.which
+ elif hasattr(key, 'want'):
+ keystr = key.want
+ else:
+ keystr = key
+ ae.AEPutParamDesc(keystr, pack(value))
+
def pack(x, forcetype = None):
"""Pack a python object into an AE descriptor"""
@@ -99,13 +109,18 @@ def pack(x, forcetype = None):
if t == DictionaryType:
record = AE.AECreateList('', 1)
for key, value in x.items():
- record.AEPutParamDesc(key, pack(value))
+ packkey(record, key, value)
+ #record.AEPutParamDesc(key, pack(value))
return record
if t == InstanceType and 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 unpack(desc):
+def unpack(desc, formodulename=""):
"""Unpack an AE descriptor to a python object"""
t = desc.type
@@ -117,17 +132,17 @@ def unpack(desc):
l = []
for i in range(desc.AECountItems()):
keyword, item = desc.AEGetNthDesc(i+1, '****')
- l.append(unpack(item))
+ l.append(unpack(item, formodulename))
return l
if t == typeAERecord:
d = {}
for i in range(desc.AECountItems()):
keyword, item = desc.AEGetNthDesc(i+1, '****')
- d[keyword] = unpack(item)
+ d[keyword] = unpack(item, formodulename)
return d
if t == typeAEText:
record = desc.AECoerceDesc('reco')
- return mkaetext(unpack(record))
+ return mkaetext(unpack(record, formodulename))
if t == typeAlias:
return macfs.RawAlias(desc.data)
# typeAppleEvent returned as unknown
@@ -153,7 +168,7 @@ def unpack(desc):
return macfs.RawFSSpec(desc.data)
if t == typeInsertionLoc:
record = desc.AECoerceDesc('reco')
- return mkinsertionloc(unpack(record))
+ return mkinsertionloc(unpack(record, formodulename))
# typeInteger equal to typeLongInteger
if t == typeIntlText:
script, language = struct.unpack('hh', desc.data[:4])
@@ -177,7 +192,11 @@ def unpack(desc):
return v
if t == typeObjectSpecifier:
record = desc.AECoerceDesc('reco')
- return mkobject(unpack(record))
+ # If we have been told the name of the module we are unpacking aedescs for,
+ # we can attempt to create the right type of python object from that module.
+ if formodulename:
+ return mkobjectfrommodule(unpack(record, formodulename), formodulename)
+ return mkobject(unpack(record, formodulename))
# typePict returned as unknown
# typePixelMap coerced to typeAERecord
# typePixelMapMinus returned as unknown
@@ -214,13 +233,13 @@ def unpack(desc):
#
if t == 'rang':
record = desc.AECoerceDesc('reco')
- return mkrange(unpack(record))
+ return mkrange(unpack(record, formodulename))
if t == 'cmpd':
record = desc.AECoerceDesc('reco')
- return mkcomparison(unpack(record))
+ return mkcomparison(unpack(record, formodulename))
if t == 'logi':
record = desc.AECoerceDesc('reco')
- return mklogical(unpack(record))
+ return mklogical(unpack(record, formodulename))
return mkunknown(desc.type, desc.data)
def coerce(data, egdata):
@@ -311,6 +330,20 @@ def mkobject(dict):
return aetypes.Property(seld.type, fr)
return aetypes.ObjectSpecifier(want, form, seld, fr)
+# Note by Jack: I'm not 100% sure of the following code. This was
+# provided by Donovan Preston, but I wonder whether the assignment
+# to __class__ is safe. Moreover, shouldn't there be a better
+# initializer for the classes in the suites?
+def mkobjectfrommodule(dict, modulename):
+ want = dict['want'].type
+ module = __import__(modulename)
+ codenamemapper = module._classdeclarations
+ classtype = codenamemapper.get(want, None)
+ newobj = mkobject(dict)
+ if classtype:
+ newobj.__class__ = classtype
+ return newobj
+
def _test():
"""Test program. Pack and unpack various things"""
objs = [
diff --git a/Mac/Lib/aetools.py b/Mac/Lib/aetools.py
index ba42f03..5495dfa 100644
--- a/Mac/Lib/aetools.py
+++ b/Mac/Lib/aetools.py
@@ -28,7 +28,7 @@ import MacOS
import sys
from aetypes import *
-from aepack import pack, unpack, coerce, AEDescType
+from aepack import packkey, pack, unpack, coerce, AEDescType
Error = 'aetools.Error'
@@ -56,19 +56,19 @@ def missed(ae):
return None
return desc.data
-def unpackevent(ae):
+def unpackevent(ae, formodulename=""):
parameters = {}
try:
dirobj = ae.AEGetParamDesc('----', '****')
except AE.Error:
pass
else:
- parameters['----'] = unpack(dirobj)
+ parameters['----'] = unpack(dirobj, formodulename)
del dirobj
while 1:
key = missed(ae)
if not key: break
- parameters[key] = unpack(ae.AEGetParamDesc(key, '****'))
+ parameters[key] = unpack(ae.AEGetParamDesc(key, '****'), formodulename)
attributes = {}
for key in aekeywords:
try:
@@ -77,14 +77,14 @@ def unpackevent(ae):
if msg[0] != -1701 and msg[0] != -1704:
raise sys.exc_type, sys.exc_value
continue
- attributes[key] = unpack(desc)
+ attributes[key] = unpack(desc, formodulename)
return parameters, attributes
def packevent(ae, parameters = {}, attributes = {}):
for key, value in parameters.items():
- ae.AEPutParamDesc(key, pack(value))
+ packkey(ae, key, value)
for key, value in attributes.items():
- ae.AEPutAttributeDesc(key, pack(value))
+ packkey(ae, key, value)
#
# Support routine for automatically generated Suite interfaces
@@ -130,6 +130,7 @@ def decodeerror(arguments):
class TalkTo:
"""An AE connection to an application"""
_signature = None # Can be overridden by subclasses
+ _moduleName = None # Can be overridden by subclasses
def __init__(self, signature=None, start=0, timeout=0):
"""Create a communication channel with a particular application.
@@ -183,7 +184,7 @@ class TalkTo:
reply = event.AESend(self.send_flags, self.send_priority,
self.send_timeout)
- parameters, attributes = unpackevent(reply)
+ parameters, attributes = unpackevent(reply, self._moduleName)
return reply, parameters, attributes
def send(self, code, subcode, parameters = {}, attributes = {}):
@@ -218,6 +219,29 @@ class TalkTo:
if _arguments.has_key('----'):
return _arguments['----']
+ if as:
+ item.__class__ = as
+ return item
+
+ def _set(self, _object, _arguments = {}, _attributes = {}):
+ """ _set: set data for an object
+ Required argument: the object
+ Keyword argument _parameters: Parameter dictionary for the set operation
+ Keyword argument _attributes: AppleEvent attribute dictionary
+ Returns: the data
+ """
+ _code = 'core'
+ _subcode = 'setd'
+
+ _arguments['----'] = _object
+
+ _reply, _arguments, _attributes = self.send(_code, _subcode,
+ _arguments, _attributes)
+ if _arguments.has_key('errn'):
+ raise Error, decodeerror(_arguments)
+
+ if _arguments.has_key('----'):
+ return _arguments['----']
# Tiny Finder class, for local use only
diff --git a/Mac/Lib/aetypes.py b/Mac/Lib/aetypes.py
index 8fe8cf9..d376e74 100644
--- a/Mac/Lib/aetypes.py
+++ b/Mac/Lib/aetypes.py
@@ -9,9 +9,9 @@ import string
# convoluted, since there are cyclic dependencies between this file and
# aetools_convert.
#
-def pack(*args):
+def pack(*args, **kwargs):
from aepack import pack
- return apply(pack, args)
+ return apply(pack, args, kwargs)
def IsSubclass(cls, base):
"""Test whether CLASS1 is the same as or a subclass of CLASS2"""
@@ -69,6 +69,26 @@ def mkenum(enum):
if IsEnum(enum): return enum
return Enum(enum)
+# Jack changed the way this is done
+class InsertionLoc:
+ def __init__(self, of, pos):
+ self.of = of
+ self.pos = pos
+
+ def __repr__(self):
+ return "InsertionLoc(%s, %s)" % (`self.of`, `self.pos`)
+
+ def __aepack__(self):
+ rec = {'kobj': self.of, 'kpos': self.pos}
+ return pack(rec, forcetype='insl')
+
+# Convenience functions for dsp:
+def beginning(of):
+ return InsertionLoc(of, Enum('bgng'))
+
+def end(of):
+ return InsertionLoc(of, Enum('end '))
+
class Boolean:
"""An AE boolean value"""