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