summaryrefslogtreecommitdiffstats
path: root/Mac/Modules/ae/aescan.py
blob: b744489c60bf22c7726222005642917f129aff8c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# Scan AppleEvents.h header file, generate aegen.py and AppleEvents.py files.
# Then run aesupport to generate AEmodule.c.
# (Should learn how to tell the compiler to compile it as well.)

import sys
import os
import string
import regex
import regsub
import MacOS

BGENDIR=os.path.join(sys.prefix, ':Tools:bgen:bgen')
sys.path.append(BGENDIR)
from bgenlocations import TOOLBOXDIR

from scantools import Scanner

def main():
	print "=== Scanning AERegistry.h for defines ==="
	input = "AERegistry.h"
	output = "@dummy-registry.py"
	defsoutput = TOOLBOXDIR + "AERegistry.py"
	scanner = AppleEventsRegScanner(input, output, defsoutput)
	scanner.scan()
	scanner.close()
	print "=== Scanning AEObjects.h for defines ==="
	# XXXX This isn't correct. We only scan AEObjects.h for defines, but there
	# are some functions in there that are probably useful (the accessor stuff)
	# once we start writing servers in python.
	input = "AEObjects.h"
	output = "@dummy-objects.py"
	defsoutput = TOOLBOXDIR + "AEObjects.py"
	scanner = AppleEventsScanner(input, output, defsoutput)
	scanner.scan()
	scanner.close()
	print "=== Scanning AEDataModel.h ==="
	input = "AEDataModel.h"
	output = "aedatamodelgen.py"
	defsoutput = TOOLBOXDIR + "AEDataModel.py"
	scanner = AppleEventsScanner(input, output, defsoutput)
	
	scanner.scan()
	scanner.close()
	print "=== Scanning AppleEvents.h ==="
	input = "AppleEvents.h"
	output = "aegen.py"
	defsoutput = TOOLBOXDIR + "AppleEvents.py"
	scanner = AppleEventsRegScanner(input, output, defsoutput)
	scanner.scan()
	scanner.close()
	print "=== Done Scanning and Generating, now doing 'import aesupport' ==="
	import aesupport
	print "=== Done 'import aesupport'.  It's up to you to compile AEmodule.c ==="

class AppleEventsScanner(Scanner):

	def destination(self, type, name, arglist):
		classname = "AEFunction"
		listname = "functions"
		if arglist:
			t, n, m = arglist[0]
			if t[-4:] == "_ptr" and m == "InMode" and \
			   t[:-4] in ("AEDesc", "AEAddressDesc", "AEDescList",
			         "AERecord", "AppleEvent"):
				classname = "AEMethod"
				listname = "aedescmethods"
		return classname, listname

	def makeblacklistnames(self):
		return [
			"AEDisposeDesc",
#			"AEGetEventHandler",
			"AEGetDescData", # Use object.data
			"AEGetSpecialHandler",
			# Constants with funny definitions
			"kAEDontDisposeOnResume",
			"kAEUseStandardDispatch",
			]

	def makegreylist(self):
		return [
			('#if TARGET_API_MAC_CARBON', [
				'AEGetDescDataSize',
				'AEReplaceDescData',
			])]
	def makeblacklisttypes(self):
		return [
			"ProcPtr",
			"AEArrayType",
			"AECoercionHandlerUPP",
			"UniversalProcPtr",
			]

	def makerepairinstructions(self):
		return [
			([("Boolean", "isSysHandler", "InMode")],
			 [("AlwaysFalse", "*", "*")]),
			
			([("void_ptr", "*", "InMode"), ("Size", "*", "InMode")],
			 [("InBuffer", "*", "*")]),
			
			([("EventHandlerProcPtr", "*", "InMode"), ("long", "*", "InMode")],
			 [("EventHandler", "*", "*")]),
			
			([("EventHandlerProcPtr", "*", "OutMode"), ("long", "*", "OutMode")],
			 [("EventHandler", "*", "*")]),
			
			([("AEEventHandlerUPP", "*", "InMode"), ("long", "*", "InMode")],
			 [("EventHandler", "*", "*")]),
			
			([("AEEventHandlerUPP", "*", "OutMode"), ("long", "*", "OutMode")],
			 [("EventHandler", "*", "*")]),
			
			([("void", "*", "OutMode"), ("Size", "*", "InMode"),
			                            ("Size", "*", "OutMode")],
			 [("VarVarOutBuffer", "*", "InOutMode")]),
			 
			([("AppleEvent", "theAppleEvent", "OutMode")],
			 [("AppleEvent_ptr", "*", "InMode")]),
			 
			([("AEDescList", "theAEDescList", "OutMode")],
			 [("AEDescList_ptr", "*", "InMode")]),
			]

	def writeinitialdefs(self):
		self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")

class AppleEventsRegScanner(AppleEventsScanner):
	def writeinitialdefs(self):
		self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n")
		self.defsfile.write("from AEDataModel import *\n")

if __name__ == "__main__":
	main()