diff --git a/interfaces/inner_api/file_access/include/file_access_extension_info.h b/interfaces/inner_api/file_access/include/file_access_extension_info.h index 2be9daa5a0ec7da9862291b3f6edcee8c2b4be63..bfc65ba79d182a1c0de735847bf643840848c243 100644 --- a/interfaces/inner_api/file_access/include/file_access_extension_info.h +++ b/interfaces/inner_api/file_access/include/file_access_extension_info.h @@ -304,11 +304,14 @@ struct ConnectExtensionInfo : public MessageParcelable { public: AAFwk::Want want = {}; sptr token = nullptr; + uintptr_t extConnection_ = 0; ConnectExtensionInfo() = default; ConnectExtensionInfo(AAFwk::Want want, sptr token) : want(want), token(token) {} + ConnectExtensionInfo(AAFwk::Want want, sptr token, uintptr_t connect) : want(want), + token(token), extConnection_(connect){} - bool WriteToParcel(MessageParcel &parcel) const override + bool WriteToParcel(MessageParcel &parcel, bool ifWriteConnect = false) const override { if (!parcel.WriteParcelable(&want)) { return false; @@ -316,10 +319,13 @@ public: if (!parcel.WriteRemoteObject(token)) { return false; } + if (ifWriteConnect && !parcel.WritePointer(extConnection_)) { + return false; + } return true; } - bool ReadFromParcel(MessageParcel &parcel) override + bool ReadFromParcel(MessageParcel &parcel, bool ifReadConnect = false) override { std::shared_ptr wantPtr(parcel.ReadParcelable()); token = parcel.ReadRemoteObject(); @@ -327,6 +333,12 @@ public: return false; } want = AAFwk::Want(*wantPtr); + if (ifReadConnect) { + extConnection_ = parcel.ReadPointer(); + if (extConnection_ == 0) { + return false; + } + } return true; } }; 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 be93711e10b38fbc74edd95fe3ff49b1d8f7ed4a..99441ccaee84ce4f26cfd995790ff93db1ba0c73 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 @@ -65,7 +65,14 @@ void FileAccessExtConnection::ConnectFileExtAbility(const AAFwk::Want &want, con fileExtProxy_ = nullptr; } isConnected_.store(false); - ErrCode ret = AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, this, token); + auto proxy = FileAccessServiceProxy::GetInstance(); + if (proxy == nullptr) { + HILOG_ERROR("ConnectFileExtAbility get SA failed"); + return E_LOAD_SA; + } + std::shared_ptr connectExtensionInfo = + std::make_shared(connectInfo->want, token, reinterpret_cast(this)); + int32_t ret = proxy->ConnectExtService(connectExtensionInfo); if (ret != ERR_OK) { HILOG_ERROR("ConnectAbility failed, ret=%{public}d", ret); return; diff --git a/services/native/file_access_service/include/file_access_service.h b/services/native/file_access_service/include/file_access_service.h index 4f92ab43943ce2299c682908e5f8b27ae905c031..00f7c7f5ec9ac92a242e81d1194406a88805a7be 100644 --- a/services/native/file_access_service/include/file_access_service.h +++ b/services/native/file_access_service/include/file_access_service.h @@ -235,6 +235,7 @@ protected: int32_t OnChange(Uri uri, NotifyType notifyType) override; int32_t GetExensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override; + int32_t ConnectExtService(const std::shared_ptr &info) override; private: class ExtensionDeathRecipient : public IRemoteObject::DeathRecipient { diff --git a/services/native/file_access_service/include/file_access_service_ipc_interface_code.h b/services/native/file_access_service/include/file_access_service_ipc_interface_code.h index 6e16398da7408c730591552c3315838c00223642..5c36dfcab9ea3d34e0e1613c2c9dfc9ae90a92ef 100644 --- a/services/native/file_access_service/include/file_access_service_ipc_interface_code.h +++ b/services/native/file_access_service/include/file_access_service_ipc_interface_code.h @@ -22,7 +22,8 @@ namespace FileAccessFwk { CMD_REGISTER_NOTIFY = 0, CMD_UNREGISTER_NOTIFY, CMD_ONCHANGE, - CMD_GET_EXTENSION_PROXY + CMD_GET_EXTENSION_PROXY, + CMD_CONNECT_EXT_SERVICE }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/include/file_access_service_proxy.h b/services/native/file_access_service/include/file_access_service_proxy.h index c938a9bc7f6d88eb3028fa9ff353b9d564bad0f5..66e28aa2dc611bda61d4442ff9ab57dc3ededb95 100644 --- a/services/native/file_access_service/include/file_access_service_proxy.h +++ b/services/native/file_access_service/include/file_access_service_proxy.h @@ -35,6 +35,7 @@ public: const std::shared_ptr &info) override; int32_t GetExensionProxy(const std::shared_ptr &info, sptr &extensionProxy) override; + int32_t ConnectExtService(const std::shared_ptr &info); class ServiceProxyLoadCallback : public SystemAbilityLoadCallbackStub { public: diff --git a/services/native/file_access_service/include/file_access_service_stub.h b/services/native/file_access_service/include/file_access_service_stub.h index cc01c4e4a61276b4911a2957fadac016d09ec619..4f5d9a1adc19688cb6c1794b4f59c32a130387d1 100644 --- a/services/native/file_access_service/include/file_access_service_stub.h +++ b/services/native/file_access_service/include/file_access_service_stub.h @@ -38,6 +38,7 @@ private: ErrCode CmdRegisterNotify(MessageParcel &data, MessageParcel &reply); ErrCode CmdUnregisterNotify(MessageParcel &data, MessageParcel &reply); ErrCode CmdGetExensionProxy(MessageParcel &data, MessageParcel &reply); + ErrCode CmdConnectExtService(MessageParcel &data, MessageParcel &reply); bool CheckCallingPermission(const std::string &permission); using RequestFuncType = int (FileAccessServiceStub::*)(MessageParcel &data, MessageParcel &reply); std::map stubFuncMap_; diff --git a/services/native/file_access_service/include/ifile_access_service_base.h b/services/native/file_access_service/include/ifile_access_service_base.h index fc0c44d262b61c444bfcc563881e521ddee114c7..5c8797f49e10f81a06f2adf34cb5d2e3ca364439 100644 --- a/services/native/file_access_service/include/ifile_access_service_base.h +++ b/services/native/file_access_service/include/ifile_access_service_base.h @@ -38,6 +38,7 @@ protected: //Get exension proxy by SA virtual int32_t GetExensionProxy(const std::shared_ptr &info, sptr &extensionProxy) = 0; + virtual int32_t ConnectExtension(const std::shared_ptr &info) = 0; }; } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/src/file_access_service.cpp b/services/native/file_access_service/src/file_access_service.cpp index 46d204ac7f833644cc8afbb6152777e24e7e57d8..32fff292a057d88e7b0dea2bf5ef50a707b21750 100644 --- a/services/native/file_access_service/src/file_access_service.cpp +++ b/services/native/file_access_service/src/file_access_service.cpp @@ -703,5 +703,17 @@ void FileAccessService::AddExtProxyInfo(std::string bundleName, sptr lock(mapMutex_); cMap_.emplace(bundleName, extProxy); } + +int32_t FileAccessService::ConnectExtService(const std::shared_ptr &info) +{ + if (info == nullptr || info->token == nullptr || info->connect_ == 0) { + HILOG_ERROR("ConnectExtensionInfo is invalid"); + return E_CONNECT; + } + FileAccessExtConnection *connect = reinterpret_cast(info->extConnection_); + int ret = AAFWK::AbilityManagerClient::GetInstance()->ConnectAbility(info->want, + connect, info->token); + return ret; +} } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/src/file_access_service_proxy.cpp b/services/native/file_access_service/src/file_access_service_proxy.cpp index 2397bdb54d8b3c3c5be5392460b702c9ac46dafd..b65fc21ce0fb65a5963dc4cebf04b40611644a53 100644 --- a/services/native/file_access_service/src/file_access_service_proxy.cpp +++ b/services/native/file_access_service/src/file_access_service_proxy.cpp @@ -351,5 +351,34 @@ int32_t FileAccessServiceProxy::GetExensionProxy(const std::shared_ptr &info) { + UserAccessTracer trace; + trace.Start("ConnectExtension"); + MessageParcel data; + if (!data.WriteInterfaceToken(FileAccessServiceProxy::GetDescriptor())) { + HILOG_ERROR("WriteInterfaceToken failed"); + return E_IPCS; + } + + if (info == nullptr) { + HILOG_ERROR("ExtensionInfo is nullptr"); + return E_GETINFO; + } + + if (!info->WriteToParcel(data, true)) { + HILOG_ERROR("fail to WriteParcelable Info"); + return E_IPCS; + } + + MessageParcel reply; + MessageOption option; + int err = Remote()->SendRequest(static_cast(FileAccessServiceInterfaceCode::CMD_CONNECT_EXT_SERVICE), + data, reply, option); + if (err != ERR_OK) { + HILOG_ERROR("fail to SendRequest. err: %{public}d", err); + } + return err; +} } // namespace FileAccessFwk } // namespace OHOS diff --git a/services/native/file_access_service/src/file_access_service_stub.cpp b/services/native/file_access_service/src/file_access_service_stub.cpp index 1ffe1759b2ba9eae29e18defa3d15573f6ab9e4a..24ed8460bbd7cbdcfc4ef14e483163f76c1d0f26 100644 --- a/services/native/file_access_service/src/file_access_service_stub.cpp +++ b/services/native/file_access_service/src/file_access_service_stub.cpp @@ -43,6 +43,8 @@ FileAccessServiceStub::FileAccessServiceStub() &FileAccessServiceStub::CmdUnregisterNotify; stubFuncMap_[static_cast(FileAccessServiceInterfaceCode::CMD_ONCHANGE)] = &FileAccessServiceStub::CmdOnChange; + stubFuncMap_[static_cast(FileAccessServiceInterfaceCode::CMD_CONNECT_EXT_SERVICE)] = + &FileAccessServiceStub::CmdConnectExtService; } FileAccessServiceStub::~FileAccessServiceStub() @@ -212,5 +214,22 @@ ErrCode FileAccessServiceStub::CmdGetExensionProxy(MessageParcel &data, MessageP } return ERR_OK; } + +ErrCode FileAccessServiceStub::CmdConnectExtService(MessageParcel &data, MessageParcel &reply) +{ + UserAccessTracer trace; + trace.Start("CmdConnectExtService"); + std::shared_ptr connectExtensionInfo = std::make_shared(); + if (!connectExtensionInfo->ReadFromParcel(data, true)) { + HILOG_ERROR("fail to read info"); + return E_IPCS; + } + int32_t ret = ConnectExtService(connectExtensionInfo); + if (!reply.WriteInt32(ret)) { + HILOG_ERROR("fail to Write connect result"); + return E_IPCS; + } + return ERR_OK; +} } // namespace FileAccessFwk } // namespace OHOS \ No newline at end of file