|
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 |