diff options
Diffstat (limited to 'lib/python2.7/plat-mac/argvemulator.py')
-rw-r--r-- | lib/python2.7/plat-mac/argvemulator.py | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/lib/python2.7/plat-mac/argvemulator.py b/lib/python2.7/plat-mac/argvemulator.py new file mode 100644 index 0000000..3dfc9f8 --- /dev/null +++ b/lib/python2.7/plat-mac/argvemulator.py @@ -0,0 +1,92 @@ +"""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 |