mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			301 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			301 lines
		
	
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
| Python script a module to comunicate with apple events
 | |
| 
 | |
| v 0.1a2
 | |
| v.0.2 16 april 1998 
 | |
| 
 | |
| 
 | |
| """
 | |
| import sys
 | |
| import getaete
 | |
| import baetools
 | |
| import baetypes
 | |
| import AE
 | |
| import AppleEvents
 | |
| import macfs
 | |
| from types import *
 | |
| #from aetypes import InstanceType
 | |
| from aepack import AEDescType
 | |
| 
 | |
| ordinal = {
 | |
| 'every': 'all ',
 | |
| 'first' : 'firs',
 | |
| 'last' : 'last',
 | |
| 'any' : 'any ',
 | |
| 'middle' : 'midd'}
 | |
| 
 | |
| 
 | |
| Error = 'PythonScript.Error'
 | |
| 
 | |
| 
 | |
| class PsEvents:
 | |
| 	pass
 | |
| 
 | |
| 
 | |
| class PsClasses:
 | |
| 
 | |
| 	
 | |
| 	def __getattr__(self, name):
 | |
| 		try:
 | |
| 			return DCItem(name, self)
 | |
| 		except:
 | |
| 			pass
 | |
| 		
 | |
| 	def __repr__(self):
 | |
| 		if self.form != 'prop':
 | |
| 			t = type(self.seld)
 | |
| 			if t == StringType:
 | |
| 				self.form = 'name'
 | |
| 			elif baetypes.IsRange(self.seld):
 | |
| 				self.form = 'rang'
 | |
| 			elif baetypes.IsComparison(self.seld) or baetypes.IsLogical(self.seld):
 | |
| 				self.form = 'test'
 | |
| 			elif t == TupleType:
 | |
| 			# Breakout: specify both form and seld in a tuple
 | |
| 			# (if you want ID or rele or somesuch)
 | |
| 				self.form, self.seld = self.seld
 | |
| 			elif t == IntType:
 | |
| 				self.form = 'indx'
 | |
| 			else:
 | |
| 				pass
 | |
| 
 | |
| 		if self.seld in ordinal.keys():
 | |
| 			self.seld = baetypes.Ordinal(ordinal[self.seld])
 | |
| 			self.form = 'indx'
 | |
| 
 | |
| 		s = "baetypes.ObjectSpecifier(%s, %s, %s" % (`self.want`, `self.form`, `self.seld`)
 | |
| 		if `self.fr`:
 | |
| 			s = s + ", %s)" % `self.fr`
 | |
| 		else:
 | |
| 			s = s + ")"
 | |
| 		return s
 | |
| 		
 | |
| 	def __str__(self):
 | |
| 		return self.want
 | |
| 		
 | |
| 		
 | |
| def template(self, seld=None, fr=None):
 | |
| 	self.seld = seld
 | |
| 	self.fr = fr
 | |
| 		
 | |
| def template1(self, which, fr=None):
 | |
| 	self.want = 'prop'
 | |
| 	self.form = 'prop'
 | |
| 	self.fr = fr
 | |
| 	
 | |
| class DCItem:
 | |
| 	def __init__(self, comp, fr):
 | |
| 		self.compclass = comp
 | |
| 		self.fr = fr
 | |
| 		
 | |
| 	def __call__(self, which=None):
 | |
| 		if which:
 | |
| 			self.compclass = eval('PsClass.%s' % self.compclass)
 | |
| 		else:
 | |
| 			try:
 | |
| 				self.compclass = eval('PsProperties.%s' % self.compclass)
 | |
| 			except AttributeError:
 | |
| 				self.compclass = eval('PsClass.%s' % self.compclass)
 | |
| 		return self.compclass(which, self.fr)
 | |
| 
 | |
| class PsClass:
 | |
| 	pass
 | |
| 
 | |
| class PsProperties:
 | |
| 	pass				
 | |
| 
 | |
| 
 | |
| class PsEnumerations:
 | |
| 	pass
 | |
| 
 | |
| 			
 | |
| def PsScript(sig=None, Timeout=0, Ignoring=0):
 | |
| 	elements = {}
 | |
| 	if sig:
 | |
| 		target, sig = Signature(sig)
 | |
| 		pyscript = getaete.Getaete(sig)
 | |
| 	else:
 | |
| 		target, sig = Signature('Pyth')
 | |
| 		pyscript = getaete.Getaete()
 | |
| 	setattr(PyScript, 'timeout', Timeout)
 | |
| 	setattr(PyScript, 'ignoring', Ignoring)
 | |
| 	setattr(PyScript, 'target', target)
 | |
| 	for key, value in pyscript[0].items():
 | |
| 		setattr(PsEvents, key, value)
 | |
| 	for key, value in pyscript[1].items():
 | |
| 		CreateClass(key, 'PsClasses', value)
 | |
| 		for val in value[2]:
 | |
| 			CreateProperty(val[0], 'PsClasses', `val[1]`)
 | |
| 			
 | |
| 		if value[3]:
 | |
| 			for val in value[3]:
 | |
| 				if val[0] not in elements.keys():
 | |
| 					elements[val[0]] = val[1]
 | |
| 				elif len(val[1]) > len(elements[val[0]]):
 | |
| 					elements[val[0]] = val[1]
 | |
| 
 | |
| 	for key, value in pyscript[2].items():
 | |
| 		for val in value:
 | |
| 			setattr(PsEnumerations, val[0], val[1])
 | |
| 
 | |
| def CreateClass(newClassName, superClassName, value):
 | |
| 	parentDict = PsClass.__dict__
 | |
| 	exec "class %s(%s): pass" % (newClassName, superClassName) in \
 | |
| 			globals(), parentDict
 | |
| 	newClassObj = parentDict[newClassName]
 | |
| 	newClassObj.__init__ = template
 | |
| 	exec "setattr(newClassObj, 'want', %s)" % `value[0]`
 | |
| 	if value[2] and value[2][0][0] == 'every':
 | |
| 		exec "setattr(newClassObj, 'plur', 1)"
 | |
| 
 | |
| def CreateProperty(newClassName, superClassName, value):
 | |
| 	parentDict = PsProperties.__dict__
 | |
| 	exec "class %s(%s): pass" % (newClassName, superClassName) in \
 | |
| 			globals(), parentDict
 | |
| 	newClassObj = parentDict[newClassName]
 | |
| 	if newClassName == 'Every':
 | |
| 		value = "baetypes.mkOrdinal('every')"
 | |
| 	newClassObj.__init__ = template1
 | |
| 	exec "setattr(newClassObj, 'seld', %s)" % value
 | |
| 
 | |
| def Signature(signature):
 | |
| 	if type(signature) == AEDescType:
 | |
| 		target = signature
 | |
| 	elif type(signature) == InstanceType and hasattr(signature, '__aepack__'):
 | |
| 		target = signature.__aepack__()
 | |
| 	elif type(signature) == StringType:
 | |
| 		if len(signature) == 4:
 | |
| 			target = AE.AECreateDesc(AppleEvents.typeApplSignature, signature)
 | |
| 			target_signature = signature
 | |
| 		else:
 | |
| 			#This should ready be made persistant, so PythonScript 'remembered' where applications were
 | |
| 			fss, ok = macfs.PromptGetFile('Find the aplication %s' % signature, 'APPL')
 | |
| 			if ok:
 | |
| 				target_signature = fss.GetCreatorType()[0]
 | |
| 				target = AE.AECreateDesc(AppleEvents.typeApplSignature, target_signature)
 | |
| 	else:
 | |
| 		raise TypeError, "signature should be 4-char string or AEDesc"
 | |
| 	return target, target_signature
 | |
| 
 | |
| 		
 | |
| 
 | |
| 		
 | |
| class PyScript(PsEvents):
 | |
| 	def __init__(self, name, obj=None,  **args):
 | |
| 		desc, code, subcode, rply, message, keywds = name
 | |
| #		print 'code', code
 | |
| #		print 'subcode', subcode
 | |
| #		print 'rply', rply
 | |
| #		print 'message', message
 | |
| #		print 'keywds', keywds
 | |
| #		print 'name', name
 | |
| #		print 'obj', obj
 | |
| #		print 'args', args
 | |
| 		self.code = code
 | |
| 		self.subcode = subcode
 | |
| 		self.attributes ={}
 | |
| 		self.arguments = {}
 | |
| 		if keywds:
 | |
| 			self.arguments = self.keyargs(keywds, args)
 | |
| 		self.arguments['----'] = self.keyfms(message[0], obj)
 | |
| 
 | |
| 		##XXXX Eudora needs this XXXX##
 | |
| 		if self.arguments['----'] == None:
 | |
| 			del self.arguments['----']
 | |
| #		print 'arguments', self.arguments
 | |
| 		if self.ignoring or rply[0] == 'null':
 | |
| 			self.send_flags = AppleEvents.kAENoReply
 | |
| 		else:
 | |
| 			self.send_flags = AppleEvents.kAEWaitReply
 | |
| 		self.send_priority = AppleEvents.kAENormalPriority	
 | |
| 		if self.timeout:
 | |
| 			self.send_timeout = self.timeout
 | |
| 		else:
 | |
| 			self.send_timeout = AppleEvents.kAEDefaultTimeout
 | |
| 
 | |
| 
 | |
| 	def keyargs(self, ats, args):
 | |
| #		print 'keyargs', ats, args
 | |
| 		output = {}
 | |
| 		for arg in args.keys():
 | |
| 			for at in ats:
 | |
| 				if at[0] == arg:
 | |
| 					output[at[1]] = self.keyfms(at[2][0], args[arg])
 | |
| 		return output
 | |
| 				
 | |
| 	def keyfms(self, key, value):
 | |
| #		print 'keyfms', 'key', key, `value`
 | |
| 		if key == 'obj ' or key == 'insl':
 | |
| 			return eval(`value`)
 | |
| 		elif key == 'TEXT':
 | |
| 			return value
 | |
| 		elif key == 'null':
 | |
| 			return 
 | |
| 		elif key == 'bool':
 | |
| 			return baetypes.mkboolean(value)
 | |
| 		elif key == 'type':
 | |
| 			try:
 | |
| 				val = eval('PsClass.%s()' % value)
 | |
| 				return baetypes.mktype(str(val))
 | |
| 			except:
 | |
| 				return baetypes.mktype(value)
 | |
| 		else:
 | |
| 			print "I don't know what to put here -- script.keyargs"
 | |
| 			print key, `value`
 | |
| 			sys.exit[1]
 | |
| 		
 | |
| 	def newevent(self, code, subcode, parameters = {}, attributes = {}):
 | |
| 		"""Create a complete structure for an apple event"""
 | |
| #		print code, subcode, parameters, attributes
 | |
| 		event = AE.AECreateAppleEvent(code, subcode, self.target,
 | |
| 			  	  AppleEvents.kAutoGenerateReturnID, AppleEvents.kAnyTransactionID)
 | |
| 		baetools.packevent(event, parameters, attributes)
 | |
| 		return event
 | |
| 		
 | |
| 	def sendevent(self, event):
 | |
| 		"""Send a pre-created appleevent, await the reply and unpack it"""
 | |
| 		
 | |
| 		reply = event.AESend(self.send_flags, self.send_priority,
 | |
| 							  self.send_timeout)
 | |
| 		parameters, attributes = baetools.unpackevent(reply)
 | |
| 		return reply, parameters, attributes
 | |
| 		
 | |
| 	def send(self, code, subcode, parameters = {}, attributes = {}):
 | |
| 		"""Send an appleevent given code/subcode/pars/attrs and unpack the reply"""
 | |
| #		print code, subcode, parameters, attributes
 | |
| 		return self.sendevent(self.newevent(code, subcode, parameters, attributes))
 | |
| 		
 | |
| 	def __str__(self):
 | |
| 		_reply, _arguments, _attributes = self.send(self.code, self.subcode, self.arguments, self.attributes)
 | |
| 
 | |
| 		if _arguments.has_key('errn'):
 | |
| 			raise baetools.Error, baetools.decodeerror(_arguments)
 | |
| 		# XXXX Optionally decode result
 | |
| 		if _arguments.has_key('----'):
 | |
| 			return str(_arguments['----'])
 | |
| 		else:
 | |
| 			return 
 | |
| 
 | |
| 	
 | |
| 	
 | |
| def test():
 | |
| 	Simp = 'Hermit:Applications:SimpleText'
 | |
| 	PsScript('MACS', Timeout=60*60*3)
 | |
| #	PsScript('CSOm', Timeout=60*60*3)
 | |
| #	PsScript('', Timeout=60*60*3)
 | |
| #	PyScript('macsoup')
 | |
| 	ev = PsEvents
 | |
| 	ps = PsClass
 | |
| #	print PsProperties.__dict__
 | |
| #	y = script(ev.Open, File('Hermit:Desktop Folder:Lincolnshire Imp'), using=Application_file(Simp))
 | |
| #	print baetypes.NProperty('prop', 'prop', 'pnam',  baetypes.ObjectSpecifier('cdis', 'indx', 1, None))
 | |
| #	y = PyScript(ev.Get, Disk("Hermit").Folder(7).File(1).Name())
 | |
| #	y = PyScript(ev.Get, Disk("Hermit").Size(), As='Integer')
 | |
| #	y = PyScript(ev.Get, ps.Desktopobject(1).Startup_disk())
 | |
| #	y = PyScript(ev.Get, Mailbox(1).File(), as='TEXT')
 | |
| #	print 'y', y, type(y)
 | |
| 
 | |
| if __name__ == '__main__':
 | |
| 	test()
 | |
| #	sys.exit(1)
 | |
| 	
 | 
