www.pudn.com > Ge_opc_Server_v1.rar > I_DO.CPP


// i_do.cpp 
// 
//  This file contains the implementation of 
//  the IDataObject interface for groups in the LHEpipeview server. 
// 
// 
//	(c) COPYRIGHT 1996-1997, INTELLUTION INC. 
// ALL RIGHTS RESERVED 
// 
// Original Author: Al Chisholm 
// 
// Modification Log: 
//	Vers    Date   By    Notes 
//	----  -------- ---   ----- 
//	0.00  11/18/96 ACC 
// 0.90  04/08/97 ACC   add async logic 
// 
 
#define WIN32_LEAN_AND_MEAN 
 
#include "OPCLHEpipeview.h" 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Constructor /Destructor functions 
// 
 
/////////////////////////////////////// 
// ILHEpipeviewDO() 
//   Constructor for this Interface 
// 
/////////////////////////////////////// 
ILHEpipeviewDO::ILHEpipeviewDO( LPUNKNOWN parent ) 
{ 
	m_Parent = (LHEpipeviewGroup *)parent; 
	m_dataCallback = 0; 
	m_datatimeCallback = 0; 
	m_writeCallback = 0; 
 
	m_data = RegisterClipboardFormat("OPCSTMFORMATDATA"); 
	m_datatime = RegisterClipboardFormat("OPCSTMFORMATDATATIME"); 
	m_write = RegisterClipboardFormat("OPCSTMFORMATWRITECOMPLETE"); 
} 
 
 
 
