diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_base.h b/frameworks/ets/ani/accesstoken/include/ani_request_base.h index 97dc0697afde2c7f8b6b8bf8ee0de76c03cf7cb5..7cf069a1769176f91a8192fb4219f077c391d57a 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_base.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_base.h @@ -40,7 +40,6 @@ enum AniRequestType { struct RequestAsyncContextBase { AccessTokenID tokenId = 0; std::string bundleName; - AtmResult result; PermissionGrantInfo info; int32_t instanceId = -1; std::shared_ptr stageContext_ = nullptr; @@ -49,13 +48,17 @@ struct RequestAsyncContextBase { bool uiContentFlag = false; std::mutex lockReleaseFlag; + // result after requesting + AtmResult result_; + std::atomic needDynamicRequest_ = true; + #ifdef EVENTHANDLER_ENABLE std::shared_ptr handler_ = nullptr; #endif std::thread::id threadId_; ani_vm* vm_ = nullptr; ani_env* env_ = nullptr; - ani_ref callbackRef = nullptr; + ani_ref callbackRef_ = nullptr; AniRequestType contextType_; RequestAsyncContextBase(ani_vm* vm, ani_env* env, AniRequestType type); diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h b/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h index 4ae216cf62776d37eedd3c686cf7f522e9c032c4..40b76ecd0d3b5d211387a2c15fdfefde52924d40 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_global_switch_on_setting.h @@ -38,9 +38,11 @@ typedef enum { } SwitchType; struct RequestGlobalSwitchAsyncContext : public RequestAsyncContextBase { - bool isDynamic = true; - bool switchStatus = false; int32_t switchType = -1; + + // results after requesting + bool switchStatus = false; + RequestGlobalSwitchAsyncContext(ani_vm* vm, ani_env* env); ~RequestGlobalSwitchAsyncContext() override; int32_t ConvertErrorCode(int32_t errCode) override; diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_permission.h b/frameworks/ets/ani/accesstoken/include/ani_request_permission.h index ae8a192725090364048dc2aff368974e20b9cb5e..6598e1dd719c803be6b4e78a8365206ac2153dd2 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_permission.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_permission.h @@ -44,11 +44,12 @@ struct RequestAsyncContext : public RequestAsyncContextBase { int32_t ConvertErrorCode(int32_t code) override; ani_object WrapResult(ani_env* env) override; bool CheckDynamicRequest() override; - void HandleResult(const std::vector& permissionList, const std::vector& grantResults); + void HandleResult(const std::vector& grantResults); bool NoNeedUpdate() override; - bool needDynamicRequest = true; std::vector permissionList; + + // results after requesting std::vector grantResults; std::vector permissionsState; std::vector dialogShownResults; @@ -57,7 +58,7 @@ struct RequestAsyncContext : public RequestAsyncContextBase { class AuthorizationResult : public Security::AccessToken::TokenCallbackStub { public: - AuthorizationResult(std::shared_ptr& data); + AuthorizationResult(std::shared_ptr data); virtual ~AuthorizationResult() override; virtual void GrantResultsCallback( diff --git a/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h b/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h index d64097bb516e0eb897afc461db88c8e920dfe58f..cd0b7a0aa39dd97a0b8ba6e081d86e0e1a2b0d2c 100644 --- a/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h +++ b/frameworks/ets/ani/accesstoken/include/ani_request_permission_on_setting.h @@ -32,10 +32,10 @@ namespace OHOS { namespace Security { namespace AccessToken { struct RequestPermOnSettingAsyncContext: public RequestAsyncContextBase { - bool isDynamic = true; std::vector permissionList; - ani_object requestResult = nullptr; - std::vector stateList; + + // results after requesting + std::vector stateList_; RequestPermOnSettingAsyncContext(ani_vm* vm_, ani_env* env_); ~RequestPermOnSettingAsyncContext() override; diff --git a/frameworks/ets/ani/accesstoken/src/ani_common.cpp b/frameworks/ets/ani/accesstoken/src/ani_common.cpp index cf221cffe448378eb00a6adf31f577e2ac3732bb..25935beef4443125a16058c18e01844507222d6b 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_common.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_common.cpp @@ -86,7 +86,7 @@ void CreateUIExtensionMainThread(std::shared_ptr asyncC OHOS::Ace::UIContent* uiContent = GetUIContent(asyncContext->stageContext_); if (uiContent == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Get ui content failed!"); - asyncContext->result.errorCode = AccessToken::RET_FAILED; + asyncContext->result_.errorCode = AccessToken::RET_FAILED; asyncContext->uiExtensionFlag = false; return; } @@ -98,7 +98,7 @@ void CreateUIExtensionMainThread(std::shared_ptr asyncC sessionId, asyncContext->tokenId); if (sessionId <= 0) { LOGE(ATM_DOMAIN, ATM_TAG, "Create component failed, sessionId is invalid"); - asyncContext->result.errorCode = AccessToken::RET_FAILED; + asyncContext->result_.errorCode = AccessToken::RET_FAILED; asyncContext->uiExtensionFlag = false; return; } @@ -125,7 +125,7 @@ void CloseModalUIExtensionMainThread(std::shared_ptr as Ace::UIContent* uiContent = GetUIContent(asyncContext->stageContext_); if (uiContent == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Get ui content failed!"); - asyncContext->result.errorCode = RET_FAILED; + asyncContext->result_.errorCode = RET_FAILED; return; } uiContent->CloseModalUIExtension(sessionId); diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp index 143da38f176e48d7c0402d8c10daee87295a393b..5f1a89038cab22692d8d478d8fdbb4fb855891ae 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_base.cpp @@ -94,7 +94,7 @@ void RequestAsyncContextBase::CopyResult(const std::shared_ptr(callbackRef), error, result); + int32_t stsCode = ConvertErrorCode(result_.errorCode); + ani_object aniError = BusinessErrorAni::CreateError(env, stsCode, GetErrorMessage(stsCode, result_.errorMsg)); + ani_object aniResult = WrapResult(env); + (void)ExecuteAsyncCallback(env, reinterpret_cast(callbackRef_), aniError, aniResult); if (!isSameThread && vm_->DetachCurrentThread() != ANI_OK) { LOGE(ATM_DOMAIN, ATM_TAG, "DetachCurrentThread failed!"); @@ -133,9 +133,9 @@ void RequestAsyncContextBase::Clear() return; } - if (callbackRef != nullptr) { - curEnv->GlobalReference_Delete(callbackRef); - callbackRef = nullptr; + if (callbackRef_ != nullptr) { + curEnv->GlobalReference_Delete(callbackRef_); + callbackRef_ = nullptr; } } diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp index 93d8f2a6e93c96a9d496a65ecd5c5b60c6d2c460..daa13b54d8b1c9340aa50e1f02169f4f20e7e9fb 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_global_switch_on_setting.cpp @@ -87,7 +87,7 @@ ani_object RequestGlobalSwitchAsyncContext::WrapResult(ani_env* env) void RequestGlobalSwitchAsyncContext::ProcessUIExtensionCallback(const OHOS::AAFwk::Want& result) { - this->result.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); + this->result_.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); this->switchStatus = result.GetBoolParam(GLOBAL_SWITCH_RESULT_KEY, 0); } @@ -120,14 +120,14 @@ void RequestGlobalSwitchAsyncContext::CopyResult(const std::shared_ptr(other); - this->result.errorCode = ptr->result.errorCode; + this->result_.errorCode = ptr->result_.errorCode; this->switchStatus = ptr->switchStatus; - this->isDynamic = false; + this->needDynamicRequest_ = false; } bool RequestGlobalSwitchAsyncContext::CheckDynamicRequest() { - if (!this->isDynamic) { + if (!this->needDynamicRequest_) { LOGI(ATM_DOMAIN, ATM_TAG, "It does not need to request permission extension"); FinishCallback(); return false; @@ -137,13 +137,13 @@ bool RequestGlobalSwitchAsyncContext::CheckDynamicRequest() bool RequestGlobalSwitchAsyncContext::NoNeedUpdate() { - return result.errorCode != RET_SUCCESS || switchStatus == false; + return result_.errorCode != RET_SUCCESS || switchStatus == false; } void RequestGlobalSwitchAsyncContext::ProcessFailResult(int32_t code) { if (code == -1) { - result.errorCode = code; + result_.errorCode = code; } } @@ -152,12 +152,12 @@ static bool ParseRequestGlobalSwitch(ani_env* env, ani_object& aniContext, ani_i { asyncContext->switchType = static_cast(type); - if (!asyncContext->FillInfoFromContext(aniContext) != ANI_OK) { + if (!asyncContext->FillInfoFromContext(aniContext)) { BusinessErrorAni::ThrowParameterTypeError(env, STS_ERROR_PARAM_ILLEGAL, GetParamErrorMsg("context", "UIAbility or UIExtension Context")); return false; } - if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef)) { + if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef_)) { return false; } return true; @@ -198,7 +198,7 @@ void RequestGlobalSwitchExecute([[maybe_unused]] ani_env* env, GetRequestInstanceControl()->AddCallbackByInstanceId(asyncContext); LOGI(ATM_DOMAIN, ATM_TAG, "Start to pop ui extension dialog"); - if (asyncContext->result.errorCode != RET_SUCCESS) { + if (asyncContext->result_.errorCode != RET_SUCCESS) { asyncContext->FinishCallback(); LOGW(ATM_DOMAIN, ATM_TAG, "Failed to pop uiextension dialog."); } diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp index 96ec8c3180d0dafdfac621f8b393002d3fc9d736..96b93d789c22b8dd80d9f5a994f528cd64bc222d 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_permission.cpp @@ -74,15 +74,15 @@ static void CreateServiceExtension(std::shared_ptr asyncCon if (abilityContext == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Convert to AbilityContext failed. " \ "UIExtension ability can not pop service ablility window!"); - asyncContext->needDynamicRequest = false; - asyncContext->result.errorCode = RET_FAILED; + asyncContext->needDynamicRequest_ = false; + asyncContext->result_.errorCode = RET_FAILED; return; } OHOS::sptr remoteObject = new (std::nothrow) AuthorizationResult(asyncContext); if (remoteObject == nullptr) { LOGE(ATM_DOMAIN, ATM_TAG, "Create window failed!"); - asyncContext->needDynamicRequest = false; - asyncContext->result.errorCode = RET_FAILED; + asyncContext->needDynamicRequest_ = false; + asyncContext->result_.errorCode = RET_FAILED; return; } OHOS::AAFwk::Want want; @@ -104,6 +104,11 @@ static void CreateServiceExtension(std::shared_ptr asyncCon want.SetParam(REQUEST_TOKEN_KEY, abilityContext->GetToken()); int32_t ret = OHOS::AAFwk::AbilityManagerClient::GetInstance()->RequestDialogService( want, abilityContext->GetToken()); + if (ret != ERR_OK) { + LOGE(ATM_DOMAIN, ATM_TAG, "RequestDialogService failed!"); + asyncContext->needDynamicRequest_ = false; + asyncContext->result_.errorCode = RET_FAILED; + } LOGI(ATM_DOMAIN, ATM_TAG, "Request end, ret: %{public}d, tokenId: %{public}d, permNum: %{public}zu", ret, asyncContext->tokenId, asyncContext->permissionList.size()); } @@ -172,7 +177,7 @@ ani_object RequestAsyncContext::WrapResult(ani_env* env) LOGE(ATM_DOMAIN, ATM_TAG, "Object_New status %{public}d ", static_cast(status)); return nullptr; } - auto state = this->needDynamicRequest ? this->grantResults : this->permissionsState; + auto state = this->needDynamicRequest_ ? this->grantResults : this->permissionsState; ani_ref aniPerms = CreateAniArrayString(env, permissionList); ani_ref aniAuthRes = CreateAniArrayInt(env, state); ani_ref aniDiasShownRes = CreateAniArrayBool(env, dialogShownResults); @@ -191,15 +196,20 @@ ani_object RequestAsyncContext::WrapResult(ani_env* env) return aObject; } -void RequestAsyncContext::HandleResult(const std::vector& permissionList, - const std::vector& grantResults) +void RequestAsyncContext::HandleResult(const std::vector& grantResults) { + if (permissionsState.size() != grantResults.size()) { + LOGE(ATM_DOMAIN, ATM_TAG, "Size of permissionsState(%{public}zu) and " \ + "grantResults(%{public}zu) is not euqal", + permissionsState.size(), grantResults.size()); + return; + } std::vector newGrantResults; - size_t size = permissionList.size(); + size_t size = grantResults.size(); for (size_t i = 0; i < size; i++) { int32_t result = static_cast(this->permissionsState[i]); if (this->permissionsState[i] == AccessToken::DYNAMIC_OPER) { - result = this->result.errorCode == AccessToken::RET_SUCCESS ? + result = this->result_.errorCode == AccessToken::RET_SUCCESS ? grantResults[i] : AccessToken::INVALID_OPER; } newGrantResults.emplace_back(result); @@ -207,7 +217,7 @@ void RequestAsyncContext::HandleResult(const std::vector& permissio if (newGrantResults.empty()) { LOGE(ATM_DOMAIN, ATM_TAG, "GrantResults empty"); - result.errorCode = RET_FAILED; + result_.errorCode = RET_FAILED; } this->grantResults.assign(newGrantResults.begin(), newGrantResults.end()); } @@ -254,7 +264,7 @@ bool RequestAsyncContext::CheckDynamicRequest() permissionsState.clear(); dialogShownResults.clear(); if (!IsDynamicRequest()) { - HandleResult(this->permissionList, this->permissionsState); + HandleResult(this->permissionsState); FinishCallback(); return false; } @@ -265,12 +275,12 @@ void RequestAsyncContext::ProcessUIExtensionCallback(const OHOS::AAFwk::Want& re { this->permissionList = result.GetStringArrayParam(PERMISSION_KEY); this->permissionsState = result.GetIntArrayParam(RESULT_KEY); - HandleResult(permissionList, permissionsState); + HandleResult(this->permissionsState); } int32_t RequestAsyncContext::ConvertErrorCode(int32_t code) { - return BusinessErrorAni::GetStsErrorCode(result.errorCode); + return BusinessErrorAni::GetStsErrorCode(result_.errorCode); } bool RequestAsyncContext::NoNeedUpdate() @@ -278,14 +288,14 @@ bool RequestAsyncContext::NoNeedUpdate() return true; } -static void RequestPermissionsFromUserProcess(std::shared_ptr& asyncContext) +static void RequestPermissionsFromUserProcess(std::shared_ptr asyncContext) { if (!asyncContext->IsDynamicRequest()) { LOGE(ATM_DOMAIN, ATM_TAG, "It does not need to request permission"); - asyncContext->needDynamicRequest = false; - if ((asyncContext->permissionsState.empty()) && (asyncContext->result.errorCode == RET_SUCCESS)) { + asyncContext->needDynamicRequest_ = false; + if ((asyncContext->permissionsState.empty()) && (asyncContext->result_.errorCode == RET_SUCCESS)) { LOGE(ATM_DOMAIN, ATM_TAG, "GrantResults empty"); - asyncContext->result.errorCode = RET_FAILED; + asyncContext->result_.errorCode = RET_FAILED; } return; } @@ -320,7 +330,7 @@ static void RequestPermissionsFromUserProcess(std::shared_ptr& asyncContext) + ani_object callback, std::shared_ptr asyncContext) { if (!asyncContext->FillInfoFromContext(aniContext)) { LOGE(ATM_DOMAIN, ATM_TAG, "FillInfoFromContext failed."); @@ -329,7 +339,7 @@ static bool ParseParameter(ani_env* env, ani_object aniContext, ani_array_ref an return false; } asyncContext->permissionList = ParseAniStringVector(env, aniPermissionList); - if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef)) { + if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef_)) { return false; } return true; @@ -367,7 +377,7 @@ void RequestPermissionsFromUserExecute([[maybe_unused]] ani_env* env, [[maybe_un return; } RequestPermissionsFromUserProcess(asyncContext); - if (asyncContext->needDynamicRequest) { + if (asyncContext->needDynamicRequest_) { return; } asyncContext->FinishCallback(); @@ -376,7 +386,7 @@ void RequestPermissionsFromUserExecute([[maybe_unused]] ani_env* env, [[maybe_un } -AuthorizationResult::AuthorizationResult(std::shared_ptr& data) : data_(data) +AuthorizationResult::AuthorizationResult(std::shared_ptr data) : data_(data) { LOGI(ATM_DOMAIN, ATM_TAG, "AuthorizationResult"); } @@ -394,7 +404,7 @@ void AuthorizationResult::GrantResultsCallback( return; } LOGI(ATM_DOMAIN, ATM_TAG, "GrantResultsCallback"); - asyncContext->HandleResult(permissionList, grantResults); + asyncContext->HandleResult(grantResults); asyncContext->FinishCallback(); } diff --git a/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp b/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp index e1cfcb1baf7e068ffe9bba2d601ee5a943da96ff..be158469457e3ebeb995ff00b18e43617b0f76d6 100644 --- a/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp +++ b/frameworks/ets/ani/accesstoken/src/ani_request_permission_on_setting.cpp @@ -79,7 +79,8 @@ ani_object RequestPermOnSettingAsyncContext::WrapResult(ani_env* env) } ani_object arrayObj; - if (env->Object_New(arrayCls, arrayCtor, &arrayObj, this->stateList.size()) != ANI_OK) { + if (env->Object_New(arrayCls, arrayCtor, &arrayObj, static_cast(this->stateList_.size())) + != ANI_OK) { LOGE(ATM_DOMAIN, ATM_TAG, "Object new failed!"); return nullptr; } @@ -92,7 +93,7 @@ ani_object RequestPermOnSettingAsyncContext::WrapResult(ani_env* env) } ani_size index = 0; - for (const auto& state: this->stateList) { + for (const auto& state: this->stateList_) { ani_enum_item enumItem; ani_size enumIndex = 0; StateToEnumIndex(state, enumIndex); @@ -143,8 +144,8 @@ int32_t RequestPermOnSettingAsyncContext::ConvertErrorCode(int32_t errorCode) void RequestPermOnSettingAsyncContext::ProcessUIExtensionCallback(const OHOS::AAFwk::Want& result) { - this->result.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); - this->stateList = result.GetIntArrayParam(PERMISSION_RESULT_KEY); + this->result_.errorCode = result.GetIntParam(RESULT_ERROR_KEY, 0); + this->stateList_ = result.GetIntArrayParam(PERMISSION_RESULT_KEY); } void RequestPermOnSettingAsyncContext::StartExtensionAbility(std::shared_ptr asyncContext) @@ -195,14 +196,14 @@ void RequestPermOnSettingAsyncContext::CopyResult(const std::shared_ptr(other); - this->result.errorCode = ptr->result.errorCode; - this->stateList = ptr->stateList; - this->isDynamic = false; + this->result_.errorCode = ptr->result_.errorCode; + this->stateList_ = ptr->stateList_; + this->needDynamicRequest_ = false; } bool RequestPermOnSettingAsyncContext::CheckDynamicRequest() { - if (!this->isDynamic) { + if (!this->needDynamicRequest_) { LOGI(ATM_DOMAIN, ATM_TAG, "It does not need to request permission extension"); FinishCallback(); return false; @@ -213,16 +214,16 @@ bool RequestPermOnSettingAsyncContext::CheckDynamicRequest() void RequestPermOnSettingAsyncContext::ProcessFailResult(int32_t code) { if (code == -1) { - this->result.errorCode = code; + this->result_.errorCode = code; } } bool RequestPermOnSettingAsyncContext::NoNeedUpdate() { - if (result.errorCode != RET_SUCCESS) { + if (result_.errorCode != RET_SUCCESS) { return true; } - for (int32_t item : this->stateList) { + for (int32_t item : this->stateList_) { if (item != PERMISSION_GRANTED) { return true; } @@ -239,7 +240,7 @@ static bool ParseRequestPermissionOnSetting(ani_env* env, ani_object& aniContext return false; } asyncContext->permissionList = ParseAniStringVector(env, aniPermissionList); - if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef)) { + if (!AniParseCallback(env, reinterpret_cast(callback), asyncContext->callbackRef_)) { return false; } return true; @@ -282,7 +283,7 @@ void RequestPermissionOnSettingExecute([[maybe_unused]] ani_env* env, GetRequestInstanceControl()->AddCallbackByInstanceId(asyncContext); LOGI(ATM_DOMAIN, ATM_TAG, "Start to pop ui extension dialog."); - if (asyncContext->result.errorCode != RET_SUCCESS) { + if (asyncContext->result_.errorCode != RET_SUCCESS) { asyncContext->FinishCallback(); LOGW(ATM_DOMAIN, ATM_TAG, "Failed to pop uiextension dialog."); }