1/*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef OHOS_WM_INCLUDE_WINDOW_MANAGER_HILOG_H
17#define OHOS_WM_INCLUDE_WINDOW_MANAGER_HILOG_H
18
19#include "hilog/log.h"
20#include <unordered_map>
21namespace OHOS {
22namespace Rosen {
23static constexpr unsigned int HILOG_DOMAIN_WINDOW = 0xD004200;
24static constexpr unsigned int HILOG_DOMAIN_DISPLAY = 0xD004201;
25
26#define PRINT_WLOG(level, ...) HILOG_IMPL(LABEL.type, level, LABEL.domain, LABEL.tag, ##__VA_ARGS__)
27
28#define WLOGD(fmt, ...) PRINT_WLOG(LOG_DEBUG, "(%{public}d)" fmt, __LINE__, ##__VA_ARGS__)
29#define WLOGI(fmt, ...) PRINT_WLOG(LOG_INFO, "(%{public}d)" fmt, __LINE__, ##__VA_ARGS__)
30#define WLOGW(fmt, ...) PRINT_WLOG(LOG_WARN, "(%{public}d)" fmt, __LINE__, ##__VA_ARGS__)
31#define WLOGE(fmt, ...) PRINT_WLOG(LOG_ERROR, "(%{public}d)" fmt, __LINE__, ##__VA_ARGS__)
32
33#define C_W_FUNC __func__
34
35#define WLOGFD(fmt, ...) WLOGD("%{public}s: " fmt, C_W_FUNC, ##__VA_ARGS__)
36#define WLOGFI(fmt, ...) WLOGI("%{public}s: " fmt, C_W_FUNC, ##__VA_ARGS__)
37#define WLOGFW(fmt, ...) WLOGW("%{public}s: " fmt, C_W_FUNC, ##__VA_ARGS__)
38#define WLOGFE(fmt, ...) WLOGE("%{public}s: " fmt, C_W_FUNC, ##__VA_ARGS__)
39
40enum class WmsLogTag : uint8_t {
41    DEFAULT = 0,               // C04200
42    DMS,                       // C04201
43    WMS_MAIN,                  // C04202
44    WMS_SUB,                   // C04203
45    WMS_SCB,                   // C04204
46    WMS_DIALOG,                // C04205
47    WMS_SYSTEM,                // C04206
48    WMS_FOCUS,                 // C04207
49    WMS_LAYOUT,                // C04208
50    WMS_IMMS,                  // C04209
51    WMS_LIFE,                  // C0420A
52    WMS_KEYBOARD,              // C0420B
53    WMS_EVENT,                 // C0420C
54    WMS_UIEXT,                 // C0420D
55    WMS_PIP,                   // C0420E
56    WMS_RECOVER,               // C0420F
57    WMS_MULTI_USER,            // C04210
58    WMS_TOAST,                 // C04211
59    WMS_MULTI_WINDOW,          // C04212
60    WMS_INPUT_KEY_FLOW,        // C04213
61    WMS_PIPELINE,              // C04214
62    WMS_HIERARCHY,             // C04215
63    END = 256,                 // Last one, do not use
64};
65
66inline const std::unordered_map<WmsLogTag, const char *> DOMAIN_CONTENTS_MAP = {
67    { WmsLogTag::DEFAULT, "WMS" },
68    { WmsLogTag::DMS, "DMS" },
69    { WmsLogTag::WMS_MAIN, "WMSMain" },
70    { WmsLogTag::WMS_SUB, "WMSSub" },
71    { WmsLogTag::WMS_SCB, "WMSScb" },
72    { WmsLogTag::WMS_DIALOG, "WMSDialog" },
73    { WmsLogTag::WMS_SYSTEM, "WMSSystem" },
74    { WmsLogTag::WMS_FOCUS, "WMSFocus" },
75    { WmsLogTag::WMS_LAYOUT, "WMSLayout" },
76    { WmsLogTag::WMS_IMMS, "WMSImms" },
77    { WmsLogTag::WMS_LIFE, "WMSLife" },
78    { WmsLogTag::WMS_KEYBOARD, "WMSKeyboard" },
79    { WmsLogTag::WMS_EVENT, "WMSEvent" },
80    { WmsLogTag::WMS_UIEXT, "WMSUiext" },
81    { WmsLogTag::WMS_PIP, "WMSPiP" },
82    { WmsLogTag::WMS_RECOVER, "WMSRecover" },
83    { WmsLogTag::WMS_MULTI_USER, "WMSMultiUser" },
84    { WmsLogTag::WMS_TOAST, "WMSToast" },
85    { WmsLogTag::WMS_MULTI_WINDOW, "WMSMultiWindow" },
86    { WmsLogTag::WMS_INPUT_KEY_FLOW, "InputKeyFlow" },
87    { WmsLogTag::WMS_PIPELINE, "WMSPipeLine" },
88    { WmsLogTag::WMS_HIERARCHY, "WMSHierarchy" },
89};
90#ifdef IS_RELEASE_VERSION
91#define WMS_FILE_NAME ""
92#else
93#define WMS_FILE_NAME (__builtin_strrchr(__FILE_NAME__, '/') ?   \
94                       __builtin_strrchr(__FILE_NAME__, '/') + 1 : __FILE_NAME__)
95#endif
96
97#define FMT_PREFIX "[%{public}s] %{public}s: "
98
99#define FMT_PREFIX_NO_FUNC "[%{public}s]: "
100
101#define PRINT_TLOG(level, tag, ...)                                                                     \
102    do {                                                                                                \
103        uint32_t hilogDomain = HILOG_DOMAIN_WINDOW + static_cast<uint32_t>(tag);                        \
104        const char *domainContent = DOMAIN_CONTENTS_MAP.count(tag) ? DOMAIN_CONTENTS_MAP.at(tag) : "";  \
105        HILOG_IMPL(LOG_CORE, level, hilogDomain, domainContent, ##__VA_ARGS__);                         \
106    } while (0)
107
108#define TLOGD(tag, fmt, ...) \
109PRINT_TLOG(LOG_DEBUG, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, ##__VA_ARGS__)
110#define TLOGI(tag, fmt, ...) \
111PRINT_TLOG(LOG_INFO, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, ##__VA_ARGS__)
112#define TLOGW(tag, fmt, ...) \
113PRINT_TLOG(LOG_WARN, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, ##__VA_ARGS__)
114#define TLOGE(tag, fmt, ...) \
115PRINT_TLOG(LOG_ERROR, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, ##__VA_ARGS__)
116
117/*
118 * There is no function name built in TLOGN log micros. Choose suitable log micros when needed.
119 */
120#define TLOGND(tag, fmt, ...) \
121PRINT_TLOG(LOG_DEBUG, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
122#define TLOGNI(tag, fmt, ...) \
123PRINT_TLOG(LOG_INFO, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
124#define TLOGNW(tag, fmt, ...) \
125PRINT_TLOG(LOG_WARN, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
126#define TLOGNE(tag, fmt, ...) \
127PRINT_TLOG(LOG_ERROR, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
128
129} // namespace OHOS
130}
131#endif // FRAMEWORKS_WM_INCLUDE_WINDOW_MANAGER_HILOG_H
132