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 "adapter/ohos/entrance/pa_engine/pa_backend.h"
17
18 #include "adapter/ohos/entrance/pa_engine/engine/common/js_backend_engine_loader.h"
19 #include "base/log/dump_log.h"
20 #include "base/log/event_report.h"
21
22 namespace OHOS::Ace {
23
Create()24 RefPtr<Backend> Backend::Create()
25 {
26 return AceType::MakeRefPtr<PaBackend>();
27 }
28
~PaBackend()29 PaBackend::~PaBackend() noexcept
30 {
31 // To guarantee the jsBackendEngine_ and delegate_ released in js thread
32 auto jsTaskExecutor = delegate_->GetAnimationJsTask();
33 RefPtr<JsBackendEngine> jsBackendEngine;
34 jsBackendEngine.Swap(jsBackendEngine_);
35 RefPtr<BackendDelegateImpl> delegate;
36 delegate.Swap(delegate_);
37 jsTaskExecutor.PostTask([jsBackendEngine, delegate] {});
38 }
39
Initialize(BackendType type,const RefPtr<TaskExecutor> & taskExecutor)40 bool PaBackend::Initialize(BackendType type, const RefPtr<TaskExecutor>& taskExecutor)
41 {
42 LOGI("PaBackend initialize begin.");
43 type_ = type;
44 ACE_DCHECK(type_ == BackendType::SERVICE);
45 InitializeBackendDelegate(taskExecutor);
46
47 taskExecutor->PostTask(
48 [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_), delegate = delegate_] {
49 auto jsBackendEngine = weakEngine.Upgrade();
50 if (!jsBackendEngine) {
51 return;
52 }
53 jsBackendEngine->Initialize(delegate);
54 },
55 TaskExecutor::TaskType::JS);
56
57 LOGI("PaBackend initialize end.");
58 return true;
59 }
60
LoadEngine(const char * libName,int32_t instanceId)61 void PaBackend::LoadEngine(const char* libName, int32_t instanceId)
62 {
63 auto& loader = JsBackendEngineLoader::Get(libName);
64 SetJsEngine(loader.CreateJsBackendEngine(instanceId));
65 }
66
InitializeBackendDelegate(const RefPtr<TaskExecutor> & taskExecutor)67 void PaBackend::InitializeBackendDelegate(const RefPtr<TaskExecutor>& taskExecutor)
68 {
69 // builder callback
70 BackendDelegateImplBuilder builder;
71 builder.loadCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
72 const std::string &url, const OHOS::AAFwk::Want& want) {
73 auto jsBackendEngine = weakEngine.Upgrade();
74 if (!jsBackendEngine) {
75 return;
76 }
77 jsBackendEngine->LoadJs(url, want);
78 };
79
80 builder.transferCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
81 const RefPtr<JsMessageDispatcher>& dispatcher) {
82 auto jsBackendEngine = weakEngine.Upgrade();
83 if (!jsBackendEngine) {
84 return;
85 }
86 jsBackendEngine->SetJsMessageDispatcher(dispatcher);
87 };
88
89 builder.asyncEventCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
90 const std::string& eventId, const std::string& param) {
91 auto jsBackendEngine = weakEngine.Upgrade();
92 if (!jsBackendEngine) {
93 return;
94 }
95 jsBackendEngine->FireAsyncEvent(eventId, param);
96 };
97
98 builder.syncEventCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
99 const std::string& eventId, const std::string& param) {
100 auto jsBackendEngine = weakEngine.Upgrade();
101 if (!jsBackendEngine) {
102 return;
103 }
104 jsBackendEngine->FireSyncEvent(eventId, param);
105 };
106
107 builder.insertCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
108 const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value) -> int32_t {
109 auto jsBackendEngine = weakEngine.Upgrade();
110 if (!jsBackendEngine) {
111 return 0;
112 }
113 return jsBackendEngine->Insert(uri, value);
114 };
115
116 builder.queryCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](const Uri& uri,
117 const std::vector<std::string>& columns,
118 const OHOS::NativeRdb::DataAbilityPredicates& predicates)
119 -> std::shared_ptr<OHOS::NativeRdb::AbsSharedResultSet> {
120 auto jsBackendEngine = weakEngine.Upgrade();
121 if (!jsBackendEngine) {
122 return nullptr;
123 }
124 return jsBackendEngine->Query(uri, columns, predicates);
125 };
126
127 builder.updateCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](const Uri& uri,
128 const OHOS::NativeRdb::ValuesBucket& value,
129 const OHOS::NativeRdb::DataAbilityPredicates& predicates) -> int32_t {
130 auto jsBackendEngine = weakEngine.Upgrade();
131 if (!jsBackendEngine) {
132 return 0;
133 }
134 return jsBackendEngine->Update(uri, value, predicates);
135 };
136
137 builder.deleteCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
138 const Uri& uri, const OHOS::NativeRdb::DataAbilityPredicates& predicates) -> int32_t {
139 auto jsBackendEngine = weakEngine.Upgrade();
140 if (!jsBackendEngine) {
141 return 0;
142 }
143 return jsBackendEngine->Delete(uri, predicates);
144 };
145
146 builder.batchInsertCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](const Uri& uri,
147 const std::vector<OHOS::NativeRdb::ValuesBucket>& values) -> int32_t {
148 auto jsBackendEngine = weakEngine.Upgrade();
149 if (!jsBackendEngine) {
150 return 0;
151 }
152 return jsBackendEngine->BatchInsert(uri, values);
153 };
154
155 builder.getTypeCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
156 const Uri& uri) -> std::string {
157 auto jsBackendEngine = weakEngine.Upgrade();
158 if (!jsBackendEngine) {
159 return std::string();
160 }
161 return jsBackendEngine->GetType(uri);
162 };
163
164 builder.getFileTypesCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
165 const Uri& uri, const std::string& mimeTypeFilter) -> std::vector<std::string> {
166 auto jsBackendEngine = weakEngine.Upgrade();
167 if (!jsBackendEngine) {
168 return std::vector<std::string>();
169 }
170 return jsBackendEngine->GetFileTypes(uri, mimeTypeFilter);
171 };
172
173 builder.openFileCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
174 const Uri& uri, const std::string& mode) -> int32_t {
175 auto jsBackendEngine = weakEngine.Upgrade();
176 if (!jsBackendEngine) {
177 return 0;
178 }
179 return jsBackendEngine->OpenFile(uri, mode);
180 };
181
182 builder.openRawFileCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
183 const Uri& uri, const std::string& mode) -> int32_t {
184 auto jsBackendEngine = weakEngine.Upgrade();
185 if (!jsBackendEngine) {
186 return 0;
187 }
188 return jsBackendEngine->OpenRawFile(uri, mode);
189 };
190
191 builder.normalizeUriCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
192 const Uri& uri) -> Uri {
193 auto jsBackendEngine = weakEngine.Upgrade();
194 if (!jsBackendEngine) {
195 return Uri("");
196 }
197 return jsBackendEngine->NormalizeUri(uri);
198 };
199
200 builder.denormalizeUriCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
201 const Uri& uri) -> Uri {
202 auto jsBackendEngine = weakEngine.Upgrade();
203 if (!jsBackendEngine) {
204 return Uri("");
205 }
206 return jsBackendEngine->DenormalizeUri(uri);
207 };
208 builder.destroyApplicationCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
209 const std::string& packageName) {
210 auto jsBackendEngine = weakEngine.Upgrade();
211 if (!jsBackendEngine) {
212 return;
213 }
214 jsBackendEngine->DestroyApplication(packageName);
215 };
216
217 builder.connectCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
218 const OHOS::AAFwk::Want& want) -> sptr<IRemoteObject> {
219 auto jsBackendEngine = weakEngine.Upgrade();
220 if (!jsBackendEngine) {
221 return nullptr;
222 }
223 return jsBackendEngine->OnConnectService(want);
224 };
225
226 builder.disConnectCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
227 const OHOS::AAFwk::Want& want) {
228 auto jsBackendEngine = weakEngine.Upgrade();
229 if (!jsBackendEngine) {
230 return;
231 }
232 jsBackendEngine->OnDisconnectService(want);
233 };
234
235 builder.commandCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
236 const OHOS::AAFwk::Want& want, int startId) {
237 auto jsBackendEngine = weakEngine.Upgrade();
238 if (!jsBackendEngine) {
239 return;
240 }
241 jsBackendEngine->OnCommand(want, startId);
242 };
243
244 builder.createFormCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
245 const OHOS::AAFwk::Want& want) {
246 auto jsBackendEngine = weakEngine.Upgrade();
247 if (!jsBackendEngine) {
248 return;
249 }
250 jsBackendEngine->OnCreate(want);
251 };
252
253 builder.deleteFormCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
254 const int64_t formId) {
255 auto jsBackendEngine = weakEngine.Upgrade();
256 if (!jsBackendEngine) {
257 return;
258 }
259 jsBackendEngine->OnDelete(formId);
260 };
261
262 builder.triggerEventCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
263 const int64_t formId, const std::string& message) {
264 auto jsBackendEngine = weakEngine.Upgrade();
265 if (!jsBackendEngine) {
266 return;
267 }
268 jsBackendEngine->OnTriggerEvent(formId, message);
269 };
270
271 builder.updateFormCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
272 const int64_t formId) {
273 auto jsBackendEngine = weakEngine.Upgrade();
274 if (!jsBackendEngine) {
275 return;
276 }
277 jsBackendEngine->OnUpdate(formId);
278 };
279
280 builder.castTemptoNormalCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
281 const int64_t formId) {
282 auto jsBackendEngine = weakEngine.Upgrade();
283 if (!jsBackendEngine) {
284 return;
285 }
286 jsBackendEngine->OnCastTemptoNormal(formId);
287 };
288
289 builder.visibilityChangedCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
290 const std::map<int64_t, int32_t>& formEventsMap) {
291 auto jsBackendEngine = weakEngine.Upgrade();
292 if (!jsBackendEngine) {
293 return;
294 }
295 jsBackendEngine->OnVisibilityChanged(formEventsMap);
296 };
297
298 builder.acquireStateCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
299 const OHOS::AAFwk::Want& want) -> int32_t {
300 auto jsBackendEngine = weakEngine.Upgrade();
301 if (!jsBackendEngine) {
302 return -1;
303 }
304 return jsBackendEngine->OnAcquireFormState(want);
305 };
306
307 builder.commandApplicationCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
308 const std::string& intent, int startId) {
309 auto jsBackendEngine = weakEngine.Upgrade();
310 if (!jsBackendEngine) {
311 return;
312 }
313 jsBackendEngine->OnCommandApplication(intent, startId);
314 };
315
316 builder.commandCallback = [weakEngine = WeakPtr<JsBackendEngine>(jsBackendEngine_)](
317 const OHOS::AAFwk::Want &want, int startId) {
318 auto jsBackendEngine = weakEngine.Upgrade();
319 if (!jsBackendEngine) {
320 return;
321 }
322 jsBackendEngine->OnCommand(want, startId);
323 };
324
325 builder.taskExecutor = taskExecutor;
326 builder.type = type_;
327
328 delegate_ = AceType::MakeRefPtr<BackendDelegateImpl>(builder);
329
330 if (jsBackendEngine_) {
331 delegate_->SetGroupJsBridge(jsBackendEngine_->GetGroupJsBridge());
332 } else {
333 LOGE("the js engine is nullptr");
334 }
335 }
336
UpdateState(Backend::State state)337 void PaBackend::UpdateState(Backend::State state)
338 {
339 LOGI("UpdateState");
340 switch (state) {
341 case Backend::State::ON_CREATE:
342 break;
343 case Backend::State::ON_DESTROY:
344 delegate_->OnApplicationDestroy("pa");
345 break;
346 default:
347 LOGE("error State: %d", state);
348 }
349 }
350
OnCommand(const std::string & intent,int startId)351 void PaBackend::OnCommand(const std::string& intent, int startId)
352 {
353 delegate_->OnApplicationCommand(intent, startId);
354 }
355
OnCommand(const OHOS::AAFwk::Want & want,int startId)356 void PaBackend::OnCommand(const OHOS::AAFwk::Want &want, int startId)
357 {
358 delegate_->OnCommand(want, startId);
359 }
360
RunPa(const std::string & url)361 void PaBackend::RunPa(const std::string& url)
362 {
363 }
364
TransferJsResponseData(int callbackId,int32_t code,std::vector<uint8_t> && data) const365 void PaBackend::TransferJsResponseData(int callbackId, int32_t code, std::vector<uint8_t>&& data) const
366 {
367 delegate_->TransferJsResponseData(callbackId, code, std::move(data));
368 }
369
TransferJsPluginGetError(int callbackId,int32_t errorCode,std::string && errorMessage) const370 void PaBackend::TransferJsPluginGetError(int callbackId, int32_t errorCode, std::string&& errorMessage) const
371 {
372 delegate_->TransferJsPluginGetError(callbackId, errorCode, std::move(errorMessage));
373 }
374
TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data) const375 void PaBackend::TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const
376 {
377 delegate_->TransferJsEventData(callbackId, code, std::move(data));
378 }
379
LoadPluginJsCode(std::string && jsCode) const380 void PaBackend::LoadPluginJsCode(std::string&& jsCode) const
381 {
382 delegate_->LoadPluginJsCode(std::move(jsCode));
383 }
384
LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen) const385 void PaBackend::LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const
386 {
387 delegate_->LoadPluginJsByteCode(std::move(jsCode), std::move(jsCodeLen));
388 }
389
SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher) const390 void PaBackend::SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const
391 {
392 delegate_->SetJsMessageDispatcher(dispatcher);
393 }
394
SetAssetManager(const RefPtr<AssetManager> & assetManager)395 void PaBackend::SetAssetManager(const RefPtr<AssetManager>& assetManager)
396 {
397 delegate_->SetAssetManager(assetManager);
398 }
399
MethodChannel(const std::string & methodName,std::string & jsonStr)400 void PaBackend::MethodChannel(const std::string& methodName, std::string& jsonStr)
401 {
402 delegate_->MethodChannel(methodName, jsonStr);
403 }
404
Insert(const Uri & uri,const OHOS::NativeRdb::ValuesBucket & value)405 int32_t PaBackend::Insert(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value)
406 {
407 return delegate_->Insert(uri, value);
408 }
409
Query(const Uri & uri,const std::vector<std::string> & columns,const OHOS::NativeRdb::DataAbilityPredicates & predicates)410 std::shared_ptr<OHOS::NativeRdb::AbsSharedResultSet> PaBackend::Query(
411 const Uri& uri, const std::vector<std::string>& columns, const OHOS::NativeRdb::DataAbilityPredicates& predicates)
412 {
413 return delegate_->Query(uri, columns, predicates);
414 }
415
Update(const Uri & uri,const OHOS::NativeRdb::ValuesBucket & value,const OHOS::NativeRdb::DataAbilityPredicates & predicates)416 int32_t PaBackend::Update(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value,
417 const OHOS::NativeRdb::DataAbilityPredicates& predicates)
418 {
419 return delegate_->Update(uri, value, predicates);
420 }
421
Delete(const Uri & uri,const OHOS::NativeRdb::DataAbilityPredicates & predicates)422 int32_t PaBackend::Delete(const Uri& uri, const OHOS::NativeRdb::DataAbilityPredicates& predicates)
423 {
424 return delegate_->Delete(uri, predicates);
425 }
426
BatchInsert(const Uri & uri,const std::vector<OHOS::NativeRdb::ValuesBucket> & values)427 int32_t PaBackend::BatchInsert(const Uri& uri, const std::vector<OHOS::NativeRdb::ValuesBucket>& values)
428 {
429 return delegate_->BatchInsert(uri, values);
430 }
431
GetType(const Uri & uri)432 std::string PaBackend::GetType(const Uri& uri)
433 {
434 return delegate_->GetType(uri);
435 }
436
GetFileTypes(const Uri & uri,const std::string & mimeTypeFilter)437 std::vector<std::string> PaBackend::GetFileTypes(const Uri& uri, const std::string& mimeTypeFilter)
438 {
439 return delegate_->GetFileTypes(uri, mimeTypeFilter);
440 }
441
OpenFile(const Uri & uri,const std::string & mode)442 int32_t PaBackend::OpenFile(const Uri& uri, const std::string& mode)
443 {
444 return delegate_->OpenFile(uri, mode);
445 }
446
OpenRawFile(const Uri & uri,const std::string & mode)447 int32_t PaBackend::OpenRawFile(const Uri& uri, const std::string& mode)
448 {
449 return delegate_->OpenRawFile(uri, mode);
450 }
451
NormalizeUri(const Uri & uri)452 Uri PaBackend::NormalizeUri(const Uri& uri)
453 {
454 return delegate_->NormalizeUri(uri);
455 }
456
DenormalizeUri(const Uri & uri)457 Uri PaBackend::DenormalizeUri(const Uri& uri)
458 {
459 return delegate_->DenormalizeUri(uri);
460 }
461
RunPa(const std::string & url,const OHOS::AAFwk::Want & want)462 void PaBackend::RunPa(const std::string& url, const OHOS::AAFwk::Want& want)
463 {
464 delegate_->RunPa(url, want);
465 }
466
OnCreate(const OHOS::AAFwk::Want & want)467 void PaBackend::OnCreate(const OHOS::AAFwk::Want &want)
468 {
469 delegate_->OnCreate(want);
470 }
471
OnDelete(const int64_t formId)472 void PaBackend::OnDelete(const int64_t formId)
473 {
474 delegate_->OnDelete(formId);
475 }
476
OnTriggerEvent(const int64_t formId,const std::string & message)477 void PaBackend::OnTriggerEvent(const int64_t formId, const std::string& message)
478 {
479 delegate_->OnTriggerEvent(formId, message);
480 }
481
OnUpdate(const int64_t formId)482 void PaBackend::OnUpdate(const int64_t formId)
483 {
484 delegate_->OnUpdate(formId);
485 }
486
OnCastTemptoNormal(const int64_t formId)487 void PaBackend::OnCastTemptoNormal(const int64_t formId)
488 {
489 delegate_->OnCastTemptoNormal(formId);
490 }
491
OnVisibilityChanged(const std::map<int64_t,int32_t> & formEventsMap)492 void PaBackend::OnVisibilityChanged(const std::map<int64_t, int32_t>& formEventsMap)
493 {
494 delegate_->OnVisibilityChanged(formEventsMap);
495 }
496
OnAcquireFormState(const OHOS::AAFwk::Want & want)497 int32_t PaBackend::OnAcquireFormState(const OHOS::AAFwk::Want& want)
498 {
499 return delegate_->OnAcquireFormState(want);
500 }
501
OnConnect(const OHOS::AAFwk::Want & want)502 sptr<IRemoteObject> PaBackend::OnConnect(const OHOS::AAFwk::Want& want)
503 {
504 return delegate_->OnConnect(want);
505 }
506
OnDisConnect(const OHOS::AAFwk::Want & want)507 void PaBackend::OnDisConnect(const OHOS::AAFwk::Want& want)
508 {
509 delegate_->OnDisConnect(want);
510 }
511
512 } // namespace OHOS::Ace
513