"""COMKit

This plug-in for Webware 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

        # Get the win32 extensions
        import pythoncom

        # Set references to the COM initialize and uninitialize functions
        appServer._initCOM = pythoncom.COINIT_MULTITHREADED
        appServer.initCOM = pythoncom.CoInitializeEx
        appServer.closeCOM = pythoncom.CoUninitialize

        # Monkey-patch this instance of the appServer

        # Grab references to the original initThread and delThread bound
        # methods, which we will replace
        appServer.originalInitThread = appServer.initThread
        appServer.originalDelThread = appServer.delThread

        # Create new versions of initThread and delThread which will call the
        # old versions

        def newInitThread(self):
            # This must be called at the beginning of any thread that uses COM
            self.initCOM(self._initCOM)
            # Call the original initThread
            self.originalInitThread()

        def newDelThread(self):
            # Call the original delThread
            self.originalDelThread()
            # Uninitialize COM
            self.closeCOM()

        # Replace the initThread and delThread methods with our new versions
        import new
        appServer.initThread = new.instancemethod(newInitThread, appServer, appServer.__class__)
        appServer.delThread = new.instancemethod(newDelThread, appServer, appServer.__class__)

        print 'COM has been enabled.'
