blob: 676e80ac5c140b3ae1e99e6cbe2ec2ed11ab0165 [file] [log] [blame]
Jack Jansenf4f6d482002-08-02 11:12:15 +00001"""argvemulator - create sys.argv from OSA events. Used by applets that
2want unix-style arguments.
3"""
4
5import sys
6import traceback
7from Carbon import AE
8from Carbon.AppleEvents import *
9from Carbon import Evt
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000010from Carbon import File
Jack Jansenf4f6d482002-08-02 11:12:15 +000011from Carbon.Events import *
12import aetools
13
14class ArgvCollector:
Jack Jansenf4f6d482002-08-02 11:12:15 +000015
Just van Rossum35b50e22003-06-21 14:41:32 +000016 """A minimal FrameWork.Application-like class"""
Jack Jansenf4f6d482002-08-02 11:12:15 +000017
Just van Rossum35b50e22003-06-21 14:41:32 +000018 def __init__(self):
19 self.quitting = 0
Just van Rossum35b50e22003-06-21 14:41:32 +000020 # Remove the funny -psn_xxx_xxx argument
21 if len(sys.argv) > 1 and sys.argv[1][:4] == '-psn':
22 del sys.argv[1]
Raymond Hettingerff41c482003-04-06 09:01:11 +000023
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000024 AE.AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, self.__runapp)
25 AE.AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, self.__openfiles)
Raymond Hettingerff41c482003-04-06 09:01:11 +000026
Just van Rossum35b50e22003-06-21 14:41:32 +000027 def close(self):
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000028 AE.AERemoveEventHandler(kCoreEventClass, kAEOpenApplication)
29 AE.AERemoveEventHandler(kCoreEventClass, kAEOpenDocuments)
Raymond Hettingerff41c482003-04-06 09:01:11 +000030
Just van Rossum35b50e22003-06-21 14:41:32 +000031 def mainloop(self, mask = highLevelEventMask, timeout = 1*60):
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000032 # Note: this is not the right way to run an event loop in OSX or even
33 # "recent" versions of MacOS9. This is however code that has proven
34 # itself.
Just van Rossum35b50e22003-06-21 14:41:32 +000035 stoptime = Evt.TickCount() + timeout
36 while not self.quitting and Evt.TickCount() < stoptime:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000037 self._dooneevent(mask, timeout)
38
39 if not self.quitting:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000040 print("argvemulator: timeout waiting for arguments")
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000041
Just van Rossum35b50e22003-06-21 14:41:32 +000042 self.close()
Raymond Hettingerff41c482003-04-06 09:01:11 +000043
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000044 def _dooneevent(self, mask = highLevelEventMask, timeout = 1*60):
Just van Rossum35b50e22003-06-21 14:41:32 +000045 got, event = Evt.WaitNextEvent(mask, timeout)
46 if got:
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000047 self._lowlevelhandler(event)
Raymond Hettingerff41c482003-04-06 09:01:11 +000048
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000049 def _lowlevelhandler(self, event):
Just van Rossum35b50e22003-06-21 14:41:32 +000050 what, message, when, where, modifiers = event
51 h, v = where
52 if what == kHighLevelEvent:
53 try:
54 AE.AEProcessAppleEvent(event)
Guido van Rossumb940e112007-01-10 16:19:56 +000055 except AE.Error as err:
Walter Dörwald70a6b492004-02-12 17:35:32 +000056 msg = "High Level Event: %r %r" % (hex(message), hex(h | (v<<16)))
Guido van Rossumbe19ed72007-02-09 05:37:30 +000057 print('AE error: ', err)
58 print('in', msg)
Just van Rossum35b50e22003-06-21 14:41:32 +000059 traceback.print_exc()
60 return
61 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000062 print("Unhandled event:", event)
Raymond Hettingerff41c482003-04-06 09:01:11 +000063
Raymond Hettingerff41c482003-04-06 09:01:11 +000064
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000065 def _quit(self):
66 self.quitting = 1
Raymond Hettingerff41c482003-04-06 09:01:11 +000067
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000068 def __runapp(self, requestevent, replyevent):
Just van Rossum35b50e22003-06-21 14:41:32 +000069 self._quit()
Raymond Hettingerff41c482003-04-06 09:01:11 +000070
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000071 def __openfiles(self, requestevent, replyevent):
72 try:
73 listdesc = requestevent.AEGetParamDesc(keyDirectObject, typeAEList)
74 for i in range(listdesc.AECountItems()):
75 aliasdesc = listdesc.AEGetNthDesc(i+1, typeAlias)[1]
76 alias = File.Alias(rawdata=aliasdesc.data)
77 fsref = alias.FSResolveAlias(None)[0]
78 pathname = fsref.as_pathname()
79 sys.argv.append(pathname)
Guido van Rossumb940e112007-01-10 16:19:56 +000080 except Exception as e:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000081 print("argvemulator.py warning: can't unpack an open document event")
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000082 import traceback
83 traceback.print_exc()
Raymond Hettingerff41c482003-04-06 09:01:11 +000084
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000085 self._quit()
Jack Jansenf4f6d482002-08-02 11:12:15 +000086
87if __name__ == '__main__':
Just van Rossum35b50e22003-06-21 14:41:32 +000088 ArgvCollector().mainloop()
Guido van Rossumbe19ed72007-02-09 05:37:30 +000089 print("sys.argv=", sys.argv)