397 lines
10 KiB
C++
397 lines
10 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Microsoft OLE DB RowsetViewer
|
|
// Copyright (C) 1994 - 1999 By Microsoft Corporation.
|
|
//
|
|
// @doc
|
|
//
|
|
// @module CBASE.H
|
|
//
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
#ifndef _CBASE_H_
|
|
#define _CBASE_H_
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Forwards
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
class CBase;
|
|
class CMainWindow;
|
|
class CMDIChild;
|
|
class CIntTrace;
|
|
class COptionsSheet;
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Defines
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
enum SOURCE
|
|
{
|
|
eInvalid = 0,
|
|
|
|
//Object Source
|
|
eCUnknown = 1,
|
|
eCDataSource = 2,
|
|
eCSession = 3,
|
|
eCCommand = 4,
|
|
eCMultipleResults = 5,
|
|
eCRowset = 6,
|
|
eCRow = 7,
|
|
eCStream = 8,
|
|
eCEnumerator = 9,
|
|
eCBinder =10,
|
|
eCServiceComp =11,
|
|
eCDataLinks =12,
|
|
eCDataset =13,
|
|
eCTransaction =14,
|
|
eCTransactionOptions =15,
|
|
eCError =16,
|
|
eCCustomError =17,
|
|
eCRowPosition =18,
|
|
eCConnectionPoint =19,
|
|
};
|
|
|
|
|
|
enum BASE_CLASS
|
|
{
|
|
eCBase = 0x0001000,
|
|
eCContainerBase = 0x0002000,
|
|
eCAsynchBase = 0x0004000,
|
|
eCPropertiesBase = 0x0008000,
|
|
eCDataAccess = 0x0010000
|
|
};
|
|
|
|
|
|
//Use to quickly implement GetInterfaceAddress
|
|
#define HANDLE_GETINTERFACE(interface) \
|
|
if(riid == IID_##interface) \
|
|
return (IUnknown**)&m_p##interface
|
|
|
|
#define OBTAIN_INTERFACE(interface) \
|
|
if(!m_p##interface) \
|
|
TRACE_QI(m_pIUnknown, IID_##interface, (IUnknown**)&m_p##interface, GetObjectName())
|
|
|
|
#define RELEASE_INTERFACE(interface) \
|
|
if(m_p##interface) \
|
|
TRACE_RELEASE(m_p##interface, WIDESTRING(#interface))
|
|
|
|
#define SOURCE_GETINTERFACE(pObject, type) \
|
|
((pObject) ? (type*)(pObject)->GetInterface(IID_##type) : NULL)
|
|
|
|
#define SOURCE_GETOBJECT(pObject, source) \
|
|
(((pObject) && (((pObject)->GetObjectType() == e##source) || ((pObject)->GetBaseType() & e##source))) ? (source*)(pObject) : NULL)
|
|
|
|
#define SOURCE_GETPARENT(pObject, source) \
|
|
((pObject) ? (source*)(pObject)->GetParent(e##source) : NULL)
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Functions
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
SOURCE GuidToSourceType(REFGUID guidType);
|
|
SOURCE DetermineObjectType(IUnknown* pIUnknown, SOURCE eSource);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Includes
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
// Interface
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
extern const IID IID_IAggregate;
|
|
interface IAggregate : public IUnknown
|
|
{
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CBase class
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
class CBase : public IUnknown
|
|
{
|
|
public:
|
|
//Constructors
|
|
CBase(SOURCE eObjectType, CMainWindow* pCMainWindow, CMDIChild* pCMDIChild = NULL);
|
|
virtual ~CBase();
|
|
|
|
//IUnknown
|
|
//So we can get referening counting on parent objects...
|
|
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
//Base impemented helpers
|
|
virtual ULONG ObjectAddRef();
|
|
virtual ULONG ObjectRelease();
|
|
virtual HRESULT ObjectQI(REFIID riid, IUnknown** ppIUnknown);
|
|
virtual HRESULT CreateObject(CBase* pCSource, REFIID riid, IUnknown* pIUnknown, DWORD dwCreateOpts = -1 /*Default*/);
|
|
virtual HRESULT ReleaseObject(ULONG ulExpectedRefCount = 0);
|
|
virtual HRESULT ReleaseChildren();
|
|
|
|
virtual HRESULT SetInterface(REFIID riid, IUnknown* pIUnknown);
|
|
virtual IUnknown* GetInterface(REFIID riid);
|
|
|
|
virtual BOOL IsSameObject(IUnknown* pIUnkObject);
|
|
virtual CBase* GetParent(SOURCE eSource);
|
|
|
|
//Derived Object helpers (Devired Class implements this)
|
|
virtual HRESULT AutoQI(DWORD dwCreateOpts) = 0;
|
|
virtual HRESULT AutoRelease() = 0;
|
|
virtual IUnknown** GetInterfaceAddress(REFIID riid) = 0;
|
|
|
|
virtual WCHAR* GetObjectName() = 0;
|
|
virtual UINT GetObjectMenu() = 0;
|
|
virtual LONG GetObjectImage() = 0;
|
|
virtual REFIID GetDefaultInterface() = 0;
|
|
virtual void OnDefOperation();
|
|
|
|
//UI - Helpers
|
|
virtual HRESULT DisplayObject();
|
|
virtual WCHAR* GetObjectDesc() { return m_strObjectDesc; }
|
|
virtual void SetObjectDesc(WCHAR* pwszDescription, BOOL fCopy = TRUE);
|
|
|
|
//Inlines
|
|
inline SOURCE GetObjectType() { return m_eObjectType; }
|
|
inline BASE_CLASS GetBaseType() { return m_eBaseClass; }
|
|
|
|
//Interface
|
|
virtual COptionsSheet* GetOptions();
|
|
|
|
//Common OLE DB Interfaces
|
|
IUnknown* m_pIUnknown;
|
|
ISupportErrorInfo* m_pISupportErrorInfo;
|
|
IAggregate* m_pIAggregate;
|
|
IService* m_pIService;
|
|
|
|
//Data
|
|
HTREEITEM m_hTreeItem;
|
|
DWORD m_dwCLSCTX;
|
|
|
|
//Parent Info
|
|
CBase* m_pCParent;
|
|
GUID m_guidSource;
|
|
|
|
//BackPointers
|
|
CMainWindow* m_pCMainWindow;
|
|
CMDIChild* m_pCMDIChild;
|
|
|
|
protected:
|
|
//Type
|
|
SOURCE m_eObjectType;
|
|
BASE_CLASS m_eBaseClass;
|
|
CComWSTR m_strObjectDesc;
|
|
|
|
//IUnknown
|
|
ULONG m_cRef;
|
|
};
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CUnknown class
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
class CUnknown : public CBase
|
|
{
|
|
public:
|
|
//Constructors
|
|
CUnknown(CMainWindow* pCMainWindow, CMDIChild* pCMDIChild = NULL)
|
|
: CBase(eCUnknown, pCMainWindow, pCMDIChild)
|
|
{
|
|
}
|
|
|
|
virtual ~CUnknown()
|
|
{
|
|
ReleaseObject(0);
|
|
}
|
|
|
|
//Derived Object helpers
|
|
//Devired Class implements this...
|
|
virtual HRESULT AutoQI(DWORD dwCreateOpts) { return CBase::AutoQI(dwCreateOpts); }
|
|
virtual HRESULT AutoRelease() { return CBase::AutoRelease(); }
|
|
virtual IUnknown** GetInterfaceAddress(REFIID riid) { return CBase::GetInterfaceAddress(riid); }
|
|
|
|
virtual WCHAR* GetObjectName() { return L"Unknown"; }
|
|
virtual UINT GetObjectMenu() { return IDM_UNKNOWNMENU; }
|
|
virtual LONG GetObjectImage() { return IMAGE_QUESTION; }
|
|
virtual REFIID GetDefaultInterface() { return IID_IUnknown; }
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CContainerBase class
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
class CContainerBase : public CBase
|
|
{
|
|
public:
|
|
//Constructors
|
|
CContainerBase(SOURCE eObjectType, CMainWindow* pCMainWindow, CMDIChild* pCMDIChild = NULL);
|
|
virtual ~CContainerBase();
|
|
|
|
//IUnknown Helpers
|
|
virtual HRESULT AutoQI(DWORD dwCreateOpts);
|
|
virtual HRESULT AutoRelease();
|
|
virtual IUnknown** GetInterfaceAddress(REFIID riid);
|
|
|
|
//Members
|
|
virtual HRESULT FindConnectionPoint(REFIID riid, IConnectionPoint** ppIConnectionPoint);
|
|
virtual HRESULT AdviseListener(REFIID riid, DWORD* pdwCookie);
|
|
virtual HRESULT UnadviseListener(REFIID riid, DWORD* pdwCookie);
|
|
|
|
//OLE DB Interfaces
|
|
//[MANADATORY]
|
|
|
|
//[OPTIONAL]
|
|
IConnectionPointContainer* m_pIConnectionPointContainer;
|
|
|
|
//protected:
|
|
//Data
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CConnectionPoint class
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
class CConnectionPoint : public CBase
|
|
{
|
|
public:
|
|
//Constructors
|
|
CConnectionPoint(CMainWindow* pCMainWindow, CMDIChild* pCMDIChild = NULL);
|
|
virtual ~CConnectionPoint();
|
|
|
|
//IUnknown Helpers
|
|
virtual HRESULT AutoQI(DWORD dwCreateOpts);
|
|
virtual HRESULT AutoRelease();
|
|
virtual IUnknown** GetInterfaceAddress(REFIID riid);
|
|
|
|
//Derived Class
|
|
virtual WCHAR* GetObjectName() { return L"ConnectionPoint"; }
|
|
virtual UINT GetObjectMenu() { return IDM_CONNECTIONPOINTMENU; }
|
|
virtual LONG GetObjectImage() { return IMAGE_FORM; }
|
|
virtual REFIID GetDefaultInterface() { return IID_IConnectionPoint; }
|
|
virtual WCHAR* GetObjectDesc();
|
|
|
|
//Members
|
|
virtual HRESULT GetConnectionInterface(IID* pIID);
|
|
|
|
//OLE DB Interfaces
|
|
//[MANADATORY]
|
|
IConnectionPoint* m_pIConnectionPoint;
|
|
|
|
//[OPTIONAL]
|
|
|
|
//protected:
|
|
//Data
|
|
DWORD m_dwCookie;
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CAsynchBase class
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
class CAsynchBase : public CContainerBase
|
|
{
|
|
public:
|
|
//Constructors
|
|
CAsynchBase(SOURCE eObjectType, CMainWindow* pCMainWindow, CMDIChild* pCMDIChild = NULL);
|
|
virtual ~CAsynchBase();
|
|
|
|
//IUnknown Helpers
|
|
virtual HRESULT AutoQI(DWORD dwCreateOpts);
|
|
virtual HRESULT AutoRelease();
|
|
virtual IUnknown** GetInterfaceAddress(REFIID riid);
|
|
|
|
//Members
|
|
virtual BOOL IsInitialized() { return m_fInitialized; }
|
|
virtual HRESULT Initialize();
|
|
virtual HRESULT Uninitialize();
|
|
|
|
virtual HRESULT Abort(HCHAPTER hChapter, DBASYNCHOP eOperation);
|
|
virtual HRESULT GetStatus(HCHAPTER hChapter, DBASYNCHOP eOperation, DBCOUNTITEM* pulProgress, DBCOUNTITEM* pulProgressMax, DBASYNCHPHASE* peAsynchPhase, LPOLESTR* ppwszStatusText);
|
|
|
|
//OLE DB Interfaces
|
|
//[MANADATORY]
|
|
|
|
//[OPTIONAL]
|
|
IDBInitialize* m_pIDBInitialize; //OLE DB interface
|
|
IDBAsynchStatus* m_pIDBAsynchStatus; //OLE DB interface
|
|
|
|
//Extra interfaces
|
|
|
|
//protected:
|
|
//Data
|
|
DWORD m_dwCookieAsynchNotify;
|
|
BOOL m_fInitialized;
|
|
};
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CPropertiesBase class
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
class CPropertiesBase : public CAsynchBase
|
|
{
|
|
public:
|
|
//Constructors
|
|
CPropertiesBase(SOURCE eObjectType, CMainWindow* pCMainWindow, CMDIChild* pCMDIChild = NULL);
|
|
virtual ~CPropertiesBase();
|
|
|
|
//IUnknown Helpers
|
|
virtual HRESULT AutoQI(DWORD dwCreateOpts);
|
|
virtual HRESULT AutoRelease();
|
|
virtual IUnknown** GetInterfaceAddress(REFIID riid);
|
|
|
|
//Members
|
|
virtual HRESULT SetProperties(ULONG cPropSets, DBPROPSET* rgPropSets);
|
|
|
|
//OLE DB Interfaces
|
|
//[MANADATORY]
|
|
IDBProperties* m_pIDBProperties; //OLE DB interface
|
|
|
|
//[OPTIONAL]
|
|
|
|
protected:
|
|
//Data
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Class CAggregate
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
class CAggregate : public IAggregate
|
|
{
|
|
public:
|
|
CAggregate();
|
|
virtual ~CAggregate();
|
|
|
|
//IUnknown
|
|
virtual STDMETHODIMP_(ULONG) AddRef(void);
|
|
virtual STDMETHODIMP_(ULONG) Release(void);
|
|
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv);
|
|
|
|
//Helpers
|
|
virtual HRESULT HandleAggregation(REFIID riid, IUnknown** ppIUnknown);
|
|
HRESULT SetInner(IUnknown* pIUnkInner);
|
|
HRESULT ReleaseInner();
|
|
|
|
protected:
|
|
//Data
|
|
ULONG m_cRef;
|
|
CComPtr<IUnknown> m_spUnkInner;
|
|
};
|
|
|
|
|
|
#endif //_CBASE_H_
|