1 /*
2 * Copyright (c) 2021 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 "product_adapter.h"
17
18 #include "acelite_config.h"
19 #include "graphic_config.h"
20 #include "js_async_work.h"
21 #include "message_queue_utils.h"
22 #include "module_manager.h"
23 #include "securec.h"
24
25 namespace OHOS {
26 namespace ACELite {
27 /**
28 * Used for holding all the related dfx interfaces assigned from specific implementation.
29 */
30 struct DFXWrapper {
DFXWrapperOHOS::ACELite::DFXWrapper31 DFXWrapper()
32 : eventTag_(0),
33 eventSubTag_(0),
34 errCodeTag_(0),
35 errCodeSubTag_(0),
36 eventPrintHandler_(nullptr),
37 errCodePrintHandler_(nullptr),
38 jsLogOutputHandler_(nullptr),
39 nativeMemInfoGetter_(nullptr)
40 {
41 }
42 uint8_t eventTag_;
43 uint8_t eventSubTag_;
44 uint8_t errCodeTag_;
45 uint8_t errCodeSubTag_;
46 EventPrintHandler eventPrintHandler_;
47 ErrCodePrintHandler errCodePrintHandler_;
48 JSLogOutputHandler jsLogOutputHandler_;
49 NativeMemInfoGetter nativeMemInfoGetter_;
50 };
51
52 static DFXWrapper g_dfxWrapper;
53 static TEHandlingHooks g_teHandlingHooks = {nullptr, nullptr};
54 static TerminateAbilityHandler g_termiantingHandler = nullptr;
55 static SetScreenOnVisibleHandler g_setScreenOnHandler = nullptr;
56 static ExtraPresetModulesHook g_extraPresetModulesHooks = {nullptr, nullptr};
57 // default font styles
58 static char *g_defaultFontFamilyName = nullptr;
59 static uint8_t g_defaultFontSize = 30;
60 static uint16_t g_screenWidth = 454;
61 static uint16_t g_screenHeight = 454;
62
63 // default app private data root path
64 const static char *DEFAULT_APP_DATA_PATH = "user/ace/data/";
65 static const char *g_defaultDataRootPath = DEFAULT_APP_DATA_PATH;
66
67 // default device info
68 const static uint8_t DEVICE_TYPE_STR_LEN = 24;
69 const static char *DEFAULT_DEVICE_TYPE_NAME = "smartVision";
70 // smartVision as default
71 static const char *g_deviceType = DEFAULT_DEVICE_TYPE_NAME;
72
73 // indicating if the ace application is on forground
74 static bool g_isRenderTickAcceptable = false;
75
InitAceTags(uint8_t * aceTags,uint8_t tagCount)76 void ProductAdapter::InitAceTags(uint8_t *aceTags, uint8_t tagCount)
77 {
78 const uint8_t minCount = 4;
79 if (aceTags == nullptr || tagCount < minCount) {
80 return;
81 }
82 uint8_t index = 0;
83 g_dfxWrapper.eventTag_ = aceTags[index++];
84 g_dfxWrapper.eventSubTag_ = aceTags[index++];
85 g_dfxWrapper.errCodeTag_ = aceTags[index++];
86 g_dfxWrapper.errCodeSubTag_ = aceTags[index++];
87 }
88
InitTraceHandlers(EventPrintHandler eventHandler,ErrCodePrintHandler errCodeHandler)89 void ProductAdapter::InitTraceHandlers(EventPrintHandler eventHandler, ErrCodePrintHandler errCodeHandler)
90 {
91 g_dfxWrapper.eventPrintHandler_ = eventHandler;
92 g_dfxWrapper.errCodePrintHandler_ = errCodeHandler;
93 }
94
InitConsoleNativeHandler(JSLogOutputHandler handler)95 void ProductAdapter::InitConsoleNativeHandler(JSLogOutputHandler handler)
96 {
97 g_dfxWrapper.jsLogOutputHandler_ = handler;
98 }
99
InitNativeMemPoolHook(NativeMemInfoGetter getter)100 void ProductAdapter::InitNativeMemPoolHook(NativeMemInfoGetter getter)
101 {
102 g_dfxWrapper.nativeMemInfoGetter_ = getter;
103 }
104
InitExtraModulesGetter(ProductModulesGetter productModuleGetter,PrivateModulesGetter privateModuleGetter)105 void ProductAdapter::InitExtraModulesGetter(ProductModulesGetter productModuleGetter,
106 PrivateModulesGetter privateModuleGetter)
107 {
108 ModuleManager::GetInstance()->SetProductModulesGetter(productModuleGetter);
109 ModuleManager::GetInstance()->SetPrivateModulesGetter(privateModuleGetter);
110 }
111
PrintEventTrace(uint8_t info2,uint8_t info3,uint8_t info4)112 void ProductAdapter::PrintEventTrace(uint8_t info2, uint8_t info3, uint8_t info4)
113 {
114 if (g_dfxWrapper.eventPrintHandler_ == nullptr || g_dfxWrapper.eventTag_ == 0 || g_dfxWrapper.eventSubTag_ == 0) {
115 return;
116 }
117
118 uint8_t subTag = (info2 == 0) ? g_dfxWrapper.eventSubTag_ : info2;
119 g_dfxWrapper.eventPrintHandler_(g_dfxWrapper.eventTag_, subTag, info3, info4);
120 }
121
PrintErrCode(uint8_t info2,uint16_t rfu)122 void ProductAdapter::PrintErrCode(uint8_t info2, uint16_t rfu)
123 {
124 if (g_dfxWrapper.errCodePrintHandler_ == nullptr || g_dfxWrapper.errCodeTag_ == 0 ||
125 g_dfxWrapper.errCodeSubTag_ == 0) {
126 return;
127 }
128 g_dfxWrapper.errCodePrintHandler_(g_dfxWrapper.errCodeTag_, g_dfxWrapper.errCodeSubTag_, info2, rfu);
129 }
130
OutputJSConsoleLog(uint8_t level,const char * content)131 void ProductAdapter::OutputJSConsoleLog(uint8_t level, const char *content)
132 {
133 if (g_dfxWrapper.jsLogOutputHandler_ == nullptr) {
134 return;
135 }
136 g_dfxWrapper.jsLogOutputHandler_(level, content);
137 }
138
GetNativeMemInfo(NativeMemInfo * memInfo)139 void ProductAdapter::GetNativeMemInfo(NativeMemInfo *memInfo)
140 {
141 if (g_dfxWrapper.nativeMemInfoGetter_ == nullptr) {
142 return;
143 }
144
145 g_dfxWrapper.nativeMemInfoGetter_(memInfo);
146 }
147
RegTerminatingHandler(TerminateAbilityHandler handler)148 void ProductAdapter::RegTerminatingHandler(TerminateAbilityHandler handler)
149 {
150 g_termiantingHandler = handler;
151 }
152
RegTEHandlers(const TEHandlingHooks & teHandlingHooks)153 void ProductAdapter::RegTEHandlers(const TEHandlingHooks &teHandlingHooks)
154 {
155 g_teHandlingHooks.renderTEHandler = teHandlingHooks.renderTEHandler;
156 g_teHandlingHooks.renderEndHandler = teHandlingHooks.renderEndHandler;
157 }
158
159 // NOTE: This TE function will be called in VSYNC interrupt, and
160 // as no any task can be switched to during an interrupt, so it's safe to
161 // read the global value directly here.
DispatchTEMessage()162 TEDispatchingResult ProductAdapter::DispatchTEMessage()
163 {
164 #if (OHOS_ACELITE_PRODUCT_WATCH == 1) // only some specific products support TE dispatching
165 if (!g_isRenderTickAcceptable) {
166 return TEDispatchingResult::REFUSED;
167 }
168
169 if (JsAsyncWork::DispatchToLoop(TE_EVENT, nullptr)) {
170 return TEDispatchingResult::ACCEPTED;
171 }
172 // if the ACE application is on forground and the dispatching failed, should retry sending to ACE again
173 return TEDispatchingResult::ACCEPT_FAILED;
174 #else
175 return TEDispatchingResult::REFUSED;
176 #endif // OHOS_ACELITE_PRODUCT_WATCH
177 }
178
SendTerminatingRequest(uint32_t token,bool forceStop)179 void ProductAdapter::SendTerminatingRequest(uint32_t token, bool forceStop)
180 {
181 if (g_termiantingHandler != nullptr) {
182 g_termiantingHandler(token, forceStop);
183 }
184 }
185
IsTEHandlersRegisted()186 bool ProductAdapter::IsTEHandlersRegisted()
187 {
188 return (g_teHandlingHooks.renderTEHandler != nullptr);
189 }
190
ProcessOneTE()191 void ProductAdapter::ProcessOneTE()
192 {
193 if (g_teHandlingHooks.renderTEHandler != nullptr) {
194 (void)(g_teHandlingHooks.renderTEHandler());
195 }
196 }
197
NotifyRenderEnd()198 void ProductAdapter::NotifyRenderEnd()
199 {
200 if (g_teHandlingHooks.renderEndHandler != nullptr) {
201 g_teHandlingHooks.renderEndHandler();
202 }
203 }
204
SetDefaultFontStyle(const char * defaultFontFamily,uint8_t defaultFontSize)205 void ProductAdapter::SetDefaultFontStyle(const char *defaultFontFamily, uint8_t defaultFontSize)
206 {
207 g_defaultFontFamilyName = const_cast<char *>(defaultFontFamily);
208 g_defaultFontSize = defaultFontSize;
209 }
210
GetDefaultFontFamilyName()211 const char *ProductAdapter::GetDefaultFontFamilyName()
212 {
213 return (g_defaultFontFamilyName != nullptr) ? g_defaultFontFamilyName : DEFAULT_VECTOR_FONT_FILENAME;
214 }
215
GetDefaultFontSize()216 uint8_t ProductAdapter::GetDefaultFontSize()
217 {
218 return g_defaultFontSize;
219 }
220
UpdateRenderTickAcceptable(bool acceptable)221 void ProductAdapter::UpdateRenderTickAcceptable(bool acceptable)
222 {
223 g_isRenderTickAcceptable = acceptable;
224 }
225
SetScreenSize(uint16_t width,uint16_t height)226 void ProductAdapter::SetScreenSize(uint16_t width, uint16_t height)
227 {
228 g_screenWidth = width;
229 g_screenHeight = height;
230 }
231
GetScreenSize(uint16_t & width,uint16_t & height)232 void ProductAdapter::GetScreenSize(uint16_t &width, uint16_t &height)
233 {
234 width = g_screenWidth;
235 height = g_screenHeight;
236 }
237
RegSetScreenOnVisibleHandler(SetScreenOnVisibleHandler handler)238 void ProductAdapter::RegSetScreenOnVisibleHandler(SetScreenOnVisibleHandler handler)
239 {
240 g_setScreenOnHandler = handler;
241 }
242
SetScreenOnVisible(bool visible)243 bool ProductAdapter::SetScreenOnVisible(bool visible)
244 {
245 return (g_setScreenOnHandler != nullptr) ? g_setScreenOnHandler(visible) : false;
246 }
247
RegExtraPresetModulesHook(ExtraPresetModulesHook hook)248 void ProductAdapter::RegExtraPresetModulesHook(ExtraPresetModulesHook hook)
249 {
250 g_extraPresetModulesHooks.loadingHandler = hook.loadingHandler;
251 g_extraPresetModulesHooks.unloadingHandler = hook.unloadingHandler;
252 }
253
LoadExtraPresetModules()254 void ProductAdapter::LoadExtraPresetModules()
255 {
256 if (g_extraPresetModulesHooks.loadingHandler != nullptr) {
257 g_extraPresetModulesHooks.loadingHandler();
258 }
259 }
260
UnloadExtraPresetModules()261 void ProductAdapter::UnloadExtraPresetModules()
262 {
263 if (g_extraPresetModulesHooks.unloadingHandler != nullptr) {
264 g_extraPresetModulesHooks.unloadingHandler();
265 }
266 }
267
ConfigPrivateDataRootPath(const char * appDataRoot)268 void ProductAdapter::ConfigPrivateDataRootPath(const char *appDataRoot)
269 {
270 if (appDataRoot == nullptr) {
271 return;
272 }
273 size_t pathLen = strlen(appDataRoot);
274 if (pathLen == 0 || pathLen >= UINT8_MAX) {
275 return;
276 }
277 g_defaultDataRootPath = appDataRoot;
278 }
279
GetPrivateDataRootPath()280 const char *ProductAdapter::GetPrivateDataRootPath()
281 {
282 return g_defaultDataRootPath;
283 }
284
InitDeviceInfo(const char * deviceType)285 void ProductAdapter::InitDeviceInfo(const char *deviceType)
286 {
287 if (deviceType == nullptr || (strlen(deviceType) == 0) || strlen(deviceType) >= DEVICE_TYPE_STR_LEN) {
288 return;
289 }
290 g_deviceType = deviceType;
291 }
292
GetDeviceType()293 const char *ProductAdapter::GetDeviceType()
294 {
295 return g_deviceType;
296 }
297 } // namespace ACELite
298 } // namespace OHOS
299