1 /*
2 * Copyright (c) 2021-2022 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 "native_engine.h"
17 #include "native_engine/native_engine_interface.h"
18 #include "utils/log.h"
19
20 static GetContainerScopeIdCallback getContainerScopeIdFunc_;
21 static ContainerScopeCallback initContainerScopeFunc_;
22 static ContainerScopeCallback finishContainerScopeFunc_;
23
NativeEngine(void * jsEngine)24 NativeEngine::NativeEngine(void* jsEngine) : jsEngine_(jsEngine) {}
25
~NativeEngine()26 NativeEngine::~NativeEngine()
27 {
28 std::lock_guard<std::mutex> insLock(instanceDataLock_);
29 FinalizerInstanceData();
30 }
31
GetScopeManager()32 NativeScopeManager* NativeEngine::GetScopeManager()
33 {
34 return nativeEngineImpl_->GetScopeManager();
35 }
36
GetReferenceManager()37 NativeReferenceManager* NativeEngine::GetReferenceManager()
38 {
39 return nativeEngineImpl_->GetReferenceManager();
40 }
41
GetModuleManager()42 NativeModuleManager* NativeEngine::GetModuleManager()
43 {
44 return nativeEngineImpl_->GetModuleManager();
45 }
46
GetCallbackScopeManager()47 NativeCallbackScopeManager* NativeEngine::GetCallbackScopeManager()
48 {
49 return nativeEngineImpl_->GetCallbackScopeManager();
50 }
51
GetUVLoop() const52 uv_loop_t* NativeEngine::GetUVLoop() const
53 {
54 return nativeEngineImpl_->GetUVLoop();
55 }
56
GetTid() const57 pthread_t NativeEngine::GetTid() const
58 {
59 return nativeEngineImpl_->GetTid();
60 }
61
ReinitUVLoop()62 bool NativeEngine::ReinitUVLoop()
63 {
64 return nativeEngineImpl_->ReinitUVLoop();
65 }
66
Loop(LoopMode mode,bool needSync)67 void NativeEngine::Loop(LoopMode mode, bool needSync)
68 {
69 nativeEngineImpl_->Loop(mode, needSync);
70 }
71
CreateAsyncWork(NativeValue * asyncResource,NativeValue * asyncResourceName,NativeAsyncExecuteCallback execute,NativeAsyncCompleteCallback complete,void * data)72 NativeAsyncWork* NativeEngine::CreateAsyncWork(NativeValue* asyncResource, NativeValue* asyncResourceName,
73 NativeAsyncExecuteCallback execute, NativeAsyncCompleteCallback complete, void* data)
74 {
75 return nativeEngineImpl_->CreateAsyncWork(this, asyncResource, asyncResourceName, execute, complete, data);
76 }
77
CreateAsyncWork(const std::string & asyncResourceName,NativeAsyncExecuteCallback execute,NativeAsyncCompleteCallback complete,void * data)78 NativeAsyncWork* NativeEngine::CreateAsyncWork(const std::string& asyncResourceName, NativeAsyncExecuteCallback execute,
79 NativeAsyncCompleteCallback complete, void* data)
80 {
81 return nativeEngineImpl_->CreateAsyncWork(this, asyncResourceName, execute, complete, data);
82 }
83
CreateSafeAsyncWork(NativeValue * func,NativeValue * asyncResource,NativeValue * asyncResourceName,size_t maxQueueSize,size_t threadCount,void * finalizeData,NativeFinalize finalizeCallback,void * context,NativeThreadSafeFunctionCallJs callJsCallback)84 NativeSafeAsyncWork* NativeEngine::CreateSafeAsyncWork(NativeValue* func, NativeValue* asyncResource,
85 NativeValue* asyncResourceName, size_t maxQueueSize, size_t threadCount, void* finalizeData,
86 NativeFinalize finalizeCallback, void* context, NativeThreadSafeFunctionCallJs callJsCallback)
87 {
88 return nativeEngineImpl_->CreateSafeAsyncWork(this, func, asyncResource, asyncResourceName, maxQueueSize,
89 threadCount, finalizeData, finalizeCallback, context, callJsCallback);
90 }
91
GetLastError()92 NativeErrorExtendedInfo* NativeEngine::GetLastError()
93 {
94 return nativeEngineImpl_->GetLastError();
95 }
96
SetLastError(int errorCode,uint32_t engineErrorCode,void * engineReserved)97 void NativeEngine::SetLastError(int errorCode, uint32_t engineErrorCode, void* engineReserved)
98 {
99 nativeEngineImpl_->SetLastError(errorCode, engineErrorCode, engineReserved);
100 }
101
ClearLastError()102 void NativeEngine::ClearLastError()
103 {
104 nativeEngineImpl_->ClearLastError();
105 }
106
EncodeToUtf8(NativeValue * nativeValue,char * buffer,int32_t * written,size_t bufferSize,int32_t * nchars)107 void NativeEngine::EncodeToUtf8(
108 NativeValue* nativeValue, char* buffer, int32_t* written, size_t bufferSize, int32_t* nchars)
109 {
110 nativeEngineImpl_->EncodeToUtf8(nativeValue, buffer, written, bufferSize, nchars);
111 }
112
EncodeToChinese(NativeValue * nativeValue,std::string & buffer,const std::string & encoding)113 void NativeEngine::EncodeToChinese(NativeValue* nativeValue, std::string& buffer, const std::string& encoding)
114 {
115 nativeEngineImpl_->EncodeToChinese(nativeValue, buffer, encoding);
116 }
117
118 #if !defined(PREVIEW)
CheckUVLoop()119 void NativeEngine::CheckUVLoop()
120 {
121 nativeEngineImpl_->CheckUVLoop();
122 }
123
CancelCheckUVLoop()124 void NativeEngine::CancelCheckUVLoop()
125 {
126 nativeEngineImpl_->CancelCheckUVLoop();
127 }
128 #endif
129
SetPostTask(PostTask postTask)130 void NativeEngine::SetPostTask(PostTask postTask)
131 {
132 nativeEngineImpl_->SetPostTask(postTask);
133 }
134
TriggerPostTask()135 void NativeEngine::TriggerPostTask()
136 {
137 nativeEngineImpl_->TriggerPostTask();
138 }
139
GetJsEngine()140 void* NativeEngine::GetJsEngine()
141 {
142 return nativeEngineImpl_->GetJsEngine();
143 }
144
145 // register init worker func
SetInitWorkerFunc(InitWorkerFunc func)146 void NativeEngine::SetInitWorkerFunc(InitWorkerFunc func)
147 {
148 initWorkerFunc_ = func;
149 }
SetGetAssetFunc(GetAssetFunc func)150 void NativeEngine::SetGetAssetFunc(GetAssetFunc func)
151 {
152 getAssetFunc_ = func;
153 }
SetOffWorkerFunc(OffWorkerFunc func)154 void NativeEngine::SetOffWorkerFunc(OffWorkerFunc func)
155 {
156 offWorkerFunc_ = func;
157 }
158 // call init worker func
CallInitWorkerFunc(NativeEngine * engine)159 bool NativeEngine::CallInitWorkerFunc(NativeEngine* engine)
160 {
161 if (initWorkerFunc_ != nullptr) {
162 initWorkerFunc_(engine);
163 return true;
164 }
165 return false;
166 }
CallGetAssetFunc(const std::string & uri,std::vector<uint8_t> & content,std::string & ami)167 bool NativeEngine::CallGetAssetFunc(const std::string& uri, std::vector<uint8_t>& content, std::string& ami)
168 {
169 if (getAssetFunc_ != nullptr) {
170 getAssetFunc_(uri, content, ami);
171 return true;
172 }
173 return false;
174 }
CallOffWorkerFunc(NativeEngine * engine)175 bool NativeEngine::CallOffWorkerFunc(NativeEngine* engine)
176 {
177 if (offWorkerFunc_ != nullptr) {
178 offWorkerFunc_(engine);
179 return true;
180 }
181 return false;
182 }
183
184 // adapt worker to ace container
SetGetContainerScopeIdFunc(GetContainerScopeIdCallback func)185 void NativeEngine::SetGetContainerScopeIdFunc(GetContainerScopeIdCallback func)
186 {
187 getContainerScopeIdFunc_ = func;
188 }
SetInitContainerScopeFunc(ContainerScopeCallback func)189 void NativeEngine::SetInitContainerScopeFunc(ContainerScopeCallback func)
190 {
191 initContainerScopeFunc_ = func;
192 }
SetFinishContainerScopeFunc(ContainerScopeCallback func)193 void NativeEngine::SetFinishContainerScopeFunc(ContainerScopeCallback func)
194 {
195 finishContainerScopeFunc_ = func;
196 }
GetContainerScopeIdFunc()197 int32_t NativeEngine::GetContainerScopeIdFunc()
198 {
199 int32_t scopeId = -1;
200 if (getContainerScopeIdFunc_ != nullptr) {
201 scopeId = getContainerScopeIdFunc_();
202 }
203 return scopeId;
204 }
InitContainerScopeFunc(int32_t id)205 bool NativeEngine::InitContainerScopeFunc(int32_t id)
206 {
207 if (initContainerScopeFunc_ != nullptr) {
208 initContainerScopeFunc_(id);
209 return true;
210 }
211 return false;
212 }
FinishContainerScopeFunc(int32_t id)213 bool NativeEngine::FinishContainerScopeFunc(int32_t id)
214 {
215 if (finishContainerScopeFunc_ != nullptr) {
216 finishContainerScopeFunc_(id);
217 return true;
218 }
219 return false;
220 }
221
222 #if !defined(PREVIEW)
CallDebuggerPostTaskFunc(std::function<void ()> && task)223 void NativeEngine::CallDebuggerPostTaskFunc(std::function<void()>&& task)
224 {
225 if (debuggerPostTaskFunc_ != nullptr) {
226 debuggerPostTaskFunc_(std::move(task));
227 }
228 }
229
SetDebuggerPostTaskFunc(DebuggerPostTask func)230 void NativeEngine::SetDebuggerPostTaskFunc(DebuggerPostTask func)
231 {
232 debuggerPostTaskFunc_ = func;
233 }
234 #endif
235
AddCleanupHook(CleanupCallback fun,void * arg)236 void NativeEngine::AddCleanupHook(CleanupCallback fun, void* arg)
237 {
238 nativeEngineImpl_->AddCleanupHook(fun, arg);
239 }
240
RemoveCleanupHook(CleanupCallback fun,void * arg)241 void NativeEngine::RemoveCleanupHook(CleanupCallback fun, void* arg)
242 {
243 nativeEngineImpl_->RemoveCleanupHook(fun, arg);
244 }
245
RunCleanup()246 void NativeEngine::RunCleanup()
247 {
248 nativeEngineImpl_->RunCleanup();
249 }
250
CleanupHandles()251 void NativeEngine::CleanupHandles()
252 {
253 nativeEngineImpl_->CleanupHandles();
254 }
255
IncreaseWaitingRequestCounter()256 void NativeEngine::IncreaseWaitingRequestCounter()
257 {
258 nativeEngineImpl_->IncreaseWaitingRequestCounter();
259 }
260
DecreaseWaitingRequestCounter()261 void NativeEngine::DecreaseWaitingRequestCounter()
262 {
263 nativeEngineImpl_->DecreaseWaitingRequestCounter();
264 }
265
RegisterWorkerFunction(const NativeEngine * engine)266 void NativeEngine::RegisterWorkerFunction(const NativeEngine* engine)
267 {
268 if (engine == nullptr) {
269 return;
270 }
271 SetInitWorkerFunc(engine->initWorkerFunc_);
272 SetGetAssetFunc(engine->getAssetFunc_);
273 SetOffWorkerFunc(engine->offWorkerFunc_);
274 }
275
RunScript(const char * path)276 NativeValue* NativeEngine::RunScript(const char* path)
277 {
278 std::vector<uint8_t> scriptContent;
279 std::string pathStr(path);
280 std::string ami;
281 if (!CallGetAssetFunc(pathStr, scriptContent, ami)) {
282 HILOG_ERROR("Get asset error");
283 return nullptr;
284 }
285 HILOG_INFO("asset size is %{public}zu", scriptContent.size());
286 return RunActor(scriptContent, ami.c_str());
287 }
288
GetNativeEngineImpl()289 NativeEngineInterface* NativeEngine::GetNativeEngineImpl()
290 {
291 return nativeEngineImpl_;
292 }
293
SetInstanceData(void * data,NativeFinalize finalize_cb,void * hint)294 void NativeEngine::SetInstanceData(void* data, NativeFinalize finalize_cb, void* hint)
295 {
296 HILOG_INFO("NativeEngineWraper::%{public}s, start.", __func__);
297 std::lock_guard<std::mutex> insLock(instanceDataLock_);
298 FinalizerInstanceData();
299 instanceDataInfo_.engine = this;
300 instanceDataInfo_.callback = finalize_cb;
301 instanceDataInfo_.nativeObject = data;
302 instanceDataInfo_.hint = hint;
303 }
304
GetInstanceData(void ** data)305 void NativeEngine::GetInstanceData(void** data)
306 {
307 HILOG_INFO("NativeEngineWraper::%{public}s, start.", __func__);
308 std::lock_guard<std::mutex> insLock(instanceDataLock_);
309 if (data) {
310 *data = instanceDataInfo_.nativeObject;
311 }
312 }
313
FinalizerInstanceData(void)314 void NativeEngine::FinalizerInstanceData(void)
315 {
316 if (instanceDataInfo_.engine != nullptr && instanceDataInfo_.callback != nullptr) {
317 instanceDataInfo_.callback(instanceDataInfo_.engine, instanceDataInfo_.nativeObject, instanceDataInfo_.hint);
318 }
319 instanceDataInfo_.engine = nullptr;
320 instanceDataInfo_.callback = nullptr;
321 instanceDataInfo_.nativeObject = nullptr;
322 instanceDataInfo_.hint = nullptr;
323 }
324
GetModuleFileName()325 const char* NativeEngine::GetModuleFileName()
326 {
327 HILOG_INFO("%{public}s, start.", __func__);
328 NativeModuleManager* moduleManager = nativeEngineImpl_->GetModuleManager();
329 HILOG_INFO("NativeEngineWraper::GetFileName GetModuleManager");
330 if (moduleManager != nullptr) {
331 const char* moduleFileName = moduleManager->GetModuleFileName(moduleName_.c_str(), isAppModule_);
332 HILOG_INFO("NativeEngineWraper::GetFileName end filename:%{public}s", moduleFileName);
333 return moduleFileName;
334 }
335 return nullptr;
336 }
337
SetModuleFileName(std::string & moduleName)338 void NativeEngine::SetModuleFileName(std::string& moduleName)
339 {
340 moduleName_ = moduleName;
341 }
342
DeleteEngine()343 void NativeEngine::DeleteEngine()
344 {
345 if (nativeEngineImpl_) {
346 delete nativeEngineImpl_;
347 nativeEngineImpl_ = nullptr;
348 }
349 }
350
SetExtensionInfos(std::unordered_map<std::string,int32_t> && extensionInfos)351 void NativeEngine::SetExtensionInfos(std::unordered_map<std::string, int32_t>&& extensionInfos)
352 {
353 extensionInfos_ = extensionInfos;
354 }
355
GetExtensionInfos()356 const std::unordered_map<std::string, int32_t>& NativeEngine::GetExtensionInfos()
357 {
358 return extensionInfos_;
359 }
360
SetModuleBlocklist(std::unordered_map<int32_t,std::unordered_set<std::string>> && blocklist)361 void NativeEngine::SetModuleBlocklist(std::unordered_map<int32_t, std::unordered_set<std::string>>&& blocklist)
362 {
363 if (!nativeEngineImpl_) {
364 return;
365 }
366 NativeModuleManager* moduleManager = nativeEngineImpl_->GetModuleManager();
367 if (!moduleManager) {
368 return;
369 }
370 moduleManager->SetModuleBlocklist(std::forward<decltype(blocklist)>(blocklist));
371 }