summaryrefslogtreecommitdiffstats
path: root/Mac/Lib/test/aete.py
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2003-11-19 14:34:18 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2003-11-19 14:34:18 (GMT)
commit28ecf70db57828db2ca279643bf9aeca7662f35c (patch)
tree09b7767bbc411f85313b58d6fe7e5e67d9392973 /Mac/Lib/test/aete.py
parent6045b9c93511c767f6cfa2d2fa299c76181acd9b (diff)
downloadcpython-28ecf70db57828db2ca279643bf9aeca7662f35c.zip
cpython-28ecf70db57828db2ca279643bf9aeca7662f35c.tar.gz
cpython-28ecf70db57828db2ca279643bf9aeca7662f35c.tar.bz2
Getting rid of support for MacOS9 and earlier. This is the first step,
and the biggest in size, but probably the easiest. Hunting through the source code comes next.
Diffstat (limited to 'Mac/Lib/test/aete.py')
-rw-r--r--Mac/Lib/test/aete.py475
1 files changed, 0 insertions, 475 deletions
diff --git a/Mac/Lib/test/aete.py b/Mac/Lib/test/aete.py
deleted file mode 100644
index 3945a86..0000000
--- a/Mac/Lib/test/aete.py
+++ /dev/null
@@ -1,475 +0,0 @@
-# Look for scriptable applications -- that is, applications with an 'aete' resource
-# Also contains (partially) reverse engineered 'aete' resource decoding
-
-import MacOS
-import os
-import string
-import sys
-import types
-import StringIO
-
-from Carbon.Res import *
-
-def main():
- filename = ""
- redirect(filename, realmain)
-
-def redirect(filename, func, *args):
- f = filename and open(filename, 'w')
- save_stdout = sys.stdout
- try:
- if f: sys.stdout = f
- return apply(func, args)
- finally:
- sys.stdout = save_stdout
- if f: f.close()
-
-def realmain():
- #list('C:System Folder:Extensions:AppleScript\252')
- #list('C:Tao AppleScript:Finder Liaison:Finder Liaison 1.0')
- list('C:Tao AppleScript:Scriptable Text Editor')
- #list('C:Internet:Eudora 1.4.2:Eudora1.4.2')
- #list('E:Excel 4.0:Microsoft Excel')
- #list('C:Internet:Netscape 1.0N:Netscape 1.0N')
- #find('C:')
- #find('D:')
- #find('E:')
- #find('F:')
-
-def find(dir, maxlevel = 5):
- hits = []
- cur = CurResFile()
- names = os.listdir(dir)
- tuples = map(lambda x: (os.path.normcase(x), x), names)
- tuples.sort()
- names = map(lambda (x, y): y, tuples)
- for name in names:
- if name in (os.curdir, os.pardir): continue
- fullname = os.path.join(dir, name)
- if os.path.islink(fullname):
- pass
- if os.path.isdir(fullname):
- if maxlevel > 0:
- sys.stderr.write(" %s\n" % `fullname`)
- hits = hits + find(fullname, maxlevel-1)
- else:
- ctor, type = MacOS.GetCreatorAndType(fullname)
- if type in ('APPL', 'FNDR', 'zsys', 'INIT', 'scri', 'cdev'):
- sys.stderr.write(" %s\n" % `fullname`)
- try:
- rf = OpenRFPerm(fullname, 0, '\1')
- except MacOS.Error, msg:
- print "Error:", fullname, msg
- continue
- UseResFile(rf)
- n = Count1Resources('aete')
- if rf <> cur:
- CloseResFile(rf)
- UseResFile(cur)
- if n > 1:
- hits.append(fullname)
- sys.stderr.write("YES! %d in %s\n" % (n, `fullname`))
- list(fullname)
- return hits
-
-def list(fullname):
- cur = CurResFile()
- rf = OpenRFPerm(fullname, 0, '\1')
- try:
- UseResFile(rf)
- resources = []
- for i in range(Count1Resources('aete')):
- res = Get1IndResource('aete', 1+i)
- resources.append(res)
- for i in range(Count1Resources('aeut')):
- res = Get1IndResource('aeut', 1+i)
- resources.append(res)
- print "\nLISTING aete+aeut RESOURCES IN", `fullname`
- for res in resources:
- print "decoding", res.GetResInfo(), "..."
- data = res.data
- try:
- aete = decode(data)
- showaete(aete)
- print "Checking putaete..."
- f = StringIO.StringIO()
- putaete(f, aete)
- newdata = f.getvalue()
- if len(newdata) == len(data):
- if newdata == data:
- print "putaete created identical data"
- else:
- newaete = decode(newdata)
- if newaete == aete:
- print "putaete created equivalent data"
- else:
- print "putaete failed the test:"
- showaete(newaete)
- else:
- print "putaete created different data:"
- print `newdata`
- except:
- import traceback
- traceback.print_exc()
- sys.stdout.flush()
- finally:
- if rf <> cur:
- CloseResFile(rf)
- UseResFile(cur)
-
-def decode(data):
- f = StringIO.StringIO(data)
- aete = generic(getaete, f)
- aete = simplify(aete)
- processed = f.tell()
- unprocessed = len(f.read())
- total = f.tell()
- if unprocessed:
- sys.stderr.write("%d processed + %d unprocessed = %d total\n" %
- (processed, unprocessed, total))
- return aete
-
-def simplify(item):
- if type(item) is types.ListType:
- return map(simplify, item)
- elif type(item) == types.TupleType and len(item) == 2:
- return simplify(item[1])
- else:
- return item
-
-
-# Here follows the aete resource decoder.
-# It is presented bottom-up instead of top-down because there are direct
-# references to the lower-level part-decoders from the high-level part-decoders.
-
-def getbyte(f, *args):
- c = f.read(1)
- if not c:
- raise EOFError, 'in getbyte' + str(args)
- return ord(c)
-
-def getword(f, *args):
- getalign(f)
- s = f.read(2)
- if len(s) < 2:
- raise EOFError, 'in getword' + str(args)
- return (ord(s[0])<<8) | ord(s[1])
-
-def getlong(f, *args):
- getalign(f)
- s = f.read(4)
- if len(s) < 4:
- raise EOFError, 'in getlong' + str(args)
- return (ord(s[0])<<24) | (ord(s[1])<<16) | (ord(s[2])<<8) | ord(s[3])
-
-def getostype(f, *args):
- getalign(f)
- s = f.read(4)
- if len(s) < 4:
- raise EOFError, 'in getostype' + str(args)
- return s
-
-def getpstr(f, *args):
- c = f.read(1)
- if len(c) < 1:
- raise EOFError, 'in getpstr[1]' + str(args)
- nbytes = ord(c)
- if nbytes == 0: return ''
- s = f.read(nbytes)
- if len(s) < nbytes:
- raise EOFError, 'in getpstr[2]' + str(args)
- return s
-
-def getalign(f):
- if f.tell() & 1:
- c = f.read(1)
- ##if c <> '\0':
- ## print 'align:', `c`
-
-def getlist(f, description, getitem):
- count = getword(f)
- list = []
- for i in range(count):
- list.append(generic(getitem, f))
- getalign(f)
- return list
-
-def alt_generic(what, f, *args):
- print "generic", `what`, args
- res = vageneric(what, f, args)
- print '->', `res`
- return res
-
-def generic(what, f, *args):
- if type(what) == types.FunctionType:
- return apply(what, (f,) + args)
- if type(what) == types.ListType:
- record = []
- for thing in what:
- item = apply(generic, thing[:1] + (f,) + thing[1:])
- record.append((thing[1], item))
- return record
- return "BAD GENERIC ARGS: %s" % `what`
-
-getdata = [
- (getostype, "type"),
- (getpstr, "description"),
- (getword, "flags")
- ]
-getargument = [
- (getpstr, "name"),
- (getostype, "keyword"),
- (getdata, "what")
- ]
-getevent = [
- (getpstr, "name"),
- (getpstr, "description"),
- (getostype, "suite code"),
- (getostype, "event code"),
- (getdata, "returns"),
- (getdata, "accepts"),
- (getlist, "optional arguments", getargument)
- ]
-getproperty = [
- (getpstr, "name"),
- (getostype, "code"),
- (getdata, "what")
- ]
-getelement = [
- (getostype, "type"),
- (getlist, "keyform", getostype)
- ]
-getclass = [
- (getpstr, "name"),
- (getostype, "class code"),
- (getpstr, "description"),
- (getlist, "properties", getproperty),
- (getlist, "elements", getelement)
- ]
-getcomparison = [
- (getpstr, "operator name"),
- (getostype, "operator ID"),
- (getpstr, "operator comment"),
- ]
-getenumerator = [
- (getpstr, "enumerator name"),
- (getostype, "enumerator ID"),
- (getpstr, "enumerator comment")
- ]
-getenumeration = [
- (getostype, "enumeration ID"),
- (getlist, "enumerator", getenumerator)
- ]
-getsuite = [
- (getpstr, "suite name"),
- (getpstr, "suite description"),
- (getostype, "suite ID"),
- (getword, "suite level"),
- (getword, "suite version"),
- (getlist, "events", getevent),
- (getlist, "classes", getclass),
- (getlist, "comparisons", getcomparison),
- (getlist, "enumerations", getenumeration)
- ]
-getaete = [
- (getword, "major/minor version in BCD"),
- (getword, "language code"),
- (getword, "script code"),
- (getlist, "suites", getsuite)
- ]
-
-
-# Display 'aete' resources in a friendly manner.
-# This one's done top-down again...
-
-def showaete(aete):
- [version, language, script, suites] = aete
- major, minor = divmod(version, 256)
- print "\nVersion %d/%d, language %d, script %d" % \
- (major, minor, language, script)
- for suite in suites:
- showsuite(suite)
-
-def showsuite(suite):
- [name, desc, code, level, version, events, classes, comps, enums] = suite
- print "\nSuite %s -- %s (%s)" % (`name`, `desc`, `code`)
- print "Level %d, version %d" % (level, version)
- for event in events:
- showevent(event)
- for cls in classes:
- showclass(cls)
- for comp in comps:
- showcomparison(comp)
- for enum in enums:
- showenumeration(enum)
-
-def showevent(event):
- [name, desc, code, subcode, returns, accepts, arguments] = event
- print "\n Command %s -- %s (%s, %s)" % (`name`, `desc`, `code`, `subcode`)
- print " returns", showdata(returns)
- print " accepts", showdata(accepts)
- for arg in arguments:
- showargument(arg)
-
-def showargument(arg):
- [name, keyword, what] = arg
- print " %s (%s)" % (name, `keyword`), showdata(what)
-
-def showclass(cls):
- [name, code, desc, properties, elements] = cls
- print "\n Class %s (%s) -- %s" % (`name`, `code`, `desc`)
- for prop in properties:
- showproperty(prop)
- for elem in elements:
- showelement(elem)
-
-def showproperty(prop):
- [name, code, what] = prop
- print " property %s (%s)" % (`name`, `code`), showdata(what)
-
-def showelement(elem):
- [code, keyform] = elem
- print " element %s" % `code`, "as", keyform
-
-def showcomparison(comp):
- [name, code, comment] = comp
- print " comparison %s (%s) -- %s" % (`name`, `code`, comment)
-
-def showenumeration(enum):
- [code, items] = enum
- print "\n Enum %s" % `code`
- for item in items:
- showenumerator(item)
-
-def showenumerator(item):
- [name, code, desc] = item
- print " %s (%s) -- %s" % (`name`, `code`, `desc`)
-
-def showdata(data):
- [type, description, flags] = data
- return "%s -- %s %s" % (`type`, `description`, showdataflags(flags))
-
-dataflagdict = {15: "optional", 14: "list", 13: "enum", 12: "mutable"}
-def showdataflags(flags):
- bits = []
- for i in range(16):
- if flags & (1<<i):
- if i in dataflagdict.keys():
- bits.append(dataflagdict[i])
- else:
- bits.append(`i`)
- return '[%s]' % string.join(bits)
-
-
-# Write an 'aete' resource.
-# Closedly modelled after showaete()...
-
-def putaete(f, aete):
- [version, language, script, suites] = aete
- putword(f, version)
- putword(f, language)
- putword(f, script)
- putlist(f, suites, putsuite)
-
-def putsuite(f, suite):
- [name, desc, code, level, version, events, classes, comps, enums] = suite
- putpstr(f, name)
- putpstr(f, desc)
- putostype(f, code)
- putword(f, level)
- putword(f, version)
- putlist(f, events, putevent)
- putlist(f, classes, putclass)
- putlist(f, comps, putcomparison)
- putlist(f, enums, putenumeration)
-
-def putevent(f, event):
- [name, desc, eventclass, eventid, returns, accepts, arguments] = event
- putpstr(f, name)
- putpstr(f, desc)
- putostype(f, eventclass)
- putostype(f, eventid)
- putdata(f, returns)
- putdata(f, accepts)
- putlist(f, arguments, putargument)
-
-def putargument(f, arg):
- [name, keyword, what] = arg
- putpstr(f, name)
- putostype(f, keyword)
- putdata(f, what)
-
-def putclass(f, cls):
- [name, code, desc, properties, elements] = cls
- putpstr(f, name)
- putostype(f, code)
- putpstr(f, desc)
- putlist(f, properties, putproperty)
- putlist(f, elements, putelement)
-
-putproperty = putargument
-
-def putelement(f, elem):
- [code, parts] = elem
- putostype(f, code)
- putlist(f, parts, putostype)
-
-def putcomparison(f, comp):
- [name, id, comment] = comp
- putpstr(f, name)
- putostype(f, id)
- putpstr(f, comment)
-
-def putenumeration(f, enum):
- [code, items] = enum
- putostype(f, code)
- putlist(f, items, putenumerator)
-
-def putenumerator(f, item):
- [name, code, desc] = item
- putpstr(f, name)
- putostype(f, code)
- putpstr(f, desc)
-
-def putdata(f, data):
- [type, description, flags] = data
- putostype(f, type)
- putpstr(f, description)
- putword(f, flags)
-
-def putlist(f, list, putitem):
- putword(f, len(list))
- for item in list:
- putitem(f, item)
- putalign(f)
-
-def putalign(f):
- if f.tell() & 1:
- f.write('\0')
-
-def putbyte(f, value):
- f.write(chr(value))
-
-def putword(f, value):
- putalign(f)
- f.write(chr((value>>8)&0xff))
- f.write(chr(value&0xff))
-
-def putostype(f, value):
- putalign(f)
- if type(value) != types.StringType or len(value) != 4:
- raise TypeError, "ostype must be 4-char string"
- f.write(value)
-
-def putpstr(f, value):
- if type(value) != types.StringType or len(value) > 255:
- raise TypeError, "pstr must be string <= 255 chars"
- f.write(chr(len(value)) + value)
-
-
-# Call the main program
-
-if __name__ == '__main__':
- main()
-else:
- realmain()