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