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