• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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