|
|
//---------------------------------------------------------------------------
// 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
|