//+--------------------------------------------------------------------------- // // 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); }