| // © 2019 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| |
| #include "unicode/utypes.h" |
| |
| #if U_ENABLE_TRACING |
| |
| #include "restrace.h" |
| #include "charstr.h" |
| #include "cstring.h" |
| #include "utracimp.h" |
| #include "uresimp.h" |
| #include "uassert.h" |
| #include "util.h" |
| |
| U_NAMESPACE_BEGIN |
| |
| ResourceTracer::~ResourceTracer() = default; |
| |
| void ResourceTracer::trace(const char* resType) const { |
| #if U_ENABLE_RESOURCE_TRACING |
| U_ASSERT(fResB || fParent); |
| UTRACE_ENTRY(UTRACE_UDATA_RESOURCE); |
| UErrorCode status = U_ZERO_ERROR; |
| |
| CharString filePath; |
| getFilePath(filePath, status); |
| |
| CharString resPath; |
| getResPath(resPath, status); |
| |
| // The longest type ("intvector") is 9 chars |
| const char kSpaces[] = " "; |
| CharString format; |
| format.append(kSpaces, sizeof(kSpaces) - 1 - uprv_strlen(resType), status); |
| format.append("(%s) %s @ %s", status); |
| |
| UTRACE_DATA3(UTRACE_VERBOSE, |
| format.data(), |
| resType, |
| filePath.data(), |
| resPath.data()); |
| UTRACE_EXIT_STATUS(status); |
| #endif // U_ENABLE_RESOURCE_TRACING |
| } |
| |
| void ResourceTracer::traceOpen() const { |
| #if U_ENABLE_RESOURCE_TRACING |
| U_ASSERT(fResB); |
| UTRACE_ENTRY(UTRACE_UDATA_BUNDLE); |
| UErrorCode status = U_ZERO_ERROR; |
| |
| CharString filePath; |
| UTRACE_DATA1(UTRACE_VERBOSE, "%s", getFilePath(filePath, status).data()); |
| UTRACE_EXIT_STATUS(status); |
| #endif // U_ENABLE_RESOURCE_TRACING |
| } |
| |
| CharString& ResourceTracer::getFilePath(CharString& output, UErrorCode& status) const { |
| if (fResB) { |
| output.append(fResB->fData->fPath, status); |
| output.append('/', status); |
| output.append(fResB->fData->fName, status); |
| output.append(".res", status); |
| } else { |
| fParent->getFilePath(output, status); |
| } |
| return output; |
| } |
| |
| CharString& ResourceTracer::getResPath(CharString& output, UErrorCode& status) const { |
| if (fResB) { |
| output.append('/', status); |
| output.append(fResB->fResPath, status); |
| // removing the trailing / |
| U_ASSERT(output[output.length()-1] == '/'); |
| output.truncate(output.length()-1); |
| } else { |
| fParent->getResPath(output, status); |
| } |
| if (fKey) { |
| output.append('/', status); |
| output.append(fKey, status); |
| } |
| if (fIndex != -1) { |
| output.append('[', status); |
| UnicodeString indexString; |
| ICU_Utility::appendNumber(indexString, fIndex); |
| output.appendInvariantChars(indexString, status); |
| output.append(']', status); |
| } |
| return output; |
| } |
| |
| void FileTracer::traceOpen(const char* path, const char* type, const char* name) { |
| if (uprv_strcmp(type, "res") == 0) { |
| traceOpenResFile(path, name); |
| } else { |
| traceOpenDataFile(path, type, name); |
| } |
| } |
| |
| void FileTracer::traceOpenDataFile(const char* path, const char* type, const char* name) { |
| UTRACE_ENTRY(UTRACE_UDATA_DATA_FILE); |
| UErrorCode status = U_ZERO_ERROR; |
| |
| CharString filePath; |
| filePath.append(path, status); |
| filePath.append('/', status); |
| filePath.append(name, status); |
| filePath.append('.', status); |
| filePath.append(type, status); |
| |
| UTRACE_DATA1(UTRACE_VERBOSE, "%s", filePath.data()); |
| UTRACE_EXIT_STATUS(status); |
| } |
| |
| void FileTracer::traceOpenResFile(const char* path, const char* name) { |
| #if U_ENABLE_RESOURCE_TRACING |
| UTRACE_ENTRY(UTRACE_UDATA_RES_FILE); |
| UErrorCode status = U_ZERO_ERROR; |
| |
| CharString filePath; |
| filePath.append(path, status); |
| filePath.append('/', status); |
| filePath.append(name, status); |
| filePath.append(".res", status); |
| |
| UTRACE_DATA1(UTRACE_VERBOSE, "%s", filePath.data()); |
| UTRACE_EXIT_STATUS(status); |
| #endif // U_ENABLE_RESOURCE_TRACING |
| } |
| |
| U_NAMESPACE_END |
| |
| #endif // U_ENABLE_TRACING |