From b8ddb674c1b18da7659838418fb7cea132312bb6 Mon Sep 17 00:00:00 2001 From: liweifeng Date: Tue, 6 Jun 2023 23:42:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8D=A1=E7=89=87=E8=AE=A2?= =?UTF-8?q?=E9=98=85=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liweifeng Change-Id: I678a0f97587f7064289b29d9659e361a60bfd924 --- frameworks/js/napi/form_host/js_form_host.cpp | 2 +- .../napi/form_provider/js_form_provider.cpp | 75 ++++++- .../js/napi/form_provider/js_form_provider.h | 5 + .../inner_api/include/form_mgr_interface.h | 28 ++- interfaces/inner_api/include/form_mgr_proxy.h | 25 ++- interfaces/inner_api/include/form_mgr_stub.h | 17 ++ interfaces/inner_api/src/form_mgr_proxy.cpp | 94 ++++++++- interfaces/inner_api/src/form_mgr_stub.cpp | 71 +++++++ interfaces/kits/native/include/form_mgr.h | 8 +- interfaces/kits/native/src/form_mgr.cpp | 19 +- services/include/form_bms_helper.h | 1 + services/include/form_data_proxy_mgr.h | 7 + services/include/form_data_proxy_record.h | 23 ++- services/include/form_item_info.h | 4 + services/include/form_mgr_adapter.h | 9 +- services/include/form_mgr_service.h | 23 +++ services/src/form_bms_helper.cpp | 15 +- services/src/form_data_mgr.cpp | 3 + services/src/form_data_proxy_mgr.cpp | 76 ++++++- services/src/form_data_proxy_record.cpp | 191 +++++++++++++++--- services/src/form_item_info.cpp | 10 + services/src/form_mgr_adapter.cpp | 40 ++-- services/src/form_mgr_service.cpp | 25 +++ services/src/form_supply_callback.cpp | 11 +- .../mock_form_mgr_adapter.cpp | 4 +- 25 files changed, 709 insertions(+), 77 deletions(-) diff --git a/frameworks/js/napi/form_host/js_form_host.cpp b/frameworks/js/napi/form_host/js_form_host.cpp index 8df80d059..98f6900a6 100644 --- a/frameworks/js/napi/form_host/js_form_host.cpp +++ b/frameworks/js/napi/form_host/js_form_host.cpp @@ -1744,7 +1744,7 @@ private: NapiFormUtil::ThrowParamNumError(engine, std::to_string(info.argc), "1 or 2"); return engine.CreateUndefined(); } - + // The promise form has only one parameters decltype(info.argc) unwrapArgc = 1; int64_t formId = 0; diff --git a/frameworks/js/napi/form_provider/js_form_provider.cpp b/frameworks/js/napi/form_provider/js_form_provider.cpp index 39882afa3..42d1eca65 100644 --- a/frameworks/js/napi/form_provider/js_form_provider.cpp +++ b/frameworks/js/napi/form_provider/js_form_provider.cpp @@ -289,9 +289,17 @@ NativeValue *JsFormProvider::OnUpdateForm(NativeEngine &engine, NativeCallbackIn std::string formDataStr = GetStringByProp(env, arg1, "data"); formProviderData->SetDataString(formDataStr); formProviderData->ParseImagesData(); + + std::vector formDataProxies; + NativeObject* nativeObject = ConvertNativeValueTo(info.argv[PARAM1]); + NativeValue* nativeProxies = nativeObject->GetProperty("proxies"); + if (nativeProxies != nullptr) { + ConvertFromDataProxies(engine, nativeProxies, formDataProxies); + } + AsyncTask::CompleteCallback complete = - [formId, data = formProviderData](NativeEngine &engine, AsyncTask &task, int32_t status) { - int32_t ret = FormMgr::GetInstance().UpdateForm(formId, *data); + [formId, data = formProviderData, formDataProxies](NativeEngine &engine, AsyncTask &task, int32_t status) { + int32_t ret = FormMgr::GetInstance().UpdateForm(formId, *data, formDataProxies); if (ret != ERR_OK) { task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret)); return; @@ -382,13 +390,20 @@ NativeValue *JsFormProvider::OnRequestPublishForm(NativeEngine &engine, NativeCa formProviderData->SetDataString(formDataStr); formProviderData->ParseImagesData(); asyncCallbackInfo->formProviderData = std::move(formProviderData); + + NativeObject* nativeObject = ConvertNativeValueTo(info.argv[PARAM1]); + NativeValue* nativeProxies = nativeObject->GetProperty("proxies"); + if (nativeProxies != nullptr) { + ConvertFromDataProxies(engine, nativeProxies, asyncCallbackInfo->formDataProxies); + } convertArgc++; } AsyncTask::CompleteCallback complete = [asyncCallbackInfo](NativeEngine &engine, AsyncTask &task, int32_t status) { int64_t formId = 0; ErrCode ret = FormMgr::GetInstance().RequestPublishForm(asyncCallbackInfo->want, - asyncCallbackInfo->withFormBindingData, asyncCallbackInfo->formProviderData, formId); + asyncCallbackInfo->withFormBindingData, asyncCallbackInfo->formProviderData, formId, + asyncCallbackInfo->formDataProxies); if (ret != ERR_OK) { task.Reject(engine, NapiFormUtil::CreateErrorByInternalErrorCode(engine, ret)); return; @@ -402,5 +417,59 @@ NativeValue *JsFormProvider::OnRequestPublishForm(NativeEngine &engine, NativeCa engine, CreateAsyncTaskWithLastParam(engine, lastParam, nullptr, std::move(complete), &result)); return result; } + +bool JsFormProvider::ConvertFromDataProxies(NativeEngine& engine, NativeValue* jsValue, + std::vector &formDataProxies) +{ + if (jsValue == nullptr || !jsValue->IsArray()) { + HILOG_ERROR("%{public}s, jsValue is nullptr not array", __func__); + return false; + } + + auto array = ConvertNativeValueTo(jsValue); + if (array == nullptr) { + HILOG_ERROR("%{public}s, convert array failed", __func__); + return false; + } + + for (uint32_t i = 0; i < array->GetLength(); i++) { + AppExecFwk::FormDataProxy formDataProxy("", ""); + if (!ConvertFormDataProxy(engine, array->GetElement(i), formDataProxy)) { + HILOG_ERROR("GetElement from array [%{public}u] error", i); + return false; + } + formDataProxies.push_back(formDataProxy); + } + return true; +} + +bool JsFormProvider::ConvertFormDataProxy(NativeEngine& engine, NativeValue* jsValue, + AppExecFwk::FormDataProxy &formDataProxy) +{ + if (jsValue == nullptr || jsValue->TypeOf() != NATIVE_OBJECT) { + HILOG_ERROR("%{public}s, jsValue is nullptr not object", __func__); + return false; + } + + NativeObject *jsObject = ConvertNativeValueTo(jsValue); + if (jsObject == nullptr) { + HILOG_ERROR("%{public}s called, jsObject is nullptr.", __func__); + return false; + } + + NativeValue* key = jsObject->GetProperty("key"); + if (!ConvertFromJsValue(engine, key, formDataProxy.key)) { + HILOG_ERROR("Parse key failed"); + return false; + } + NativeValue* subscribeId = jsObject->GetProperty("subscriberId"); + if (subscribeId != nullptr && !ConvertFromJsValue(engine, subscribeId, formDataProxy.subscribeId)) { + HILOG_WARN("Parse subscribeId failed, use empty as default value."); + formDataProxy.subscribeId = ""; + } + HILOG_INFO("key is %{public}s, subscribeId is %{public}s", formDataProxy.key.c_str(), + formDataProxy.subscribeId.c_str()); + return true; +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/js/napi/form_provider/js_form_provider.h b/frameworks/js/napi/form_provider/js_form_provider.h index 26465c695..272047653 100644 --- a/frameworks/js/napi/form_provider/js_form_provider.h +++ b/frameworks/js/napi/form_provider/js_form_provider.h @@ -24,6 +24,7 @@ #include "napi/native_node_api.h" #include "nlohmann/json.hpp" #include "want.h" +#include namespace OHOS { namespace AbilityRuntime { @@ -31,6 +32,7 @@ struct RequestPublishFormCallbackInfo { Want want {}; bool withFormBindingData = false; std::unique_ptr formProviderData = nullptr; + std::vector formDataProxies; }; struct AsyncIsRequestPublishFormSupportedCallbackInfo : AsyncCallbackInfoBase { @@ -70,6 +72,9 @@ private: NativeValue* OnUpdateForm(NativeEngine &engine, NativeCallbackInfo &info); NativeValue* OnIsRequestPublishFormSupported(NativeEngine &engine, const NativeCallbackInfo &info); NativeValue* OnRequestPublishForm(NativeEngine &engine, NativeCallbackInfo &info); + bool ConvertFromDataProxies(NativeEngine& engine, NativeValue* jsValue, + std::vector &formDataProxies); + bool ConvertFormDataProxy(NativeEngine& engine, NativeValue* jsValue, AppExecFwk::FormDataProxy &formDataProxy); }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/interfaces/inner_api/include/form_mgr_interface.h b/interfaces/inner_api/include/form_mgr_interface.h index 9a4de8ad0..042035c13 100644 --- a/interfaces/inner_api/include/form_mgr_interface.h +++ b/interfaces/inner_api/include/form_mgr_interface.h @@ -23,6 +23,7 @@ #include "form_instances_filter.h" #include "form_js_info.h" #include "form_provider_data.h" +#include "form_provider_data_proxy.h" #include "form_share_info.h" #include "form_state_info.h" #include "ipc_types.h" @@ -423,6 +424,29 @@ public: * @return Returns ERR_OK on success, others on failure. */ virtual ErrCode RegisterRemoveObserver(const std::string &bundleName, const sptr &callerToken) = 0; + + /** + * @brief Update proxy form with formId. + * @param formId The Id of the form to update. + * @param FormProviderData Form binding data. + * @param std::vector Form proxy vector. + * @return Returns ERR_OK on success, others on failure. + */ + virtual ErrCode UpdateProxyForm(int64_t formId, const FormProviderData &FormProviderData, + const std::vector &formDataProxies) { return ERR_OK; } + + /** + * @brief Request to publish a proxy form to the form host. + * @param want The want of the form to publish. + * @param withFormBindingData Indicates whether the formBindingData is carried with. + * @param formBindingData Indicates the form data. + * @param formId Return the form id to be published. + * @param std::vector Form proxy vector. + * @return Returns ERR_OK on success, others on failure. + */ + virtual ErrCode RequestPublishProxyForm(Want &want, bool withFormBindingData, + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies) { return ERR_OK; } enum class Message { // ipc id 1-1000 for kit // ipc id 1001-2000 for DMS @@ -481,7 +505,9 @@ public: FORM_MGR_GET_FORM_INSTANCES_FROM_BY_FILTER, FORM_MGR_GET_FORM_INSTANCES_FROM_BY_ID, FORM_MGR_REGISTER_ADD_OBSERVER, - FORM_MGR_REGISTER_REMOVE_OBSERVER + FORM_MGR_REGISTER_REMOVE_OBSERVER, + FORM_MGR_UPDATE_PROXY_FORM, + FORM_MGR_REQUEST_PUBLISH_PROXY_FORM }; }; } // namespace AppExecFwk diff --git a/interfaces/inner_api/include/form_mgr_proxy.h b/interfaces/inner_api/include/form_mgr_proxy.h index afc2df507..3efc54bcf 100644 --- a/interfaces/inner_api/include/form_mgr_proxy.h +++ b/interfaces/inner_api/include/form_mgr_proxy.h @@ -347,7 +347,7 @@ public: * @return Returns ERR_OK on success, others on failure. */ int32_t SetBackgroundFunction(const std::string funcName, const std::string params) override; - + /** * @brief get forms count. * @param isTempFormFlag Indicates temp form or not. @@ -413,6 +413,28 @@ public: */ ErrCode RegisterRemoveObserver(const std::string &bundleName, const sptr &callerToken) override; + /** + * @brief Update proxy form with formId, send formId to form manager service. + * @param formId The Id of the form to update. + * @param FormProviderData Form binding data. + * @param std::vector Form proxy vector. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateProxyForm(int64_t formId, const FormProviderData &FormProviderData, + const std::vector &formDataProxies) override; + + /** + * @brief Request to publish a proxy form to the form host. + * @param want The want of the form to publish. + * @param withFormBindingData Indicates whether the formBindingData is carried with. + * @param formBindingData Indicates the form data. + * @param formId Return the form id to be published. + * @param std::vector Form proxy vector. + * @return Returns ERR_OK on success, others on failure. + */ + virtual ErrCode RequestPublishProxyForm(Want &want, bool withFormBindingData, + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies) override; private: template int GetParcelableInfos(MessageParcel &reply, std::vector &parcelableInfos); @@ -425,6 +447,7 @@ private: ErrCode GetRunningFormInfos(IFormMgr::Message code, MessageParcel &data, std::vector &runningFormInfos); int32_t GetFormInstance(IFormMgr::Message code, MessageParcel &data, std::vector &formInstances); + bool WriteFormDataProxies(MessageParcel &data, const std::vector &formDataProxies); private: static inline BrokerDelegator delegator_; }; diff --git a/interfaces/inner_api/include/form_mgr_stub.h b/interfaces/inner_api/include/form_mgr_stub.h index d5f0c625f..70952bf04 100644 --- a/interfaces/inner_api/include/form_mgr_stub.h +++ b/interfaces/inner_api/include/form_mgr_stub.h @@ -369,6 +369,23 @@ private: */ ErrCode HandleRegisterRemoveObserver(MessageParcel &data, MessageParcel &reply); + /** + * @brief update proxy form. + * @param data input param + * @param reply output param + * @return Return ERR_OK on success, others on failure + */ + ErrCode HandleUpdateProxyForm(MessageParcel &data, MessageParcel &reply); + + /** + * @brief handle request publish form message. + * @param data input param. + * @param reply output param. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode HandleRequestPublishProxyForm(MessageParcel &data, MessageParcel &reply); + + bool ReadFormDataProxies(MessageParcel &data, std::vector &formDataProxies); private: using FormMgrFunc = int32_t (FormMgrStub::*)(MessageParcel &data, MessageParcel &reply); std::map memberFuncMap_; diff --git a/interfaces/inner_api/src/form_mgr_proxy.cpp b/interfaces/inner_api/src/form_mgr_proxy.cpp index c1a0fa6e0..4ff07e9e3 100644 --- a/interfaces/inner_api/src/form_mgr_proxy.cpp +++ b/interfaces/inner_api/src/form_mgr_proxy.cpp @@ -1295,7 +1295,7 @@ int32_t FormMgrProxy::AcquireFormData(int64_t formId, int64_t requestCode, const HILOG_ERROR("failed to write callerToken."); return ERR_APPEXECFWK_PARCEL_ERROR; } - + int error; MessageParcel reply; error = SendTransactCmd(IFormMgr::Message::FORM_MGR_ACQUIRE_DATA, data, reply); @@ -1620,5 +1620,97 @@ ErrCode FormMgrProxy::RegisterRemoveObserver(const std::string &bundleName, cons } return reply.ReadInt32(); } + +ErrCode FormMgrProxy::UpdateProxyForm(int64_t formId, const FormProviderData &FormProviderData, + const std::vector &formDataProxies) +{ + MessageParcel data; + if (!WriteInterfaceToken(data)) { + HILOG_ERROR("%{public}s, failed to write interface token", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteInt64(formId)) { + HILOG_ERROR("%{public}s, failed to write formId", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteParcelable(&FormProviderData)) { + HILOG_ERROR("%{public}s, failed to write formBindingData", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!WriteFormDataProxies(data, formDataProxies)) { + HILOG_ERROR("failed to write form data proxies."); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + MessageParcel reply; + int32_t error = SendTransactCmd(IFormMgr::Message::FORM_MGR_UPDATE_PROXY_FORM, data, reply); + if (error != ERR_OK) { + HILOG_ERROR("failed to SendTransactCmd."); + return error; + } + return reply.ReadInt32(); +} + +ErrCode FormMgrProxy::RequestPublishProxyForm(Want &want, bool withFormBindingData, + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies) +{ + MessageParcel data; + + if (!WriteInterfaceToken(data)) { + HILOG_ERROR("%{public}s, failed to write interface token", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteParcelable(&want)) { + HILOG_ERROR("%{public}s, failed to write want", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (!data.WriteBool(withFormBindingData)) { + HILOG_ERROR("%{public}s, failed to write withFormBindingData", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + if (withFormBindingData) { + if (!data.WriteParcelable(formBindingData.get())) { + HILOG_ERROR("%{public}s, failed to write formBindingData", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + } + if (!WriteFormDataProxies(data, formDataProxies)) { + HILOG_ERROR("failed to write form data proxies."); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + MessageParcel reply; + int32_t error = SendTransactCmd(IFormMgr::Message::FORM_MGR_REQUEST_PUBLISH_PROXY_FORM, data, reply); + if (error != ERR_OK) { + HILOG_ERROR("failed to SendTransactCmd."); + return error; + } + ErrCode errCode = reply.ReadInt32(); + if (errCode == ERR_OK) { + formId = reply.ReadInt64(); + } + return errCode; +} + +bool FormMgrProxy::WriteFormDataProxies(MessageParcel &data, const std::vector &formDataProxies) +{ + HILOG_DEBUG("proxies size: %{public}zu.", formDataProxies.size()); + if (!data.WriteInt32(formDataProxies.size())) { + HILOG_ERROR("failed to marshalling form data proxies size."); + return false; + } + for (const auto &formDataProxy : formDataProxies) { + if (!data.WriteString16(Str8ToStr16(formDataProxy.key))) { + HILOG_ERROR("failed to marshalling form data proxies key: %{public}s.", formDataProxy.key.c_str()); + return false; + } + if (!data.WriteString16(Str8ToStr16(formDataProxy.subscribeId))) { + HILOG_ERROR("failed to marshalling form data proxies subscribeId: %{public}s.", + formDataProxy.subscribeId.c_str()); + return false; + } + } + return true; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/inner_api/src/form_mgr_stub.cpp b/interfaces/inner_api/src/form_mgr_stub.cpp index 395a548d3..d3de8e451 100644 --- a/interfaces/inner_api/src/form_mgr_stub.cpp +++ b/interfaces/inner_api/src/form_mgr_stub.cpp @@ -22,6 +22,7 @@ #include "ipc_skeleton.h" #include "ipc_types.h" #include "iremote_object.h" +#include namespace OHOS { namespace AppExecFwk { @@ -128,6 +129,10 @@ FormMgrStub::FormMgrStub() &FormMgrStub::HandleRegisterAddObserver; memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_REGISTER_REMOVE_OBSERVER)] = &FormMgrStub::HandleRegisterRemoveObserver; + memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_UPDATE_PROXY_FORM)] = + &FormMgrStub::HandleUpdateProxyForm; + memberFuncMap_[static_cast(IFormMgr::Message::FORM_MGR_REQUEST_PUBLISH_PROXY_FORM)] = + &FormMgrStub::HandleRequestPublishProxyForm; } FormMgrStub::~FormMgrStub() @@ -1098,5 +1103,71 @@ ErrCode FormMgrStub::HandleRegisterRemoveObserver(MessageParcel &data, MessagePa reply.WriteInt32(result); return result; } + +ErrCode FormMgrStub::HandleUpdateProxyForm(MessageParcel &data, MessageParcel &reply) +{ + int64_t formId = data.ReadInt64(); + std::unique_ptr formProviderData(data.ReadParcelable()); + if (formProviderData == nullptr) { + HILOG_ERROR("%{public}s, failed to get formProviderData.", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + std::vector formDataProxies; + if (!ReadFormDataProxies(data, formDataProxies)) { + HILOG_ERROR("failed to get formDataProxies."); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + int32_t result = UpdateProxyForm(formId, *formProviderData, formDataProxies); + reply.WriteInt32(result); + return result; +} + +ErrCode FormMgrStub::HandleRequestPublishProxyForm(MessageParcel &data, MessageParcel &reply) +{ + std::unique_ptr want(data.ReadParcelable()); + if (want == nullptr) { + HILOG_ERROR("%{public}s, failed to get want.", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + + bool withFormBindingData = data.ReadBool(); + std::unique_ptr formProviderData = nullptr; + if (withFormBindingData) { + formProviderData.reset(data.ReadParcelable()); + if (formProviderData == nullptr) { + HILOG_ERROR("%{public}s, failed to get formProviderData.", __func__); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + } + std::vector formDataProxies; + if (!ReadFormDataProxies(data, formDataProxies)) { + HILOG_ERROR("failed to get formDataProxies."); + return ERR_APPEXECFWK_PARCEL_ERROR; + } + int64_t formId = 0; + ErrCode result = RequestPublishProxyForm(*want, withFormBindingData, formProviderData, formId, formDataProxies); + reply.WriteInt32(result); + if (result == ERR_OK) { + reply.WriteInt64(formId); + } + return result; +} +bool FormMgrStub::ReadFormDataProxies(MessageParcel &data, std::vector &formDataProxies) +{ + auto number = data.ReadInt32(); + HILOG_DEBUG("proxies number: %{public}d.", number); + if (number < 0 || number > INT16_MAX) { + HILOG_ERROR("proxies number over limit: %{public}d.", number); + return false; + } + + for (auto i = 0; i < number; i++) { + FormDataProxy formDataProxy("", ""); + formDataProxy.key = Str16ToStr8(data.ReadString16()); + formDataProxy.subscribeId = Str16ToStr8(data.ReadString16()); + formDataProxies.push_back(formDataProxy); + } + return true; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/interfaces/kits/native/include/form_mgr.h b/interfaces/kits/native/include/form_mgr.h index 79efea34f..f01879ddc 100644 --- a/interfaces/kits/native/include/form_mgr.h +++ b/interfaces/kits/native/include/form_mgr.h @@ -30,6 +30,7 @@ #include "form_js_info.h" #include "form_mgr_interface.h" #include "form_provider_data.h" +#include "form_provider_data_proxy.h" #include "form_state_info.h" #include "iremote_object.h" #include "want.h" @@ -98,9 +99,11 @@ public: * @brief Update form with formId, send formId to form manager service. * @param formId The Id of the form to update. * @param formBindingData Form binding data. + * @param std::vector Form proxy vector. * @return Returns ERR_OK on success, others on failure. */ - int UpdateForm(const int64_t formId, const FormProviderData &formBindingData); + int UpdateForm(const int64_t formId, const FormProviderData &formBindingData, + const std::vector &formDataProxies = {}); /** * @brief Notify the form service that the form user's lifecycle is updated. @@ -226,7 +229,8 @@ public: * @return Returns ERR_OK on success, others on failure. */ ErrCode RequestPublishForm(Want &want, bool withFormBindingData, - std::unique_ptr &formBindingData, int64_t &formId); + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies = {}); /** * @brief Lifecycle Update. diff --git a/interfaces/kits/native/src/form_mgr.cpp b/interfaces/kits/native/src/form_mgr.cpp index 7a74da6f4..736a66c07 100644 --- a/interfaces/kits/native/src/form_mgr.cpp +++ b/interfaces/kits/native/src/form_mgr.cpp @@ -166,7 +166,8 @@ int FormMgr::ReleaseForm(const int64_t formId, const sptr &caller * @param formBindingData Form binding data. * @return Returns ERR_OK on success, others on failure. */ -int FormMgr::UpdateForm(const int64_t formId, const FormProviderData &formBindingData) +int FormMgr::UpdateForm(const int64_t formId, const FormProviderData &formBindingData, + const std::vector &formDataProxies) { HILOG_INFO("%{public}s called.", __func__); @@ -181,7 +182,7 @@ int FormMgr::UpdateForm(const int64_t formId, const FormProviderData &formBindin } // check formBindingData - if (formBindingData.GetDataString().empty()) { + if (formBindingData.GetDataString().empty() && formDataProxies.empty()) { HILOG_ERROR("%{public}s error, the formProviderData is null.", __func__); return ERR_APPEXECFWK_FORM_PROVIDER_DATA_EMPTY; } @@ -191,6 +192,7 @@ int FormMgr::UpdateForm(const int64_t formId, const FormProviderData &formBindin HILOG_ERROR("%{public}s failed errCode:%{public}d.", __func__, errCode); return errCode; } + auto hostCaller = FormCallerMgr::GetInstance().GetFormHostCaller(formId); if (hostCaller != nullptr) { hostCaller->UpdateForm(formId, formBindingData); @@ -201,7 +203,10 @@ int FormMgr::UpdateForm(const int64_t formId, const FormProviderData &formBindin formProviderCaller->UpdateForm(formId, formBindingData); } } - return remoteProxy_->UpdateForm(formId, formBindingData); + if (formDataProxies.empty()) { + return remoteProxy_->UpdateForm(formId, formBindingData); + } + return remoteProxy_->UpdateProxyForm(formId, formBindingData, formDataProxies); } /** @@ -456,7 +461,8 @@ int FormMgr::SetNextRefreshTime(const int64_t formId, const int64_t nextTime) } ErrCode FormMgr::RequestPublishForm(Want &want, bool withFormBindingData, - std::unique_ptr &formBindingData, int64_t &formId) + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies) { HILOG_INFO("%{public}s called.", __func__); ErrCode errCode = Connect(); @@ -464,7 +470,10 @@ ErrCode FormMgr::RequestPublishForm(Want &want, bool withFormBindingData, HILOG_ERROR("%{public}s failed errCode:%{public}d.", __func__, errCode); return errCode; } - return remoteProxy_->RequestPublishForm(want, withFormBindingData, formBindingData, formId); + if (formDataProxies.empty()) { + return remoteProxy_->RequestPublishForm(want, withFormBindingData, formBindingData, formId); + } + return remoteProxy_->RequestPublishProxyForm(want, withFormBindingData, formBindingData, formId, formDataProxies); } int FormMgr::LifecycleUpdate( diff --git a/services/include/form_bms_helper.h b/services/include/form_bms_helper.h index 25fca64f7..cb53f9e7b 100644 --- a/services/include/form_bms_helper.h +++ b/services/include/form_bms_helper.h @@ -147,6 +147,7 @@ public: ErrCode GetProxyDataInfos(const std::string &bundleName, const std::string &moduleName, int32_t userId, std::vector &proxyData); + ErrCode GetApplicationInfo(const std::string &bundleName, int32_t userId, ApplicationInfo &appInfo); static constexpr int64_t INVALID_UID = -1; private: /** diff --git a/services/include/form_data_proxy_mgr.h b/services/include/form_data_proxy_mgr.h index de42b3722..40169a0f4 100644 --- a/services/include/form_data_proxy_mgr.h +++ b/services/include/form_data_proxy_mgr.h @@ -34,9 +34,16 @@ public: ErrCode SubscribeFormData(int64_t formId, const std::vector &formDataProxies); ErrCode UnsubscribeFormData(int64_t formId); + void UpdateSubscribeFormData(int64_t formId, const std::vector &formDataProxies); + void ProduceFormDataProxies(int64_t formId, const std::vector &formDataProxies); + bool ConsumeFormDataProxies(int64_t formId, std::vector &formDataProxies); + void EnableSubscribeFormData(const std::vector &formIds); + void DisableSubscribeFormData(const std::vector &formIds); private: std::mutex formDataProxyRecordMutex_; std::map> formDataProxyRecordMap_; // formId:FormDataProxyRecord + std::mutex formDataProxiesMutex_; + std::map> formDataProxiesMap_; // formId:FormDataProxies }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/include/form_data_proxy_record.h b/services/include/form_data_proxy_record.h index f6fa268e8..d77e4d3af 100644 --- a/services/include/form_data_proxy_record.h +++ b/services/include/form_data_proxy_record.h @@ -29,32 +29,45 @@ namespace AppExecFwk { */ class FormDataProxyRecord : public std::enable_shared_from_this { public: - FormDataProxyRecord(int64_t formId, const std::string &bundleName, const std::string &moduleName); + FormDataProxyRecord(int64_t formId, const std::string &bundleName, const std::string &moduleName, uint32_t tokenId); ~FormDataProxyRecord(); ErrCode SubscribeFormData(const std::vector &formDataProxies); ErrCode UnsubscribeFormData(); + void UpdateSubscribeFormData(const std::vector &formDataProxies); + void EnableSubscribeFormData(); + void DisableSubscribeFormData(); private: struct FormDataProxyRequest { int64_t subscribeId; std::vector uris; }; - void ParseFormDataProxies(const std::vector &formDataProxies); void ConvertSubscribeMapToRequests(std::map &subscribeMap, std::vector &formDataProxyRequests); void UpdatePublishedDataForm(const std::vector &data); void UpdateRdbDataForm(const std::vector &data); - ErrCode SubscribeRdbFormData(); - ErrCode SubscribePublishFormData(); - + ErrCode SubscribeRdbFormData(std::map &rdbSubscribeMap); + ErrCode SubscribePublishFormData(std::map &publishSubscribeMap); + ErrCode UnsubscribeFormData(std::map &rdbSubscribeMap, + std::map &publishSubscribeMap); void OnRdbDataChange(const DataShare::RdbChangeNode &changeNode); void OnPublishedDataChange(const DataShare::PublishedDataChangeNode &changeNode); + void UpdateSubscribeMap(const std::vector &formDataProxies, + std::map &originRdbMap, + std::map &newRdbMap, + std::map &originPublishMap, + std::map &newPublishMap); + + ErrCode SetRdbSubsState(std::map &rdbSubscribeMap, bool subsState); + ErrCode SetPublishSubsState(std::map &publishSubscribeMap, bool subsState); + std::shared_ptr dataShareHelper_; int64_t formId_ = -1; std::string bundleName_; std::string moduleName_; + int32_t tokenId_; std::map rdbSubscribeMap_; // key: subscribeId std::map publishSubscribeMap_; // key: subscribeId }; diff --git a/services/include/form_item_info.h b/services/include/form_item_info.h index 202d39efe..c8b645091 100644 --- a/services/include/form_item_info.h +++ b/services/include/form_item_info.h @@ -305,6 +305,9 @@ public: * @param uiSyntax. */ void SetUiSyntax(const FormType &uiSyntax); + + void SetDataProxyFlag(bool dataProxyEnabled); + bool GetDataProxyFlag() const; private: /** * @brief Equal or not. @@ -342,6 +345,7 @@ private: std::string abilityModuleName_ = ""; std::unordered_map moduleInfoMap_; std::string deviceId_ = ""; + bool dataProxyEnabled_ = false; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/include/form_mgr_adapter.h b/services/include/form_mgr_adapter.h index 0c39689f1..e5c322c5c 100644 --- a/services/include/form_mgr_adapter.h +++ b/services/include/form_mgr_adapter.h @@ -80,13 +80,15 @@ public: int ReleaseForm(const int64_t formId, const sptr &callerToken, const bool delCache); /** - * @brief Update form with formId, send formId to form manager service. + * @brief Update form with formId. * @param formId The Id of the form to update. * @param bundleName Provider ability bundleName. * @param formProviderData form provider data. + * @param std::vector Form proxy vector. * @return Returns ERR_OK on success, others on failure. */ - int UpdateForm(const int64_t formId, const std::string &bundleName, const FormProviderData &formProviderData); + int UpdateForm(const int64_t formId, const std::string &bundleName, const FormProviderData &formProviderData, + const std::vector &formDataProxies = {}); /** * @brief Request form with formId and want, send formId and want to form manager service. @@ -175,7 +177,8 @@ public: * @return Returns ERR_OK on success, others on failure. */ ErrCode RequestPublishForm(Want &want, bool withFormBindingData, - std::unique_ptr &formBindingData, int64_t &formId); + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies = {}); /** * @brief Check if the request of publishing a form is supported by the host. diff --git a/services/include/form_mgr_service.h b/services/include/form_mgr_service.h index f5d384aa8..87865e116 100644 --- a/services/include/form_mgr_service.h +++ b/services/include/form_mgr_service.h @@ -447,6 +447,29 @@ public: * @return Returns ERR_OK on success, others on failure. */ ErrCode RegisterRemoveObserver(const std::string &bundleName, const sptr &callerToken) override; + + /** + * @brief Update proxy form with formId. + * @param formId The Id of the form to update. + * @param FormProviderData Form binding data. + * @param std::vector Form proxy vector. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode UpdateProxyForm(int64_t formId, const FormProviderData &FormProviderData, + const std::vector &formDataProxies) override; + + /** + * @brief Request to publish a proxy form to the form host. + * @param want The want of the form to publish. + * @param withFormBindingData Indicates whether the formBindingData is carried with. + * @param formBindingData Indicates the form data. + * @param formId Return the form id to be published. + * @param std::vector Form proxy vector. + * @return Returns ERR_OK on success, others on failure. + */ + ErrCode RequestPublishProxyForm(Want &want, bool withFormBindingData, + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies) override; private: enum class DumpKey { KEY_DUMP_HELP = 0, diff --git a/services/src/form_bms_helper.cpp b/services/src/form_bms_helper.cpp index a72601db4..2e558d94c 100644 --- a/services/src/form_bms_helper.cpp +++ b/services/src/form_bms_helper.cpp @@ -350,10 +350,23 @@ ErrCode FormBmsHelper::GetProxyDataInfos(const std::string &bundleName, const st sptr iBundleMgr = GetBundleMgr(); if (iBundleMgr == nullptr) { HILOG_ERROR("iBundleMgr is nullptr"); - return false; + return ERR_APPEXECFWK_FORM_GET_BMS_FAILED; } return IN_PROCESS_CALL(iBundleMgr->GetProxyDataInfos(bundleName, moduleName, proxyData, userId)); } + +ErrCode FormBmsHelper::GetApplicationInfo(const std::string &bundleName, int32_t userId, ApplicationInfo &appInfo) +{ + HILOG_DEBUG("called."); + sptr iBundleMgr = GetBundleMgr(); + if (iBundleMgr == nullptr) { + HILOG_ERROR("iBundleMgr is nullptr"); + return ERR_APPEXECFWK_FORM_GET_BMS_FAILED; + } + + return IN_PROCESS_CALL(iBundleMgr->GetApplicationInfoV9(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, + userId, appInfo)); +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_data_mgr.cpp b/services/src/form_data_mgr.cpp index 893f126f9..64d63b994 100644 --- a/services/src/form_data_mgr.cpp +++ b/services/src/form_data_mgr.cpp @@ -21,6 +21,7 @@ #include "form_bms_helper.h" #include "form_cache_mgr.h" #include "form_constants.h" +#include "form_data_proxy_mgr.h" #include "form_mgr_errors.h" #include "form_observer_record.h" #include "form_provider_mgr.h" @@ -184,6 +185,7 @@ FormRecord FormDataMgr::CreateFormRecord(const FormItemInfo &formInfo, const int callingUid) == newRecord.formUserUids.end()) { newRecord.formUserUids.emplace_back(callingUid); } + newRecord.isDataProxy = formInfo.GetDataProxyFlag(); formInfo.GetHapSourceDirs(newRecord.hapSourceDirs); HILOG_INFO("%{public}s end", __func__); @@ -598,6 +600,7 @@ void FormDataMgr::HandleHostDied(const sptr &remoteHost) if (std::find(recordTempForms.begin(), recordTempForms.end(), formId) != recordTempForms.end()) { FormRecord formRecord = itFormRecord->second; itFormRecord = formRecords_.erase(itFormRecord); + FormDataProxyMgr::GetInstance().UnsubscribeFormData(formId); FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, formRecord); } else { itFormRecord++; diff --git a/services/src/form_data_proxy_mgr.cpp b/services/src/form_data_proxy_mgr.cpp index 70249be1a..8e2270020 100644 --- a/services/src/form_data_proxy_mgr.cpp +++ b/services/src/form_data_proxy_mgr.cpp @@ -15,7 +15,9 @@ #include "form_data_proxy_mgr.h" +#include "form_bms_helper.h" #include "form_data_mgr.h" +#include "form_util.h" #include "form_mgr_errors.h" #include "hilog_wrapper.h" @@ -42,11 +44,6 @@ ErrCode FormDataProxyMgr::SubscribeFormData(int64_t formId, const std::vector lock(formDataProxyRecordMutex_); auto search = formDataProxyRecordMap_.find(formId); if (search != formDataProxyRecordMap_.end()) { @@ -59,8 +56,14 @@ ErrCode FormDataProxyMgr::SubscribeFormData(int64_t formId, const std::vector formDataProxyRecord = - std::make_shared(formId, formRecord.bundleName, formRecord.moduleName); + ApplicationInfo appInfo; + if (FormBmsHelper::GetInstance().GetApplicationInfo(formRecord.bundleName, FormUtil::GetCurrentAccountId(), + appInfo) != ERR_OK) { + HILOG_ERROR("get app info failed."); + return ERR_APPEXECFWK_FORM_COMMON_CODE; + } + std::shared_ptr formDataProxyRecord = std::make_shared(formId, + formRecord.bundleName, formRecord.moduleName, appInfo.accessTokenId); auto ret = formDataProxyRecord->SubscribeFormData(formDataProxies); if (ret != ERR_OK) { HILOG_ERROR("SubscribeFormData failed."); @@ -84,5 +87,64 @@ ErrCode FormDataProxyMgr::UnsubscribeFormData(int64_t formId) return ERR_OK; } + +void FormDataProxyMgr::UpdateSubscribeFormData(int64_t formId, const std::vector &formDataProxies) +{ + HILOG_DEBUG("update subscribe form data. formId: %{public}s", std::to_string(formId).c_str()); + std::lock_guard lock(formDataProxyRecordMutex_); + auto search = formDataProxyRecordMap_.find(formId); + if (search != formDataProxyRecordMap_.end()) { + if (search->second != nullptr) { + search->second->UpdateSubscribeFormData(formDataProxies); + } + } +} + +void FormDataProxyMgr::ProduceFormDataProxies(int64_t formId, const std::vector &formDataProxies) +{ + std::lock_guard lock(formDataProxiesMutex_); + formDataProxiesMap_[formId] = formDataProxies; +} + +bool FormDataProxyMgr::ConsumeFormDataProxies(int64_t formId, std::vector &formDataProxies) +{ + std::lock_guard lock(formDataProxiesMutex_); + auto search = formDataProxiesMap_.find(formId); + if (search == formDataProxiesMap_.end()) { + HILOG_DEBUG("no form data proxies, formId: %{public}s", std::to_string(formId).c_str()); + return false; + } + formDataProxies = search->second; + formDataProxiesMap_.erase(search); + return true; +} + +void FormDataProxyMgr::EnableSubscribeFormData(const std::vector &formIds) +{ + std::lock_guard lock(formDataProxyRecordMutex_); + for (const auto &formId : formIds) { + auto search = formDataProxyRecordMap_.find(formId); + if (search != formDataProxyRecordMap_.end()) { + if (search->second != nullptr) { + search->second->EnableSubscribeFormData(); + HILOG_DEBUG("enable subscribe form data. formId: %{public}s", std::to_string(formId).c_str()); + } + } + } +} + +void FormDataProxyMgr::DisableSubscribeFormData(const std::vector &formIds) +{ + std::lock_guard lock(formDataProxyRecordMutex_); + for (const auto &formId : formIds) { + auto search = formDataProxyRecordMap_.find(formId); + if (search != formDataProxyRecordMap_.end()) { + if (search->second != nullptr) { + search->second->DisableSubscribeFormData(); + HILOG_DEBUG("disable subscribe form data. formId: %{public}s", std::to_string(formId).c_str()); + } + } + } +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_data_proxy_record.cpp b/services/src/form_data_proxy_record.cpp index a7c9cb271..6c6d67d13 100644 --- a/services/src/form_data_proxy_record.cpp +++ b/services/src/form_data_proxy_record.cpp @@ -41,10 +41,10 @@ void FormDataProxyRecord::OnPublishedDataChange(const DataShare::PublishedDataCh UpdatePublishedDataForm(changeNode.datas_); } -FormDataProxyRecord::FormDataProxyRecord(int64_t formId, const std::string &bundleName, const std::string &moduleName) - : formId_(formId), bundleName_(bundleName), moduleName_(moduleName) +FormDataProxyRecord::FormDataProxyRecord(int64_t formId, const std::string &bundleName, const std::string &moduleName, + uint32_t tokenId) : formId_(formId), bundleName_(bundleName), moduleName_(moduleName), tokenId_(tokenId) { - std::string uri = "datashareproxy:://" + bundleName; + std::string uri = "datashareproxy://" + bundleName; DataShare::CreateOptions options; options.isProxy_ = true; dataShareHelper_ = DataShare::DataShareHelper::Creator(uri, options); @@ -62,12 +62,12 @@ ErrCode FormDataProxyRecord::SubscribeFormData(const std::vector HILOG_DEBUG("subscribe form data."); ParseFormDataProxies(formDataProxies); ErrCode ret = ERR_OK; - ret = SubscribeRdbFormData(); + ret = SubscribeRdbFormData(rdbSubscribeMap_); if (ret != ERR_OK) { HILOG_ERROR("subscribe rdb form data failed."); return ret; } - ret = SubscribePublishFormData(); + ret = SubscribePublishFormData(publishSubscribeMap_); if (ret != ERR_OK) { HILOG_ERROR("subscribe publish form data failed."); return ret; @@ -75,20 +75,20 @@ ErrCode FormDataProxyRecord::SubscribeFormData(const std::vector return ret; } -ErrCode FormDataProxyRecord::SubscribeRdbFormData() +ErrCode FormDataProxyRecord::SubscribeRdbFormData(std::map &rdbSubscribeMap) { if (dataShareHelper_ == nullptr) { HILOG_ERROR("dataShareHelper is nullptr."); return ERR_APPEXECFWK_FORM_INVALID_PARAM; } - if (rdbSubscribeMap_.empty()) { - HILOG_DEBUG("rdbSubscribeMap_ is nullptr."); + if (rdbSubscribeMap.empty()) { + HILOG_DEBUG("rdbSubscribeMap is empty."); return ERR_OK; } std::vector formDataProxyRequests; - ConvertSubscribeMapToRequests(rdbSubscribeMap_, formDataProxyRequests); + ConvertSubscribeMapToRequests(rdbSubscribeMap, formDataProxyRequests); std::weak_ptr weak(shared_from_this()); auto rdbTask = [weak](const DataShare::RdbChangeNode &changeNode) { @@ -104,31 +104,34 @@ ErrCode FormDataProxyRecord::SubscribeRdbFormData() templateId.subscriberId_ = search.subscribeId; templateId.bundleName_ = bundleName_; auto ret = dataShareHelper_->SubscribeRdbData(search.uris, templateId, rdbTask); - HILOG_DEBUG("subscribe rdb data. subscribeId is %{public}s", std::to_string(search.subscribeId).c_str()); + uint32_t failNum = 0; for (const auto &iter : ret) { if (iter.errCode_ != 0) { - HILOG_DEBUG("subscribe rdb data failed. %{public}s", iter.key_.c_str()); + HILOG_ERROR("subscribe rdb data failed. %{public}s", iter.key_.c_str()); + failNum++; } } + HILOG_DEBUG("subscribe rdb data. subscribeId: %{public}s, failNum: %{public}d, totalNum: %{public}zu", + std::to_string(search.subscribeId).c_str(), failNum, search.uris.size()); } return ERR_OK; } -ErrCode FormDataProxyRecord::SubscribePublishFormData() +ErrCode FormDataProxyRecord::SubscribePublishFormData(std::map &publishSubscribeMap) { if (dataShareHelper_ == nullptr) { HILOG_ERROR("dataShareHelper is nullptr."); return ERR_APPEXECFWK_FORM_INVALID_PARAM; } - if (publishSubscribeMap_.empty()) { - HILOG_DEBUG("publishSubscribeMap_ is nullptr."); + if (publishSubscribeMap.empty()) { + HILOG_DEBUG("publishSubscribeMap is nullptr."); return ERR_OK; } std::vector formDataProxyRequests; - ConvertSubscribeMapToRequests(publishSubscribeMap_, formDataProxyRequests); + ConvertSubscribeMapToRequests(publishSubscribeMap, formDataProxyRequests); std::weak_ptr weak(shared_from_this()); auto publishedTask = [weak](const DataShare::PublishedDataChangeNode &changeNode) { @@ -141,18 +144,27 @@ ErrCode FormDataProxyRecord::SubscribePublishFormData() }; for (const auto &search : formDataProxyRequests) { auto ret = dataShareHelper_->SubscribePublishedData(search.uris, search.subscribeId, publishedTask); - HILOG_DEBUG("subscribe published data. subscribeId is %{public}s", std::to_string(search.subscribeId).c_str()); + uint32_t failNum = 0; for (const auto &iter : ret) { if (iter.errCode_ != 0) { - HILOG_DEBUG("subscribe published data failed. %{public}s", iter.key_.c_str()); + HILOG_ERROR("subscribe published data failed. %{public}s", iter.key_.c_str()); + failNum++; } } + HILOG_DEBUG("subscribe published data. subscribeId: %{public}s, failNum: %{public}d, totalNum: %{public}zu", + std::to_string(search.subscribeId).c_str(), failNum, search.uris.size()); } return ERR_OK; } ErrCode FormDataProxyRecord::UnsubscribeFormData() +{ + return UnsubscribeFormData(rdbSubscribeMap_, publishSubscribeMap_); +} + +ErrCode FormDataProxyRecord::UnsubscribeFormData(std::map &rdbSubscribeMap, + std::map &publishSubscribeMap) { if (dataShareHelper_ == nullptr) { HILOG_ERROR("dataShareHelper is nullptr."); @@ -160,21 +172,21 @@ ErrCode FormDataProxyRecord::UnsubscribeFormData() } std::vector rdbRequests; - ConvertSubscribeMapToRequests(rdbSubscribeMap_, rdbRequests); + ConvertSubscribeMapToRequests(rdbSubscribeMap, rdbRequests); for (const auto &search : rdbRequests) { DataShare::TemplateId templateId; templateId.subscriberId_ = search.subscribeId; templateId.bundleName_ = bundleName_; dataShareHelper_->UnsubscribeRdbData(search.uris, templateId); } - rdbSubscribeMap_.clear(); + rdbSubscribeMap.clear(); std::vector publishRequests; - ConvertSubscribeMapToRequests(publishSubscribeMap_, publishRequests); + ConvertSubscribeMapToRequests(publishSubscribeMap, publishRequests); for (const auto &search : publishRequests) { dataShareHelper_->UnsubscribePublishedData(search.uris, search.subscribeId); } - publishSubscribeMap_.clear(); + publishSubscribeMap.clear(); return ERR_OK; } @@ -208,18 +220,17 @@ void FormDataProxyRecord::ConvertSubscribeMapToRequests(std::map &formDataProxyRequests) { std::string userId = std::to_string(FormUtil::GetCurrentAccountId()); - std::string tokenId = std::to_string(IPCSkeleton::GetCallingTokenID()); for (const auto &subscribe : subscribeMap) { - int64_t subscriberId; + int64_t subscriberId = formId_; if (!FormUtil::ConvertStringToInt64(subscribe.second, subscriberId)) { - HILOG_ERROR("Convert string to int64 failed, subscriberId is %{public}s.", subscribe.second.c_str()); - continue; + HILOG_WARN("Convert string to int64 failed, change to default value formId."); } bool isNewSubscriberId = true; std::string uri; for (auto &search : formDataProxyRequests) { if (search.subscribeId == subscriberId) { - uri = subscribe.first + "?" + "user=" + userId + "&srcToken=" + tokenId; + uri = subscribe.first + "?" + "user=" + userId + "&srcToken=" + std::to_string(tokenId_) + + "&dstBundleName=" + bundleName_; search.uris.push_back(uri); isNewSubscriberId = false; break; @@ -228,7 +239,8 @@ void FormDataProxyRecord::ConvertSubscribeMapToRequests(std::map formDataProxyRequests; + ConvertSubscribeMapToRequests(rdbSubscribeMap, formDataProxyRequests); + + for (const auto &search : formDataProxyRequests) { + DataShare::TemplateId templateId; + templateId.subscriberId_ = search.subscribeId; + templateId.bundleName_ = bundleName_; + std::vector ret; + if (subsState) { + ret = dataShareHelper_->EnableRdbSubs(search.uris, templateId); + } else { + ret = dataShareHelper_->DisableRdbSubs(search.uris, templateId); + } + uint32_t failNum = 0; + for (const auto &iter : ret) { + if (iter.errCode_ != 0) { + HILOG_ERROR("set rdb state failed. %{public}s", iter.key_.c_str()); + failNum++; + } + } + HILOG_DEBUG("set rdb state. subscribeId: %{public}s, failNum: %{public}d, totalNum: %{public}zu", + std::to_string(search.subscribeId).c_str(), failNum, search.uris.size()); + } + + return ERR_OK; +} + +ErrCode FormDataProxyRecord::SetPublishSubsState(std::map &publishSubscribeMap, + bool subsState) +{ + if (dataShareHelper_ == nullptr) { + HILOG_ERROR("dataShareHelper is nullptr."); + return ERR_APPEXECFWK_FORM_INVALID_PARAM; + } + + if (publishSubscribeMap.empty()) { + HILOG_DEBUG("publishSubscribeMap is nullptr."); + return ERR_OK; + } + + std::vector formDataProxyRequests; + ConvertSubscribeMapToRequests(publishSubscribeMap, formDataProxyRequests); + + for (const auto &search : formDataProxyRequests) { + std::vector ret; + if (subsState) { + ret = dataShareHelper_->EnablePubSubs(search.uris, search.subscribeId); + } else { + ret = dataShareHelper_->DisablePubSubs(search.uris, search.subscribeId); + } + uint32_t failNum = 0; + for (const auto &iter : ret) { + if (iter.errCode_ != 0) { + HILOG_ERROR("set published state failed. %{public}s", iter.key_.c_str()); + failNum++; + } + } + HILOG_DEBUG("set published state. subscribeId: %{public}s, failNum: %{public}d, totalNum: %{public}zu", + std::to_string(search.subscribeId).c_str(), failNum, search.uris.size()); + } + + return ERR_OK; +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/services/src/form_item_info.cpp b/services/src/form_item_info.cpp index d38899832..d2da27fc0 100644 --- a/services/src/form_item_info.cpp +++ b/services/src/form_item_info.cpp @@ -492,5 +492,15 @@ void FormItemInfo::SetUiSyntax(const FormType &uiSyntax) { uiSyntax_ = uiSyntax; } + +void FormItemInfo::SetDataProxyFlag(bool dataProxyEnabled) +{ + dataProxyEnabled_ = dataProxyEnabled; +} + +bool FormItemInfo::GetDataProxyFlag() const +{ + return dataProxyEnabled_; +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/services/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index 60b0a6abe..9b40b43b6 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -293,6 +293,7 @@ int FormMgrAdapter::ReleaseForm(const int64_t formId, const sptr int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId); // remove connection for in application form FormSupplyCallback::GetInstance()->RemoveConnection(matchedFormId, callerToken); + FormDataProxyMgr::GetInstance().UnsubscribeFormData(matchedFormId); if (FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) { // delete temp form if receive release form call return HandleDeleteTempForm(matchedFormId, callerToken); @@ -521,15 +522,8 @@ ErrCode FormMgrAdapter::HandleDeleteFormCache(FormRecord &dbRecord, const int ui return result; } -/** - * @brief Update form with formId, send formId to form manager service. - * @param formId The Id of the form to update. - * @param bundleName Provider ability bundleName. - * @param formProviderData form provider data. - * @return Returns ERR_OK on success, others on failure. - */ -int FormMgrAdapter::UpdateForm(const int64_t formId, - const std::string &bundleName, const FormProviderData &formProviderData) +int FormMgrAdapter::UpdateForm(const int64_t formId, const std::string &bundleName, + const FormProviderData &formProviderData, const std::vector &formDataProxies) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); HILOG_INFO("%{public}s start.", __func__); @@ -562,13 +556,19 @@ int FormMgrAdapter::UpdateForm(const int64_t formId, return ERR_APPEXECFWK_FORM_INVALID_PARAM; } + int32_t ret = ERR_OK; if (formRecord.uiSyntax == FormType::ETS) { WantParams wantParams; - return FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderData, wantParams, true); + ret = FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderData, wantParams, true); } else { // update Form - return FormProviderMgr::GetInstance().UpdateForm(matchedFormId, formRecord, formProviderData); + ret = FormProviderMgr::GetInstance().UpdateForm(matchedFormId, formRecord, formProviderData); + } + + if (!formDataProxies.empty()) { + FormDataProxyMgr::GetInstance().UpdateSubscribeFormData(matchedFormId, formDataProxies); } + return ret; } /** @@ -713,6 +713,12 @@ ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector &fo HILOG_WARN("%{public}s fail, HandleEventNotify error, key is %{public}s.", __func__, iter->first.c_str()); } } + if (formVisibleType == static_cast(FormVisibilityType::VISIBLE)) { + FormDataProxyMgr::GetInstance().EnableSubscribeFormData(formIds); + } else if (formVisibleType == static_cast(FormVisibilityType::INVISIBLE)) { + FormDataProxyMgr::GetInstance().DisableSubscribeFormData(formIds); + } + return ERR_OK; } @@ -1484,6 +1490,7 @@ ErrCode FormMgrAdapter::CreateFormItemInfo(const BundleInfo &bundleInfo, itemInfo.AddHapSourceDirs(item.moduleSourceDir); } } + itemInfo.SetDataProxyFlag(formInfo.dataProxyEnabled); return ERR_OK; } @@ -1643,7 +1650,8 @@ ErrCode FormMgrAdapter::RequestPublishFormToHost(Want &want) } ErrCode FormMgrAdapter::RequestPublishForm(Want &want, bool withFormBindingData, - std::unique_ptr &formBindingData, int64_t &formId) + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies) { HILOG_INFO("%{public}s called.", __func__); ErrCode errCode = CheckPublishForm(want); @@ -1681,6 +1689,9 @@ ErrCode FormMgrAdapter::RequestPublishForm(Want &want, bool withFormBindingData, if (errCode != ERR_OK) { FormDataMgr::GetInstance().RemoveRequestPublishFormInfo(formId); } + if (!formDataProxies.empty()) { + FormDataProxyMgr::GetInstance().ProduceFormDataProxies(formId, formDataProxies); + } return errCode; } @@ -1794,7 +1805,10 @@ ErrCode FormMgrAdapter::AddRequestPublishForm(const FormItemInfo &formItemInfo, return errorCode; } } - + std::vector formDataProxies; + if (FormDataProxyMgr::GetInstance().ConsumeFormDataProxies(formId, formDataProxies)) { + FormDataProxyMgr::GetInstance().UpdateSubscribeFormData(formId, formDataProxies); + } // start update timer return AddFormTimer(formRecord); } diff --git a/services/src/form_mgr_service.cpp b/services/src/form_mgr_service.cpp index 5d3f31169..77cd30791 100644 --- a/services/src/form_mgr_service.cpp +++ b/services/src/form_mgr_service.cpp @@ -1206,5 +1206,30 @@ ErrCode FormMgrService::RegisterRemoveObserver(const std::string &bundleName, co } return FormMgrAdapter::GetInstance().RegisterRemoveObserver(bundleName, callerToken); } + +ErrCode FormMgrService::UpdateProxyForm(int64_t formId, const FormProviderData &formBindingData, + const std::vector &formDataProxies) +{ + HILOG_DEBUG("called."); + std::string callerBundleName; + auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName); + if (ret != ERR_OK) { + HILOG_ERROR("%{public}s fail, get caller bundle name failed", __func__); + return ret; + } + return FormMgrAdapter::GetInstance().UpdateForm(formId, callerBundleName, formBindingData, formDataProxies); +} + +ErrCode FormMgrService::RequestPublishProxyForm(Want &want, bool withFormBindingData, + std::unique_ptr &formBindingData, int64_t &formId, + const std::vector &formDataProxies) +{ + HILOG_DEBUG("called."); + if (!CheckCallerIsSystemApp()) { + return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS; + } + return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData, formId, + formDataProxies); +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/services/src/form_supply_callback.cpp b/services/src/form_supply_callback.cpp index 985be9f7b..d0093fe63 100644 --- a/services/src/form_supply_callback.cpp +++ b/services/src/form_supply_callback.cpp @@ -76,26 +76,27 @@ int FormSupplyCallback::OnAcquire(const FormProviderInfo &formProviderInfo, cons RemoveConnection(connectId); } - FormDataProxyMgr::GetInstance().SubscribeFormData(formId, formProviderInfo.GetFormProxies()); - if (FormRenderMgr::GetInstance().IsNeedRender(formId)) { return FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderInfo.GetFormData(), want.GetParams(), false); } + int32_t ret = ERR_APPEXECFWK_FORM_INVALID_PARAM; int type = want.GetIntParam(Constants::ACQUIRE_TYPE, 0); HILOG_DEBUG("%{public}s come: %{public}" PRId64 ", %{public}d, %{public}d", __func__, formId, connectId, type); switch (type) { case Constants::ACQUIRE_TYPE_CREATE_FORM: - return FormProviderMgr::GetInstance().AcquireForm(formId, formProviderInfo); + ret = FormProviderMgr::GetInstance().AcquireForm(formId, formProviderInfo); case Constants::ACQUIRE_TYPE_RECREATE_FORM: - return FormProviderMgr::GetInstance().UpdateForm(formId, formProviderInfo); + ret = FormProviderMgr::GetInstance().UpdateForm(formId, formProviderInfo); default: HILOG_WARN("%{public}s warning, onAcquired type: %{public}d", __func__, type); } + + FormDataProxyMgr::GetInstance().SubscribeFormData(formId, formProviderInfo.GetFormProxies()); HILOG_INFO("%{public}s end.", __func__); - return ERR_APPEXECFWK_FORM_INVALID_PARAM; + return ret; } /** diff --git a/test/unittest/fms_form_mgr_service_test/mock_form_mgr_adapter.cpp b/test/unittest/fms_form_mgr_service_test/mock_form_mgr_adapter.cpp index 5ef862ed9..789b650d9 100755 --- a/test/unittest/fms_form_mgr_service_test/mock_form_mgr_adapter.cpp +++ b/test/unittest/fms_form_mgr_service_test/mock_form_mgr_adapter.cpp @@ -230,8 +230,8 @@ bool FormMgrAdapter::IsRequestPublishFormSupported() return g_isRequestPublishFormSupported; } -int FormMgrAdapter::UpdateForm( - const int64_t formId, const std::string &bundleName, const FormProviderData &formProviderData) +int FormMgrAdapter::UpdateForm(const int64_t formId, const std::string &bundleName, + const FormProviderData &formProviderData, const std::vector &formDataProxies) { return g_updateForm; } -- Gitee