# COMKit
#
# This plug-in for WebKit for Python allows COM objects such as ADO to be
# used in free-threading mode in a threaded app server.  See Appendix D of
# the fine book Python Programming on Win32 by Mark Hammond and Andy
# Robinson for details.
#
# To use COM, simply set EnableCOM to 1 in your AppServer.config file.
# This causes the app server threads to be configured properly for
# COM free-threading.  Then go ahead and use win32com inside your servlets.

__all__ = []


# This function gets called by the app server during initialization
def InstallInWebKit(appServer):
    # See if enabling COM was requested
    if appServer.setting('EnableCOM', 0):

        # This must be done BEFORE pythoncom is imported -- see the book mentioned above.
        import sys
        sys.coinit_flags = 0

        # See if the win32 extensions are available
        import pythoncom
        # Create a base class for a COM-enabled app server.
        class COMEnabledAppServer:
            def initThread(self):
                # This must be called at the beginning of any thread that uses COM
                import pythoncom
                pythoncom.CoInitializeEx(pythoncom.COINIT_MULTITHREADED)
                
                # Invoke superclass's initThread.  This enables multiple plug-ins
                # to each have their own initThread get called.
                self.__class__.__bases__[0].initThread(self)

            def delThread(self):
                # Invoke superclass's delThread.  This enables multiple plug-ins
                # to each have their own delThread get called.
                self.__class__.__bases__[0].delThread(self)

                # This must be called at the end of any thread that uses COM
                import pythoncom
                pythoncom.CoUninitialize()

        # We mix-in the COMEnabledAppServer, but it's a reverse mix-in:

        # Make COMEnabledAppServer inherit the current app server's class
        COMEnabledAppServer.__bases__ = (appServer.__class__,)

        # Make the current app server point to COMEnabledAppServer
        appServer.__class__ = COMEnabledAppServer

        print 'COM has been enabled.'

        # Note: Python makes "plugging in" possible.