1/*
2 * Copyright (c) 2021-2024 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#include "base/log/log_wrapper.h"
17
18#ifdef _GNU_SOURCE
19#include <dlfcn.h>
20#endif
21#include <mutex>
22
23#ifdef ACE_INSTANCE_LOG
24#include "core/common/container_scope.h"
25#endif
26
27namespace OHOS::Ace {
28namespace {
29#ifdef ACE_INSTANCE_LOG
30constexpr const char* INSTANCE_ID_GEN_REASONS[] = {
31    "scope",
32    "active",
33    "default",
34    "singleton",
35    "foreground",
36    "undefined",
37};
38#endif
39} // namespace
40
41const std::unordered_map<AceLogTag, const char*> g_DOMAIN_CONTENTS_MAP = {
42    { AceLogTag::ACE_DEFAULT_DOMAIN, "Ace" },
43    { AceLogTag::ACE_ALPHABET_INDEXER, "AceAlphabetIndexer" },
44    { AceLogTag::ACE_COUNTER, "AceCounter" },
45    { AceLogTag::ACE_SUB_WINDOW, "AceSubWindow" },
46    { AceLogTag::ACE_FORM, "AceForm" },
47    { AceLogTag::ACE_DRAG, "AceDrag" },
48    { AceLogTag::ACE_VIDEO, "AceVideo" },
49    { AceLogTag::ACE_COMPONENT_SNAPSHOT, "AceComponentSnapshot" },
50    { AceLogTag::ACE_CANVAS, "AceCanvas" },
51    { AceLogTag::ACE_REFRESH, "AceRefresh" },
52    { AceLogTag::ACE_SCROLL, "AceScroll" },
53    { AceLogTag::ACE_SCROLLABLE, "AceScrollable" },
54    { AceLogTag::ACE_FONT, "AceFont" },
55    { AceLogTag::ACE_OVERLAY, "AceOverlay" },
56    { AceLogTag::ACE_DIALOG_TIMEPICKER, "AceDialogTimePicker" },
57    { AceLogTag::ACE_DIALOG, "AceDialog" },
58    { AceLogTag::ACE_PANEL, "AcePanel" },
59    { AceLogTag::ACE_MENU, "AceMenu" },
60    { AceLogTag::ACE_TEXTINPUT, "AceTextInput" },
61    { AceLogTag::ACE_TEXT, "AceText" },
62    { AceLogTag::ACE_TEXT_FIELD, "AceTextField" },
63    { AceLogTag::ACE_SWIPER, "AceSwiper" },
64    { AceLogTag::ACE_TABS, "AceTabs" },
65    { AceLogTag::ACE_BLANK, "AceBlank" },
66    { AceLogTag::ACE_GRIDROW, "AceGridRow" },
67    { AceLogTag::ACE_INPUTTRACKING, "AceInputTracking" },
68    { AceLogTag::ACE_RICH_TEXT, "AceRichText" },
69    { AceLogTag::ACE_WEB, "AceWeb" },
70    { AceLogTag::ACE_FOCUS, "AceFocus" },
71    { AceLogTag::ACE_MOUSE, "AceMouse" },
72    { AceLogTag::ACE_GESTURE, "AceGesture" },
73    { AceLogTag::ACE_IMAGE, "AceImage" },
74    { AceLogTag::ACE_RATING, "AceRating" },
75    { AceLogTag::ACE_LIST, "AceList" },
76    { AceLogTag::ACE_NAVIGATION, "AceNavigation" },
77    { AceLogTag::ACE_WATERFLOW, "AceWaterFlow" },
78    { AceLogTag::ACE_ACCESSIBILITY, "AceAccessibility" },
79    { AceLogTag::ACE_ROUTER, "AceRouter" },
80    { AceLogTag::ACE_THEME, "AceTheme" },
81    { AceLogTag::ACE_BORDER_IMAGE, "AceBorderImage" },
82    { AceLogTag::ACE_GRID, "AceGrid" },
83    { AceLogTag::ACE_PLUGIN_COMPONENT, "AcePluginComponent" },
84    { AceLogTag::ACE_UIEXTENSIONCOMPONENT, "AceUiExtensionComponent" },
85    { AceLogTag::ACE_IF, "AceIf" },
86    { AceLogTag::ACE_FOREACH, "AceForEach" },
87    { AceLogTag::ACE_LAZY_FOREACH, "AceLazyForEach" },
88    { AceLogTag::ACE_GAUGE, "AceGauge" },
89    { AceLogTag::ACE_HYPERLINK, "AceHyperLink" },
90    { AceLogTag::ACE_ANIMATION, "AceAnimation" },
91    { AceLogTag::ACE_XCOMPONENT, "AceXcomponent" },
92    { AceLogTag::ACE_AUTO_FILL, "AceAutoFill" },
93    { AceLogTag::ACE_KEYBOARD, "AceKeyboard" },
94    { AceLogTag::ACE_UIEVENT, "AceUIEvent" },
95    { AceLogTag::ACE_UI_SERVICE, "AceUIService" },
96    { AceLogTag::ACE_DISPLAY_SYNC, "AceDisplaySync" },
97    { AceLogTag::ACE_RESOURCE, "AceResource" },
98    { AceLogTag::ACE_SIDEBAR, "AceSideBarContainer" },
99    { AceLogTag::ACE_GEOMETRY_TRANSITION, "AceGeometryTransition" },
100    { AceLogTag::ACE_DOWNLOAD_MANAGER, "DownloadManager" },
101    { AceLogTag::ACE_WINDOW_SCENE, "AceWindowScene" },
102    { AceLogTag::ACE_NODE_CONTAINER, "AceNodeContainer" },
103    { AceLogTag::ACE_NATIVE_NODE, "AceNativeNode" },
104    { AceLogTag::ACE_ISOLATED_COMPONENT, "AceIsolatedComponent" },
105    { AceLogTag::ACE_SECURITYUIEXTENSION, "AceSecurityUiExtensionComponent" },
106    { AceLogTag::ACE_MARQUEE, "AceMarquee" },
107    { AceLogTag::ACE_OBSERVER, "AceObserver" },
108    { AceLogTag::ACE_EMBEDDED_COMPONENT, "AceEmbeddedComponent" },
109    { AceLogTag::ACE_TEXT_CLOCK, "AceTextClock" },
110    { AceLogTag::ACE_FOLDER_STACK, "AceFolderStack" },
111    { AceLogTag::ACE_SELECT_COMPONENT, "AceSelectComponent" },
112    { AceLogTag::ACE_STATE_STYLE, "AceStateStyle" },
113    { AceLogTag::ACE_SEARCH, "AceSearch" },
114    { AceLogTag::ACE_STATE_MGMT, "AceStateMgmt" },
115    { AceLogTag::ACE_REPEAT, "AceRepeat" },
116    { AceLogTag::ACE_SHEET, "AceSheet" },
117    { AceLogTag::ACE_CANVAS_COMPONENT, "AceCanvasComponent" },
118    { AceLogTag::ACE_SCROLL_BAR, "AceScrollBar" },
119    { AceLogTag::ACE_MOVING_PHOTO, "AceMovingPhoto" },
120    { AceLogTag::ACE_ARK_COMPONENT, "AceArkComponent" },
121    { AceLogTag::ACE_WINDOW, "AceWindow" },
122    { AceLogTag::ACE_WINDOW_PIPELINE, "AceWindowPipeline" },
123    { AceLogTag::ACE_INPUTKEYFLOW, "InputKeyFlow"},
124    { AceLogTag::ACE_APPBAR, "AceAppBar"},
125    { AceLogTag::ACE_SELECT_OVERLAY, "AceSelectOverlay"},
126    { AceLogTag::ACE_CLIPBOARD, "AceClipBoard"},
127    { AceLogTag::ACE_SECURITY_COMPONENT, "AceSecurityComponent"},
128    { AceLogTag::ACE_LAYOUT_INSPECTOR, "AceLayoutInspector" },
129    { AceLogTag::ACE_MEDIA_QUERY, "AceMediaQuery" },
130    { AceLogTag::ACE_LAYOUT, "AceLayout" },
131    { AceLogTag::ACE_STYLUS, "AceStylus"},
132};
133// initial static member object
134LogLevel LogWrapper::level_ = LogLevel::DEBUG;
135
136char LogWrapper::GetSeparatorCharacter()
137{
138    return '/';
139}
140
141#ifdef ACE_INSTANCE_LOG
142int32_t LogWrapper::GetId()
143{
144    return ContainerScope::CurrentId();
145}
146
147const std::string LogWrapper::GetIdWithReason()
148{
149    int32_t currentId = ContainerScope::CurrentId();
150    std::pair<int32_t, InstanceIdGenReason> idWithReason = ContainerScope::CurrentIdWithReason();
151    return std::to_string(currentId) + ":" + std::to_string(idWithReason.first) + ":" +
152           INSTANCE_ID_GEN_REASONS[static_cast<uint32_t>(idWithReason.second)];
153}
154#endif
155
156bool LogBacktrace(size_t maxFrameNums)
157{
158    static const char* (*pfnGetTrace)(size_t, size_t);
159#ifdef _GNU_SOURCE
160    if (!pfnGetTrace) {
161        pfnGetTrace = (decltype(pfnGetTrace))dlsym(RTLD_DEFAULT, "GetTrace");
162    }
163#endif
164    if (!pfnGetTrace) {
165        return false;
166    }
167
168    static std::mutex mtx;
169    std::lock_guard lock(mtx);
170    size_t skipFrameNum = 2;
171    LOGI("Backtrace: skipFrameNum=%{public}zu maxFrameNums=%{public}zu\n%{public}s",
172        skipFrameNum, maxFrameNums, pfnGetTrace(skipFrameNum, maxFrameNums));
173    return true;
174}
175} // namespace OHOS::Ace
176