You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
13 KiB
370 lines
13 KiB
//---------------------------------------------------------------------------
|
|
// CMSR2C.cpp : CVDCursorFromRowset implementation
|
|
//
|
|
// Copyright (c) 1996 Microsoft Corporation, All Rights Reserved
|
|
// Developed by Sheridan Software Systems, Inc.
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
#include "MSR2C.h"
|
|
#include "CMSR2C.h"
|
|
#include "Notifier.h"
|
|
#include "RSColumn.h"
|
|
#include "RSSource.h"
|
|
#include "CursMain.h"
|
|
|
|
SZTHISFILE
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CreateInstance - Same params as IClassFactory::CreateInstance
|
|
//
|
|
// Desc: instantiates an CVDCursorFromRowset object, returning an interface
|
|
// pointer.
|
|
// Parms: riid - ID identifying the interface the caller
|
|
// desires to have for the new object.
|
|
// ppvObj - pointer in which to store the desired
|
|
// interface pointer for the new object.
|
|
// Return: HRESULT - NOERROR if successful, otherwise
|
|
// E_NOINTERFACE if we cannot support the
|
|
// requested interface.
|
|
//
|
|
HRESULT CVDCursorFromRowset::CreateInstance(LPUNKNOWN pUnkOuter,
|
|
REFIID riid,
|
|
LPVOID * ppvObj)
|
|
{
|
|
if (!ppvObj)
|
|
return E_INVALIDARG;
|
|
|
|
*ppvObj=NULL;
|
|
|
|
if (pUnkOuter)
|
|
{
|
|
//If aggregating then they have to ask for IUnknown
|
|
if (!DO_GUIDS_MATCH(riid, IID_IUnknown))
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
//Create the object
|
|
CVDCursorFromRowset * pNewObj = new CVDCursorFromRowset(pUnkOuter);
|
|
|
|
if (NULL==pNewObj)
|
|
return E_OUTOFMEMORY;
|
|
|
|
//Get interface from private unknown - needed for aggreagation support
|
|
HRESULT hr=pNewObj->m_UnkPrivate.QueryInterface(riid, ppvObj);
|
|
|
|
if FAILED(hr)
|
|
delete pNewObj;
|
|
|
|
return hr;
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CVDCursorPosition - Constructor
|
|
//
|
|
CVDCursorFromRowset::CVDCursorFromRowset(LPUNKNOWN pUnkOuter)
|
|
{
|
|
m_pUnkOuter = pUnkOuter;
|
|
|
|
VDUpdateObjectCount(1); // update global object counter to prevent dll from being unloaded
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CVDCursorPosition - Destructor
|
|
//
|
|
CVDCursorFromRowset::~CVDCursorFromRowset()
|
|
{
|
|
VDUpdateObjectCount(-1); // update global object counter to allow dll to be unloaded
|
|
}
|
|
///////////////////////////////////////////////////////////////////
|
|
// Name: QueryInterface
|
|
// Desc: allows a client to ask our object if we support a
|
|
// particular method.
|
|
// Parms: [in] riid - ID of method the client is querying for.
|
|
// [out] ppv - pointer to the interface requested.
|
|
// Return: HRESULT - NOERROR if a pointer to the interface will
|
|
// be returned, or E_NOINTERFACE if it cannot.
|
|
////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP CVDCursorFromRowset::QueryInterface(REFIID riid, void** ppv)
|
|
{
|
|
if (m_pUnkOuter)
|
|
return m_pUnkOuter->QueryInterface(riid, ppv);
|
|
else
|
|
return m_UnkPrivate.QueryInterface(riid, ppv);
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Name: AddRef
|
|
// Desc: increment the reference count on our object.
|
|
// Parms: none
|
|
// Return: current reference count.
|
|
////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP_(ULONG) CVDCursorFromRowset::AddRef(void)
|
|
{
|
|
if (m_pUnkOuter)
|
|
return m_pUnkOuter->AddRef();
|
|
else
|
|
return m_UnkPrivate.AddRef();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Name: Release
|
|
// Desc: decrement the reference count on our object. If the
|
|
// count has gone to 0, destroy the object.
|
|
// Parms: none
|
|
// Return: current reference count.
|
|
////////////////////////////////////////////////////////////////////
|
|
STDMETHODIMP_(ULONG) CVDCursorFromRowset::Release(void)
|
|
{
|
|
if (m_pUnkOuter)
|
|
return m_pUnkOuter->Release();
|
|
else
|
|
return m_UnkPrivate.Release();
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// GetCursor - Get cursor from rowset
|
|
//=--------------------------------------------------------------------------=
|
|
STDMETHODIMP CVDCursorFromRowset::GetCursor(IRowset * pRowset,
|
|
ICursor ** ppCursor,
|
|
LCID lcid)
|
|
{
|
|
return CVDCursorMain::Create(pRowset, ppCursor, lcid);
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// GetCursor - Get cursor from row position
|
|
//=--------------------------------------------------------------------------=
|
|
STDMETHODIMP CVDCursorFromRowset::GetCursor(IRowPosition * pRowPosition,
|
|
ICursor ** ppCursor,
|
|
LCID lcid)
|
|
{
|
|
return CVDCursorMain::Create(pRowPosition, ppCursor, lcid);
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CVDCursorFromRowset::CPrivateUnknownObject::m_pMainUnknown
|
|
//=--------------------------------------------------------------------------=
|
|
// this method is used when we're sitting in the private unknown object,
|
|
// and we need to get at the pointer for the main unknown. basically, it's
|
|
// a little better to do this pointer arithmetic than have to store a pointer
|
|
// to the parent, etc.
|
|
//
|
|
inline CVDCursorFromRowset *CVDCursorFromRowset::CPrivateUnknownObject::m_pMainUnknown
|
|
(
|
|
void
|
|
)
|
|
{
|
|
return (CVDCursorFromRowset *)((LPBYTE)this - offsetof(CVDCursorFromRowset, m_UnkPrivate));
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CVDCursorFromRowset::CPrivateUnknownObject::QueryInterface
|
|
//=--------------------------------------------------------------------------=
|
|
// this is the non-delegating internal QI routine.
|
|
//
|
|
// Parameters:
|
|
// REFIID - [in] interface they want
|
|
// void ** - [out] where they want to put the resulting object ptr.
|
|
//
|
|
// Output:
|
|
// HRESULT - S_OK, E_NOINTERFACE
|
|
//
|
|
// Notes:
|
|
//
|
|
STDMETHODIMP CVDCursorFromRowset::CPrivateUnknownObject::QueryInterface
|
|
(
|
|
REFIID riid,
|
|
void **ppvObjOut
|
|
)
|
|
{
|
|
if (!ppvObjOut)
|
|
return E_INVALIDARG;
|
|
|
|
*ppvObjOut = NULL;
|
|
|
|
if (DO_GUIDS_MATCH(riid, IID_IUnknown))
|
|
{
|
|
m_cRef++;
|
|
*ppvObjOut = (IUnknown *)this;
|
|
}
|
|
else
|
|
if (DO_GUIDS_MATCH(riid, IID_ICursorFromRowset))
|
|
{
|
|
m_pMainUnknown()->AddRef();
|
|
*ppvObjOut = m_pMainUnknown();
|
|
}
|
|
else
|
|
if (DO_GUIDS_MATCH(riid, IID_ICursorFromRowPosition))
|
|
{
|
|
m_pMainUnknown()->AddRef();
|
|
*ppvObjOut = (ICursorFromRowPosition*)m_pMainUnknown();
|
|
}
|
|
|
|
return *ppvObjOut ? S_OK : E_NOINTERFACE;
|
|
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CVDCursorFromRowset::CPrivateUnknownObject::AddRef
|
|
//=--------------------------------------------------------------------------=
|
|
// adds a tick to the current reference count.
|
|
//
|
|
// Output:
|
|
// ULONG - the new reference count
|
|
//
|
|
// Notes:
|
|
//
|
|
ULONG CVDCursorFromRowset::CPrivateUnknownObject::AddRef
|
|
(
|
|
void
|
|
)
|
|
{
|
|
return ++m_cRef;
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// CVDCursorFromRowset::CPrivateUnknownObject::Release
|
|
//=--------------------------------------------------------------------------=
|
|
// removes a tick from the count, and delets the object if necessary
|
|
//
|
|
// Output:
|
|
// ULONG - remaining refs
|
|
//
|
|
// Notes:
|
|
//
|
|
ULONG CVDCursorFromRowset::CPrivateUnknownObject::Release
|
|
(
|
|
void
|
|
)
|
|
{
|
|
ULONG cRef = --m_cRef;
|
|
|
|
if (!m_cRef)
|
|
delete m_pMainUnknown();
|
|
|
|
return cRef;
|
|
}
|
|
|
|
//=--------------------------------------------------------------------------=
|
|
// VDGetICursorFromIRowset
|
|
//=--------------------------------------------------------------------------=
|
|
// MSR2C entry point
|
|
//
|
|
HRESULT WINAPI VDGetICursorFromIRowset(IRowset * pRowset,
|
|
ICursor ** ppCursor,
|
|
LCID lcid)
|
|
{
|
|
// call update object count to initialize g_pMalloc if not already initialized
|
|
VDUpdateObjectCount(1);
|
|
|
|
HRESULT hr = CVDCursorMain::Create(pRowset, ppCursor, lcid);
|
|
|
|
// maintain correct object count (object count is incremented in the constructor
|
|
// of CVDCursorMain)
|
|
VDUpdateObjectCount(-1);
|
|
|
|
return hr;
|
|
}
|
|
|
|
// object construction/destruction counters (debug only)
|
|
//
|
|
#ifdef _DEBUG
|
|
int g_cVDNotifierCreated; // CVDNotifier
|
|
int g_cVDNotifierDestroyed;
|
|
int g_cVDNotifyDBEventsConnPtCreated; // CVDNotifyDBEventsConnPt
|
|
int g_cVDNotifyDBEventsConnPtDestroyed;
|
|
int g_cVDNotifyDBEventsConnPtContCreated; // CVDNotifyDBEventsConnPtCont
|
|
int g_cVDNotifyDBEventsConnPtContDestroyed;
|
|
int g_cVDEnumConnPointsCreated; // CVDEnumConnPoints
|
|
int g_cVDEnumConnPointsDestroyed;
|
|
int g_cVDRowsetColumnCreated; // CVDRowsetColumn
|
|
int g_cVDRowsetColumnDestroyed;
|
|
int g_cVDRowsetSourceCreated; // CVDRowsetSource
|
|
int g_cVDRowsetSourceDestroyed;
|
|
int g_cVDCursorMainCreated; // CVDCursorMain
|
|
int g_cVDCursorMainDestroyed;
|
|
int g_cVDCursorPositionCreated; // CVDCursorPosition
|
|
int g_cVDCursorPositionDestroyed;
|
|
int g_cVDCursorBaseCreated; // CVDCursorBase
|
|
int g_cVDCursorBaseDestroyed;
|
|
int g_cVDCursorCreated; // CVDCursor
|
|
int g_cVDCursorDestroyed;
|
|
int g_cVDMetadataCursorCreated; // CVDMetadataCursor
|
|
int g_cVDMetadataCursorDestroyed;
|
|
int g_cVDEntryIDDataCreated; // CVDEntryIDData
|
|
int g_cVDEntryIDDataDestroyed;
|
|
int g_cVDStreamCreated; // CVDStream
|
|
int g_cVDStreamDestroyed;
|
|
int g_cVDColumnUpdateCreated; // CVDColumnUpdate
|
|
int g_cVDColumnUpdateDestroyed;
|
|
#endif // _DEBUG
|
|
|
|
// dump oject counters
|
|
//
|
|
#ifdef _DEBUG
|
|
void DumpObjectCounters()
|
|
{
|
|
CHAR str[256];
|
|
OutputDebugString("MSR2C Objects-\n");
|
|
wsprintf(str, "CVDNotifier: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDNotifierCreated, g_cVDNotifierDestroyed,
|
|
g_cVDNotifierCreated == g_cVDNotifierDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDNotifyDBEventsConnPt: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDNotifyDBEventsConnPtCreated, g_cVDNotifyDBEventsConnPtDestroyed,
|
|
g_cVDNotifyDBEventsConnPtCreated == g_cVDNotifyDBEventsConnPtDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDNotifyDBEventsConnPtCont: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDNotifyDBEventsConnPtContCreated, g_cVDNotifyDBEventsConnPtContDestroyed,
|
|
g_cVDNotifyDBEventsConnPtContCreated == g_cVDNotifyDBEventsConnPtContDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDEnumConnPoints: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDEnumConnPointsCreated, g_cVDEnumConnPointsDestroyed,
|
|
g_cVDEnumConnPointsCreated == g_cVDEnumConnPointsDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDRowsetColumn: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDRowsetColumnCreated, g_cVDRowsetColumnDestroyed,
|
|
g_cVDRowsetColumnCreated == g_cVDRowsetColumnDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDRowsetSource: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDRowsetSourceCreated, g_cVDRowsetSourceDestroyed,
|
|
g_cVDRowsetSourceCreated == g_cVDRowsetSourceDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDCursorMain: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDCursorMainCreated, g_cVDCursorMainDestroyed,
|
|
g_cVDCursorMainCreated == g_cVDCursorMainDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDCursorPosition: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDCursorPositionCreated, g_cVDCursorPositionDestroyed,
|
|
g_cVDCursorPositionCreated == g_cVDCursorPositionDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDCursorBase: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDCursorBaseCreated, g_cVDCursorBaseDestroyed,
|
|
g_cVDCursorBaseCreated == g_cVDCursorBaseDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDCursor: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDCursorCreated, g_cVDCursorDestroyed,
|
|
g_cVDCursorCreated == g_cVDCursorDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDMetadataCursor: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDMetadataCursorCreated, g_cVDMetadataCursorDestroyed,
|
|
g_cVDMetadataCursorCreated == g_cVDMetadataCursorDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDEntryIDData: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDEntryIDDataCreated, g_cVDEntryIDDataDestroyed,
|
|
g_cVDEntryIDDataCreated == g_cVDEntryIDDataDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDStream: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDStreamCreated, g_cVDStreamDestroyed,
|
|
g_cVDStreamCreated == g_cVDStreamDestroyed);
|
|
OutputDebugString(str);
|
|
wsprintf(str, "CVDColumnUpdate: Created = %d, Destroyed = %d, Equal = %d.\n",
|
|
g_cVDColumnUpdateCreated, g_cVDColumnUpdateDestroyed,
|
|
g_cVDColumnUpdateCreated == g_cVDColumnUpdateDestroyed);
|
|
OutputDebugString(str);
|
|
}
|
|
#endif // _DEBUG
|
|
|
|
|