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