From 78c55a02df94e914452bcf885d4d65bd2e3f640e Mon Sep 17 00:00:00 2001 From: zero-cyc Date: Fri, 17 Sep 2021 21:14:03 +0800 Subject: [PATCH] chenlien@huawei.com Signed-off-by: zero-cyc Change-Id: I6c2c12149dd85291e7c2cd6c4f1e34a0c0e0228b --- adapter/ohos/cpp/ace_service_ability.cpp | 8 +++++ adapter/ohos/cpp/ace_service_ability.h | 1 + adapter/ohos/cpp/pa_container.cpp | 24 +++++++++++-- adapter/ohos/cpp/pa_container.h | 1 + .../pa_backend/backend_delegate_impl.cpp | 9 ++++- .../bridge/pa_backend/backend_delegate_impl.h | 4 +++ .../engine/common/js_backend_engine.h | 2 ++ .../engine/quickjs/qjs_pa_engine.cpp | 36 ++++++++++++++++++- .../pa_backend/engine/quickjs/qjs_pa_engine.h | 1 + frameworks/bridge/pa_backend/pa_backend.cpp | 14 ++++++++ frameworks/bridge/pa_backend/pa_backend.h | 2 ++ 11 files changed, 98 insertions(+), 4 deletions(-) diff --git a/adapter/ohos/cpp/ace_service_ability.cpp b/adapter/ohos/cpp/ace_service_ability.cpp index ce8d50b..fe2dac3 100644 --- a/adapter/ohos/cpp/ace_service_ability.cpp +++ b/adapter/ohos/cpp/ace_service_ability.cpp @@ -131,5 +131,13 @@ void AceServiceAbility::OnDisconnect(const Want &want) LOGI("AceServiceAbility::OnDisconnect end"); } +void AceServiceAbility::OnCommand(const AAFwk::Want &want, bool restart, int startId) +{ + LOGI("AceServiceAbility::OnCommand start"); + Ability::OnCommand(want, restart, startId); + Platform::PaContainer::OnCommand(want, startId, abilityId_); + LOGI("AceServiceAbility::OnCommand end"); +} + } } // namespace OHOS::Ace diff --git a/adapter/ohos/cpp/ace_service_ability.h b/adapter/ohos/cpp/ace_service_ability.h index 77c31bc..6108911 100644 --- a/adapter/ohos/cpp/ace_service_ability.h +++ b/adapter/ohos/cpp/ace_service_ability.h @@ -38,6 +38,7 @@ public: void OnStop() override; sptr OnConnect(const OHOS::AAFwk::Want &want) override; void OnDisconnect(const OHOS::AAFwk::Want &want) override; + void OnCommand(const AAFwk::Want &want, bool restart, int startId) override; private: int32_t abilityId_ = 100000; diff --git a/adapter/ohos/cpp/pa_container.cpp b/adapter/ohos/cpp/pa_container.cpp index b92674c..c51d783 100644 --- a/adapter/ohos/cpp/pa_container.cpp +++ b/adapter/ohos/cpp/pa_container.cpp @@ -533,7 +533,7 @@ sptr PaContainer::OnConnect(int32_t instanceId, const OHOS::AAFwk LOGI("OnConnect with id %{private}d", instanceId); auto container = AceEngine::Get().GetContainer(instanceId); if (!container) { - LOGE("no AceContainer with id %{private}d", instanceId); + LOGE("no pa container with id %{private}d", instanceId); return nullptr; } auto aceContainer = AceType::DynamicCast(container); @@ -554,7 +554,7 @@ void PaContainer::OnDisConnect(int32_t instanceId, const OHOS::AAFwk::Want &want LOGI("OnDisConnect with id %{private}d", instanceId); auto container = AceEngine::Get().GetContainer(instanceId); if (!container) { - LOGE("no AceContainer with id %{private}d", instanceId); + LOGE("no pa container with id %{private}d", instanceId); return; } auto aceContainer = AceType::DynamicCast(container); @@ -569,4 +569,24 @@ void PaContainer::OnDisConnect(int32_t instanceId, const OHOS::AAFwk::Want &want } } +void PaContainer::OnCommand(const OHOS::AAFwk::Want &want, int startId, int32_t instanceId) +{ + LOGI("OnCommand with id %{private}d", instanceId); + auto container = AceEngine::Get().GetContainer(instanceId); + if (!container) { + LOGE("no pa container with id %{private}d", instanceId); + return; + } + auto aceContainer = AceType::DynamicCast(container); + auto back = aceContainer->GetBackend(); + if (back) { + auto paBackend = AceType::DynamicCast(back); + if (paBackend == nullptr) { + LOGE("DynamicCast paBackend failed with id %{private}d", instanceId); + return; + } + paBackend->OnCommand(want, startId); + } +} + } // namespace OHOS::Ace::Platform diff --git a/adapter/ohos/cpp/pa_container.h b/adapter/ohos/cpp/pa_container.h index ce2092a..d4282d1 100644 --- a/adapter/ohos/cpp/pa_container.h +++ b/adapter/ohos/cpp/pa_container.h @@ -149,6 +149,7 @@ public: static sptr OnConnect(int32_t instanceId, const OHOS::AAFwk::Want &want); static void OnDisConnect(int32_t instanceId, const OHOS::AAFwk::Want &want); static AppExecFwk::FormProviderData GetFormData(int32_t formId); + static void OnCommand(const OHOS::AAFwk::Want &want, int startId, int32_t instanceId); private: void InitializeBackend(); diff --git a/frameworks/bridge/pa_backend/backend_delegate_impl.cpp b/frameworks/bridge/pa_backend/backend_delegate_impl.cpp index 28e5d52..a34f58a 100644 --- a/frameworks/bridge/pa_backend/backend_delegate_impl.cpp +++ b/frameworks/bridge/pa_backend/backend_delegate_impl.cpp @@ -58,7 +58,7 @@ BackendDelegateImpl::BackendDelegateImpl(const BackendDelegateImplBuilder &build castTemptoNormalCallback_(builder.castTemptoNormalCallback), visibilityChangedCallback_(builder.visibilityChangedCallback), acquireStateCallback_(builder.acquireStateCallback), - + commandCallback_(builder.commandCallback), manifestParser_(AceType::MakeRefPtr()), ability_(builder.ability), type_(builder.type), @@ -385,4 +385,11 @@ void BackendDelegateImpl::OnAcquireState(const OHOS::AAFwk::Want &want) TaskExecutor::TaskType::JS); } +void BackendDelegateImpl::OnCommand(const OHOS::AAFwk::Want &want, int startId) +{ + taskExecutor_->PostTask( + [commandCallback = commandCallback_, want, startId] { commandCallback(want, startId); }, + TaskExecutor::TaskType::JS); +} + } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/pa_backend/backend_delegate_impl.h b/frameworks/bridge/pa_backend/backend_delegate_impl.h index 6163e94..b639bbf 100644 --- a/frameworks/bridge/pa_backend/backend_delegate_impl.h +++ b/frameworks/bridge/pa_backend/backend_delegate_impl.h @@ -66,6 +66,7 @@ using UpdateFormCallback = std::function; using CastTemptoNormalCallback = std::function; using VisibilityChangedCallback = std::function& formEventsMap)>; using AcquireStateCallback = std::function; +using CommandCallback = std::function; struct BackendDelegateImplBuilder { RefPtr taskExecutor; @@ -93,6 +94,7 @@ struct BackendDelegateImplBuilder { CastTemptoNormalCallback castTemptoNormalCallback; VisibilityChangedCallback visibilityChangedCallback; AcquireStateCallback acquireStateCallback; + CommandCallback commandCallback; void* ability; BackendType type; }; @@ -143,6 +145,7 @@ public: void OnApplicationDestroy(const std::string &packageName); sptr OnConnect(const OHOS::AAFwk::Want &want); void OnDisConnect(const OHOS::AAFwk::Want &want); + void OnCommand(const OHOS::AAFwk::Want &want, int startId); int32_t Insert(const Uri& uri, const OHOS::NativeRdb::ValuesBucket& value); std::shared_ptr Query( @@ -207,6 +210,7 @@ private: CastTemptoNormalCallback castTemptoNormalCallback_; VisibilityChangedCallback visibilityChangedCallback_; AcquireStateCallback acquireStateCallback_; + CommandCallback commandCallback_; RefPtr manifestParser_; void* ability_; diff --git a/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h b/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h index 9bc875b..d9fbb41 100644 --- a/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h +++ b/frameworks/bridge/pa_backend/engine/common/js_backend_engine.h @@ -74,6 +74,8 @@ public: virtual void OnCastTemptoNormal(const int64_t formId) = 0; virtual void OnVisibilityChanged(const std::map& formEventsMap) = 0; virtual void OnAcquireState(const OHOS::AAFwk::Want &want) = 0; + virtual void OnCommand(const OHOS::AAFwk::Want &want, int startId) = 0; + void SetFormData(const AppExecFwk::FormProviderData &formProviderData) { formProviderData_ = formProviderData; diff --git a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp index a4c557a..8ac26f0 100644 --- a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp +++ b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.cpp @@ -1095,7 +1095,6 @@ sptr QjsPaEngine::OnConnectService(const OHOS::AAFwk::Want &want) auto remoteObj = NAPI_ohos_rpc_getNativeRemoteObject(reinterpret_cast(nativeEngine_), reinterpret_cast(nativeValue)); JS_FreeValue(ctx, globalObj); - JS_FreeValue(ctx, retVal); return remoteObj; } } @@ -1128,6 +1127,7 @@ void QjsPaEngine::OnDisconnectService(const OHOS::AAFwk::Want &want) LOGE("Qjs OnDisconnectService FAILED!"); } JS_FreeValue(ctx, globalObj); + JS_FreeValue(ctx, retVal); } void QjsPaEngine::OnDelete(const int64_t formId) @@ -1261,4 +1261,38 @@ void QjsPaEngine::OnAcquireState(const OHOS::AAFwk::Want &want) return; } +void QjsPaEngine::OnCommand(const OHOS::AAFwk::Want &want, int startId) +{ + LOGI("OnCommand"); + JSContext *ctx = engineInstance_->GetQjsContext(); + ACE_DCHECK(ctx); + + QJSHandleScope handleScope(ctx); + JSValue globalObj = JS_GetGlobalObject(ctx); + JSValue paObj = QJSUtils::GetPropertyStr(ctx, globalObj, "pa"); + if (!JS_IsObject(paObj)) { + LOGE("get onCommand function error"); + return; + } + JSValue onCommandFunc = QJSUtils::GetPropertyStr(ctx, paObj, "onCommand"); + if (!JS_IsFunction(ctx, onCommandFunc)) { + LOGE("onCommand function is not found!"); + JS_FreeValue(ctx, globalObj); + return; + } + napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast(nativeEngine_), want); + NativeValue* nativeWant = reinterpret_cast(napiWant); + JSValue jsWant = (JSValue)*nativeWant; + JSValueConst argv[] = { + jsWant, + JS_NewInt32(ctx, startId) + }; + JSValue retVal = QJSUtils::Call(ctx, onCommandFunc, JS_UNDEFINED, countof(argv), argv); + if (JS_IsException(retVal)) { + LOGE("Qjs onCommand FAILED!"); + } + JS_FreeValue(ctx, globalObj); + JS_FreeValue(ctx, retVal); +} + } // namespace OHOS::Ace::Framework diff --git a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h index ed18ab2..db00427 100644 --- a/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h +++ b/frameworks/bridge/pa_backend/engine/quickjs/qjs_pa_engine.h @@ -163,6 +163,7 @@ public: void OnCastTemptoNormal(const int64_t formId) override; void OnVisibilityChanged(const std::map& formEventsMap) override; void OnAcquireState(const OHOS::AAFwk::Want &want) override; + void OnCommand(const OHOS::AAFwk::Want &want, int startId) override; private: void GetLoadOptions(std::string& optionStr); diff --git a/frameworks/bridge/pa_backend/pa_backend.cpp b/frameworks/bridge/pa_backend/pa_backend.cpp index e98b7d6..933360a 100644 --- a/frameworks/bridge/pa_backend/pa_backend.cpp +++ b/frameworks/bridge/pa_backend/pa_backend.cpp @@ -280,6 +280,15 @@ void PaBackend::InitializeBackendDelegate(const RefPtr &taskExecut jsBackendEngine->OnAcquireState(want); }; + builder.commandCallback = [weakEngine = WeakPtr(jsBackendEngine_)]( + const OHOS::AAFwk::Want &want, int startId) { + auto jsBackendEngine = weakEngine.Upgrade(); + if (!jsBackendEngine) { + return; + } + jsBackendEngine->OnCommand(want, startId); + }; + builder.taskExecutor = taskExecutor; builder.ability = ability_; builder.type = type_; @@ -414,4 +423,9 @@ void PaBackend::OnDisConnect(const OHOS::AAFwk::Want &want) delegate_->OnDisConnect(want); } +void PaBackend::OnCommand(const OHOS::AAFwk::Want &want, int startId) +{ + delegate_->OnCommand(want, startId); +} + } // namespace OHOS::Ace diff --git a/frameworks/bridge/pa_backend/pa_backend.h b/frameworks/bridge/pa_backend/pa_backend.h index 18d0771..52d20af 100644 --- a/frameworks/bridge/pa_backend/pa_backend.h +++ b/frameworks/bridge/pa_backend/pa_backend.h @@ -93,6 +93,8 @@ public: } } + void OnCommand(const OHOS::AAFwk::Want &want, int startId); + private: void InitializeBackendDelegate(const RefPtr& taskExecutor); BackendType type_ = BackendType::SERVICE; -- Gitee