| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | """'echo' -- an AppleEvent handler which handles all events the same.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | It replies to each event by echoing the parameter back to the client. | 
					
						
							|  |  |  | This is a good way to find out how the Script Editor formats AppleEvents, | 
					
						
							|  |  |  | especially to figure out all the different forms an object specifier | 
					
						
							|  |  |  | can have (without having to rely on Apple's implementation). | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-19 15:59:49 +00:00
										 |  |  | import sys | 
					
						
							|  |  |  | sys.stdout = sys.stderr | 
					
						
							|  |  |  | import traceback | 
					
						
							|  |  |  | import MacOS | 
					
						
							| 
									
										
										
										
											2001-08-25 12:15:04 +00:00
										 |  |  | from Carbon import AE | 
					
						
							|  |  |  | from Carbon.AppleEvents import * | 
					
						
							|  |  |  | from Carbon import Evt | 
					
						
							|  |  |  | from Carbon.Events import * | 
					
						
							|  |  |  | from Carbon import Menu | 
					
						
							|  |  |  | from Carbon import Dlg | 
					
						
							|  |  |  | from Carbon import Win | 
					
						
							|  |  |  | from Carbon.Windows import * | 
					
						
							|  |  |  | from Carbon import Qd | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | import aetools | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | import EasyDialogs | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | kHighLevelEvent = 23				# Not defined anywhere for Python yet? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-07-29 15:34:25 +00:00
										 |  |  | def mymessage(str): | 
					
						
							|  |  |  | 	err = AE.AEInteractWithUser(kAEDefaultTimeout) | 
					
						
							|  |  |  | 	if err: | 
					
						
							|  |  |  | 		print str | 
					
						
							|  |  |  | 	EasyDialogs.Message(str) | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							|  |  |  | 	echo = EchoServer() | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:56 +00:00
										 |  |  | 	saveparams = MacOS.SchedParams(0, 0)	# Disable Python's own "event handling" | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 	try: | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 		echo.mainloop(everyEvent, 0) | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 	finally: | 
					
						
							| 
									
										
										
										
											1997-06-12 10:49:56 +00:00
										 |  |  | 		apply(MacOS.SchedParams, saveparams)	# Let Python have a go at events | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 		echo.close() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class EchoServer: | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-07-29 15:34:25 +00:00
										 |  |  | 	#suites = ['aevt', 'core', 'reqd'] | 
					
						
							|  |  |  | 	suites = ['****'] | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self): | 
					
						
							|  |  |  | 		self.active = 0 | 
					
						
							|  |  |  | 		for suite in self.suites: | 
					
						
							|  |  |  | 			AE.AEInstallEventHandler(suite, typeWildCard, self.aehandler) | 
					
						
							| 
									
										
										
										
											1995-07-29 15:34:25 +00:00
										 |  |  | 			print (suite, typeWildCard, self.aehandler) | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 		self.active = 1 | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 		self.appleid = 1 | 
					
						
							|  |  |  | 		Menu.ClearMenuBar() | 
					
						
							|  |  |  | 		self.applemenu = applemenu = Menu.NewMenu(self.appleid, "\024") | 
					
						
							|  |  |  | 		applemenu.AppendMenu("All about echo...;(-") | 
					
						
							|  |  |  | 		applemenu.InsertMenu(0) | 
					
						
							|  |  |  | 		Menu.DrawMenuBar() | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def __del__(self): | 
					
						
							|  |  |  | 		self.close() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def close(self): | 
					
						
							|  |  |  | 		if self.active: | 
					
						
							|  |  |  | 			self.active = 0 | 
					
						
							|  |  |  | 			for suite in self.suites: | 
					
						
							|  |  |  | 				AE.AERemoveEventHandler(suite, typeWildCard) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def mainloop(self, mask = everyEvent, timeout = 60*60): | 
					
						
							|  |  |  | 		while 1: | 
					
						
							| 
									
										
										
										
											1995-02-19 15:59:49 +00:00
										 |  |  | 			self.dooneevent(mask, timeout) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def dooneevent(self, mask = everyEvent, timeout = 60*60): | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 			got, event = Evt.WaitNextEvent(mask, timeout) | 
					
						
							|  |  |  | 			if got: | 
					
						
							|  |  |  | 				self.lowlevelhandler(event) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def lowlevelhandler(self, event): | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 		what, message, when, where, modifiers = event | 
					
						
							|  |  |  | 		h, v = where | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 		if what == kHighLevelEvent: | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 			msg = "High Level Event: %s %s" % \ | 
					
						
							|  |  |  | 				(`code(message)`, `code(h | (v<<16))`) | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 			try: | 
					
						
							|  |  |  | 				AE.AEProcessAppleEvent(event) | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 			except AE.Error, err: | 
					
						
							| 
									
										
										
										
											1995-07-29 15:34:25 +00:00
										 |  |  | 				mymessage(msg + "\015AEProcessAppleEvent error: %s" % str(err)) | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 				traceback.print_exc() | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 			else: | 
					
						
							| 
									
										
										
										
											1995-07-29 15:34:25 +00:00
										 |  |  | 				mymessage(msg + "\015OK!") | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 		elif what == keyDown: | 
					
						
							|  |  |  | 			c = chr(message & charCodeMask) | 
					
						
							|  |  |  | 			if c == '.' and modifiers & cmdKey: | 
					
						
							|  |  |  | 				raise KeyboardInterrupt, "Command-period" | 
					
						
							|  |  |  | 			MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | 		elif what == mouseDown: | 
					
						
							|  |  |  | 			partcode, window = Win.FindWindow(where) | 
					
						
							|  |  |  | 			if partcode == inMenuBar: | 
					
						
							|  |  |  | 				result = Menu.MenuSelect(where) | 
					
						
							|  |  |  | 				id = (result>>16) & 0xffff	# Hi word | 
					
						
							|  |  |  | 				item = result & 0xffff		# Lo word | 
					
						
							|  |  |  | 				if id == self.appleid: | 
					
						
							|  |  |  | 					if item == 1: | 
					
						
							| 
									
										
										
										
											1995-07-29 15:34:25 +00:00
										 |  |  | 						mymessage("Echo -- echo AppleEvents") | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 		elif what <> autoKey: | 
					
						
							|  |  |  | 			print "Event:", (eventname(what), message, when, (h, v), modifiers) | 
					
						
							| 
									
										
										
										
											1995-03-10 14:42:57 +00:00
										 |  |  | ##			MacOS.HandleEvent(event) | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def aehandler(self, request, reply): | 
					
						
							| 
									
										
										
										
											1995-07-29 15:34:25 +00:00
										 |  |  | 		print "Apple Event!" | 
					
						
							| 
									
										
										
										
											1995-02-05 16:59:27 +00:00
										 |  |  | 		parameters, attributes = aetools.unpackevent(request) | 
					
						
							|  |  |  | 		print "class =", `attributes['evcl'].type`, | 
					
						
							|  |  |  | 		print "id =", `attributes['evid'].type` | 
					
						
							|  |  |  | 		print "Parameters:" | 
					
						
							|  |  |  | 		keys = parameters.keys() | 
					
						
							|  |  |  | 		keys.sort() | 
					
						
							|  |  |  | 		for key in keys: | 
					
						
							|  |  |  | 			print "%s: %.150s" % (`key`, `parameters[key]`) | 
					
						
							|  |  |  | 			print "      :", str(parameters[key]) | 
					
						
							|  |  |  | 		print "Attributes:" | 
					
						
							|  |  |  | 		keys = attributes.keys() | 
					
						
							|  |  |  | 		keys.sort() | 
					
						
							|  |  |  | 		for key in keys: | 
					
						
							|  |  |  | 			print "%s: %.150s" % (`key`, `attributes[key]`) | 
					
						
							|  |  |  | 		aetools.packevent(reply, parameters) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _eventnames = { | 
					
						
							|  |  |  | 	keyDown: 'keyDown', | 
					
						
							|  |  |  | 	autoKey: 'autoKey', | 
					
						
							|  |  |  | 	mouseDown: 'mouseDown', | 
					
						
							|  |  |  | 	mouseUp: 'mouseUp', | 
					
						
							|  |  |  | 	updateEvt: 'updateEvt', | 
					
						
							|  |  |  | 	diskEvt: 'diskEvt', | 
					
						
							|  |  |  | 	activateEvt: 'activateEvt', | 
					
						
							|  |  |  | 	osEvt: 'osEvt', | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def eventname(what): | 
					
						
							|  |  |  | 	if _eventnames.has_key(what): return _eventnames[what] | 
					
						
							|  |  |  | 	else: return `what` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def code(x): | 
					
						
							|  |  |  | 	"Convert a long int to the 4-character code it really is" | 
					
						
							|  |  |  | 	s = '' | 
					
						
							|  |  |  | 	for i in range(4): | 
					
						
							|  |  |  | 		x, c = divmod(x, 256) | 
					
						
							|  |  |  | 		s = chr(c) + s | 
					
						
							|  |  |  | 	return s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  | 	main() |