380 lines
9.0 KiB
C++
380 lines
9.0 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Microsoft OLE DB RowsetViewer
|
|
// Copyright (C) 1994 - 1999 By Microsoft Corporation.
|
|
//
|
|
// @doc
|
|
//
|
|
// @module CDATASOURCE.CPP
|
|
//
|
|
//-----------------------------------------------------------------------------------
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// Includes
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
#include "Headers.h"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CError::CError
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
CError::CError(CMainWindow* pCMainWindow)
|
|
: CBase(eCError, pCMainWindow, NULL)
|
|
{
|
|
//OLE DB Interfaces
|
|
m_pIErrorInfo = NULL; //Error interface
|
|
m_pIErrorRecords = NULL; //Error interface
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CError::~CError
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
CError::~CError()
|
|
{
|
|
ReleaseObject(0);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// IUnknown** CError::GetInterfaceAddress
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
IUnknown** CError::GetInterfaceAddress(REFIID riid)
|
|
{
|
|
HANDLE_GETINTERFACE(IErrorInfo);
|
|
HANDLE_GETINTERFACE(IErrorRecords);
|
|
|
|
//Otherwise delegate
|
|
return CBase::GetInterfaceAddress(riid);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::AutoRelease
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::AutoRelease()
|
|
{
|
|
//Error
|
|
RELEASE_INTERFACE(IErrorInfo);
|
|
RELEASE_INTERFACE(IErrorRecords);
|
|
|
|
//Delegate
|
|
return CBase::AutoRelease();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::AutoQI
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::AutoQI(DWORD dwCreateOpts)
|
|
{
|
|
//Delegate First so we have base interfaces
|
|
CBase::AutoQI(dwCreateOpts);
|
|
|
|
//[MANDATORY]
|
|
if(dwCreateOpts & CREATE_QI_MANDATORY)
|
|
{
|
|
OBTAIN_INTERFACE(IErrorInfo);
|
|
OBTAIN_INTERFACE(IErrorRecords);
|
|
}
|
|
|
|
//[OPTIONAL]
|
|
if(dwCreateOpts & CREATE_QI_OPTIONAL)
|
|
{
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CError::GetObjectDesc
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
WCHAR* CError::GetObjectDesc()
|
|
{
|
|
if(!m_strObjectDesc)
|
|
{
|
|
CComBSTR bstr;
|
|
if(SUCCEEDED(GetDescription(&bstr)) && bstr)
|
|
m_strObjectDesc.CopyFrom(bstr);
|
|
}
|
|
|
|
return m_strObjectDesc;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetDescription
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetDescription(BSTR* pbstrDescription)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pIErrorInfo)
|
|
{
|
|
//IErrorInfo::GetDescription
|
|
XTEST(hr = m_pIErrorInfo->GetDescription(pbstrDescription));
|
|
TRACE_METHOD(hr, L"IErrorInfo::GetDescription(&\"%s\")", pbstrDescription ? *pbstrDescription : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetSource
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetSource(BSTR* pbstrSource)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pIErrorInfo)
|
|
{
|
|
//IErrorInfo::GetSource
|
|
XTEST(hr = m_pIErrorInfo->GetSource(pbstrSource));
|
|
TRACE_METHOD(hr, L"IErrorInfo::GetSource(&\"%s\")", pbstrSource ? *pbstrSource : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetHelpFile
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetHelpFile(BSTR* pbstrHelpFile)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pIErrorInfo)
|
|
{
|
|
//IErrorInfo::GetHelpFile
|
|
XTEST(hr = m_pIErrorInfo->GetHelpFile(pbstrHelpFile));
|
|
TRACE_METHOD(hr, L"IErrorInfo::GetHelpFile(&\"%s\")", pbstrHelpFile ? *pbstrHelpFile : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetHelpContext
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetHelpContext(DWORD* pdwHelpContext)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pIErrorInfo)
|
|
{
|
|
//IErrorInfo::GetHelpContext
|
|
XTEST(hr = m_pIErrorInfo->GetHelpContext(pdwHelpContext));
|
|
TRACE_METHOD(hr, L"IErrorInfo::GetHelpContext(&0x%08x)", pdwHelpContext ? *pdwHelpContext : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetGUID
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetGUID(GUID* pGuid)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
WCHAR* pwszProgID = NULL;
|
|
|
|
if(m_pIErrorInfo)
|
|
{
|
|
//IErrorInfo::GetGUID
|
|
XTEST(hr = m_pIErrorInfo->GetGUID(pGuid));
|
|
|
|
if(pGuid)
|
|
pwszProgID = GetProgID(*pGuid);
|
|
TRACE_METHOD(hr, L"IErrorInfo::GetGuid(&\"%s\")", pwszProgID);
|
|
}
|
|
|
|
SAFE_FREE(pwszProgID);
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetRecordCount
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetRecordCount(ULONG* pulCount)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pIErrorRecords)
|
|
{
|
|
//IErrorRecords::GetRecordCount
|
|
XTEST(hr = m_pIErrorRecords->GetRecordCount(pulCount));
|
|
TRACE_METHOD(hr, L"IErrorRecords::GetRecordCount(&%d)", pulCount ? *pulCount : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetCustomErrorObject
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetCustomErrorObject(ULONG ulRecordNum, REFIID riid, IUnknown** ppObject)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pIErrorRecords)
|
|
{
|
|
//IErrorRecords::GetCustomErrorObject
|
|
XTEST(hr = m_pIErrorRecords->GetCustomErrorObject(ulRecordNum, riid, ppObject));
|
|
TRACE_METHOD(hr, L"IErrorRecords::GetCustomErrorObject(%lu, %s, &%p)", ulRecordNum, GetInterfaceName(riid), ppObject ? *ppObject : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CError::GetErrorInfo
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CError::GetErrorInfo(ULONG ulRecordNum, LCID lcid, IErrorInfo** ppErrorInfo)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pIErrorRecords)
|
|
{
|
|
//IErrorRecords::GetErrorInfo
|
|
XTEST(hr = m_pIErrorRecords->GetErrorInfo(ulRecordNum, lcid, ppErrorInfo));
|
|
TRACE_METHOD(hr, L"IErrorRecords::GetErrorInfo(%lu, %ld, &%p)", ulRecordNum, lcid, ppErrorInfo ? *ppErrorInfo : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CCustomError::CCustomError
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
CCustomError::CCustomError(CMainWindow* pCMainWindow)
|
|
: CBase(eCCustomError, pCMainWindow, NULL)
|
|
{
|
|
//OLE DB Interfaces
|
|
m_pISQLErrorInfo = NULL; //Error interface
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// CCustomError::~CCustomError
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
CCustomError::~CCustomError()
|
|
{
|
|
ReleaseObject(0);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// IUnknown** CCustomError::GetInterfaceAddress
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
IUnknown** CCustomError::GetInterfaceAddress(REFIID riid)
|
|
{
|
|
HANDLE_GETINTERFACE(ISQLErrorInfo);
|
|
|
|
//Otherwise delegate
|
|
return CBase::GetInterfaceAddress(riid);
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CCustomError::AutoRelease
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CCustomError::AutoRelease()
|
|
{
|
|
//Error
|
|
RELEASE_INTERFACE(ISQLErrorInfo);
|
|
|
|
//Delegate
|
|
return CBase::AutoRelease();
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CCustomError::AutoQI
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CCustomError::AutoQI(DWORD dwCreateOpts)
|
|
{
|
|
//Delegate First so we have base interfaces
|
|
CBase::AutoQI(dwCreateOpts);
|
|
|
|
//[MANDATORY]
|
|
if(dwCreateOpts & CREATE_QI_MANDATORY)
|
|
{
|
|
}
|
|
|
|
//[OPTIONAL]
|
|
if(dwCreateOpts & CREATE_QI_OPTIONAL)
|
|
{
|
|
OBTAIN_INTERFACE(ISQLErrorInfo);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CCustomError::GetObjectDesc
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
WCHAR* CCustomError::GetObjectDesc()
|
|
{
|
|
if(!m_strObjectDesc)
|
|
{
|
|
CComBSTR bstr;
|
|
LONG lNativeError = 0;
|
|
|
|
//ISQLErrorInfo::GetSQLInfo
|
|
if(SUCCEEDED(GetSQLInfo(&bstr, &lNativeError)) && bstr)
|
|
{
|
|
m_strObjectDesc.CopyFrom(bstr);
|
|
}
|
|
}
|
|
|
|
return m_strObjectDesc;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////
|
|
// HRESULT CCustomError::GetSQLInfo
|
|
//
|
|
/////////////////////////////////////////////////////////////////
|
|
HRESULT CCustomError::GetSQLInfo(BSTR* pbstrSQLState, LONG* plNativeError)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if(m_pISQLErrorInfo)
|
|
{
|
|
//ISQLErrorInfo::GetSQLInfo
|
|
XTEST(hr = m_pISQLErrorInfo->GetSQLInfo(pbstrSQLState, plNativeError));
|
|
TRACE_METHOD(hr, L"ISQLErrorInfo::GetSQLInfo(&\"%s\", &%ld)", pbstrSQLState ? *pbstrSQLState : NULL, plNativeError ? *plNativeError : NULL);
|
|
}
|
|
|
|
return hr;
|
|
}
|