Fix three PyChecker-detected gotchas.
[python/dscho.git] / Mac / Lib / test / AEservertest.py
blob631889d89057c9cf808d3c31806a7699bd9f8667
1 """AEservertest - Test AppleEvent server interface
3 (adapted from Guido's 'echo' program).
5 Build an applet from this source, and include the aete resource that you
6 want to test. Use the AEservertest script to try things.
7 """
9 import sys
10 sys.stdout = sys.stderr
11 import traceback
12 import MacOS
13 import AE
14 from AppleEvents import *
15 import Evt
16 from Events import *
17 import Menu
18 import Dlg
19 import Win
20 from Windows import *
21 import Qd
22 import macfs
24 import aetools
25 import EasyDialogs
27 kHighLevelEvent = 23 # Not defined anywhere for Python yet?
29 Quit='Quit'
31 def mymessage(str):
32 err = AE.AEInteractWithUser(kAEDefaultTimeout)
33 if err:
34 print str
35 EasyDialogs.Message(str)
37 def myaskstring(str, default=''):
38 err = AE.AEInteractWithUser(kAEDefaultTimeout)
39 if err:
40 return default
41 return EasyDialogs.AskString(str, default)
43 def main():
44 echo = EchoServer()
45 savepars = MacOS.SchedParams(0, 0) # Disable Python's own "event handling"
46 try:
47 try:
48 echo.mainloop(everyEvent, 0)
49 except Quit:
50 pass
51 finally:
52 apply(MacOS.SchedParams, savepars) # Let Python have a go at events
53 echo.close()
56 class EchoServer:
58 suites = ['aevt', 'core', 'reqd']
60 def __init__(self):
61 self.active = 0
63 # Install the handlers
65 for suite in self.suites:
66 AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler)
67 print (suite, typeWildCard, self.aehandler)
68 self.active = 1
70 # Setup the apple menu and file/quit
72 self.appleid = 1
73 self.fileid = 2
75 Menu.ClearMenuBar()
76 self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024")
77 applemenu.AppendMenu("All about echo...;(-")
78 applemenu.InsertMenu(0)
80 self.filemenu = Menu.NewMenu(self.fileid, 'File')
81 self.filemenu.AppendMenu("Quit/Q")
82 self.filemenu.InsertMenu(0)
84 Menu.DrawMenuBar()
86 # Set interaction allowed (for the return values)
88 AE.AESetInteractionAllowed(kAEInteractWithAll)
90 def __del__(self):
91 self.close()
93 def close(self):
94 if self.active:
95 self.active = 0
96 for suite in self.suites:
97 AE.AERemoveEventHandler(suite, typeWildCard)
99 def mainloop(self, mask = everyEvent, timeout = 60*60):
100 while 1:
101 self.dooneevent(mask, timeout)
103 def dooneevent(self, mask = everyEvent, timeout = 60*60):
104 got, event = Evt.WaitNextEvent(mask, timeout)
105 if got:
106 self.lowlevelhandler(event)
108 def lowlevelhandler(self, event):
109 what, message, when, where, modifiers = event
110 h, v = where
111 if what == kHighLevelEvent:
112 msg = "High Level Event: %s %s" % \
113 (`code(message)`, `code(h | (v<<16))`)
114 self.handled_by_us = 0
115 try:
116 AE.AEProcessAppleEvent(event)
117 except AE.Error, err:
118 mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err))
119 traceback.print_exc()
120 else:
121 if self.handled_by_us == 0:
122 print msg, "Handled by AE, somehow"
123 else:
124 print msg, 'Handled by us.'
125 elif what == keyDown:
126 c = chr(message & charCodeMask)
127 if modifiers & cmdKey:
128 if c == '.':
129 raise KeyboardInterrupt, "Command-period"
130 else:
131 self.menuhit(Menu.MenuKey(message&charCodeMask))
132 ##MacOS.HandleEvent(event)
133 elif what == mouseDown:
134 partcode, window = Win.FindWindow(where)
135 if partcode == inMenuBar:
136 result = Menu.MenuSelect(where)
137 self.menuhit(result)
138 elif what <> autoKey:
139 print "Event:", (eventname(what), message, when, (h, v), modifiers)
140 ## MacOS.HandleEvent(event)
142 def menuhit(self, result):
143 id = (result>>16) & 0xffff # Hi word
144 item = result & 0xffff # Lo word
145 if id == self.appleid:
146 if item == 1:
147 mymessage("Echo -- echo AppleEvents")
148 elif id == self.fileid:
149 if item == 1:
150 raise Quit
152 def aehandler(self, request, reply):
153 print "Apple Event!"
154 self.handled_by_us = 1
155 parameters, attributes = aetools.unpackevent(request)
156 print "class =", `attributes['evcl'].type`,
157 print "id =", `attributes['evid'].type`
158 print "Parameters:"
159 keys = parameters.keys()
160 keys.sort()
161 for key in keys:
162 print "%s: %.150s" % (`key`, `parameters[key]`)
163 print " :", str(parameters[key])
164 print "Attributes:"
165 keys = attributes.keys()
166 keys.sort()
167 for key in keys:
168 print "%s: %.150s" % (`key`, `attributes[key]`)
169 parameters['----'] = self.askreplyvalue()
170 aetools.packevent(reply, parameters)
172 def askreplyvalue(self):
173 while 1:
174 str = myaskstring('Reply value to send (python-style)', 'None')
175 try:
176 rv = eval(str)
177 break
178 except:
179 pass
180 return rv
182 _eventnames = {
183 keyDown: 'keyDown',
184 autoKey: 'autoKey',
185 mouseDown: 'mouseDown',
186 mouseUp: 'mouseUp',
187 updateEvt: 'updateEvt',
188 diskEvt: 'diskEvt',
189 activateEvt: 'activateEvt',
190 osEvt: 'osEvt',
193 def eventname(what):
194 if _eventnames.has_key(what): return _eventnames[what]
195 else: return `what`
197 def code(x):
198 "Convert a long int to the 4-character code it really is"
199 s = ''
200 for i in range(4):
201 x, c = divmod(x, 256)
202 s = chr(c) + s
203 return s
206 if __name__ == '__main__':
207 main()