/////////////////////////////////////// 
// ~ILHEpipeviewDO() 
//   Destructor for this Interface 
// 
/////////////////////////////////////// 
ILHEpipeviewDO::~ILHEpipeviewDO( void) 
{ 
	m_Parent->m_pILHEpipeviewDO = 0; 
 
	// A well behaved client should already have released these: 
	// 
	if(m_dataCallback) m_dataCallback->Release(); 
	if(m_datatimeCallback) m_datatimeCallback->Release(); 
	if(m_writeCallback) m_writeCallback->Release(); 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// IUnknown functions Delegate to Parent 
// 
 
STDMETHODIMP_(ULONG) ILHEpipeviewDO::AddRef( void) 
{ 
	return m_Parent->AddRef(); 
} 
 
STDMETHODIMP_(ULONG) ILHEpipeviewDO::Release( void) 
{ 
	return m_Parent->Release(); 
} 
 
STDMETHODIMP ILHEpipeviewDO::QueryInterface( REFIID iid, LPVOID* ppInterface) 
{ 
	return m_Parent->QueryInterface(iid, ppInterface); 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// ILHEpipeviewDO (IDataObject) interface functions 
// 
 
 
/////////////////////////////////////// 
// IDataObject::DAdvise 
/////////////////////////////////////// 
 
STDMETHODIMP ILHEpipeviewDO::DAdvise( 
	FORMATETC *pfe, 
	DWORD advf, 
	IAdviseSink *pAdvSink, 
	DWORD *pdwConnection) 
{ 
	HRESULT hr; 
 
	// Basic Sanity Checks 
	// 
	if(!pdwConnection) return E_POINTER; 
	if(!pAdvSink) return E_POINTER; 
	if(!pfe) return E_POINTER; 
 
	// Figure out what type of connection he wants 
	// 
	if(pfe->cfFormat == m_data) 
	{ 
		// if already in use, return error 
		// Else connect it up 
		// 
		if(m_dataCallback) return CONNECT_E_ADVISELIMIT; 
		hr = pAdvSink->QueryInterface( IID_IAdviseSink, (LPVOID*) &m_dataCallback); 
		if(FAILED(hr)) return hr; 
	} 
	else if(pfe->cfFormat == m_datatime) 
	{ 
		// if already in use, return error 
		// Else connect it up 
		// 
		if(m_datatimeCallback) return CONNECT_E_ADVISELIMIT; 
		hr = pAdvSink->QueryInterface( IID_IAdviseSink, (LPVOID*) &m_datatimeCallback); 
		if(FAILED(hr)) return hr; 
	} 
	else if(pfe->cfFormat == m_write) 
	{ 
		// if already in use, return error 
		// Else connect it up 
		// 
		if(m_writeCallback) return CONNECT_E_ADVISELIMIT; 
		hr = pAdvSink->QueryInterface( IID_IAdviseSink, (LPVOID*) &m_writeCallback); 
		if(FAILED(hr)) return hr; 
	} 
	else 
	{ 
		// Bad stream format 
		// 
		return DV_E_FORMATETC; 
	} 
 
	// Cookie used to indicate connection type 
	// 
	*pdwConnection = pfe->cfFormat; 
 
	//zzz add adf handling (primefirst) 
 
	return S_OK; 
} 
 
/////////////////////////////////////// 
// IDataObject::DUnadvise 
/////////////////////////////////////// 
 
STDMETHODIMP ILHEpipeviewDO::DUnadvise( 
			DWORD dwConnection) 
{ 
	// Figure out what type of connection it is 
	// 
	if((UINT)dwConnection == m_data) 
	{ 
		// if already in use, return error 
		// Else connect it up 
		// 
		if(!m_dataCallback) return OLE_E_NOCONNECTION; 
		m_dataCallback->Release(); 
		m_dataCallback = 0; 
	} 
	else if((UINT)dwConnection == m_datatime) 
	{ 
		// if already in use, return error 
		// Else connect it up 
		// 
		if(!m_datatimeCallback) return OLE_E_NOCONNECTION; 
		m_datatimeCallback->Release(); 
		m_datatimeCallback = 0; 
	} 
	else if((UINT)dwConnection == m_write) 
	{ 
		// if already in use, return error 
		// Else connect it up 
		// 
		if(!m_writeCallback) return OLE_E_NOCONNECTION; 
		m_writeCallback->Release(); 
		m_writeCallback = 0; 
	} 
	else 
	{ 
		// Bad stream format 
		// 
		return OLE_E_NOCONNECTION; 
	} 
	return S_OK; 
} 
 
/////////////////////////////////////// 
// IDataObject::GetData 
/////////////////////////////////////// 
 
STDMETHODIMP ILHEpipeviewDO::GetData( 
			FORMATETC *pformatetcIn, 
			STGMEDIUM *pmedium) 
{ 
	return E_NOTIMPL; 
} 
 
 
/////////////////////////////////////// 
// IDataObject::GetDataHere 
/////////////////////////////////////// 
 
STDMETHODIMP ILHEpipeviewDO::GetDataHere( 
			FORMATETC *pformatetc, 
			STGMEDIUM *pmedium) 
{ 
	return E_NOTIMPL; 
} 
 
 
 
/////////////////////////////////////// 
// IDataObject::QueryGetData 
/////////////////////////////////////// 
 
STDMETHODIMP ILHEpipeviewDO::QueryGetData( 
			FORMATETC *pformatetc) 
{ 
	return E_NOTIMPL; 
} 
 
 
/////////////////////////////////////// 
// IDataObject::GetCanonicalFormatEtc 
/////////////////////////////////////// 
 
STDMETHODIMP ILHEpipeviewDO::GetCanonicalFormatEtc( 
			FORMATETC *pformatectIn, 
			FORMATETC *pformatetcOut) 
{ 
	return E_NOTIMPL; 
} 
 
 
/////////////////////////////////////// 
// IDataObject::SetData 
 
 
STDMETHODIMP ILHEpipeviewDO::SetData( 
			FORMATETC *pformatetc, 
			STGMEDIUM *pmedium, 
			BOOL fRelease) 
{ 
	return E_NOTIMPL; 
} 
 
 
/////////////////////////////////////// 
// IDataObject::EnumFormatEtc 
/////////////////////////////////////// 
 
STDMETHODIMP ILHEpipeviewDO::EnumFormatEtc( 
			DWORD dwDirection, 
			IEnumFORMATETC **ppenumFormatEtc) 
{ 
	return E_NOTIMPL; 
} 
 
 
/////////////////////////////////////// 
// IDataObject::EnumDAdvise 
/////////////////////////////////////// 
STDMETHODIMP ILHEpipeviewDO::EnumDAdvise( 
			IEnumSTATDATA **ppenumAdvise) 
{ 
	return E_NOTIMPL; 
}