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>
21 namespace OHOS {
22 namespace Rosen {
23 static constexpr unsigned int HILOG_DOMAIN_WINDOW = 0xD004200;
24 static 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 
40 enum 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     WMS_PATTERN,               // C04216
64     WMS_ATTRIBUTE,             // C04217
65     WMS_PC,                    // C04218
66     WMS_DECOR,                 // C04219
67     WMS_LAYOUT_PC,             // C0421A
68     WMS_STARTUP_PAGE,          // C0421B
69     WMS_COMPAT,                // C0421C
70     END = 256,                 // Last one, do not use
71 };
72 
73 inline const std::unordered_map<WmsLogTag, const char *> DOMAIN_CONTENTS_MAP = {
74     { WmsLogTag::DEFAULT, "WMS" },
75     { WmsLogTag::DMS, "DMS" },
76     { WmsLogTag::WMS_MAIN, "WMSMain" },
77     { WmsLogTag::WMS_SUB, "WMSSub" },
78     { WmsLogTag::WMS_SCB, "WMSScb" },
79     { WmsLogTag::WMS_DIALOG, "WMSDialog" },
80     { WmsLogTag::WMS_SYSTEM, "WMSSystem" },
81     { WmsLogTag::WMS_FOCUS, "WMSFocus" },
82     { WmsLogTag::WMS_LAYOUT, "WMSLayout" },
83     { WmsLogTag::WMS_IMMS, "WMSImms" },
84     { WmsLogTag::WMS_LIFE, "WMSLife" },
85     { WmsLogTag::WMS_KEYBOARD, "WMSKeyboard" },
86     { WmsLogTag::WMS_EVENT, "WMSEvent" },
87     { WmsLogTag::WMS_UIEXT, "WMSUiext" },
88     { WmsLogTag::WMS_PIP, "WMSPiP" },
89     { WmsLogTag::WMS_RECOVER, "WMSRecover" },
90     { WmsLogTag::WMS_MULTI_USER, "WMSMultiUser" },
91     { WmsLogTag::WMS_TOAST, "WMSToast" },
92     { WmsLogTag::WMS_MULTI_WINDOW, "WMSMultiWindow" },
93     { WmsLogTag::WMS_INPUT_KEY_FLOW, "InputKeyFlow" },
94     { WmsLogTag::WMS_PIPELINE, "WMSPipeLine" },
95     { WmsLogTag::WMS_HIERARCHY, "WMSHierarchy" },
96     { WmsLogTag::WMS_PATTERN, "WMSPattern" },
97     { WmsLogTag::WMS_ATTRIBUTE, "WMSAttribute" },
98     { WmsLogTag::WMS_PC, "WMSPc" },
99     { WmsLogTag::WMS_DECOR, "WMSDecor" },
100     { WmsLogTag::WMS_LAYOUT_PC, "WMSLayoutPc" },
101     { WmsLogTag::WMS_STARTUP_PAGE, "WMSStartupPage" },
102     { WmsLogTag::WMS_COMPAT, "WMSCompat" },
103 };
104 #ifdef IS_RELEASE_VERSION
105 #define WMS_FILE_NAME ""
106 #else
107 #define WMS_FILE_NAME (__builtin_strrchr(__FILE_NAME__, '/') ?   \
108                        __builtin_strrchr(__FILE_NAME__, '/') + 1 : __FILE_NAME__)
109 #endif
110 
111 #define FMT_PREFIX "[%{public}s] %{public}s(%{public}d): "
112 
113 #define FMT_PREFIX_NO_FUNC "[%{public}s]: "
114 
115 #define PRINT_TLOG(level, tag, ...)                                                                     \
116     do {                                                                                                \
117         uint32_t hilogDomain = HILOG_DOMAIN_WINDOW + static_cast<uint32_t>(tag);                        \
118         const char *domainContent = DOMAIN_CONTENTS_MAP.count(tag) ? DOMAIN_CONTENTS_MAP.at(tag) : "";  \
119         HILOG_IMPL(LOG_CORE, level, hilogDomain, domainContent, ##__VA_ARGS__);                         \
120     } while (0)
121 
122 #define TLOGD(tag, fmt, ...) \
123 PRINT_TLOG(LOG_DEBUG, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, __LINE__, ##__VA_ARGS__)
124 #define TLOGI(tag, fmt, ...) \
125 PRINT_TLOG(LOG_INFO, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, __LINE__, ##__VA_ARGS__)
126 #define TLOGW(tag, fmt, ...) \
127 PRINT_TLOG(LOG_WARN, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, __LINE__, ##__VA_ARGS__)
128 #define TLOGE(tag, fmt, ...) \
129 PRINT_TLOG(LOG_ERROR, tag, FMT_PREFIX fmt, WMS_FILE_NAME, C_W_FUNC, __LINE__, ##__VA_ARGS__)
130 
131 /*
132  * There is no function name built in TLOGN log micros. Choose suitable log micros when needed.
133  */
134 #define TLOGND(tag, fmt, ...) \
135 PRINT_TLOG(LOG_DEBUG, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
136 #define TLOGNI(tag, fmt, ...) \
137 PRINT_TLOG(LOG_INFO, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
138 #define TLOGNW(tag, fmt, ...) \
139 PRINT_TLOG(LOG_WARN, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
140 #define TLOGNE(tag, fmt, ...) \
141 PRINT_TLOG(LOG_ERROR, tag, FMT_PREFIX_NO_FUNC fmt, WMS_FILE_NAME, ##__VA_ARGS__)
142 
143 } // namespace OHOS
144 }
145 #endif // FRAMEWORKS_WM_INCLUDE_WINDOW_MANAGER_HILOG_H
146