symbian-qemu-0.9.1-12/python-2.6.1/Lib/plat-mac/argvemulator.py
author Gareth Stockwell <gareth.stockwell@accenture.com>
Wed, 22 Sep 2010 15:40:40 +0100
branchgraphics-phase-3
changeset 111 345f1c88c950
parent 1 2fb8b9db1c86
permissions -rw-r--r--
Fixes to syborg-graphicswrapper.vcproj These changes allow syborg-graphicswrapper to link against the hostthreadadapter and khronosapiwrapper libraries built by the graphics.simulator component. The .vcproj file uses relative paths, which requires that the following three packages are laid out as follows: os/ graphics adapt/ graphics.simulator qemu

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