"""Utilities for working with Connections"""
import win32com.server.util, pythoncom

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		
