• 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 // 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