• 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_container.h"
17 
18 #include "adapter/ohos/entrance/file_asset_provider_impl.h"
19 #include "adapter/ohos/entrance/hap_asset_provider_impl.h"
20 #include "adapter/ohos/entrance/pa_engine/engine/common/js_backend_engine_loader.h"
21 #include "adapter/ohos/entrance/pa_engine/pa_backend.h"
22 #include "base/subwindow/subwindow_manager.h"
23 #include "core/common/ace_engine.h"
24 
25 namespace OHOS::Ace::Platform {
26 namespace {
27 
28 constexpr char ARK_PA_ENGINE_SHARED_LIB[] = "libace_engine_pa_ark.z.so";
29 
GetPaEngineSharedLibrary()30 const char* GetPaEngineSharedLibrary()
31 {
32     return ARK_PA_ENGINE_SHARED_LIB;
33 }
34 
35 } // namespace
36 
PaContainer(int32_t instanceId,void * paAbility,const PaContainerOptions & options,std::unique_ptr<PlatformEventCallback> callback)37 PaContainer::PaContainer(int32_t instanceId, void* paAbility, const PaContainerOptions& options,
38     std::unique_ptr<PlatformEventCallback> callback)
39     : instanceId_(instanceId), paAbility_(paAbility)
40 {
41     ACE_DCHECK(callback);
42     type_ = options.type;
43     hapPath_ = options.hapPath;
44     workerPath_ =  options.workerPath;
45     InitializeBackend(options.language);
46     platformEventCallback_ = std::move(callback);
47 }
48 
InitializeBackend(SrcLanguage language)49 void PaContainer::InitializeBackend(SrcLanguage language)
50 {
51     // create backend
52     backend_ = Backend::Create();
53     auto paBackend = AceType::DynamicCast<PaBackend>(backend_);
54     CHECK_NULL_VOID(paBackend);
55 
56     // set JS engine, init in JS thread
57     auto& loader = JsBackendEngineLoader::Get(GetPaEngineSharedLibrary());
58     auto jsEngine = loader.CreateJsBackendEngine(instanceId_);
59     jsEngine->AddExtraNativeObject("ability", paAbility_);
60     jsEngine->SetNeedDebugBreakPoint(AceApplicationInfo::GetInstance().IsNeedDebugBreakPoint());
61     jsEngine->SetDebugVersion(AceApplicationInfo::GetInstance().IsDebugVersion());
62     jsEngine->SetHapPath(hapPath_);
63     jsEngine->SetWorkerPath(workerPath_);
64     paBackend->SetJsEngine(jsEngine);
65 
66     ACE_DCHECK(backend_);
67     backend_->Initialize(type_, language);
68 }
69 
GetContainer(int32_t instanceId)70 RefPtr<PaContainer> PaContainer::GetContainer(int32_t instanceId)
71 {
72     auto container = AceEngine::Get().GetContainer(instanceId);
73     CHECK_NULL_RETURN(container, nullptr);
74     return AceType::DynamicCast<PaContainer>(container);
75 }
76 
CreateContainer(int32_t instanceId,void * paAbility,const PaContainerOptions & options,std::unique_ptr<PlatformEventCallback> callback)77 void PaContainer::CreateContainer(int32_t instanceId, void* paAbility, const PaContainerOptions& options,
78     std::unique_ptr<PlatformEventCallback> callback)
79 {
80     auto aceContainer = AceType::MakeRefPtr<PaContainer>(instanceId, paAbility, options, std::move(callback));
81     AceEngine::Get().AddContainer(instanceId, aceContainer);
82 
83     auto back = aceContainer->GetBackend();
84     CHECK_NULL_VOID(back);
85     back->UpdateState(Backend::State::ON_CREATE);
86 }
87 
RunPa(int32_t instanceId,const std::string & content,const OHOS::AAFwk::Want & want)88 bool PaContainer::RunPa(int32_t instanceId, const std::string& content, const OHOS::AAFwk::Want& want)
89 {
90     LOGI("PA: PaContainer RunPa start");
91     auto container = AceEngine::Get().GetContainer(instanceId);
92     CHECK_NULL_RETURN(container, false);
93     ContainerScope scope(instanceId);
94     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
95     CHECK_NULL_RETURN(aceContainer, false);
96     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
97     CHECK_NULL_RETURN(paBackend, false);
98     paBackend->RunPa(content, want);
99     return true;
100 }
101 
OnCreate(int32_t instanceId,const OHOS::AAFwk::Want & want)102 bool PaContainer::OnCreate(int32_t instanceId, const OHOS::AAFwk::Want& want)
103 {
104     LOGI("PA: PaContainer OnCreate start");
105     auto container = AceEngine::Get().GetContainer(instanceId);
106     CHECK_NULL_RETURN(container, false);
107     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
108     CHECK_NULL_RETURN(aceContainer, false);
109     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
110     CHECK_NULL_RETURN(paBackend, false);
111     paBackend->OnCreate(want);
112     return true;
113 }
114 
OnDelete(int32_t instanceId,int64_t formId)115 bool PaContainer::OnDelete(int32_t instanceId, int64_t formId)
116 {
117     LOGI("PA: PaContainer OnDelete start");
118     auto container = AceEngine::Get().GetContainer(instanceId);
119     CHECK_NULL_RETURN(container, false);
120     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
121     CHECK_NULL_RETURN(aceContainer, false);
122     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
123     CHECK_NULL_RETURN(paBackend, false);
124     paBackend->OnDelete(formId);
125     return true;
126 }
127 
OnTriggerEvent(int32_t instanceId,int64_t formId,const std::string & message)128 bool PaContainer::OnTriggerEvent(int32_t instanceId, int64_t formId, const std::string& message)
129 {
130     LOGI("PA: PaContainer OnTriggerEvent start");
131     auto container = AceEngine::Get().GetContainer(instanceId);
132     CHECK_NULL_RETURN(container, false);
133     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
134     CHECK_NULL_RETURN(aceContainer, false);
135     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
136     CHECK_NULL_RETURN(paBackend, false);
137     paBackend->OnTriggerEvent(formId, message);
138     return true;
139 }
140 
OnAcquireFormState(int32_t instanceId,const OHOS::AAFwk::Want & want)141 int32_t PaContainer::OnAcquireFormState(int32_t instanceId, const OHOS::AAFwk::Want& want)
142 {
143     LOGI("PA: PaContainer OnAcquireFormState start");
144     auto container = AceEngine::Get().GetContainer(instanceId);
145     CHECK_NULL_RETURN(container, -1);
146     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
147     CHECK_NULL_RETURN(aceContainer, -1);
148     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
149     CHECK_NULL_RETURN(paBackend, -1);
150     int32_t formState = paBackend->OnAcquireFormState(want);
151     return formState;
152 }
153 
OnUpdate(int32_t instanceId,int64_t formId)154 bool PaContainer::OnUpdate(int32_t instanceId, int64_t formId)
155 {
156     LOGI("PA: PaContainer OnUpdate start");
157     auto container = AceEngine::Get().GetContainer(instanceId);
158     CHECK_NULL_RETURN(container, false);
159     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
160     CHECK_NULL_RETURN(aceContainer, false);
161     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
162     CHECK_NULL_RETURN(paBackend, false);
163     paBackend->OnUpdate(formId);
164     return true;
165 }
166 
OnCastTemptoNormal(int32_t instanceId,int64_t formId)167 bool PaContainer::OnCastTemptoNormal(int32_t instanceId, int64_t formId)
168 {
169     LOGI("PA: PaContainer OnCastTemptoNormal start");
170     auto container = AceEngine::Get().GetContainer(instanceId);
171     CHECK_NULL_RETURN(container, false);
172     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
173     CHECK_NULL_RETURN(aceContainer, false);
174     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
175     CHECK_NULL_RETURN(paBackend, false);
176     paBackend->OnCastTemptoNormal(formId);
177     return true;
178 }
179 
OnVisibilityChanged(int32_t instanceId,const std::map<int64_t,int32_t> & formEventsMap)180 bool PaContainer::OnVisibilityChanged(int32_t instanceId, const std::map<int64_t, int32_t>& formEventsMap)
181 {
182     LOGI("PA: PaContainer OnVisibilityChanged start");
183     auto container = AceEngine::Get().GetContainer(instanceId);
184     CHECK_NULL_RETURN(container, false);
185     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
186     CHECK_NULL_RETURN(aceContainer, false);
187     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
188     CHECK_NULL_RETURN(paBackend, false);
189     paBackend->OnVisibilityChanged(formEventsMap);
190     return true;
191 }
192 
GetFormData(int32_t instanceId)193 AppExecFwk::FormProviderData PaContainer::GetFormData(int32_t instanceId)
194 {
195     LOGI("PA: PaContainer GetFormData start");
196     auto container = AceEngine::Get().GetContainer(instanceId);
197     CHECK_NULL_RETURN(container, AppExecFwk::FormProviderData());
198     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
199     CHECK_NULL_RETURN(aceContainer, AppExecFwk::FormProviderData());
200     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
201     CHECK_NULL_RETURN(paBackend, AppExecFwk::FormProviderData());
202     return paBackend->GetFormData();
203 }
204 
Destroy()205 void PaContainer::Destroy()
206 {
207     RefPtr<Backend> backend;
208     backend_.Swap(backend);
209     CHECK_NULL_VOID(backend);
210     backend->UpdateState(Backend::State::ON_DESTROY);
211 }
212 
DestroyContainer(int32_t instanceId)213 void PaContainer::DestroyContainer(int32_t instanceId)
214 {
215     LOGI("DestroyContainer with id %{private}d", instanceId);
216     SubwindowManager::GetInstance()->CloseDialog(instanceId);
217     auto container = AceEngine::Get().GetContainer(instanceId);
218     CHECK_NULL_VOID(container);
219     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
220     CHECK_NULL_VOID(aceContainer);
221     aceContainer->Destroy();
222 }
223 
AddAssetPath(int32_t instanceId,const std::string & packagePath,const std::string & hapPath,const std::vector<std::string> & paths)224 void PaContainer::AddAssetPath(int32_t instanceId, const std::string& packagePath, const std::string& hapPath,
225     const std::vector<std::string>& paths)
226 {
227     auto container = AceType::DynamicCast<PaContainer>(AceEngine::Get().GetContainer(instanceId));
228     CHECK_NULL_VOID(container);
229     RefPtr<AssetManagerImpl> assetManagerImpl;
230     if (container->assetManager_) {
231         assetManagerImpl = AceType::DynamicCast<AssetManagerImpl>(container->assetManager_);
232     } else {
233         assetManagerImpl = Referenced::MakeRefPtr<AssetManagerImpl>();
234         container->assetManager_ = assetManagerImpl;
235         AceType::DynamicCast<PaBackend>(container->GetBackend())->SetAssetManager(assetManagerImpl);
236     }
237     CHECK_NULL_VOID(assetManagerImpl);
238     if (!hapPath.empty()) {
239         auto assetProvider = AceType::MakeRefPtr<HapAssetProviderImpl>();
240         if (assetProvider->Initialize(hapPath, paths)) {
241             LOGI("Push AssetProvider to queue.");
242             assetManagerImpl->PushBack(std::move(assetProvider));
243         }
244     }
245     if (!packagePath.empty()) {
246         auto assetProvider = AceType::MakeRefPtr<FileAssetProviderImpl>();
247         if (assetProvider->Initialize(packagePath, paths)) {
248             LOGI("Push AssetProvider to queue.");
249             assetManagerImpl->PushBack(std::move(assetProvider));
250         }
251     }
252 }
253 
AddLibPath(int32_t instanceId,const std::vector<std::string> & libPath)254 void PaContainer::AddLibPath(int32_t instanceId, const std::vector<std::string>& libPath)
255 {
256     auto container = AceType::DynamicCast<PaContainer>(AceEngine::Get().GetContainer(instanceId));
257     CHECK_NULL_VOID(container);
258     RefPtr<AssetManager> assetManagerImpl;
259     if (container->assetManager_) {
260         assetManagerImpl = AceType::DynamicCast<AssetManagerImpl>(container->assetManager_);
261     } else {
262         assetManagerImpl = Referenced::MakeRefPtr<AssetManagerImpl>();
263         container->assetManager_ = assetManagerImpl;
264         AceType::DynamicCast<PaBackend>(container->GetBackend())->SetAssetManager(assetManagerImpl);
265     }
266     CHECK_NULL_VOID(assetManagerImpl);
267     assetManagerImpl->SetLibPath("default", libPath);
268 }
269 
Insert(int32_t instanceId,const Uri & uri,const OHOS::NativeRdb::ValuesBucket & value)270 int32_t PaContainer::Insert(int32_t instanceId, const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value)
271 {
272     LOGI("Insert with id %{public}d", instanceId);
273     int32_t ret = 0;
274     auto container = AceEngine::Get().GetContainer(instanceId);
275     CHECK_NULL_RETURN(container, ret);
276     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
277     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
278     CHECK_NULL_RETURN(back, ret);
279     ret = back->Insert(uri, value);
280     return ret;
281 }
282 
Query(int32_t instanceId,const Uri & uri,const std::vector<std::string> & columns,const OHOS::NativeRdb::DataAbilityPredicates & predicates)283 std::shared_ptr<OHOS::NativeRdb::AbsSharedResultSet> PaContainer::Query(int32_t instanceId, const Uri& uri,
284     const std::vector<std::string>& columns, const OHOS::NativeRdb::DataAbilityPredicates& predicates)
285 {
286     LOGI("Query with id %{public}d", instanceId);
287     std::shared_ptr<OHOS::NativeRdb::AbsSharedResultSet> ret;
288     auto container = AceEngine::Get().GetContainer(instanceId);
289     CHECK_NULL_RETURN(container, ret);
290     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
291     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
292     CHECK_NULL_RETURN(back, ret);
293     ret = back->Query(uri, columns, predicates);
294     return ret;
295 }
296 
Update(int32_t instanceId,const Uri & uri,const OHOS::NativeRdb::ValuesBucket & value,const OHOS::NativeRdb::DataAbilityPredicates & predicates)297 int32_t PaContainer::Update(int32_t instanceId, const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value,
298     const OHOS::NativeRdb::DataAbilityPredicates& predicates)
299 {
300     LOGI("Update with id %{public}d", instanceId);
301     int32_t ret = 0;
302     auto container = AceEngine::Get().GetContainer(instanceId);
303     CHECK_NULL_RETURN(container, ret);
304     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
305     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
306     CHECK_NULL_RETURN(back, ret);
307     ret = back->Update(uri, value, predicates);
308     return ret;
309 }
310 
Delete(int32_t instanceId,const Uri & uri,const OHOS::NativeRdb::DataAbilityPredicates & predicates)311 int32_t PaContainer::Delete(
312     int32_t instanceId, const Uri& uri, const OHOS::NativeRdb::DataAbilityPredicates& predicates)
313 {
314     LOGI("Delete with id %{public}d", instanceId);
315     int32_t ret = 0;
316     auto container = AceEngine::Get().GetContainer(instanceId);
317     CHECK_NULL_RETURN(container, ret);
318     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
319     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
320     CHECK_NULL_RETURN(back, ret);
321     ret = back->Delete(uri, predicates);
322     return ret;
323 }
324 
BatchInsert(int32_t instanceId,const Uri & uri,const std::vector<OHOS::NativeRdb::ValuesBucket> & values)325 int32_t PaContainer::BatchInsert(
326     int32_t instanceId, const Uri& uri, const std::vector<OHOS::NativeRdb::ValuesBucket>& values)
327 {
328     LOGI("BatchInsert with id %{public}d", instanceId);
329     int32_t ret = 0;
330     auto container = AceEngine::Get().GetContainer(instanceId);
331     CHECK_NULL_RETURN(container, ret);
332     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
333     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
334     CHECK_NULL_RETURN(back, ret);
335     ret = back->BatchInsert(uri, values);
336     return ret;
337 }
338 
GetType(int32_t instanceId,const Uri & uri)339 std::string PaContainer::GetType(int32_t instanceId, const Uri& uri)
340 {
341     LOGI("GetType with id %{public}d", instanceId);
342     std::string ret;
343     auto container = AceEngine::Get().GetContainer(instanceId);
344     CHECK_NULL_RETURN(container, ret);
345     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
346     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
347     CHECK_NULL_RETURN(back, ret);
348     ret = back->GetType(uri);
349     return ret;
350 }
351 
GetFileTypes(int32_t instanceId,const Uri & uri,const std::string & mimeTypeFilter)352 std::vector<std::string> PaContainer::GetFileTypes(
353     int32_t instanceId, const Uri& uri, const std::string& mimeTypeFilter)
354 {
355     LOGI("GetFileTypes with id %{public}d", instanceId);
356     std::vector<std::string> ret;
357     auto container = AceEngine::Get().GetContainer(instanceId);
358     CHECK_NULL_RETURN(container, ret);
359     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
360     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
361     CHECK_NULL_RETURN(back, ret);
362     ret = back->GetFileTypes(uri, mimeTypeFilter);
363     return ret;
364 }
365 
OpenFile(int32_t instanceId,const Uri & uri,const std::string & mode)366 int32_t PaContainer::OpenFile(int32_t instanceId, const Uri& uri, const std::string& mode)
367 {
368     LOGI("OpenFile with id %{public}d", instanceId);
369     int32_t ret = 0;
370     auto container = AceEngine::Get().GetContainer(instanceId);
371     CHECK_NULL_RETURN(container, ret);
372     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
373     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
374     CHECK_NULL_RETURN(back, ret);
375     ret = back->OpenFile(uri, mode);
376     return ret;
377 }
378 
OpenRawFile(int32_t instanceId,const Uri & uri,const std::string & mode)379 int32_t PaContainer::OpenRawFile(int32_t instanceId, const Uri& uri, const std::string& mode)
380 {
381     LOGI("OpenRawFile with id %{public}d", instanceId);
382     int32_t ret = 0;
383     auto container = AceEngine::Get().GetContainer(instanceId);
384     CHECK_NULL_RETURN(container, ret);
385     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
386     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
387     CHECK_NULL_RETURN(back, ret);
388     ret = back->OpenRawFile(uri, mode);
389     return ret;
390 }
391 
NormalizeUri(int32_t instanceId,const Uri & uri)392 Uri PaContainer::NormalizeUri(int32_t instanceId, const Uri& uri)
393 {
394     LOGI("NormalizeUri with id %{public}d", instanceId);
395     Uri ret("");
396     auto container = AceEngine::Get().GetContainer(instanceId);
397     CHECK_NULL_RETURN(container, ret);
398     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
399     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
400     CHECK_NULL_RETURN(back, ret);
401     ret = back->NormalizeUri(uri);
402     return ret;
403 }
404 
DenormalizeUri(int32_t instanceId,const Uri & uri)405 Uri PaContainer::DenormalizeUri(int32_t instanceId, const Uri& uri)
406 {
407     LOGI("DenormalizeUri with id %{public}d", instanceId);
408     Uri ret("");
409     auto container = AceEngine::Get().GetContainer(instanceId);
410     CHECK_NULL_RETURN(container, ret);
411     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
412     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
413     CHECK_NULL_RETURN(back, ret);
414     ret = back->DenormalizeUri(uri);
415     return ret;
416 }
417 
OnConnect(int32_t instanceId,const OHOS::AAFwk::Want & want)418 sptr<IRemoteObject> PaContainer::OnConnect(int32_t instanceId, const OHOS::AAFwk::Want& want)
419 {
420     LOGI("OnConnect with id %{private}d", instanceId);
421     auto container = AceEngine::Get().GetContainer(instanceId);
422     CHECK_NULL_RETURN(container, nullptr);
423     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
424     auto back = aceContainer->GetBackend();
425     CHECK_NULL_RETURN(back, nullptr);
426     auto paBackend = AceType::DynamicCast<PaBackend>(back);
427     CHECK_NULL_RETURN(paBackend, nullptr);
428     return paBackend->OnConnect(want);
429     return nullptr;
430 }
431 
OnDisConnect(int32_t instanceId,const OHOS::AAFwk::Want & want)432 void PaContainer::OnDisConnect(int32_t instanceId, const OHOS::AAFwk::Want& want)
433 {
434     LOGI("OnDisConnect with id %{private}d", instanceId);
435     auto container = AceEngine::Get().GetContainer(instanceId);
436     CHECK_NULL_VOID(container);
437     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
438     auto back = aceContainer->GetBackend();
439     CHECK_NULL_VOID(back);
440     auto paBackend = AceType::DynamicCast<PaBackend>(back);
441     CHECK_NULL_VOID(paBackend);
442     paBackend->OnDisConnect(want);
443 }
444 
OnCommand(const OHOS::AAFwk::Want & want,int startId,int32_t instanceId)445 void PaContainer::OnCommand(const OHOS::AAFwk::Want &want, int startId, int32_t instanceId)
446 {
447     LOGI("OnCommand with id %{private}d", instanceId);
448     auto container = AceEngine::Get().GetContainer(instanceId);
449     CHECK_NULL_VOID(container);
450     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
451     auto back = aceContainer->GetBackend();
452     CHECK_NULL_VOID(back);
453     auto paBackend = AceType::DynamicCast<PaBackend>(back);
454     CHECK_NULL_VOID(paBackend);
455     paBackend->OnCommand(want, startId);
456 }
457 
OnShare(int32_t instanceId,int64_t formId,OHOS::AAFwk::WantParams & wantParams)458 bool PaContainer::OnShare(int32_t instanceId, int64_t formId, OHOS::AAFwk::WantParams &wantParams)
459 {
460     auto container = AceEngine::Get().GetContainer(instanceId);
461     CHECK_NULL_RETURN(container, false);
462     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
463     CHECK_NULL_RETURN(aceContainer, false);
464     auto paBackend = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
465     CHECK_NULL_RETURN(paBackend, false);
466     return paBackend->OnShare(formId, wantParams);
467 }
468 
Call(int32_t instanceId,const Uri & uri,const std::string & method,const std::string & arg,const AppExecFwk::PacMap & pacMap)469 std::shared_ptr<AppExecFwk::PacMap> PaContainer::Call(int32_t instanceId, const Uri& uri,
470     const std::string& method, const std::string& arg, const AppExecFwk::PacMap& pacMap)
471 {
472     std::shared_ptr<AppExecFwk::PacMap> ret = nullptr;
473     auto container = AceEngine::Get().GetContainer(instanceId);
474     CHECK_NULL_RETURN(container, ret);
475     auto aceContainer = AceType::DynamicCast<PaContainer>(container);
476     auto back = AceType::DynamicCast<PaBackend>(aceContainer->GetBackend());
477     CHECK_NULL_RETURN(back, ret);
478     ret = back->Call(uri, method, arg, pacMap);
479     return ret;
480 }
481 } // namespace OHOS::Ace::Platform
482