diff options
Diffstat (limited to 'src/dutil/inc/dutil.h')
| -rw-r--r-- | src/dutil/inc/dutil.h | 83 |
1 files changed, 65 insertions, 18 deletions
diff --git a/src/dutil/inc/dutil.h b/src/dutil/inc/dutil.h index 3791dd5a..efaeb5a9 100644 --- a/src/dutil/inc/dutil.h +++ b/src/dutil/inc/dutil.h | |||
| @@ -20,13 +20,44 @@ typedef enum REPORT_LEVEL | |||
| 20 | REPORT_ERROR, // always gets reported, but can never be specified | 20 | REPORT_ERROR, // always gets reported, but can never be specified |
| 21 | } REPORT_LEVEL; | 21 | } REPORT_LEVEL; |
| 22 | 22 | ||
| 23 | typedef enum DUTIL_SOURCE | ||
| 24 | { | ||
| 25 | DUTIL_SOURCE_UNKNOWN, | ||
| 26 | |||
| 27 | DUTIL_SOURCE_EXTERNAL = 256, | ||
| 28 | } DUTIL_SOURCE; | ||
| 29 | |||
| 23 | // asserts and traces | 30 | // asserts and traces |
| 24 | typedef BOOL (DAPI *DUTIL_ASSERTDISPLAYFUNCTION)(__in_z LPCSTR sz); | 31 | typedef BOOL (DAPI *DUTIL_ASSERTDISPLAYFUNCTION)(__in_z LPCSTR sz); |
| 25 | 32 | ||
| 33 | typedef void (CALLBACK *DUTIL_CALLBACK_TRACEERROR)( | ||
| 34 | __in_z LPCSTR szFile, | ||
| 35 | __in int iLine, | ||
| 36 | __in REPORT_LEVEL rl, | ||
| 37 | __in UINT source, | ||
| 38 | __in HRESULT hr, | ||
| 39 | __in_z __format_string LPCSTR szFormat, | ||
| 40 | __in va_list args | ||
| 41 | ); | ||
| 42 | |||
| 26 | #ifdef __cplusplus | 43 | #ifdef __cplusplus |
| 27 | extern "C" { | 44 | extern "C" { |
| 28 | #endif | 45 | #endif |
| 29 | 46 | ||
| 47 | /******************************************************************** | ||
| 48 | DutilInitialize - initialize dutil. | ||
| 49 | |||
| 50 | *******************************************************************/ | ||
| 51 | HRESULT DAPI DutilInitialize( | ||
| 52 | __in_opt DUTIL_CALLBACK_TRACEERROR pfnTraceErrorCallback | ||
| 53 | ); | ||
| 54 | |||
| 55 | /******************************************************************** | ||
| 56 | DutilUninitialize - uninitialize dutil. | ||
| 57 | |||
| 58 | *******************************************************************/ | ||
| 59 | void DAPI DutilUninitialize(); | ||
| 60 | |||
| 30 | void DAPI Dutil_SetAssertModule(__in HMODULE hAssertModule); | 61 | void DAPI Dutil_SetAssertModule(__in HMODULE hAssertModule); |
| 31 | void DAPI Dutil_SetAssertDisplayFunction(__in DUTIL_ASSERTDISPLAYFUNCTION pfn); | 62 | void DAPI Dutil_SetAssertDisplayFunction(__in DUTIL_ASSERTDISPLAYFUNCTION pfn); |
| 32 | void DAPI Dutil_Assert(__in_z LPCSTR szFile, __in int iLine); | 63 | void DAPI Dutil_Assert(__in_z LPCSTR szFile, __in int iLine); |
| @@ -34,8 +65,9 @@ void DAPI Dutil_AssertSz(__in_z LPCSTR szFile, __in int iLine, __in_z LPCSTR szM | |||
| 34 | 65 | ||
| 35 | void DAPI Dutil_TraceSetLevel(__in REPORT_LEVEL ll, __in BOOL fTraceFilenames); | 66 | void DAPI Dutil_TraceSetLevel(__in REPORT_LEVEL ll, __in BOOL fTraceFilenames); |
| 36 | REPORT_LEVEL DAPI Dutil_TraceGetLevel(); | 67 | REPORT_LEVEL DAPI Dutil_TraceGetLevel(); |
| 37 | void __cdecl Dutil_Trace(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in_z __format_string LPCSTR szMessage, ...); | 68 | void DAPIV Dutil_Trace(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in_z __format_string LPCSTR szMessage, ...); |
| 38 | void __cdecl Dutil_TraceError(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in HRESULT hr, __in_z __format_string LPCSTR szMessage, ...); | 69 | void DAPIV Dutil_TraceError(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in HRESULT hr, __in_z __format_string LPCSTR szMessage, ...); |
| 70 | void DAPIV Dutil_TraceErrorSource(__in_z LPCSTR szFile, __in int iLine, __in REPORT_LEVEL rl, __in UINT source, __in HRESULT hr, __in_z __format_string LPCSTR szMessage, ...); | ||
| 39 | void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT hrError); | 71 | void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT hrError); |
| 40 | 72 | ||
| 41 | #ifdef __cplusplus | 73 | #ifdef __cplusplus |
| @@ -70,28 +102,43 @@ void DAPI Dutil_RootFailure(__in_z LPCSTR szFile, __in int iLine, __in HRESULT h | |||
| 70 | 102 | ||
| 71 | #endif // DEBUG | 103 | #endif // DEBUG |
| 72 | 104 | ||
| 73 | // ExitTrace can be overriden | 105 | // DUTIL_SOURCE_DEFAULT can be overriden |
| 74 | #ifndef ExitTrace | 106 | #ifndef DUTIL_SOURCE_DEFAULT |
| 75 | #define ExitTrace TraceError | 107 | #define DUTIL_SOURCE_DEFAULT DUTIL_SOURCE_UNKNOWN |
| 76 | #endif | 108 | #endif |
| 77 | 109 | ||
| 78 | // Exit macros | 110 | // Exit macros |
| 79 | #define ExitFunction() { goto LExit; } | 111 | #define ExitFunction() { goto LExit; } |
| 80 | #define ExitFunction1(x) { x; goto LExit; } | 112 | #define ExitFunction1(x) { x; goto LExit; } |
| 81 | 113 | ||
| 82 | #define ExitFunctionWithLastError(x) { x = HRESULT_FROM_WIN32(::GetLastError()); goto LExit; } | 114 | #define ExitFunctionWithLastError(x) { x = HRESULT_FROM_WIN32(::GetLastError()); goto LExit; } |
| 83 | 115 | ||
| 84 | #define ExitOnLastError(x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s, __VA_ARGS__); goto LExit; } } | 116 | #define ExitTraceSource(d, x, s, ...) { TraceError(x, s, __VA_ARGS__); (void)Dutil_TraceErrorSource(__FILE__, __LINE__, REPORT_ERROR, d, x, s, __VA_ARGS__); } |
| 85 | #define ExitOnLastErrorDebugTrace(x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s, __VA_ARGS__); goto LExit; } } | 117 | #define ExitTraceDebugSource(d, x, s, ...) { TraceErrorDebug(x, s, __VA_ARGS__); (void)Dutil_TraceErrorSource(__FILE__, __LINE__, REPORT_DEBUG, d, x, s, __VA_ARGS__); } |
| 86 | #define ExitWithLastError(x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s, __VA_ARGS__); goto LExit; } | 118 | |
| 87 | #define ExitOnFailure(x, s, ...) if (FAILED(x)) { ExitTrace(x, s, __VA_ARGS__); goto LExit; } | 119 | #define ExitOnLastErrorSource(d, x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } } |
| 88 | #define ExitOnRootFailure(x, s, ...) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s, __VA_ARGS__); goto LExit; } | 120 | #define ExitOnLastErrorDebugTraceSource(d, x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceDebugSource(d, x, s, __VA_ARGS__); goto LExit; } } |
| 89 | #define ExitOnFailureDebugTrace(x, s, ...) if (FAILED(x)) { TraceErrorDebug(x, s, __VA_ARGS__); goto LExit; } | 121 | #define ExitWithLastErrorSource(d, x, s, ...) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
| 90 | #define ExitOnNull(p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s, __VA_ARGS__); goto LExit; } | 122 | #define ExitOnFailureSource(d, x, s, ...) if (FAILED(x)) { ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
| 91 | #define ExitOnNullWithLastError(p, x, s, ...) if (NULL == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s, __VA_ARGS__); goto LExit; } | 123 | #define ExitOnRootFailureSource(d, x, s, ...) if (FAILED(x)) { Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
| 92 | #define ExitOnNullDebugTrace(p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); TraceErrorDebug(x, s, __VA_ARGS__); goto LExit; } | 124 | #define ExitOnFailureDebugTraceSource(d, x, s, ...) if (FAILED(x)) { ExitTraceDebugSource(d, x, s, __VA_ARGS__); goto LExit; } |
| 93 | #define ExitOnInvalidHandleWithLastError(p, x, s, ...) if (INVALID_HANDLE_VALUE == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s, __VA_ARGS__); goto LExit; } | 125 | #define ExitOnNullSource(d, p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
| 94 | #define ExitOnWin32Error(e, x, s, ...) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTrace(x, s, __VA_ARGS__); goto LExit; } | 126 | #define ExitOnNullWithLastErrorSource(d, p, x, s, ...) if (NULL == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } |
| 127 | #define ExitOnNullDebugTraceSource(d, p, x, e, s, ...) if (NULL == p) { x = e; Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceDebugSource(d, x, s, __VA_ARGS__); goto LExit; } | ||
| 128 | #define ExitOnInvalidHandleWithLastErrorSource(d, p, x, s, ...) if (INVALID_HANDLE_VALUE == p) { DWORD Dutil_er = ::GetLastError(); x = HRESULT_FROM_WIN32(Dutil_er); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | ||
| 129 | #define ExitOnWin32ErrorSource(d, e, x, s, ...) if (ERROR_SUCCESS != e) { x = HRESULT_FROM_WIN32(e); if (!FAILED(x)) { x = E_FAIL; } Dutil_RootFailure(__FILE__, __LINE__, x); ExitTraceSource(d, x, s, __VA_ARGS__); goto LExit; } | ||
| 130 | |||
| 131 | #define ExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
| 132 | #define ExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
| 133 | #define ExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
| 134 | #define ExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
| 135 | #define ExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
| 136 | #define ExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_DEFAULT, x, s, __VA_ARGS__) | ||
| 137 | #define ExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_DEFAULT, p, x, e, s, __VA_ARGS__) | ||
| 138 | #define ExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_DEFAULT, p, x, s, __VA_ARGS__) | ||
| 139 | #define ExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_DEFAULT, p, x, e, s, __VA_ARGS__) | ||
| 140 | #define ExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_DEFAULT, p, x, s, __VA_ARGS__) | ||
| 141 | #define ExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_DEFAULT, e, x, s, __VA_ARGS__) | ||
| 95 | 142 | ||
| 96 | // release macros | 143 | // release macros |
| 97 | #define ReleaseObject(x) if (x) { x->Release(); } | 144 | #define ReleaseObject(x) if (x) { x->Release(); } |
