tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

restrace.cpp (3793B)


      1 // © 2019 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 
      4 #include "unicode/utypes.h"
      5 
      6 #if U_ENABLE_TRACING
      7 
      8 #include "restrace.h"
      9 #include "charstr.h"
     10 #include "cstring.h"
     11 #include "utracimp.h"
     12 #include "uresimp.h"
     13 #include "uassert.h"
     14 #include "util.h"
     15 
     16 U_NAMESPACE_BEGIN
     17 
     18 ResourceTracer::~ResourceTracer() = default;
     19 
     20 void ResourceTracer::trace(const char* resType) const {
     21    U_ASSERT(fResB || fParent);
     22    UTRACE_ENTRY(UTRACE_UDATA_RESOURCE);
     23    UErrorCode status = U_ZERO_ERROR;
     24 
     25    CharString filePath;
     26    getFilePath(filePath, status);
     27 
     28    CharString resPath;
     29    getResPath(resPath, status);
     30 
     31    // The longest type ("intvector") is 9 chars
     32    const char kSpaces[] = "         ";
     33    CharString format;
     34    format.append(kSpaces, sizeof(kSpaces) - 1 - uprv_strlen(resType), status);
     35    format.append("(%s) %s @ %s", status);
     36 
     37    UTRACE_DATA3(UTRACE_VERBOSE,
     38        format.data(),
     39        resType,
     40        filePath.data(),
     41        resPath.data());
     42    UTRACE_EXIT_STATUS(status);
     43 }
     44 
     45 void ResourceTracer::traceOpen() const {
     46    U_ASSERT(fResB);
     47    UTRACE_ENTRY(UTRACE_UDATA_BUNDLE);
     48    UErrorCode status = U_ZERO_ERROR;
     49 
     50    CharString filePath;
     51    UTRACE_DATA1(UTRACE_VERBOSE, "%s", getFilePath(filePath, status).data());
     52    UTRACE_EXIT_STATUS(status);
     53 }
     54 
     55 CharString& ResourceTracer::getFilePath(CharString& output, UErrorCode& status) const {
     56    if (fResB) {
     57        // Note: if you get a segfault around here, check that ResourceTable and
     58        // ResourceArray instances outlive ResourceValue instances referring to
     59        // their contents:
     60        output.append(fResB->fData->fPath, status);
     61        output.append('/', status);
     62        output.append(fResB->fData->fName, status);
     63        output.append(".res", status);
     64    } else {
     65        fParent->getFilePath(output, status);
     66    }
     67    return output;
     68 }
     69 
     70 CharString& ResourceTracer::getResPath(CharString& output, UErrorCode& status) const {
     71    if (fResB) {
     72        output.append('/', status);
     73        output.append(fResB->fResPath, status);
     74        // removing the trailing /
     75        U_ASSERT(output[output.length()-1] == '/');
     76        output.truncate(output.length()-1);
     77    } else {
     78        fParent->getResPath(output, status);
     79    }
     80    if (fKey) {
     81        output.append('/', status);
     82        output.append(fKey, status);
     83    }
     84    if (fIndex != -1) {
     85        output.append('[', status);
     86        UnicodeString indexString;
     87        ICU_Utility::appendNumber(indexString, fIndex);
     88        output.appendInvariantChars(indexString, status);
     89        output.append(']', status);
     90    }
     91    return output;
     92 }
     93 
     94 void FileTracer::traceOpen(const char* path, const char* type, const char* name) {
     95    if (uprv_strcmp(type, "res") == 0) {
     96        traceOpenResFile(path, name);
     97    } else {
     98        traceOpenDataFile(path, type, name);
     99    }
    100 }
    101 
    102 void FileTracer::traceOpenDataFile(const char* path, const char* type, const char* name) {
    103    UTRACE_ENTRY(UTRACE_UDATA_DATA_FILE);
    104    UErrorCode status = U_ZERO_ERROR;
    105 
    106    CharString filePath;
    107    filePath.append(path, status);
    108    filePath.append('/', status);
    109    filePath.append(name, status);
    110    filePath.append('.', status);
    111    filePath.append(type, status);
    112 
    113    UTRACE_DATA1(UTRACE_VERBOSE, "%s", filePath.data());
    114    UTRACE_EXIT_STATUS(status);
    115 }
    116 
    117 void FileTracer::traceOpenResFile(const char* path, const char* name) {
    118    UTRACE_ENTRY(UTRACE_UDATA_RES_FILE);
    119    UErrorCode status = U_ZERO_ERROR;
    120 
    121    CharString filePath;
    122    filePath.append(path, status);
    123    filePath.append('/', status);
    124    filePath.append(name, status);
    125    filePath.append(".res", status);
    126 
    127    UTRACE_DATA1(UTRACE_VERBOSE, "%s", filePath.data());
    128    UTRACE_EXIT_STATUS(status);
    129 }
    130 
    131 U_NAMESPACE_END
    132 
    133 #endif // U_ENABLE_TRACING