From e12df1c821b9cd5f441eca9d657b60e6bf5d8320 Mon Sep 17 00:00:00 2001 From: songjindian Date: Tue, 9 May 2023 16:58:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0forcestop=20data=E4=BC=A0?= =?UTF-8?q?=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: songjindian --- .../include/slite/abilityms_slite_client.h | 2 + .../src/slite/abilityms_slite_client.cpp | 56 +++++++++++++++++-- .../include/slite/ability_record_manager.h | 4 +- .../src/slite/ability_mgr_service_slite.cpp | 11 +++- .../src/slite/ability_record_manager.cpp | 30 ++++++++-- .../src/slite/ability_thread.cpp | 9 ++- 6 files changed, 97 insertions(+), 15 deletions(-) diff --git a/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h b/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h index 4c959e8..8036947 100755 --- a/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h +++ b/frameworks/abilitymgr_lite/include/slite/abilityms_slite_client.h @@ -47,6 +47,8 @@ public: int32_t ForceStop(char *bundleName) const; + int32_t ForceStop(const Want *want) const; + ElementName *GetTopAbility() const; void SetServiceIdentity(const Identity *identity); diff --git a/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp b/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp index 91cf50f..7ccd9db 100644 --- a/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp +++ b/frameworks/abilitymgr_lite/src/slite/abilityms_slite_client.cpp @@ -81,7 +81,7 @@ int32_t AbilityMsClient::StartAbility(const Want *want) const HILOG_INFO(HILOG_MODULE_APP, "start ability with input data"); } else { const char* defaultData = "data"; - SetWantData(info, defaultData, 5); + SetWantData(info, defaultData, strlen(defaultData) + 1); HILOG_INFO(HILOG_MODULE_APP, "start ability with default data"); } data->want = info; @@ -151,13 +151,61 @@ int32_t AbilityMsClient::ForceStop(char *bundleName) const if (identity_ == nullptr) { return PARAM_CHECK_ERROR; } - char *name = Utils::Strdup(bundleName); + Want *want = static_cast(AdapterMalloc(sizeof(Want))); + if (want == nullptr) { + return MEMORY_MALLOC_ERROR; + } + want->element = reinterpret_cast(AdapterMalloc(sizeof(ElementName))); + if (want->element == nullptr) { + return MEMORY_MALLOC_ERROR; + } + want->element->deviceId = nullptr; + want->element->bundleName = Utils::Strdup(bundleName); + want->element->abilityName = nullptr; + want->data = nullptr; + want->dataLength = 0; + want->appPath = nullptr; + const char *forceData = "forcedata"; + SetWantData(want, forceData, strlen(forceData) + 1); + if (want->data != nullptr) { + HILOG_INFO(HILOG_MODULE_APP, "force stop with default data"); + } Request request = { .msgId = TERMINATE_APP_BY_BUNDLENAME, - .len = (int16)strlen(name), - .data = reinterpret_cast(name), + .len = sizeof(Want), + .data = want, }; + return SAMGR_SendRequest(identity_, &request, nullptr); +} +int32_t AbilityMsClient::ForceStop(const Want *want) const +{ + if (identity_ == nullptr) { + return PARAM_CHECK_ERROR; + } + if (want == nullptr || want->element == nullptr || want->element->bundleName == nullptr) { + return PARAM_CHECK_ERROR; + } + Want *info = static_cast(AdapterMalloc(sizeof(Want))); + if (info == nullptr) { + return MEMORY_MALLOC_ERROR; + } + info->element = nullptr; + info->data = nullptr; + info->dataLength = 0; + info->appPath = nullptr; + SetWantElement(info, *(want->element)); + SetWantData(info, want->data, want->dataLength); + if (want->data != nullptr) { + HILOG_INFO(HILOG_MODULE_APP, "force stop with data"); + } else { + HILOG_INFO(HILOG_MODULE_APP, "force stop with no data"); + } + Request request = { + .msgId = TERMINATE_APP_BY_BUNDLENAME, + .len = sizeof(Want), + .data = info, + }; return SAMGR_SendRequest(identity_, &request, nullptr); } diff --git a/services/abilitymgr_lite/include/slite/ability_record_manager.h b/services/abilitymgr_lite/include/slite/ability_record_manager.h index bbc575b..c9df022 100644 --- a/services/abilitymgr_lite/include/slite/ability_record_manager.h +++ b/services/abilitymgr_lite/include/slite/ability_record_manager.h @@ -50,8 +50,10 @@ public: int32_t StartAbility(const Want *want); int32_t TerminateAbility(uint16_t token); + + int32_t TerminateAbility(uint16_t token, const Want* want); - int32_t ForceStop(const char *bundleName); + int32_t ForceStop(const Want *want); int32_t ForceStopBundle(uint16_t token); diff --git a/services/abilitymgr_lite/src/slite/ability_mgr_service_slite.cpp b/services/abilitymgr_lite/src/slite/ability_mgr_service_slite.cpp index 94054c5..7e8bede 100755 --- a/services/abilitymgr_lite/src/slite/ability_mgr_service_slite.cpp +++ b/services/abilitymgr_lite/src/slite/ability_mgr_service_slite.cpp @@ -169,8 +169,15 @@ BOOL AbilityMgrServiceSlite::ServiceMessageHandle(Service *service, Request *req } else if (request->msgId == TERMINATE_APP) { ret = AbilityRecordManager::GetInstance().ForceStopBundle(request->msgValue); } else if (request->msgId == TERMINATE_APP_BY_BUNDLENAME) { - char *bundleName = reinterpret_cast(request->data); - ret = AbilityRecordManager::GetInstance().ForceStop(bundleName); + auto *data = static_cast(request->data); + if (data == nullptr) { + return FALSE; + } + ret = AbilityRecordManager::GetInstance().ForceStop(data); + ClearWant(data); + AdapterFree(request->data); + request->data = nullptr; + request->len = 0; } return ret == ERR_OK; } diff --git a/services/abilitymgr_lite/src/slite/ability_record_manager.cpp b/services/abilitymgr_lite/src/slite/ability_record_manager.cpp index 5d3e0e8..e1c6812 100644 --- a/services/abilitymgr_lite/src/slite/ability_record_manager.cpp +++ b/services/abilitymgr_lite/src/slite/ability_record_manager.cpp @@ -309,6 +309,11 @@ int32_t AbilityRecordManager::StartAbility(AbilitySvcInfo *info) } int32_t AbilityRecordManager::TerminateAbility(uint16_t token) +{ + return TerminateAbility(token, nullptr); +} + +int32_t AbilityRecordManager::TerminateAbility(uint16_t token, const Want* want = nullptr) { HILOG_INFO(HILOG_MODULE_AAFWK, "TerminateAbility [%{public}u]", token); AbilityRecord *topRecord = const_cast(abilityList_.GetTopAbility()); @@ -367,6 +372,17 @@ int32_t AbilityRecordManager::TerminateAbility(uint16_t token) abilityList_.Add(topRecord); abilityList_.Add(newTopRecord); } + if (want != nullptr) { + if (newTopRecord->abilityData != nullptr) { + AdapterFree(newTopRecord->abilityData->wantData); + } + if (want->data != nullptr) { + newTopRecord->SetWantData(want->data, want->dataLength); + } + HILOG_INFO(HILOG_MODULE_AAFWK, "Terminate ability with want, dataLength is %{public}u", want->dataLength); + } else { + HILOG_INFO(HILOG_MODULE_AAFWK, "Terminate ability with no want"); + } // TerminateAbility top js pendingToken_ = newTopRecord->token; @@ -404,22 +420,24 @@ int32_t AbilityRecordManager::ForceStopBundle(uint16_t token) return ERR_OK; } -int32_t AbilityRecordManager::ForceStop(const char *bundleName) +int32_t AbilityRecordManager::ForceStop(const Want *want) { - if (bundleName == nullptr) { + if (want == nullptr + || want->element == nullptr + || want->element->bundleName == nullptr) { return PARAM_NULL_ERROR; } // stop Launcher - if (IsLauncher(bundleName)) { - return TerminateAbility(0); + if (IsLauncher(want->element->bundleName)) { + return TerminateAbility(0, nullptr); } // stop js app - if (strcmp(abilityList_.GetTopAbility()->appName, bundleName) == 0) { + if (strcmp(abilityList_.GetTopAbility()->appName, want->element->bundleName) == 0) { AbilityRecord *topRecord = const_cast(abilityList_.GetTopAbility()); HILOG_INFO(HILOG_MODULE_AAFWK, "ForceStop [%{public}u]", topRecord->token); - return TerminateAbility(topRecord->token); + return TerminateAbility(topRecord->token, want); } return PARAM_CHECK_ERROR; } diff --git a/services/abilitymgr_lite/src/slite/ability_thread.cpp b/services/abilitymgr_lite/src/slite/ability_thread.cpp index 3caaf4f..8e5df41 100644 --- a/services/abilitymgr_lite/src/slite/ability_thread.cpp +++ b/services/abilitymgr_lite/src/slite/ability_thread.cpp @@ -35,9 +35,9 @@ int32_t AbilityThread::HandleCreate(const Want *want) return PARAM_NULL_ERROR; } if (want->data != nullptr) { - HILOG_INFO(HILOG_MODULE_APP, "start ability with data %{public}u", want->dataLength); + HILOG_INFO(HILOG_MODULE_AAFWK, "start ability with data %{public}u", want->dataLength); } else { - HILOG_INFO(HILOG_MODULE_APP, "start ability with no data"); + HILOG_INFO(HILOG_MODULE_AAFWK, "start ability with no data"); } ability_->OnCreate(*want); return ERR_OK; @@ -51,6 +51,11 @@ int32_t AbilityThread::HandleForeground(const Want *want) if (want == nullptr) { return PARAM_NULL_ERROR; } + if (want->data != nullptr) { + HILOG_INFO(HILOG_MODULE_AAFWK, "foreground ability with data %{public}u", want->dataLength); + } else { + HILOG_INFO(HILOG_MODULE_AAFWK, "foreground ability with no data"); + } ability_->OnForeground(*want); return ERR_OK; } -- Gitee