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(); } |