| """argvemulator - create sys.argv from OSA events. Used by applets that | |
| want unix-style arguments. | |
| """ | |
| from warnings import warnpy3k | |
| warnpy3k("In 3.x, the argvemulator module is removed.", stacklevel=2) | |
| import sys | |
| import traceback | |
| from Carbon import AE | |
| from Carbon.AppleEvents import * | |
| from Carbon import Evt | |
| from Carbon import File | |
| from Carbon.Events import * | |
| import aetools | |
| class ArgvCollector: | |
| """A minimal FrameWork.Application-like class""" | |
| def __init__(self): | |
| self.quitting = 0 | |
| # Remove the funny -psn_xxx_xxx argument | |
| if len(sys.argv) > 1 and sys.argv[1][:4] == '-psn': | |
| del sys.argv[1] | |
| AE.AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, self.__runapp) | |
| AE.AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, self.__openfiles) | |
| def close(self): | |
| AE.AERemoveEventHandler(kCoreEventClass, kAEOpenApplication) | |
| AE.AERemoveEventHandler(kCoreEventClass, kAEOpenDocuments) | |
| def mainloop(self, mask = highLevelEventMask, timeout = 1*60): | |
| # Note: this is not the right way to run an event loop in OSX or even | |
| # "recent" versions of MacOS9. This is however code that has proven | |
| # itself. | |
| stoptime = Evt.TickCount() + timeout | |
| while not self.quitting and Evt.TickCount() < stoptime: | |
| self._dooneevent(mask, timeout) | |
| if not self.quitting: | |
| print "argvemulator: timeout waiting for arguments" | |
| self.close() | |
| def _dooneevent(self, mask = highLevelEventMask, timeout = 1*60): | |
| got, event = Evt.WaitNextEvent(mask, timeout) | |
| if got: | |
| self._lowlevelhandler(event) | |
| def _lowlevelhandler(self, event): | |
| what, message, when, where, modifiers = event | |
| h, v = where | |
| if what == kHighLevelEvent: | |
| try: | |
| AE.AEProcessAppleEvent(event) | |
| except AE.Error, err: | |
| msg = "High Level Event: %r %r" % (hex(message), hex(h | (v<<16))) | |
| print 'AE error: ', err | |
| print 'in', msg | |
| traceback.print_exc() | |
| return | |
| else: | |
| print "Unhandled event:", event | |
| def _quit(self): | |
| self.quitting = 1 | |
| def __runapp(self, requestevent, replyevent): | |
| self._quit() | |
| def __openfiles(self, requestevent, replyevent): | |
| try: | |
| listdesc = requestevent.AEGetParamDesc(keyDirectObject, typeAEList) | |
| for i in range(listdesc.AECountItems()): | |
| aliasdesc = listdesc.AEGetNthDesc(i+1, typeAlias)[1] | |
| alias = File.Alias(rawdata=aliasdesc.data) | |
| fsref = alias.FSResolveAlias(None)[0] | |
| pathname = fsref.as_pathname() | |
| sys.argv.append(pathname) | |
| except Exception, e: | |
| print "argvemulator.py warning: can't unpack an open document event" | |
| import traceback | |
| traceback.print_exc() | |
| self._quit() | |
| if __name__ == '__main__': | |
| ArgvCollector().mainloop() | |
| print "sys.argv=", sys.argv |