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