283 lines
6.4 KiB
C++
283 lines
6.4 KiB
C++
//+-----------------------------------------------------------------------
|
|
//
|
|
// event.cpp: Implementation of the CEventBroker class.
|
|
// This class translates internal ADC/OSP events into
|
|
// appropriate notifications for the external world.
|
|
//
|
|
//------------------------------------------------------------------------
|
|
|
|
#include "priv.h"
|
|
|
|
// Do not build this file if on Win9X or NT4
|
|
#ifndef DOWNLEVEL_PLATFORM
|
|
|
|
#include "event.h"
|
|
//#include "dump.h"
|
|
|
|
|
|
// constructor
|
|
CEventBroker::CEventBroker(LPWSTR pszQualifier) : _cRef(1)
|
|
{
|
|
ASSERT(NULL == _pospl);
|
|
ASSERT(NULL == _pdsl);
|
|
|
|
TraceAddRef(CEventBroker, _cRef);
|
|
_cbstrQualifier = SysAllocString(pszQualifier);
|
|
}
|
|
|
|
|
|
// destructor
|
|
CEventBroker::~CEventBroker()
|
|
{
|
|
TraceMsg(TF_OBJLIFE, "(EventBroker) destroying");
|
|
|
|
SetDataSourceListener(NULL);
|
|
SetOSPListener(NULL);
|
|
if (_cbstrQualifier)
|
|
SysFreeString(_cbstrQualifier);
|
|
}
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------
|
|
Purpose: IUnknown::QueryInterface
|
|
*/
|
|
STDMETHODIMP CEventBroker::QueryInterface(REFIID riid, LPVOID * ppvObj)
|
|
{
|
|
static const QITAB qit[] = {
|
|
QITABENT(CEventBroker, IARPEvent),
|
|
{ 0 },
|
|
};
|
|
|
|
return QISearch(this, (LPCQITAB)qit, riid, ppvObj);
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CEventBroker::AddRef()
|
|
{
|
|
++_cRef;
|
|
TraceAddRef(CEventBroker, _cRef);
|
|
return _cRef;
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CEventBroker::Release()
|
|
{
|
|
ASSERT(_cRef > 0);
|
|
_cRef--;
|
|
|
|
TraceRelease(CEventBroker, _cRef);
|
|
|
|
if (_cRef > 0)
|
|
return _cRef;
|
|
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::SetDataSourceListener
|
|
|
|
Sets the Data Source listener.
|
|
|
|
If pdsl is NULL, no notifcations are sent.
|
|
*/
|
|
STDMETHODIMP CEventBroker::SetDataSourceListener(DataSourceListener * pdsl)
|
|
{
|
|
// If we've changed/reset the data source listener, make sure we don't
|
|
// think we've fired dataMemberChanged on it yet.
|
|
ATOMICRELEASE(_pdsl);
|
|
|
|
_pdsl = pdsl;
|
|
if (_pdsl)
|
|
_pdsl->AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::SetOSPListener
|
|
|
|
Sets the OSP listener.
|
|
|
|
If pospl is NULL, no notifications are sent.
|
|
*/
|
|
STDMETHODIMP CEventBroker::SetOSPListener(OLEDBSimpleProviderListener *pospl)
|
|
{
|
|
ATOMICRELEASE(_pospl);
|
|
|
|
_pospl = pospl;
|
|
if (_pospl)
|
|
_pospl->AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::IsOSPListener
|
|
|
|
Returns S_OK if the given listener is the current OSP listener.
|
|
*/
|
|
STDMETHODIMP CEventBroker::IsOSPListener(OLEDBSimpleProviderListener *pospl)
|
|
{
|
|
return (pospl == _pospl) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::RowChanged
|
|
|
|
Fired when the OSP updated some fields in a row.
|
|
*/
|
|
STDMETHODIMP CEventBroker::RowChanged(DBROWCOUNT iRow)
|
|
{
|
|
ASSERT(iRow >= 0);
|
|
|
|
if (_pospl)
|
|
{
|
|
TraceMsg(TF_DSO, "(CEventBroker) rowChanged %d", iRow);
|
|
|
|
_pospl->cellChanged(iRow, -1);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::AboutToDeleteRows
|
|
|
|
Fired when the OSP is going to delete some rows.
|
|
*/
|
|
STDMETHODIMP CEventBroker::AboutToDeleteRows(DBROWCOUNT iRowStart, DBROWCOUNT cRows)
|
|
{
|
|
ASSERT(iRowStart >= 0);
|
|
ASSERT(cRows > 0);
|
|
|
|
if (_pospl)
|
|
{
|
|
TraceMsg(TF_DSO, "(CEventBroker) AboutToDeleteRows(%d, %d)", iRowStart, cRows);
|
|
|
|
_pospl->aboutToDeleteRows(iRowStart, cRows);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::DeletedRows
|
|
|
|
Fired when the OSP has deleted some rows.
|
|
*/
|
|
STDMETHODIMP CEventBroker::DeletedRows(DBROWCOUNT iRowStart, DBROWCOUNT cRows)
|
|
{
|
|
ASSERT(iRowStart >= 0);
|
|
ASSERT(cRows > 0);
|
|
|
|
if (_pospl)
|
|
{
|
|
TraceMsg(TF_DSO, "(CEventBroker) DeletedRows(%d, %d)", iRowStart, cRows);
|
|
|
|
_pospl->deletedRows(iRowStart, cRows);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::RowsAvailable
|
|
|
|
Fired when the OSP has enumerated some rows.
|
|
*/
|
|
STDMETHODIMP CEventBroker::RowsAvailable(DBROWCOUNT iRowStart, DBROWCOUNT cRows)
|
|
{
|
|
ASSERT(iRowStart >= 0);
|
|
ASSERT(cRows > 0);
|
|
|
|
if (_pospl)
|
|
{
|
|
TraceMsg(TF_DSO, "(CEventBroker) RowsAvailable(%d, %d)", iRowStart, cRows);
|
|
|
|
_pospl->rowsAvailable(iRowStart, cRows);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::LoadCompleted
|
|
|
|
Fired when the OSP has finished enumerating its data.
|
|
*/
|
|
STDMETHODIMP CEventBroker::LoadCompleted(void)
|
|
{
|
|
if (_pospl)
|
|
{
|
|
TraceMsg(TF_DSO, "(CEventBroker) LoadCompleted");
|
|
|
|
_pospl->transferComplete(OSPXFER_COMPLETE);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::LoadAborted
|
|
|
|
Fired when the OSP has aborted its enumeration.
|
|
*/
|
|
STDMETHODIMP CEventBroker::LoadAborted(void)
|
|
{
|
|
// Right now, any error results in not returning an SP object,
|
|
// therefore we should not fire transfer complete.
|
|
if (_pospl)
|
|
{
|
|
TraceMsg(TF_DSO, "(CEventBroker) LoadAborted");
|
|
|
|
_pospl->transferComplete(OSPXFER_ABORT);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
Purpose: IARPEvent::DataSetChanged
|
|
|
|
Fired when the OSP's data set has changed (resorted, refiltered, etc.)
|
|
*/
|
|
STDMETHODIMP CEventBroker::DataSetChanged(void)
|
|
{
|
|
if (_pdsl)
|
|
{
|
|
TraceMsg(TF_DSO, "(CEventBroker) DataSetChanged");
|
|
|
|
_pdsl->dataMemberChanged(_cbstrQualifier);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/*----------------------------------------------------------
|
|
Purpose: Create-instance function for CARPEvent
|
|
|
|
*/
|
|
HRESULT CARPEvent_CreateInstance(REFIID riid, LPVOID * ppvObj, LPWSTR pszQualifier)
|
|
{
|
|
HRESULT hres = E_OUTOFMEMORY;
|
|
|
|
*ppvObj = NULL;
|
|
|
|
CEventBroker * pObj = new CEventBroker(pszQualifier);
|
|
if (pObj)
|
|
{
|
|
hres = pObj->QueryInterface(riid, ppvObj);
|
|
pObj->Release();
|
|
}
|
|
|
|
return hres;
|
|
}
|
|
|
|
#endif //DOWNLEVEL_PLATFORM
|