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;
}