00001 #ifndef MGA_COMMONERROR_H
00002 #define MGA_COMMONERROR_H
00003
00004 #include <exception>
00005 #include <comdef.h>
00006
00007
00008
00009 #if !defined(ASSERT) && defined(ATLASSERT)
00010 #define ASSERT ATLASSERT
00011 #endif
00012
00013
00014
00015 class hresult_exception : public std::exception
00016 {
00017 public:
00018 hresult_exception() throw();
00019 hresult_exception(const hresult_exception &e) throw();
00020 hresult_exception(HRESULT hr) throw();
00021 hresult_exception &operator=(const hresult_exception &e) throw();
00022 hresult_exception &operator=(HRESULT hr) throw();
00023 ~hresult_exception() throw();
00024 virtual const char *what() const throw();
00025
00026 public:
00027 HRESULT hr;
00028 };
00029
00030
00031
00032 #define NOTHROW throw()
00033
00034 #define COMTHROW(FUNC) \
00035 do { \
00036 HRESULT _hr = (FUNC); \
00037 if( FAILED(_hr) ) { \
00038 throw hresult_exception(_hr); \
00039 } \
00040 } while(false)
00041
00042 #define VERIFYTHROW(FUNC) \
00043 do { \
00044 if( !(bool)(FUNC) ) { \
00045 throw hresult_exception(E_VERIFY); \
00046 } \
00047 } while(false)
00048
00049 #define COMVERIFY(FUNC) \
00050 VERIFY(SUCCEEDED(FUNC))
00051
00052 #define HR_THROW(_hr) \
00053 do { \
00054 throw hresult_exception(_hr); \
00055 } while(false)
00056
00057 #define COMTRY try
00058
00059 #ifdef __AFX_H__
00060 #define CATCH_CMEMORY_EXCEPTION(CLEANUP) \
00061 catch (CMemoryException* e) \
00062 { \
00063 try { CLEANUP; } catch (const std::bad_alloc& ) { } \
00064 e->Delete(); \
00065 SetStandardOrGMEErrorInfo(E_OUTOFMEMORY); \
00066 return E_OUTOFMEMORY; \
00067 }
00068 #else
00069 #define CATCH_CMEMORY_EXCEPTION(CLEANUP)
00070 #endif
00071
00072
00073 #define COMCATCH(CLEANUP) \
00074 catch(hresult_exception &e) \
00075 { \
00076 ASSERT( FAILED(e.hr) ); \
00077 { CLEANUP; } \
00078 SetStandardOrGMEErrorInfo(e.hr); \
00079 return e.hr; \
00080 } \
00081 catch(_com_error &e) \
00082 { \
00083 { CLEANUP; } \
00084 if (e.Description() != _bstr_t()) \
00085 SetErrorInfo(e.Description()); \
00086 else \
00087 SetStandardOrGMEErrorInfo(e.Error()); \
00088 return e.Error(); \
00089 } \
00090 catch (const std::bad_alloc& ) \
00091 { \
00092 try { CLEANUP; } catch (const std::bad_alloc& ) { } \
00093 SetStandardOrGMEErrorInfo(E_OUTOFMEMORY); \
00094 return E_OUTOFMEMORY; \
00095 } \
00096 CATCH_CMEMORY_EXCEPTION(CLEANUP) \
00097 return S_OK;
00098
00099 #define COMRETURN(HR) \
00100 { \
00101 HRESULT _hr = HR; \
00102 if( FAILED(_hr) ) \
00103 SetErrorInfo(_hr); \
00104 return _hr; \
00105 }
00106
00107 inline bool CheckOut_IsBound(BSTR b) { return b != NULL; }
00108 inline bool CheckOut_IsBound(const VARIANT &v) { return !(v.vt == VT_EMPTY || v.vt == VT_NULL); }
00109 inline bool CheckOut_IsBound(const IUnknown *p) { return p != NULL; }
00110 inline bool CheckOut_IsBound(const int) { return false; }
00111 inline bool CheckOut_IsBound(const short) { return false; }
00112 inline bool CheckOut_IsBound(const ULONG) { return false; }
00113 inline bool CheckOut_IsBound(const SAFEARRAY *p) { return p != NULL; }
00114
00115 #define CHECK_IN(PTR) \
00116 { \
00117 if( PTR == NULL ) \
00118 COMRETURN(E_INVALIDARG) \
00119 }
00120
00121 #define CHECK_OUT(PTR) \
00122 { \
00123 if( PTR == NULL ) \
00124 COMRETURN(E_POINTER) \
00125 else if( CheckOut_IsBound(*PTR) ) \
00126 COMRETURN(E_OUT_NOT_EMPTY) \
00127 }
00128
00129 #define CHECK_INOUT(PTR) \
00130 { \
00131 if( PTR == NULL ) \
00132 COMRETURN(E_INVALIDARG) \
00133 }
00134
00135
00136
00137
00138 void throw_com_error(HRESULT hr, LPCOLESTR desc);
00139 void SetErrorInfo(LPCOLESTR desc) NOTHROW;
00140 void SetErrorInfo(HRESULT hr, LPOLESTR desc2 = NULL) NOTHROW;
00141 bool GetErrorInfo(BSTR *p) NOTHROW;
00142 void GetErrorInfo(HRESULT hr, BSTR *p) NOTHROW;
00143 static void SetStandardOrGMEErrorInfo(HRESULT hr) NOTHROW {
00144 _bstr_t error;
00145 GetErrorInfo(hr, error.GetAddress());
00146 if (static_cast<LPOLESTR>(error))
00147 SetErrorInfo(static_cast<LPOLESTR>(error));
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 #define E_INVALID_USAGE _HRESULT_TYPEDEF_(0x80731001)
00161
00162
00163 #define E_EXCEPTION _HRESULT_TYPEDEF_(0x80731002)
00164
00165
00166 #define E_CONVERSION _HRESULT_TYPEDEF_(0x80731003)
00167
00168
00169 #define E_GETALL _HRESULT_TYPEDEF_(0x80731004)
00170
00171
00172 #define E_OUT_NOT_EMPTY _HRESULT_TYPEDEF_(0x80731005)
00173
00174
00175 #define E_SAMEPROJECT _HRESULT_TYPEDEF_(0x80731006)
00176
00177
00178 #define E_NOTFOUND _HRESULT_TYPEDEF_(0x80731007)
00179
00180
00181 #define E_FILEOPEN _HRESULT_TYPEDEF_(0x80731008)
00182
00183
00184 #define E_VERIFY _HRESULT_TYPEDEF_(0x80731009)
00185
00186
00187 #define E_COMTHROW_TEST _HRESULT_TYPEDEF_(0x8073100A)
00188
00189
00190 #define E_COMMON_FIRST E_INVALID_USAGE
00191 #define E_COMMON_LAST E_COMTHROW_TEST
00192
00193
00194
00195
00196 #define E_LOCK_VIOLATION _HRESULT_TYPEDEF_(0x80732001)
00197
00198
00199 #define E_INVALID_LOCK_VALUE _HRESULT_TYPEDEF_(0x80732002)
00200
00201
00202 #define E_ATTRID _HRESULT_TYPEDEF_(0x80732003)
00203
00204
00205 #define E_METAID _HRESULT_TYPEDEF_(0x80732004)
00206
00207
00208 #define E_METAPROJECT _HRESULT_TYPEDEF_(0x80732005)
00209
00210
00211 #define E_REPOSITORY _HRESULT_TYPEDEF_(0x80732006)
00212
00213
00214 #define E_PROJECT_MISMATCH _HRESULT_TYPEDEF_(0x80732007)
00215
00216
00217 #define E_ZOMBIE _HRESULT_TYPEDEF_(0x80732008)
00218
00219
00220 #define E_VALTYPE _HRESULT_TYPEDEF_(0x80732009)
00221
00222
00223 #define E_TRANSACTION _HRESULT_TYPEDEF_(0x8073200A)
00224
00225
00226 #define E_OBJECTEXISTS _HRESULT_TYPEDEF_(0x8073200B)
00227
00228
00229 #define E_TERRITORY _HRESULT_TYPEDEF_(0x8073200C)
00230
00231
00232 #define E_NOTLOCKED _HRESULT_TYPEDEF_(0x8073200D)
00233
00234
00235 #define E_REPOSITORY_DATA _HRESULT_TYPEDEF_(0x8073200E)
00236
00237
00238 #define E_NONEMPTY_COLL _HRESULT_TYPEDEF_(0x8073200F)
00239
00240
00241 #define E_UNKNOWN_STORAGE _HRESULT_TYPEDEF_(0x80732010)
00242
00243
00244 #define E_BINFILE _HRESULT_TYPEDEF_(0x80732011)
00245
00246
00247 #define E_NAMEMISSING _HRESULT_TYPEDEF_(0x80732012)
00248
00249
00250 #define E_CORE_FIRST E_LOCK_VIOLATION
00251 #define E_CORE_LAST E_NAMEMISSING
00252
00253
00254
00255
00256 #define E_ATTVALTYPE _HRESULT_TYPEDEF_(0x80733001)
00257
00258
00259 #define E_META_NOTOPEN _HRESULT_TYPEDEF_(0x80733002)
00260
00261
00262 #define E_INVALID_PATH _HRESULT_TYPEDEF_(0x80733003)
00263
00264
00265 #define E_METAREF _HRESULT_TYPEDEF_(0x80733004)
00266
00267
00268 #define E_META_FIRST E_ATTVALTYPE
00269 #define E_META_LAST E_METAREF
00270
00271
00272
00273
00274 #define E_XMLPARSER _HRESULT_TYPEDEF_(0x80734001)
00275
00276
00277 #define E_INVALID_DTD _HRESULT_TYPEDEF_(0x80734002)
00278
00279
00280 #define E_INVALID_GUID _HRESULT_TYPEDEF_(0x80734003)
00281
00282
00283 #define E_INVALID_FILENAME _HRESULT_TYPEDEF_(0x80734004)
00284
00285
00286 #define E_INVALID_MGA _HRESULT_TYPEDEF_(0x80734005)
00287
00288
00289 #define E_INVALID_META _HRESULT_TYPEDEF_(0x80734006)
00290
00291
00292 #define E_TOOMANYPASSES _HRESULT_TYPEDEF_(0x80734007)
00293
00294
00295 #define E_INVALID_XML_LONG _HRESULT_TYPEDEF_(0x80734008)
00296
00297
00298 #define E_PARSER_FIRST E_INVALID_DTD
00299 #define E_PARSER_LAST E_INVALID_XML_LONG
00300
00301
00302 #define E_XSLT_XERCES_INIT _HRESULT_TYPEDEF_(0x80734009)
00303 #define E_XSLT_COMPILE_ERROR _HRESULT_TYPEDEF_(0x8073400A)
00304 #define E_XSLT_TRANSF_ERROR _HRESULT_TYPEDEF_(0x8073400B)
00305 #define E_XSLT_ERROR _HRESULT_TYPEDEF_(0x8073400C)
00306 #define E_XSLTFILESEL_USER_ABORTED _HRESULT_TYPEDEF_(0x8073400D)
00307
00308 #endif//MGA_COMMONERROR_H