diff options
Diffstat (limited to 'src/dutil/logutil.cpp')
-rw-r--r-- | src/dutil/logutil.cpp | 67 |
1 files changed, 41 insertions, 26 deletions
diff --git a/src/dutil/logutil.cpp b/src/dutil/logutil.cpp index 438cdbb8..35251274 100644 --- a/src/dutil/logutil.cpp +++ b/src/dutil/logutil.cpp | |||
@@ -2,6 +2,21 @@ | |||
2 | 2 | ||
3 | #include "precomp.h" | 3 | #include "precomp.h" |
4 | 4 | ||
5 | |||
6 | // Exit macros | ||
7 | #define LoguExitOnLastError(x, s, ...) ExitOnLastErrorSource(DUTIL_SOURCE_LOGUTIL, x, s, __VA_ARGS__) | ||
8 | #define LoguExitOnLastErrorDebugTrace(x, s, ...) ExitOnLastErrorDebugTraceSource(DUTIL_SOURCE_LOGUTIL, x, s, __VA_ARGS__) | ||
9 | #define LoguExitWithLastError(x, s, ...) ExitWithLastErrorSource(DUTIL_SOURCE_LOGUTIL, x, s, __VA_ARGS__) | ||
10 | #define LoguExitOnFailure(x, s, ...) ExitOnFailureSource(DUTIL_SOURCE_LOGUTIL, x, s, __VA_ARGS__) | ||
11 | #define LoguExitOnRootFailure(x, s, ...) ExitOnRootFailureSource(DUTIL_SOURCE_LOGUTIL, x, s, __VA_ARGS__) | ||
12 | #define LoguExitOnFailureDebugTrace(x, s, ...) ExitOnFailureDebugTraceSource(DUTIL_SOURCE_LOGUTIL, x, s, __VA_ARGS__) | ||
13 | #define LoguExitOnNull(p, x, e, s, ...) ExitOnNullSource(DUTIL_SOURCE_LOGUTIL, p, x, e, s, __VA_ARGS__) | ||
14 | #define LoguExitOnNullWithLastError(p, x, s, ...) ExitOnNullWithLastErrorSource(DUTIL_SOURCE_LOGUTIL, p, x, s, __VA_ARGS__) | ||
15 | #define LoguExitOnNullDebugTrace(p, x, e, s, ...) ExitOnNullDebugTraceSource(DUTIL_SOURCE_LOGUTIL, p, x, e, s, __VA_ARGS__) | ||
16 | #define LoguExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_LOGUTIL, p, x, s, __VA_ARGS__) | ||
17 | #define LoguExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_LOGUTIL, e, x, s, __VA_ARGS__) | ||
18 | #define LoguExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_LOGUTIL, g, x, s, __VA_ARGS__) | ||
19 | |||
5 | // globals | 20 | // globals |
6 | static HMODULE LogUtil_hModule = NULL; | 21 | static HMODULE LogUtil_hModule = NULL; |
7 | static BOOL LogUtil_fDisabled = FALSE; | 22 | static BOOL LogUtil_fDisabled = FALSE; |
@@ -110,23 +125,23 @@ extern "C" HRESULT DAPI LogOpen( | |||
110 | if (wzExt && *wzExt) | 125 | if (wzExt && *wzExt) |
111 | { | 126 | { |
112 | hr = PathCreateTimeBasedTempFile(wzDirectory, wzLog, wzPostfix, wzExt, &LogUtil_sczLogPath, &LogUtil_hLog); | 127 | hr = PathCreateTimeBasedTempFile(wzDirectory, wzLog, wzPostfix, wzExt, &LogUtil_sczLogPath, &LogUtil_hLog); |
113 | ExitOnFailure(hr, "Failed to create log based on current system time."); | 128 | LoguExitOnFailure(hr, "Failed to create log based on current system time."); |
114 | } | 129 | } |
115 | else | 130 | else |
116 | { | 131 | { |
117 | hr = PathConcat(wzDirectory, wzLog, &LogUtil_sczLogPath); | 132 | hr = PathConcat(wzDirectory, wzLog, &LogUtil_sczLogPath); |
118 | ExitOnFailure(hr, "Failed to combine the log path."); | 133 | LoguExitOnFailure(hr, "Failed to combine the log path."); |
119 | 134 | ||
120 | hr = PathGetDirectory(LogUtil_sczLogPath, &sczLogDirectory); | 135 | hr = PathGetDirectory(LogUtil_sczLogPath, &sczLogDirectory); |
121 | ExitOnFailure(hr, "Failed to get log directory."); | 136 | LoguExitOnFailure(hr, "Failed to get log directory."); |
122 | 137 | ||
123 | hr = DirEnsureExists(sczLogDirectory, NULL); | 138 | hr = DirEnsureExists(sczLogDirectory, NULL); |
124 | ExitOnFailure(hr, "Failed to ensure log file directory exists: %ls", sczLogDirectory); | 139 | LoguExitOnFailure(hr, "Failed to ensure log file directory exists: %ls", sczLogDirectory); |
125 | 140 | ||
126 | LogUtil_hLog = ::CreateFileW(LogUtil_sczLogPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, (fAppend) ? OPEN_ALWAYS : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | 141 | LogUtil_hLog = ::CreateFileW(LogUtil_sczLogPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, (fAppend) ? OPEN_ALWAYS : CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
127 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) | 142 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) |
128 | { | 143 | { |
129 | ExitOnLastError(hr, "failed to create log file: %ls", LogUtil_sczLogPath); | 144 | LoguExitOnLastError(hr, "failed to create log file: %ls", LogUtil_sczLogPath); |
130 | } | 145 | } |
131 | 146 | ||
132 | if (fAppend) | 147 | if (fAppend) |
@@ -152,7 +167,7 @@ extern "C" HRESULT DAPI LogOpen( | |||
152 | if (psczLogPath) | 167 | if (psczLogPath) |
153 | { | 168 | { |
154 | hr = StrAllocString(psczLogPath, LogUtil_sczLogPath, 0); | 169 | hr = StrAllocString(psczLogPath, LogUtil_sczLogPath, 0); |
155 | ExitOnFailure(hr, "Failed to copy log path."); | 170 | LoguExitOnFailure(hr, "Failed to copy log path."); |
156 | } | 171 | } |
157 | 172 | ||
158 | LExit: | 173 | LExit: |
@@ -217,15 +232,15 @@ HRESULT DAPI LogRename( | |||
217 | ReleaseFileHandle(LogUtil_hLog); | 232 | ReleaseFileHandle(LogUtil_hLog); |
218 | 233 | ||
219 | hr = FileEnsureMove(LogUtil_sczLogPath, wzNewPath, TRUE, TRUE); | 234 | hr = FileEnsureMove(LogUtil_sczLogPath, wzNewPath, TRUE, TRUE); |
220 | ExitOnFailure(hr, "Failed to move logfile to new location: %ls", wzNewPath); | 235 | LoguExitOnFailure(hr, "Failed to move logfile to new location: %ls", wzNewPath); |
221 | 236 | ||
222 | hr = StrAllocString(&LogUtil_sczLogPath, wzNewPath, 0); | 237 | hr = StrAllocString(&LogUtil_sczLogPath, wzNewPath, 0); |
223 | ExitOnFailure(hr, "Failed to store new logfile path: %ls", wzNewPath); | 238 | LoguExitOnFailure(hr, "Failed to store new logfile path: %ls", wzNewPath); |
224 | 239 | ||
225 | LogUtil_hLog = ::CreateFileW(LogUtil_sczLogPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); | 240 | LogUtil_hLog = ::CreateFileW(LogUtil_sczLogPath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); |
226 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) | 241 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) |
227 | { | 242 | { |
228 | ExitOnLastError(hr, "failed to create log file: %ls", LogUtil_sczLogPath); | 243 | LoguExitOnLastError(hr, "failed to create log file: %ls", LogUtil_sczLogPath); |
229 | } | 244 | } |
230 | 245 | ||
231 | // Enable "append" mode by moving file pointer to the end | 246 | // Enable "append" mode by moving file pointer to the end |
@@ -307,7 +322,7 @@ HRESULT DAPI LogSetSpecialParams( | |||
307 | else | 322 | else |
308 | { | 323 | { |
309 | hr = StrAllocConcat(&LogUtil_sczSpecialBeginLine, wzSpecialBeginLine, 0); | 324 | hr = StrAllocConcat(&LogUtil_sczSpecialBeginLine, wzSpecialBeginLine, 0); |
310 | ExitOnFailure(hr, "Failed to allocate copy of special beginline string"); | 325 | LoguExitOnFailure(hr, "Failed to allocate copy of special beginline string"); |
311 | } | 326 | } |
312 | 327 | ||
313 | // Handle special string to be appended to every time stamp | 328 | // Handle special string to be appended to every time stamp |
@@ -318,7 +333,7 @@ HRESULT DAPI LogSetSpecialParams( | |||
318 | else | 333 | else |
319 | { | 334 | { |
320 | hr = StrAllocConcat(&LogUtil_sczSpecialAfterTimeStamp, wzSpecialAfterTimeStamp, 0); | 335 | hr = StrAllocConcat(&LogUtil_sczSpecialAfterTimeStamp, wzSpecialAfterTimeStamp, 0); |
321 | ExitOnFailure(hr, "Failed to allocate copy of special post-timestamp string"); | 336 | LoguExitOnFailure(hr, "Failed to allocate copy of special post-timestamp string"); |
322 | } | 337 | } |
323 | 338 | ||
324 | // Handle special string to be appended before every full line | 339 | // Handle special string to be appended before every full line |
@@ -329,7 +344,7 @@ HRESULT DAPI LogSetSpecialParams( | |||
329 | else | 344 | else |
330 | { | 345 | { |
331 | hr = StrAllocConcat(&LogUtil_sczSpecialEndLine, wzSpecialEndLine, 0); | 346 | hr = StrAllocConcat(&LogUtil_sczSpecialEndLine, wzSpecialEndLine, 0); |
332 | ExitOnFailure(hr, "Failed to allocate copy of special endline string"); | 347 | LoguExitOnFailure(hr, "Failed to allocate copy of special endline string"); |
333 | } | 348 | } |
334 | 349 | ||
335 | LExit: | 350 | LExit: |
@@ -597,14 +612,14 @@ extern "C" HRESULT DAPI LogErrorStringArgs( | |||
597 | LPWSTR sczMessage = NULL; | 612 | LPWSTR sczMessage = NULL; |
598 | 613 | ||
599 | hr = StrAllocStringAnsi(&sczFormat, szFormat, 0, CP_ACP); | 614 | hr = StrAllocStringAnsi(&sczFormat, szFormat, 0, CP_ACP); |
600 | ExitOnFailure(hr, "Failed to convert format string to wide character string"); | 615 | LoguExitOnFailure(hr, "Failed to convert format string to wide character string"); |
601 | 616 | ||
602 | // format the string as a unicode string - this is necessary to be able to include | 617 | // format the string as a unicode string - this is necessary to be able to include |
603 | // international characters in our output string. This does have the counterintuitive effect | 618 | // international characters in our output string. This does have the counterintuitive effect |
604 | // that the caller's "%s" is interpreted differently | 619 | // that the caller's "%s" is interpreted differently |
605 | // (so callers should use %hs for LPSTR and %ls for LPWSTR) | 620 | // (so callers should use %hs for LPSTR and %ls for LPWSTR) |
606 | hr = StrAllocFormattedArgs(&sczMessage, sczFormat, args); | 621 | hr = StrAllocFormattedArgs(&sczMessage, sczFormat, args); |
607 | ExitOnFailure(hr, "Failed to format error message: \"%ls\"", sczFormat); | 622 | LoguExitOnFailure(hr, "Failed to format error message: \"%ls\"", sczFormat); |
608 | 623 | ||
609 | hr = LogStringLine(REPORT_ERROR, "Error 0x%x: %ls", hrError, sczMessage); | 624 | hr = LogStringLine(REPORT_ERROR, "Error 0x%x: %ls", hrError, sczMessage); |
610 | 625 | ||
@@ -636,14 +651,14 @@ extern "C" HRESULT DAPI LogErrorIdModule( | |||
636 | WORD cStrings = 1; // guaranteed wzError is in the list | 651 | WORD cStrings = 1; // guaranteed wzError is in the list |
637 | 652 | ||
638 | hr = ::StringCchPrintfW(wzError, countof(wzError), L"0x%08x", hrError); | 653 | hr = ::StringCchPrintfW(wzError, countof(wzError), L"0x%08x", hrError); |
639 | ExitOnFailure(hr, "failed to format error code: \"0%08x\"", hrError); | 654 | LoguExitOnFailure(hr, "failed to format error code: \"0%08x\"", hrError); |
640 | 655 | ||
641 | cStrings += wzString1 ? 1 : 0; | 656 | cStrings += wzString1 ? 1 : 0; |
642 | cStrings += wzString2 ? 1 : 0; | 657 | cStrings += wzString2 ? 1 : 0; |
643 | cStrings += wzString3 ? 1 : 0; | 658 | cStrings += wzString3 ? 1 : 0; |
644 | 659 | ||
645 | hr = LogIdModule(REPORT_ERROR, dwLogId, hModule, wzError, wzString1, wzString2, wzString3); | 660 | hr = LogIdModule(REPORT_ERROR, dwLogId, hModule, wzError, wzString1, wzString2, wzString3); |
646 | ExitOnFailure(hr, "Failed to log id module."); | 661 | LoguExitOnFailure(hr, "Failed to log id module."); |
647 | 662 | ||
648 | LExit: | 663 | LExit: |
649 | return hr; | 664 | return hr; |
@@ -771,7 +786,7 @@ extern "C" HRESULT LogStringWorkRaw( | |||
771 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) | 786 | if (INVALID_HANDLE_VALUE == LogUtil_hLog) |
772 | { | 787 | { |
773 | hr = StrAnsiAllocConcat(&LogUtil_sczPreInitBuffer, szLogData, 0); | 788 | hr = StrAnsiAllocConcat(&LogUtil_sczPreInitBuffer, szLogData, 0); |
774 | ExitOnFailure(hr, "Failed to concatenate string to pre-init buffer"); | 789 | LoguExitOnFailure(hr, "Failed to concatenate string to pre-init buffer"); |
775 | 790 | ||
776 | ExitFunction1(hr = S_OK); | 791 | ExitFunction1(hr = S_OK); |
777 | } | 792 | } |
@@ -781,7 +796,7 @@ extern "C" HRESULT LogStringWorkRaw( | |||
781 | { | 796 | { |
782 | if (!::WriteFile(LogUtil_hLog, reinterpret_cast<const BYTE*>(szLogData) + cbTotal, cbLogData - cbTotal, &cbWrote, NULL)) | 797 | if (!::WriteFile(LogUtil_hLog, reinterpret_cast<const BYTE*>(szLogData) + cbTotal, cbLogData - cbTotal, &cbWrote, NULL)) |
783 | { | 798 | { |
784 | ExitOnLastError(hr, "Failed to write output to log: %ls - %ls", LogUtil_sczLogPath, szLogData); | 799 | LoguExitOnLastError(hr, "Failed to write output to log: %ls - %hs", LogUtil_sczLogPath, szLogData); |
785 | } | 800 | } |
786 | 801 | ||
787 | cbTotal += cbWrote; | 802 | cbTotal += cbWrote; |
@@ -816,7 +831,7 @@ static HRESULT LogIdWork( | |||
816 | 831 | ||
817 | if (0 == cch) | 832 | if (0 == cch) |
818 | { | 833 | { |
819 | ExitOnLastError(hr, "failed to log id: %d", dwLogId); | 834 | LoguExitOnLastError(hr, "failed to log id: %d", dwLogId); |
820 | } | 835 | } |
821 | 836 | ||
822 | if (2 <= cch && L'\r' == pwz[cch-2] && L'\n' == pwz[cch-1]) | 837 | if (2 <= cch && L'\r' == pwz[cch-2] && L'\n' == pwz[cch-1]) |
@@ -850,14 +865,14 @@ static HRESULT LogStringWorkArgs( | |||
850 | LPWSTR sczMessage = NULL; | 865 | LPWSTR sczMessage = NULL; |
851 | 866 | ||
852 | hr = StrAllocStringAnsi(&sczFormat, szFormat, 0, CP_ACP); | 867 | hr = StrAllocStringAnsi(&sczFormat, szFormat, 0, CP_ACP); |
853 | ExitOnFailure(hr, "Failed to convert format string to wide character string"); | 868 | LoguExitOnFailure(hr, "Failed to convert format string to wide character string"); |
854 | 869 | ||
855 | // format the string as a unicode string | 870 | // format the string as a unicode string |
856 | hr = StrAllocFormattedArgs(&sczMessage, sczFormat, args); | 871 | hr = StrAllocFormattedArgs(&sczMessage, sczFormat, args); |
857 | ExitOnFailure(hr, "Failed to format message: \"%ls\"", sczFormat); | 872 | LoguExitOnFailure(hr, "Failed to format message: \"%ls\"", sczFormat); |
858 | 873 | ||
859 | hr = LogStringWork(rl, 0, sczMessage, fLOGUTIL_NEWLINE); | 874 | hr = LogStringWork(rl, 0, sczMessage, fLOGUTIL_NEWLINE); |
860 | ExitOnFailure(hr, "Failed to write formatted string to log:%ls", sczMessage); | 875 | LoguExitOnFailure(hr, "Failed to write formatted string to log:%ls", sczMessage); |
861 | 876 | ||
862 | LExit: | 877 | LExit: |
863 | ReleaseStr(sczFormat); | 878 | ReleaseStr(sczFormat); |
@@ -909,24 +924,24 @@ static HRESULT LogStringWork( | |||
909 | hr = StrAllocFormatted(&scz, L"%ls[%04X:%04X][%04hu-%02hu-%02huT%02hu:%02hu:%02hu]%hs%03d:%ls %ls%ls", LogUtil_sczSpecialBeginLine ? LogUtil_sczSpecialBeginLine : L"", | 924 | hr = StrAllocFormatted(&scz, L"%ls[%04X:%04X][%04hu-%02hu-%02huT%02hu:%02hu:%02hu]%hs%03d:%ls %ls%ls", LogUtil_sczSpecialBeginLine ? LogUtil_sczSpecialBeginLine : L"", |
910 | dwProcessId, dwThreadId, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, szType, dwId, | 925 | dwProcessId, dwThreadId, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, szType, dwId, |
911 | LogUtil_sczSpecialAfterTimeStamp ? LogUtil_sczSpecialAfterTimeStamp : L"", sczString, LogUtil_sczSpecialEndLine ? LogUtil_sczSpecialEndLine : L"\r\n"); | 926 | LogUtil_sczSpecialAfterTimeStamp ? LogUtil_sczSpecialAfterTimeStamp : L"", sczString, LogUtil_sczSpecialEndLine ? LogUtil_sczSpecialEndLine : L"\r\n"); |
912 | ExitOnFailure(hr, "Failed to format line prefix."); | 927 | LoguExitOnFailure(hr, "Failed to format line prefix."); |
913 | } | 928 | } |
914 | 929 | ||
915 | wzLogData = scz ? scz : sczString; | 930 | wzLogData = scz ? scz : sczString; |
916 | 931 | ||
917 | // Convert to UTF-8 before writing out to the log file | 932 | // Convert to UTF-8 before writing out to the log file |
918 | hr = StrAnsiAllocString(&sczMultiByte, wzLogData, 0, CP_UTF8); | 933 | hr = StrAnsiAllocString(&sczMultiByte, wzLogData, 0, CP_UTF8); |
919 | ExitOnFailure(hr, "Failed to convert log string to UTF-8"); | 934 | LoguExitOnFailure(hr, "Failed to convert log string to UTF-8"); |
920 | 935 | ||
921 | if (s_vpfLogStringWorkRaw) | 936 | if (s_vpfLogStringWorkRaw) |
922 | { | 937 | { |
923 | hr = s_vpfLogStringWorkRaw(sczMultiByte, s_vpvLogStringWorkRawContext); | 938 | hr = s_vpfLogStringWorkRaw(sczMultiByte, s_vpvLogStringWorkRawContext); |
924 | ExitOnFailure(hr, "Failed to write string to log using redirected function: %ls", sczString); | 939 | LoguExitOnFailure(hr, "Failed to write string to log using redirected function: %ls", sczString); |
925 | } | 940 | } |
926 | else | 941 | else |
927 | { | 942 | { |
928 | hr = LogStringWorkRaw(sczMultiByte); | 943 | hr = LogStringWorkRaw(sczMultiByte); |
929 | ExitOnFailure(hr, "Failed to write string to log using default function: %ls", sczString); | 944 | LoguExitOnFailure(hr, "Failed to write string to log using default function: %ls", sczString); |
930 | } | 945 | } |
931 | 946 | ||
932 | LExit: | 947 | LExit: |