291 lines
7.8 KiB
C++
291 lines
7.8 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Copyright (C) 1997, Microsoft Corporation
|
||
|
//
|
||
|
// File: dberror.hxx
|
||
|
//
|
||
|
// Contents: Ole DB error object to implement OLE DB error interfaces.
|
||
|
//
|
||
|
// Classes: CCIOleDBError
|
||
|
//
|
||
|
// History: 28-Apr-97 KrishnaN Created
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
//
|
||
|
// NOTE: High nibble is reserved by IDENTIFIER_SDK_MASK. Second highest
|
||
|
// nibble is used by Monarch, so we will use the third highest
|
||
|
// nibble to identify our errors.
|
||
|
//
|
||
|
|
||
|
const DWORD IDENTIFIER_CI_ERROR = 0x00800000;
|
||
|
|
||
|
// CLSID_CI_PROVIDER
|
||
|
// {F9AE8980-7E52-11d0-8964-00C04FD611D7}
|
||
|
const GUID CLSID_CI_PROVIDER =
|
||
|
{0xF9AE8980, 0x7E52, 0x11d0, 0x89, 0x64, 0x00, 0xC0, 0x4F, 0xD6, 0x11, 0xD7};
|
||
|
|
||
|
// CLSID_CI_ERROR
|
||
|
// {F9AE8981-7E52-11d0-8964-00C04FD611D7}
|
||
|
const GUID CLSID_CI_ERROR =
|
||
|
{0xF9AE8981, 0x7E52, 0x11d0, 0x89, 0x64, 0x00, 0xC0, 0x4F, 0xD6, 0x11, 0xD7};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CErrorLookupCF
|
||
|
//
|
||
|
// Purpose: Class factory for CIndexer class
|
||
|
//
|
||
|
// History: 25-Mar-97 KrishnaN Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CErrorLookupCF : public IClassFactory
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CErrorLookupCF();
|
||
|
|
||
|
//
|
||
|
// From IUnknown
|
||
|
//
|
||
|
|
||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID *ppiuk );
|
||
|
STDMETHOD_(ULONG, AddRef) (THIS);
|
||
|
STDMETHOD_(ULONG, Release) (THIS);
|
||
|
|
||
|
//
|
||
|
// From IClassFactory
|
||
|
//
|
||
|
|
||
|
STDMETHOD(CreateInstance) ( IUnknown * pUnkOuter,
|
||
|
REFIID riid, void * * ppvObject );
|
||
|
|
||
|
STDMETHOD(LockServer) ( BOOL fLock );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
friend SCODE STDMETHODCALLTYPE DllGetClassObject( REFCLSID cid,
|
||
|
REFIID iid, void** ppvObj );
|
||
|
virtual ~CErrorLookupCF();
|
||
|
|
||
|
long _cRefs;
|
||
|
};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CErrorLookup
|
||
|
//
|
||
|
// Purpose: Implements IErrorLookup
|
||
|
//
|
||
|
// History: 28-Apr-97 KrishnaN Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CErrorLookup : public IErrorLookup
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CErrorLookup() : _cRefs (1)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// IUnknown methods.
|
||
|
//
|
||
|
|
||
|
STDMETHOD(QueryInterface) ( THIS_ REFIID riid, LPVOID *ppiuk );
|
||
|
|
||
|
STDMETHOD_(ULONG, AddRef) (THIS);
|
||
|
|
||
|
STDMETHOD_(ULONG, Release) (THIS);
|
||
|
|
||
|
|
||
|
//
|
||
|
// IErrorLookup members
|
||
|
//
|
||
|
|
||
|
// GetErrorDescription Method
|
||
|
STDMETHOD(GetErrorDescription)(HRESULT hrError,
|
||
|
DWORD dwLookupId,
|
||
|
DISPPARAMS* pdispparams,
|
||
|
LCID lcid,
|
||
|
BSTR* ppwszSource,
|
||
|
BSTR* ppwszDescription);
|
||
|
|
||
|
// GetHelpInfo Method
|
||
|
STDMETHOD(GetHelpInfo)(HRESULT hrError,
|
||
|
DWORD dwLookupId,
|
||
|
LCID lcid,
|
||
|
BSTR* ppwszHelpFile,
|
||
|
DWORD* pdwHelpContext);
|
||
|
|
||
|
// Callback on interface to release dynamic error memory
|
||
|
STDMETHOD(ReleaseErrors) (const DWORD dwDynamicErrorId);
|
||
|
|
||
|
private:
|
||
|
|
||
|
// Refcouting
|
||
|
LONG _cRefs;
|
||
|
};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CCIOleDBError
|
||
|
//
|
||
|
// Purpose: Posts OLE DB errors on behalf of CI
|
||
|
//
|
||
|
// History: 28-Apr-97 KrishnaN Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
class CCIOleDBError : public ISupportErrorInfo
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
CCIOleDBError( IUnknown & rUnknown, CMutexSem & mutex );
|
||
|
~CCIOleDBError();
|
||
|
|
||
|
//
|
||
|
// IUnknown methods.
|
||
|
//
|
||
|
|
||
|
STDMETHOD(QueryInterface) ( THIS_ REFIID riid, LPVOID *ppiuk );
|
||
|
|
||
|
STDMETHOD_(ULONG, AddRef) (THIS);
|
||
|
|
||
|
STDMETHOD_(ULONG, Release) (THIS);
|
||
|
|
||
|
//
|
||
|
// ISupportErrorInfo method
|
||
|
//
|
||
|
|
||
|
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
|
||
|
|
||
|
//
|
||
|
// Supporting methods
|
||
|
//
|
||
|
|
||
|
inline void SetInterfaceArray(ULONG cErrInt, IID const * const * prgGuid)
|
||
|
{
|
||
|
_rgpErrInt = prgGuid;
|
||
|
_cErrInt = cErrInt;
|
||
|
};
|
||
|
|
||
|
// Post an HRESULT to be looked up in ole-db sdk's
|
||
|
// error collection or CI's error collection
|
||
|
HRESULT PostHResult(HRESULT hrErr, const IID& refiid);
|
||
|
HRESULT PostHResult(CException & e, const IID& refiid);
|
||
|
|
||
|
// Post static strings and DISPPARAMs. Translates
|
||
|
HRESULT PostParserError ( HRESULT hrErr,
|
||
|
DWORD dwIds,
|
||
|
DISPPARAMS **ppdispparams );
|
||
|
|
||
|
// Post static strings and DISPPARAMs (does actual post)
|
||
|
HRESULT PostError ( HRESULT hrErr,
|
||
|
const IID & piid,
|
||
|
DWORD dwIds,
|
||
|
DISPPARAMS* pdispparams );
|
||
|
|
||
|
// Clear Error Object
|
||
|
inline static void ClearErrorInfo(void)
|
||
|
{
|
||
|
SetErrorInfo(0, NULL);
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
|
||
|
// Gets the error interfaces, IErrorInfo and IErrorRecords
|
||
|
HRESULT GetErrorInterfaces(IErrorInfo** ppIErrorInfo,
|
||
|
IErrorRecords** ppIErrorRecords);
|
||
|
|
||
|
BOOL NeedToSetError ( SCODE scErr,
|
||
|
IErrorInfo * pIErrorInfo,
|
||
|
IErrorRecords *pErrorRecords);
|
||
|
|
||
|
|
||
|
SCODE _GetErrorClassFact();
|
||
|
|
||
|
CMutexSem & _mutex;
|
||
|
IClassFactory * _pErrClassFact;
|
||
|
IID const * const * _rgpErrInt; // Array of Interface IID Pointers
|
||
|
ULONG _cErrInt; // Count of the IID Pointer array
|
||
|
IUnknown & _rUnknown; // Controlling IUnknown
|
||
|
};
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Method: IsCIError, public
|
||
|
//
|
||
|
// Synopsis: Detects if the error is a CI error.
|
||
|
//
|
||
|
// Arguments: [hrError] - Error code in question.
|
||
|
//
|
||
|
// Returns: True if we detect to be a CI error.
|
||
|
//
|
||
|
// History: 29-Apr-97 KrishnaN Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline BOOL IsCIError(HRESULT hrError)
|
||
|
{
|
||
|
//
|
||
|
// All CI errors, as listed in cierror.h, have FACILITY_ITF and
|
||
|
// have codes in the range of 0x1600 to 0x18FF.
|
||
|
//
|
||
|
|
||
|
return (HRESULT_FACILITY(hrError) == FACILITY_ITF &&
|
||
|
HRESULT_CODE(hrError) >= 0x1600 &&
|
||
|
HRESULT_CODE(hrError) < 0x1850);
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Method: IsOleDBError, public
|
||
|
//
|
||
|
// Synopsis: Detects if the error is a OleDB error.
|
||
|
//
|
||
|
// Arguments: [hrError] - Error code in question.
|
||
|
//
|
||
|
// Returns: True if we detect to be a OleDB error.
|
||
|
//
|
||
|
// History: 29-Apr-97 KrishnaN Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline BOOL IsOleDBError(HRESULT hrError)
|
||
|
{
|
||
|
//
|
||
|
// A HRESULT is a Ole DB error if it has the FACILITY_ITF facility and has
|
||
|
// error codes in the range 0e00 to 0eff.
|
||
|
//
|
||
|
|
||
|
return (HRESULT_FACILITY(hrError) == FACILITY_ITF &&
|
||
|
HRESULT_CODE(hrError) >= 0x0E00 &&
|
||
|
HRESULT_CODE(hrError) < 0x0EFF);
|
||
|
}
|
||
|
|
||
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Method: IsParserError, public
|
||
|
//
|
||
|
// Synopsis: Detects if the error is a SQL Text Parser error.
|
||
|
//
|
||
|
// Arguments: [hrError] - Error code in question.
|
||
|
//
|
||
|
// Returns: True if we detect to be a OleDB error.
|
||
|
//
|
||
|
// History: 11-06-97 danleg Created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
inline BOOL IsParserError(HRESULT hrError)
|
||
|
{
|
||
|
return (HRESULT_FACILITY(hrError) == FACILITY_ITF &&
|
||
|
HRESULT_CODE(hrError) >= 0x092f &&
|
||
|
HRESULT_CODE(hrError) < 0x0992);
|
||
|
}
|