Home | History | Annotate | Download | only in plat-mac
      1 """argvemulator - create sys.argv from OSA events. Used by applets that
      2 want unix-style arguments.
      3 """
      4 
      5 from warnings import warnpy3k
      6 warnpy3k("In 3.x, the argvemulator module is removed.", stacklevel=2)
      7 
      8 import sys
      9 import traceback
     10 from Carbon import AE
     11 from Carbon.AppleEvents import *
     12 from Carbon import Evt
     13 from Carbon import File
     14 from Carbon.Events import *
     15 import aetools
     16 
     17 class ArgvCollector:
     18 
     19     """A minimal FrameWork.Application-like class"""
     20 
     21     def __init__(self):
     22         self.quitting = 0
     23         # Remove the funny -psn_xxx_xxx argument
     24         if len(sys.argv) > 1 and sys.argv[1][:4] == '-psn':
     25             del sys.argv[1]
     26 
     27         AE.AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, self.__runapp)
     28         AE.AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, self.__openfiles)
     29 
     30     def close(self):
     31         AE.AERemoveEventHandler(kCoreEventClass, kAEOpenApplication)
     32         AE.AERemoveEventHandler(kCoreEventClass, kAEOpenDocuments)
     33 
     34     def mainloop(self, mask = highLevelEventMask, timeout = 1*60):
     35         # Note: this is not the right way to run an event loop in OSX or even
     36         # "recent" versions of MacOS9. This is however code that has proven
     37         # itself.
     38         stoptime = Evt.TickCount() + timeout
     39         while not self.quitting and Evt.TickCount() < stoptime:
     40             self._dooneevent(mask, timeout)
     41 
     42         if not self.quitting:
     43             print "argvemulator: timeout waiting for arguments"
     44 
     45         self.close()
     46 
     47     def _dooneevent(self, mask = highLevelEventMask, timeout = 1*60):
     48         got, event = Evt.WaitNextEvent(mask, timeout)
     49         if got:
     50             self._lowlevelhandler(event)
     51 
     52     def _lowlevelhandler(self, event):
     53         what, message, when, where, modifiers = event
     54         h, v = where
     55         if what == kHighLevelEvent:
     56             try:
     57                 AE.AEProcessAppleEvent(event)
     58             except AE.Error, err:
     59                 msg = "High Level Event: %r %r" % (hex(message), hex(h | (v<<16)))
     60                 print 'AE error: ', err
     61                 print 'in', msg
     62                 traceback.print_exc()
     63             return
     64         else:
     65             print "Unhandled event:", event
     66 
     67 
     68     def _quit(self):
     69         self.quitting = 1
     70 
     71     def __runapp(self, requestevent, replyevent):
     72         self._quit()
     73 
     74     def __openfiles(self, requestevent, replyevent):
     75         try:
     76             listdesc = requestevent.AEGetParamDesc(keyDirectObject, typeAEList)
     77             for i in range(listdesc.AECountItems()):
     78                 aliasdesc = listdesc.AEGetNthDesc(i+1, typeAlias)[1]
     79                 alias = File.Alias(rawdata=aliasdesc.data)
     80                 fsref = alias.FSResolveAlias(None)[0]
     81                 pathname = fsref.as_pathname()
     82                 sys.argv.append(pathname)
     83         except  Exception, e:
     84             print "argvemulator.py warning: can't unpack an open document event"
     85             import traceback
     86             traceback.print_exc()
     87 
     88         self._quit()
     89 
     90 if __name__ == '__main__':
     91     ArgvCollector().mainloop()
     92     print "sys.argv=", sys.argv
     93