📄 datasource.cpp
字号:
//-----------------------------------------------------------------------------
// Microsoft OLE DB RowsetViewer
// Copyright (C) 1994 - 1998 By Microsoft Corporation.
//
// @doc
//
// @module DATASOURCE.CPP
//
//-----------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////
// Includes
//
/////////////////////////////////////////////////////////////////
#include "Common.h"
#include "DataSource.h"
#include "Main.h"
/////////////////////////////////////////////////////////////////
// CBase::CBase
//
/////////////////////////////////////////////////////////////////
CBase::CBase(CMDIChild* pCMDIChild)
{
//BackPointer
ASSERT(pCMDIChild);
m_pCMDIChild = pCMDIChild;
//OLEDB Interfaces
m_pIUnknown = NULL;
}
/////////////////////////////////////////////////////////////////
// CBase::~CBase
//
/////////////////////////////////////////////////////////////////
CBase::~CBase()
{
ASSERT(m_pCMDIChild);
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
//Verify Object has no references on it...
pCListBox->OutputRelease(&m_pIUnknown, "IUnknown", 0);
}
/////////////////////////////////////////////////////////////////
// BOOL CBase::ReleaseBase
//
/////////////////////////////////////////////////////////////////
HRESULT CBase::ReleaseBase(CHAR* pszObject)
{
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
//IUnknown interfaces
//Shouldn't have any extra references left...
pCListBox->OutputRelease(&m_pIUnknown, pszObject ? pszObject : "IUnknown", 0);
return S_OK;
}
/////////////////////////////////////////////////////////////////
// ULONG CBase::AddRef
//
/////////////////////////////////////////////////////////////////
ULONG CBase::AddRef()
{
//IUnknown::AddRef
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
return pCListBox->OutputAddRef(m_pIUnknown);
}
/////////////////////////////////////////////////////////////////
// ULONG CBase::Release
//
/////////////////////////////////////////////////////////////////
ULONG CBase::Release()
{
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
IUnknown* pIUnknown = m_pIUnknown;
ULONG ulRefCount = 0;
//IUnknown::Release
ulRefCount = pCListBox->OutputRelease(&m_pIUnknown);
if(ulRefCount != 0)
m_pIUnknown = pIUnknown;
return ulRefCount;
}
/////////////////////////////////////////////////////////////////
// HRESULT CBase::QueryInterface
//
/////////////////////////////////////////////////////////////////
HRESULT CBase::QueryInterface(REFIID riid)
{
HRESULT hr = S_OK;
HWND hWnd = m_pCMDIChild->m_hWnd;
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
IUnknown* pIUnknown = NULL;
//IUnknown::QueryInterface
XTEST(hWnd, hr = pCListBox->OutputQI(m_pIUnknown, riid, &pIUnknown));
//We need to put the obtained interface in the
//appropiate member or release it...
if(FAILED(hr) || FAILED(SetInterface(riid, pIUnknown)))
pCListBox->OutputRelease(&pIUnknown);
return hr;
}
////////////////////////////////////////////////////////////////
// CBase::GetOptionsObj
//
/////////////////////////////////////////////////////////////////
COptionsDlg* CBase::GetOptionsObj()
{
ASSERT(m_pCMDIChild);
return m_pCMDIChild->GetOptionsObj();
}
/////////////////////////////////////////////////////////////////
// CDataSource::CDataSource
//
/////////////////////////////////////////////////////////////////
CDataSource::CDataSource(CMDIChild* pCMDIChild) : CBase(pCMDIChild)
{
//OLEDB Interfaces
m_pIDBCreateSession = NULL; //DataSource interface
m_pIDBInitialize = NULL; //DataSource interface
m_pIDBProperties = NULL; //DataSource interface
m_pIPersist = NULL; //DataSource interface
m_pIConnectionPointContainer= NULL; //DataSource interface
m_pIDBAsynchStatus = NULL; //DataSource interface
m_pIDBDataSourceAdmin = NULL; //DataSource interface
m_pIDBInfo = NULL; //DataSource interface
m_pIPersistFile = NULL; //DataSource interface
m_pISupportErrorInfo = NULL; //DataSource interface
m_pISourcesRowset = NULL; //Enumerator interface
m_pIParseDisplayName = NULL; //Enumerator interface
//Extra interfaces
m_pIConnectionPoint = NULL; //Connection interface
//EnumInfo
memset(&m_EnumInfo, 0, sizeof(ENUMINFO));
//Properties
m_pwszDataSource = NULL; //DBPROP_DATASOURCENAME
m_pwszDBMS = NULL; //DBPROP_DBMSNAME
m_pwszDBMSVer = NULL; //DBPROP_DBMSVER
m_pwszProviderName = NULL;
m_pwszProviderDesc = NULL;
m_fConnected = FALSE;
//Listeners
m_pCAsynchNotify = new CAsynchNotify(m_pCMDIChild->m_pCListBox);
}
/////////////////////////////////////////////////////////////////
// CDataSource::~CDataSource
//
/////////////////////////////////////////////////////////////////
CDataSource::~CDataSource()
{
ASSERT(m_pCMDIChild);
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
ReleaseDataSource();
//Verify Listeners have no extra references on them...
pCListBox->OutputRelease((IUnknown**)&m_pCAsynchNotify, "IDBAsynchNotify", 0);
}
/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::SetInterface
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::SetInterface(REFIID riid, IUnknown* pIUnknown)
{
HRESULT hr = S_OK;
//no-op
if(pIUnknown == NULL)
return E_INVALIDARG;
//If the requested interface is a DataSource interface, place it in the
//Appropiate member variable, otherwise we have to release it, since we
//have no place to store it...
if(riid == IID_IUnknown)
m_pIUnknown = pIUnknown;
else if(riid == IID_IDBCreateSession)
m_pIDBCreateSession = (IDBCreateSession*)pIUnknown;
else if(riid == IID_IDBInitialize)
m_pIDBInitialize = (IDBInitialize*)pIUnknown;
else if(riid == IID_IDBProperties)
m_pIDBProperties = (IDBProperties*)pIUnknown;
else if(riid == IID_IPersist)
m_pIPersist = (IPersist*)pIUnknown;
else if(riid == IID_IConnectionPointContainer)
m_pIConnectionPointContainer = (IConnectionPointContainer*)pIUnknown;
else if(riid == IID_IDBAsynchStatus)
m_pIDBAsynchStatus = (IDBAsynchStatus*)pIUnknown;
else if(riid == IID_IDBDataSourceAdmin)
m_pIDBDataSourceAdmin = (IDBDataSourceAdmin*)pIUnknown;
else if(riid == IID_IDBInfo)
m_pIDBInfo = (IDBInfo*)pIUnknown;
else if(riid == IID_IPersistFile)
m_pIPersistFile = (IPersistFile*)pIUnknown;
else if(riid == IID_ISupportErrorInfo)
m_pISupportErrorInfo = (ISupportErrorInfo*)pIUnknown;
else if(riid == IID_ISourcesRowset)
m_pISourcesRowset = (ISourcesRowset*)pIUnknown;
else if(riid == IID_IParseDisplayName)
m_pIParseDisplayName = (IParseDisplayName*)pIUnknown;
else
hr = E_NOINTERFACE;
return hr;
}
/////////////////////////////////////////////////////////////////
// BOOL CDataSource::ReleaseDataSource
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::ReleaseDataSource()
{
//UnadviseListeners
UnadviseListeners();
//DataSource interfaces
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
pCListBox->OutputRelease((IUnknown**)&m_pIDBCreateSession, "IDBCreateSession");
pCListBox->OutputRelease((IUnknown**)&m_pIDBInitialize, "IDBInitialize");
pCListBox->OutputRelease((IUnknown**)&m_pIDBProperties, "IDBProperties");
pCListBox->OutputRelease((IUnknown**)&m_pIPersist, "IPersist");
pCListBox->OutputRelease((IUnknown**)&m_pIDBAsynchStatus, "IDBAsynchStatus");
pCListBox->OutputRelease((IUnknown**)&m_pIDBDataSourceAdmin, "IDBDataSourceAdmin");
pCListBox->OutputRelease((IUnknown**)&m_pIDBInfo, "IDBInfo");
pCListBox->OutputRelease((IUnknown**)&m_pIPersistFile, "IPersistFile");
pCListBox->OutputRelease((IUnknown**)&m_pISupportErrorInfo, "ISupportErrorInfo");
pCListBox->OutputRelease((IUnknown**)&m_pIConnectionPointContainer, "IConnectionPointContainer");
//Enumerator interfaces
pCListBox->OutputRelease((IUnknown**)&m_pISourcesRowset, "ISourcesRowset");
pCListBox->OutputRelease((IUnknown**)&m_pIParseDisplayName, "IParseDisplayName");
//Extra interfaces
pCListBox->OutputRelease((IUnknown**)&m_pIConnectionPoint, "IConnectionPoint");
//Base
ReleaseBase("DataSource");
//Properties
SAFE_FREE(m_pwszDataSource);
SAFE_FREE(m_pwszDBMS);
SAFE_FREE(m_pwszDBMSVer);
SAFE_FREE(m_pwszProviderName);
SAFE_FREE(m_pwszProviderDesc);
//Data
m_fConnected = FALSE;
return S_OK;
}
/////////////////////////////////////////////////////////////////
// BOOL CDataSource::IsConnected
//
/////////////////////////////////////////////////////////////////
BOOL CDataSource::IsConnected()
{
return m_fConnected;
}
/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::CreateDataSource
//
/////////////////////////////////////////////////////////////////
HRESULT CDataSource::CreateDataSource(CDataSource* pCDataSource)
{
//Use exsiting Connection
ASSERT(pCDataSource);
HRESULT hr = S_OK;
HRESULT hrOptional = S_OK;
HWND hWnd = m_pCMDIChild->m_hWnd;
CListBox* pCListBox = m_pCMDIChild->m_pCListBox;
//Release all Previous interfaces...
IUnknown* pIUnknown = pCDataSource->m_pIUnknown;
pCListBox->OutputAddRef(pIUnknown);
ReleaseDataSource();
m_pIUnknown = pIUnknown;
//Determine the Type of this Object...
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IParseDisplayName, (IUnknown**)&m_pIParseDisplayName);
//DataSource
if(m_pIParseDisplayName == NULL)
{
//[MANDATORY]
if(m_pCMDIChild->GetConnectObj()->m_dwConnectOpts & CONNECT_SETPROPERTIES || m_pCMDIChild->GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
XTEST(hWnd, hr = pCListBox->OutputQI(m_pIUnknown, IID_IDBProperties, (IUnknown**)&m_pIDBProperties));
if(m_pCMDIChild->GetConnectObj()->m_dwConnectOpts & CONNECT_INITIALIZE || m_pCMDIChild->GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
XTESTC(hWnd, hr = pCListBox->OutputQI(m_pIUnknown, IID_IDBInitialize, (IUnknown**)&m_pIDBInitialize));
if(m_pCMDIChild->GetConnectObj()->m_dwConnectOpts & CONNECT_CREATESESSION || m_pCMDIChild->GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IDBCreateSession, (IUnknown**)&m_pIDBCreateSession);
//AutoQI
if(GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
{
//[OPTIONAL]
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IPersist, (IUnknown**)&m_pIPersist);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IConnectionPointContainer, (IUnknown**)&m_pIConnectionPointContainer);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IDBAsynchStatus, (IUnknown**)&m_pIDBAsynchStatus);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IDBDataSourceAdmin, (IUnknown**)&m_pIDBDataSourceAdmin);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IDBInfo, (IUnknown**)&m_pIDBInfo);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IPersistFile, (IUnknown**)&m_pIPersistFile);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_ISupportErrorInfo, (IUnknown**)&m_pISupportErrorInfo);
}
//DBPROP_DATASOURCENAME
GetProperty(m_pIUnknown, DBPROP_DATASOURCENAME, DBPROPSET_DATASOURCEINFO, &m_pwszDataSource);
//DBPROP_DBMSNAME
GetProperty(m_pIUnknown, DBPROP_DBMSNAME, DBPROPSET_DATASOURCEINFO, &m_pwszDBMS);
//DBPROP_DBMSVER
GetProperty(m_pIUnknown, DBPROP_DBMSVER, DBPROPSET_DATASOURCEINFO, &m_pwszDBMSVer);
//DBPROP_PROVIDERFILENAME
GetProperty(m_pIUnknown, DBPROP_PROVIDERFILENAME, DBPROPSET_DATASOURCEINFO, &m_pwszProviderName);
//DBPROP_PROVIDERFRIENDLYNAME
GetProperty(m_pIUnknown, DBPROP_PROVIDERFRIENDLYNAME, DBPROPSET_DATASOURCEINFO, &m_pwszProviderDesc);
}
else //Enumerator
{
//AutoQI
if(GetOptionsObj()->m_dwRowsetOpts & ROWSET_AUTOQI)
{
//[MANDATORY]
XTESTC(hWnd, hr = pCListBox->OutputQI(m_pIUnknown, IID_ISourcesRowset, (IUnknown**)&m_pISourcesRowset));
//[OPTIONAL]
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IDBInitialize, (IUnknown**)&m_pIDBInitialize);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_IDBProperties, (IUnknown**)&m_pIDBProperties);
hrOptional = pCListBox->OutputQI(m_pIUnknown, IID_ISupportErrorInfo, (IUnknown**)&m_pISupportErrorInfo);
}
}
//Copy EnumInfo
memcpy(&m_EnumInfo, &pCDataSource->m_EnumInfo, sizeof(ENUMINFO));
CLEANUP:
return hr;
}
/////////////////////////////////////////////////////////////////
// HRESULT CDataSource::AdviseListeners
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -