// © 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 { 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); } void ResourceTracer::traceOpen() const { 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); } 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) { 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); } U_NAMESPACE_END #endif // U_ENABLE_TRACING