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 static RestoreSystemHandler g_restoreSystemHandler = nullptr;
58 static IsPNGSupportedHandler g_isPNGSupportedHandler = nullptr;
59 static SetViewsParaHandler g_setViewsParaHandler = nullptr;
60 // default font styles
61 static char *g_defaultFontFamilyName = nullptr;
62 static uint8_t g_defaultFontSize = 30;
63 static uint16_t g_screenWidth = 454;
64 static uint16_t g_screenHeight = 454;
65
66 // default app private data root path
67 const static char *DEFAULT_APP_DATA_PATH = "user/ace/data/";
68 static const char *g_defaultDataRootPath = DEFAULT_APP_DATA_PATH;
69
70 // default device info
71 const static uint8_t DEVICE_TYPE_STR_LEN = 24;
72 const static char *DEFAULT_DEVICE_TYPE_NAME = "smartVision";
73 // smartVision as default
74 static const char *g_deviceType = DEFAULT_DEVICE_TYPE_NAME;
75
76 // indicating if the ace application is on foreground
77 static bool g_isRenderTickAcceptable = false;
78
InitAceTags(uint8_t * aceTags,uint8_t tagCount)79 void ProductAdapter::InitAceTags(uint8_t *aceTags, uint8_t tagCount)
80 {
81 const uint8_t minCount = 4;
82 if (aceTags == nullptr || tagCount < minCount) {
83 return;
84 }
85 uint8_t index = 0;
86 g_dfxWrapper.eventTag_ = aceTags[index++];
87 g_dfxWrapper.eventSubTag_ = aceTags[index++];
88 g_dfxWrapper.errCodeTag_ = aceTags[index++];
89 g_dfxWrapper.errCodeSubTag_ = aceTags[index++];
90 }
91
InitTraceHandlers(EventPrintHandler eventHandler,ErrCodePrintHandler errCodeHandler)92 void ProductAdapter::InitTraceHandlers(EventPrintHandler eventHandler, ErrCodePrintHandler errCodeHandler)
93 {
94 g_dfxWrapper.eventPrintHandler_ = eventHandler;
95 g_dfxWrapper.errCodePrintHandler_ = errCodeHandler;
96 }
97
InitConsoleNativeHandler(JSLogOutputHandler handler)98 void ProductAdapter::InitConsoleNativeHandler(JSLogOutputHandler handler)
99 {
100 g_dfxWrapper.jsLogOutputHandler_ = handler;
101 }
102
InitNativeMemPoolHook(NativeMemInfoGetter getter)103 void ProductAdapter::InitNativeMemPoolHook(NativeMemInfoGetter getter)
104 {
105 g_dfxWrapper.nativeMemInfoGetter_ = getter;
106 }
107
InitExtraModulesGetter(ProductModulesGetter productModuleGetter,PrivateModulesGetter privateModuleGetter)108 void ProductAdapter::InitExtraModulesGetter(ProductModulesGetter productModuleGetter,
109 PrivateModulesGetter privateModuleGetter)
110 {
111 ModuleManager::GetInstance()->SetProductModulesGetter(productModuleGetter);
112 ModuleManager::GetInstance()->SetPrivateModulesGetter(privateModuleGetter);
113 }
114
PrintEventTrace(uint8_t info2,uint8_t info3,uint8_t info4)115 void ProductAdapter::PrintEventTrace(uint8_t info2, uint8_t info3, uint8_t info4)
116 {
117 if (g_dfxWrapper.eventPrintHandler_ == nullptr || g_dfxWrapper.eventTag_ == 0 || g_dfxWrapper.eventSubTag_ == 0) {
118 return;
119 }
120
121 uint8_t subTag = (info2 == 0) ? g_dfxWrapper.eventSubTag_ : info2;
122 g_dfxWrapper.eventPrintHandler_(g_dfxWrapper.eventTag_, subTag, info3, info4);
123 }
124
PrintErrCode(uint8_t info2,uint16_t rfu)125 void ProductAdapter::PrintErrCode(uint8_t info2, uint16_t rfu)
126 {
127 if (g_dfxWrapper.errCodePrintHandler_ == nullptr || g_dfxWrapper.errCodeTag_ == 0 ||
128 g_dfxWrapper.errCodeSubTag_ == 0) {
129 return;
130 }
131 g_dfxWrapper.errCodePrintHandler_(g_dfxWrapper.errCodeTag_, g_dfxWrapper.errCodeSubTag_, info2, rfu);
132 }
133
OutputJSConsoleLog(uint8_t level,const char * content)134 void ProductAdapter::OutputJSConsoleLog(uint8_t level, const char *content)
135 {
136 if (g_dfxWrapper.jsLogOutputHandler_ == nullptr) {
137 return;
138 }
139 g_dfxWrapper.jsLogOutputHandler_(level, content);
140 }
141
GetNativeMemInfo(NativeMemInfo * memInfo)142 void ProductAdapter::GetNativeMemInfo(NativeMemInfo *memInfo)
143 {
144 if (g_dfxWrapper.nativeMemInfoGetter_ == nullptr) {
145 return;
146 }
147
148 g_dfxWrapper.nativeMemInfoGetter_(memInfo);
149 }
150
RegTerminatingHandler(TerminateAbilityHandler handler)151 void ProductAdapter::RegTerminatingHandler(TerminateAbilityHandler handler)
152 {
153 g_termiantingHandler = handler;
154 }
155
RegTEHandlers(const TEHandlingHooks & teHandlingHooks)156 void ProductAdapter::RegTEHandlers(const TEHandlingHooks &teHandlingHooks)
157 {
158 g_teHandlingHooks.renderTEHandler = teHandlingHooks.renderTEHandler;
159 g_teHandlingHooks.renderEndHandler = teHandlingHooks.renderEndHandler;
160 }
161
RegRestoreSystemHandler(RestoreSystemHandler handler)162 void ProductAdapter::RegRestoreSystemHandler(RestoreSystemHandler handler)
163 {
164 g_restoreSystemHandler = handler;
165 }
166
RegIsPNGSupportedHandler(IsPNGSupportedHandler handler)167 void ProductAdapter::RegIsPNGSupportedHandler(IsPNGSupportedHandler handler)
168 {
169 g_isPNGSupportedHandler = handler;
170 }
171
RegSetViewsParaHandler(SetViewsParaHandler handler)172 void ProductAdapter::RegSetViewsParaHandler(SetViewsParaHandler handler)
173 {
174 g_setViewsParaHandler = handler;
175 }
176 // NOTE: This TE function will be called in VSYNC interrupt, and
177 // as no any task can be switched to during an interrupt, so it's safe to
178 // read the global value directly here.
DispatchTEMessage()179 TEDispatchingResult ProductAdapter::DispatchTEMessage()
180 {
181 #if (OHOS_ACELITE_PRODUCT_WATCH == 1) // only some specific products support TE dispatching
182 if (!g_isRenderTickAcceptable) {
183 return TEDispatchingResult::REFUSED;
184 }
185
186 if (JsAsyncWork::DispatchToLoop(TE_EVENT, nullptr)) {
187 return TEDispatchingResult::ACCEPTED;
188 }
189 // if the ACE application is on foreground and the dispatching failed, should retry sending to ACE again
190 return TEDispatchingResult::ACCEPT_FAILED;
191 #else
192 return TEDispatchingResult::REFUSED;
193 #endif // OHOS_ACELITE_PRODUCT_WATCH
194 }
195
SendTerminatingRequest(uint32_t token,bool forceStop)196 void ProductAdapter::SendTerminatingRequest(uint32_t token, bool forceStop)
197 {
198 if (g_termiantingHandler != nullptr) {
199 g_termiantingHandler(token, forceStop);
200 }
201 }
202
IsTEHandlersRegisted()203 bool ProductAdapter::IsTEHandlersRegisted()
204 {
205 return (g_teHandlingHooks.renderTEHandler != nullptr);
206 }
207
ProcessOneTE()208 void ProductAdapter::ProcessOneTE()
209 {
210 if (g_teHandlingHooks.renderTEHandler != nullptr) {
211 (void)(g_teHandlingHooks.renderTEHandler());
212 }
213 }
214
NotifyRenderEnd()215 void ProductAdapter::NotifyRenderEnd()
216 {
217 if (g_teHandlingHooks.renderEndHandler != nullptr) {
218 g_teHandlingHooks.renderEndHandler();
219 }
220 }
221
SetDefaultFontStyle(const char * defaultFontFamily,uint8_t defaultFontSize)222 void ProductAdapter::SetDefaultFontStyle(const char *defaultFontFamily, uint8_t defaultFontSize)
223 {
224 g_defaultFontFamilyName = const_cast<char *>(defaultFontFamily);
225 g_defaultFontSize = defaultFontSize;
226 }
227
GetDefaultFontFamilyName()228 const char *ProductAdapter::GetDefaultFontFamilyName()
229 {
230 return (g_defaultFontFamilyName != nullptr) ? g_defaultFontFamilyName : DEFAULT_VECTOR_FONT_FILENAME;
231 }
232
GetDefaultFontSize()233 uint8_t ProductAdapter::GetDefaultFontSize()
234 {
235 return g_defaultFontSize;
236 }
237
UpdateRenderTickAcceptable(bool acceptable)238 void ProductAdapter::UpdateRenderTickAcceptable(bool acceptable)
239 {
240 g_isRenderTickAcceptable = acceptable;
241 }
242
SetScreenSize(uint16_t width,uint16_t height)243 void ProductAdapter::SetScreenSize(uint16_t width, uint16_t height)
244 {
245 g_screenWidth = width;
246 g_screenHeight = height;
247 }
248
GetScreenSize(uint16_t & width,uint16_t & height)249 void ProductAdapter::GetScreenSize(uint16_t &width, uint16_t &height)
250 {
251 width = g_screenWidth;
252 height = g_screenHeight;
253 }
254
RegSetScreenOnVisibleHandler(SetScreenOnVisibleHandler handler)255 void ProductAdapter::RegSetScreenOnVisibleHandler(SetScreenOnVisibleHandler handler)
256 {
257 g_setScreenOnHandler = handler;
258 }
259
SetScreenOnVisible(bool visible)260 bool ProductAdapter::SetScreenOnVisible(bool visible)
261 {
262 return (g_setScreenOnHandler != nullptr) ? g_setScreenOnHandler(visible) : false;
263 }
264
RegExtraPresetModulesHook(ExtraPresetModulesHook hook)265 void ProductAdapter::RegExtraPresetModulesHook(ExtraPresetModulesHook hook)
266 {
267 g_extraPresetModulesHooks.loadingHandler = hook.loadingHandler;
268 g_extraPresetModulesHooks.unloadingHandler = hook.unloadingHandler;
269 }
270
LoadExtraPresetModules()271 void ProductAdapter::LoadExtraPresetModules()
272 {
273 if (g_extraPresetModulesHooks.loadingHandler != nullptr) {
274 g_extraPresetModulesHooks.loadingHandler();
275 }
276 }
277
UnloadExtraPresetModules()278 void ProductAdapter::UnloadExtraPresetModules()
279 {
280 if (g_extraPresetModulesHooks.unloadingHandler != nullptr) {
281 g_extraPresetModulesHooks.unloadingHandler();
282 }
283 }
284
ConfigPrivateDataRootPath(const char * appDataRoot)285 void ProductAdapter::ConfigPrivateDataRootPath(const char *appDataRoot)
286 {
287 if (appDataRoot == nullptr) {
288 return;
289 }
290 size_t pathLen = strlen(appDataRoot);
291 if (pathLen == 0 || pathLen >= UINT8_MAX) {
292 return;
293 }
294 g_defaultDataRootPath = appDataRoot;
295 }
296
GetPrivateDataRootPath()297 const char *ProductAdapter::GetPrivateDataRootPath()
298 {
299 return g_defaultDataRootPath;
300 }
301
InitDeviceInfo(const char * deviceType)302 void ProductAdapter::InitDeviceInfo(const char *deviceType)
303 {
304 if (deviceType == nullptr || (strlen(deviceType) == 0) || strlen(deviceType) >= DEVICE_TYPE_STR_LEN) {
305 return;
306 }
307 g_deviceType = deviceType;
308 }
309
GetDeviceType()310 const char *ProductAdapter::GetDeviceType()
311 {
312 return g_deviceType;
313 }
314
RestoreSystemWrapper(const char * crashMessage)315 void ProductAdapter::RestoreSystemWrapper(const char *crashMessage)
316 {
317 if (g_restoreSystemHandler != nullptr) {
318 g_restoreSystemHandler(crashMessage);
319 }
320 }
321
IsPNGSupportedWrapper(const char * imagePath,const char * bundleName)322 bool ProductAdapter::IsPNGSupportedWrapper(const char *imagePath, const char *bundleName)
323 {
324 return (g_isPNGSupportedHandler != nullptr) ? g_isPNGSupportedHandler(imagePath, bundleName) : false;
325 }
326
SetViewsParaWrapper(void * ComponentHandler)327 void ProductAdapter::SetViewsParaWrapper(void *ComponentHandler)
328 {
329 if (g_setViewsParaHandler != nullptr) {
330 g_setViewsParaHandler(ComponentHandler);
331 }
332 }
333 } // namespace ACELite
334 } // namespace OHOS
335