symbian-qemu-0.9.1-12/python-2.6.1/Lib/plat-mac/argvemulator.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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