49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
"""Utilities for working with Connections"""
|
|
import pythoncom
|
|
import win32com.server.util
|
|
|
|
|
|
class SimpleConnection:
|
|
"A simple, single connection object"
|
|
|
|
def __init__(self, coInstance=None, eventInstance=None, eventCLSID=None, debug=0):
|
|
self.cp = None
|
|
self.cookie = None
|
|
self.debug = debug
|
|
if not coInstance is None:
|
|
self.Connect(coInstance, eventInstance, eventCLSID)
|
|
|
|
def __del__(self):
|
|
try:
|
|
self.Disconnect()
|
|
except pythoncom.error:
|
|
# Ignore disconnection as we are torn down.
|
|
pass
|
|
|
|
def _wrap(self, obj):
|
|
useDispatcher = None
|
|
if self.debug:
|
|
from win32com.server import dispatcher
|
|
|
|
useDispatcher = dispatcher.DefaultDebugDispatcher
|
|
return win32com.server.util.wrap(obj, useDispatcher=useDispatcher)
|
|
|
|
def Connect(self, coInstance, eventInstance, eventCLSID=None):
|
|
try:
|
|
oleobj = coInstance._oleobj_
|
|
except AttributeError:
|
|
oleobj = coInstance
|
|
cpc = oleobj.QueryInterface(pythoncom.IID_IConnectionPointContainer)
|
|
if eventCLSID is None:
|
|
eventCLSID = eventInstance.CLSID
|
|
comEventInstance = self._wrap(eventInstance)
|
|
self.cp = cpc.FindConnectionPoint(eventCLSID)
|
|
self.cookie = self.cp.Advise(comEventInstance)
|
|
|
|
def Disconnect(self):
|
|
if not self.cp is None:
|
|
if self.cookie:
|
|
self.cp.Unadvise(self.cookie)
|
|
self.cookie = None
|
|
self.cp = None
|