diff --git a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp index 57a09c4725e060ca9342d3f5df73846bba2b3628..06d5b947d6916fbc777d4e5c878f273a3de5e116 100644 --- a/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp +++ b/frameworks/js/napi/file_access_module/napi_fileaccess_helper.cpp @@ -772,18 +772,18 @@ napi_value NAPI_Copy(napi_env env, napi_callback_info info) if (!result) { return NapiFileInfoExporter::ThrowError(env, E_GETRESULT); } - int ret = ERR_OK; - auto cbExec = [srcPathStr, destPathStr, force, result, &ret, fileAccessHelper]() -> NError { + auto ret = std::make_shared(ERR_OK); + auto cbExec = [srcPathStr, destPathStr, force, result, ret, fileAccessHelper]() -> NError { OHOS::Uri srcUri(srcPathStr); OHOS::Uri destUri(destPathStr); - ret = fileAccessHelper->Copy(srcUri, destUri, *result, force); - if ((ret == COPY_EXCEPTION) && !result->empty()) { + *ret = fileAccessHelper->Copy(srcUri, destUri, *result, force); + if ((*ret == COPY_EXCEPTION) && !result->empty()) { return NError(result->at(0).errCode); } return NError(); }; - auto cbComplete = [&ret, result](napi_env env, NError err) -> NVal { - if (ret == COPY_EXCEPTION) { + auto cbComplete = [ret, result](napi_env env, NError err) -> NVal { + if (*ret == COPY_EXCEPTION) { return { env, err.GetNapiErr(env) }; } return { env, CreateObjectArray(env, *result) }; @@ -1364,18 +1364,18 @@ napi_value NAPI_MoveItem(napi_env env, napi_callback_info info) if (result == nullptr) { return NapiFileInfoExporter::ThrowError(env, E_GETRESULT); } - int ret = ERR_OK; - auto cbExec = [srcPathStr, destPathStr, force, result, &ret, fileAccessHelper]() -> NError { + auto ret = std::make_shared(ERR_OK); + auto cbExec = [srcPathStr, destPathStr, force, result, ret, fileAccessHelper]() -> NError { OHOS::Uri srcUri(srcPathStr); OHOS::Uri destUri(destPathStr); - ret = fileAccessHelper->MoveItem(srcUri, destUri, *result, force); - if ((ret == COPY_EXCEPTION) && !result->empty()) { + *ret = fileAccessHelper->MoveItem(srcUri, destUri, *result, force); + if ((*ret == COPY_EXCEPTION) && !result->empty()) { return NError(result->at(0).errCode); } return NError(); }; - auto cbComplete = [&ret, result](napi_env env, NError err) -> NVal { - if (ret == COPY_EXCEPTION) { + auto cbComplete = [ret, result](napi_env env, NError err) -> NVal { + if (*ret == COPY_EXCEPTION) { return { env, err.GetNapiErr(env) }; } return { env, CreateObjectArray(env, *result) }; diff --git a/interfaces/inner_api/file_access/include/file_access_ext_connection.h b/interfaces/inner_api/file_access/include/file_access_ext_connection.h index 640901dbd689470a2286b3b239f0602cbfb8019b..83801fe7a2ce11d632c0409c5d11b435471249ea 100644 --- a/interfaces/inner_api/file_access/include/file_access_ext_connection.h +++ b/interfaces/inner_api/file_access/include/file_access_ext_connection.h @@ -31,7 +31,7 @@ namespace FileAccessFwk { class FileAccessExtConnection : public AAFwk::AbilityConnectionStub { public: FileAccessExtConnection() = default; - virtual ~FileAccessExtConnection() = default; + virtual ~FileAccessExtConnection(); void OnAbilityConnectDone( const AppExecFwk::ElementName &element, const sptr &remoteObject, int resultCode) override; @@ -44,6 +44,7 @@ public: private: void AddFileAccessDeathRecipient(const sptr &token); + void RemoveFileAccessDeathRecipient(const sptr &token); struct ThreadLockInfo { std::condition_variable condition; std::mutex mutex; diff --git a/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp b/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp index 395ef5d203b55ea28a96f4bad65c6c7b2c5f0f58..3a6c782c3a01f47bb3626c584dfb36c422485007 100644 --- a/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp +++ b/interfaces/inner_api/file_access/src/file_access_ext_connection.cpp @@ -50,32 +50,41 @@ void FileAccessExtConnection::OnAbilityConnectDone( void FileAccessExtConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) { - fileExtProxy_ = nullptr; - isConnected_.store(false); + HILOG_INFO("OnAbilityDisconnectDone resultCode=%{public}d", resultCode); } void FileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want, const sptr &token) { + fileExtProxy_ = nullptr; + isConnected_.store(false); ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, token); - HILOG_INFO("ConnectFileExtAbility ret: %{public}d ", ret); if (ret != ERR_OK) { - HILOG_INFO("ConnectAbility ret=%{public}d", ret); + HILOG_ERROR("ConnectAbility failed, ret=%{public}d", ret); return; } std::unique_lock lock(connectLockInfo_.mutex); const int WAIT_TIME = 3; // second if (!connectLockInfo_.condition.wait_for(lock, std::chrono::seconds(WAIT_TIME), [this] { return fileExtProxy_ != nullptr && connectLockInfo_.isReady; })) { - HILOG_INFO("Wait connect timeout."); + HILOG_ERROR("Wait connect timeout."); + return; } + HILOG_INFO("ConnectFileExtAbility success"); } void FileAccessExtConnection::DisconnectFileExtAbility() { + if (fileExtProxy_ != nullptr) { + RemoveFileAccessDeathRecipient(fileExtProxy_->AsObject()); + } + ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(this); + if (ret != ERR_OK) { + HILOG_ERROR("DisconnectAbility failed, ret=%{public}d", ret); + return; + } fileExtProxy_ = nullptr; isConnected_.store(false); - ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(this); - HILOG_INFO("DisconnectFileExtAbility called end, ret=%{public}d", ret); + HILOG_INFO("DisconnectFileExtAbility done"); } bool FileAccessExtConnection::IsExtAbilityConnected() @@ -104,6 +113,14 @@ void FileAccessExtConnection::AddFileAccessDeathRecipient(const sptr &token) +{ + std::lock_guard lock(deathRecipientMutex_); + if (token != nullptr && callerDeathRecipient_ != nullptr) { + token->RemoveDeathRecipient(callerDeathRecipient_); + } +} + void FileAccessExtConnection::OnSchedulerDied(const wptr &remote) { HILOG_ERROR("OnSchedulerDied"); @@ -117,6 +134,13 @@ void FileAccessExtConnection::OnSchedulerDied(const wptr &remote) } } +FileAccessExtConnection::~FileAccessExtConnection() +{ + if (isConnected_.load()) { + DisconnectFileExtAbility(); + } +} + void FileAccessDeathRecipient::OnRemoteDied(const wptr &remote) { HILOG_ERROR("OnRemoteDied");