From 016e9a80a63fe7f800705dc287dec14c66f98b7b Mon Sep 17 00:00:00 2001 From: liweifeng Date: Wed, 8 Feb 2023 23:06:38 +0800 Subject: [PATCH] =?UTF-8?q?arkTS=E5=8D=A1=E7=89=87=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E5=A4=9A=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: liweifeng Change-Id: I63167a3f931e1b74b2034b08e559327dfc1862ec --- interfaces/inner_api/include/form_constants.h | 6 ++- .../include/form_render_record.h | 6 +-- .../src/form_render_impl.cpp | 2 +- .../src/form_render_record.cpp | 37 ++++++++++--------- services/include/form_bms_helper.h | 3 ++ services/include/form_render_connection.h | 1 - services/include/form_render_mgr.h | 5 +-- services/src/form_bms_helper.cpp | 28 ++++++++++++++ services/src/form_mgr_adapter.cpp | 12 ++++-- services/src/form_render_connection.cpp | 9 +++++ services/src/form_render_mgr.cpp | 24 +++++++++--- services/src/form_supply_callback.cpp | 3 +- 12 files changed, 99 insertions(+), 37 deletions(-) diff --git a/interfaces/inner_api/include/form_constants.h b/interfaces/inner_api/include/form_constants.h index a6aeb29829..895419dc9e 100644 --- a/interfaces/inner_api/include/form_constants.h +++ b/interfaces/inner_api/include/form_constants.h @@ -166,7 +166,7 @@ namespace Constants { {Dimension::DIMENSION_4_4, "4*4"}, {Dimension::DIMENSION_2_1, "2*1"} }; - + // rdb constexpr const char* FORM_RDB_NAME = "/formdb.db"; constexpr const char* FORM_RDB_TABLE_NAME = "form_table"; @@ -174,6 +174,10 @@ namespace Constants { constexpr const char* FORM_JOURNAL_MODE = "WAL"; constexpr const char* FORM_SYNC_MODE = "FULL"; constexpr int32_t FORM_RDB_VERSION = 1; + constexpr const char* FORM_RENDER_TYPE_KEY = "form_render_type"; + constexpr int32_t RENDER_FORM = 0; // default value + constexpr int32_t UPDATE_RENDERING_FORM = 1; + constexpr const char* FORM_COMPILE_MODE_KEY = "form_compile_mode"; } // namespace Constants } // namespace AppExecFwk } // namespace OHOS diff --git a/services/form_render_service/include/form_render_record.h b/services/form_render_service/include/form_render_record.h index f195e1b41d..6d5ba4b69d 100644 --- a/services/form_render_service/include/form_render_record.h +++ b/services/form_render_service/include/form_render_record.h @@ -88,9 +88,9 @@ private: bool CreateRuntime(const FormJsInfo &formJsInfo); - std::shared_ptr GetContext(const FormJsInfo &formJsInfo); + std::shared_ptr GetContext(const FormJsInfo &formJsInfo, const Want &want); - std::shared_ptr CreateContext(const FormJsInfo &formJsInfo); + std::shared_ptr CreateContext(const FormJsInfo &formJsInfo, const Want &want); std::shared_ptr GetFormRendererGroup(const FormJsInfo &formJsInfo, const std::shared_ptr &context, const std::shared_ptr &runtime); @@ -115,7 +115,7 @@ private: std::unordered_map> contextsMapForModuleName_; // std::mutex formRendererGroupMutex_; - std::map> formRendererGroupMap_; + std::map> formRendererGroupMap_; }; } // namespace FormRender } // namespace AppExecFwk diff --git a/services/form_render_service/src/form_render_impl.cpp b/services/form_render_service/src/form_render_impl.cpp index f7e6336692..0ae723dc77 100644 --- a/services/form_render_service/src/form_render_impl.cpp +++ b/services/form_render_service/src/form_render_impl.cpp @@ -95,7 +95,7 @@ int32_t FormRenderImpl::StopRenderingForm(const FormJsInfo &formJsInfo, const Wa HILOG_ERROR("%{public}s warn, IFormSupply is nullptr", __func__); return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED; } - + int32_t uid = want.GetIntParam(Constants::FORM_SUPPLY_UID, 0); if (!uid) { HILOG_ERROR("GetUid failed"); diff --git a/services/form_render_service/src/form_render_record.cpp b/services/form_render_service/src/form_render_record.cpp index 9e5cb1e274..365483e465 100644 --- a/services/form_render_service/src/form_render_record.cpp +++ b/services/form_render_service/src/form_render_record.cpp @@ -29,7 +29,7 @@ std::shared_ptr FormRenderRecord::Create(const std::string &bu HILOG_ERROR("Create FormRenderRecord failed."); return nullptr; } - + if (!renderRecord->CreateEventHandler(bundleName)) { HILOG_ERROR("CreateEventHandler failed."); return nullptr; @@ -90,7 +90,7 @@ int32_t FormRenderRecord::UpdateRenderRecord(const FormJsInfo &formJsInfo, const } renderRecord->HandleUpdateInJsThread(formJsInfo, want); }; - + if (eventHandler_ == nullptr) { HILOG_ERROR("eventHandler_ is nullptr"); return RENDER_FORM_FAILED; @@ -119,7 +119,7 @@ int32_t FormRenderRecord::DeleteRenderRecord(int64_t formId, const Want &want, c } renderRecord->HandleDeleteInJsThread(formId, want); }; - + if (eventHandler_ == nullptr) { HILOG_ERROR("eventHandler_ is nullptr"); return RENDER_FORM_FAILED; @@ -166,7 +166,7 @@ bool FormRenderRecord::CreateRuntime(const FormJsInfo &formJsInfo) return true; } -std::shared_ptr FormRenderRecord::GetContext(const FormJsInfo &formJsInfo) +std::shared_ptr FormRenderRecord::GetContext(const FormJsInfo &formJsInfo, const Want &want) { { std::lock_guard lock(contextsMapMutex_); @@ -176,10 +176,10 @@ std::shared_ptr FormRenderRecord::GetContext(const Form } } - return CreateContext(formJsInfo); + return CreateContext(formJsInfo, want); } -std::shared_ptr FormRenderRecord::CreateContext(const FormJsInfo &formJsInfo) +std::shared_ptr FormRenderRecord::CreateContext(const FormJsInfo &formJsInfo, const Want &want) { auto context = std::make_shared(); if (context == nullptr) { @@ -189,13 +189,15 @@ std::shared_ptr FormRenderRecord::CreateContext(const F AppExecFwk::HapModuleInfo hapModuleInfo; hapModuleInfo.name = formJsInfo.moduleName; hapModuleInfo.hapPath = formJsInfo.jsFormCodePath; + hapModuleInfo.compileMode = static_cast(want.GetIntParam(Constants::FORM_COMPILE_MODE_KEY, + static_cast(CompileMode::ES_MODULE))); context->InitHapModuleInfo(hapModuleInfo); auto applicationInfo = std::make_shared(); applicationInfo->bundleName = formJsInfo.bundleName; context->SetApplicationInfo(applicationInfo); HILOG_DEBUG("bundleName is %{public}s, moduleName is %{public}s", formJsInfo.bundleName.c_str(), formJsInfo.moduleName.c_str()); - + std::lock_guard lock(contextsMapMutex_); contextsMapForModuleName_.emplace(formJsInfo.moduleName, context); return context; @@ -233,28 +235,29 @@ void FormRenderRecord::HandleUpdateInJsThread(const FormJsInfo &formJsInfo, cons HILOG_ERROR("Create runtime failed."); return; } - auto context = GetContext(formJsInfo); + auto context = GetContext(formJsInfo, want); if (context == nullptr) { HILOG_ERROR("Create Context failed."); return; } - { + auto renderType = want.GetIntParam(Constants::FORM_RENDER_TYPE_KEY, Constants::RENDER_FORM); + HILOG_INFO("renderType is %{public}d.", renderType); + if (renderType == Constants::RENDER_FORM) { + auto formRendererGroup = this->GetFormRendererGroup(formJsInfo, context, runtime_); + if (formRendererGroup == nullptr) { + HILOG_ERROR("Create formRendererGroup failed."); + return; + } + formRendererGroup->AddForm(want, formJsInfo); + } else { std::lock_guard lock(formRendererGroupMutex_); if (auto search = this->formRendererGroupMap_.find(formJsInfo.formId); search != this->formRendererGroupMap_.end()) { auto group = search->second; group->UpdateForm(formJsInfo); - return; } } - - auto formRendererGroup = this->GetFormRendererGroup(formJsInfo, context, runtime_); - if (formRendererGroup == nullptr) { - HILOG_ERROR("Create formRendererGroup failed."); - return; - } - formRendererGroup->AddForm(want, formJsInfo); return; } diff --git a/services/include/form_bms_helper.h b/services/include/form_bms_helper.h index d3fb67bf53..c5b1480844 100644 --- a/services/include/form_bms_helper.h +++ b/services/include/form_bms_helper.h @@ -103,6 +103,9 @@ public: */ int32_t GetUidByBundleName(const std::string &bundleName, int32_t userId); + bool GetCompileMode(const std::string &bundleName, const std::string &moduleName, + int32_t userId, int32_t &compileMode); + static constexpr int64_t INVALID_UID = -1; private: /** diff --git a/services/include/form_render_connection.h b/services/include/form_render_connection.h index 5c88dd537f..462f645962 100644 --- a/services/include/form_render_connection.h +++ b/services/include/form_render_connection.h @@ -50,7 +50,6 @@ public: void OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode) override; void SetReconnectFlag(); - private: FormRecord formRecord_; WantParams wantParams_; diff --git a/services/include/form_render_mgr.h b/services/include/form_render_mgr.h index ff79ddbe6e..033efa252e 100644 --- a/services/include/form_render_mgr.h +++ b/services/include/form_render_mgr.h @@ -40,8 +40,8 @@ public: ErrCode RenderForm(const FormRecord &formRecord, const WantParams &wantParams); - ErrCode RenderForm(int64_t formId, const FormProviderInfo &formProviderInfo, - const WantParams &wantParams); + ErrCode UpdateRenderingForm(int64_t formId, const FormProviderData &formProviderData, + const WantParams &wantParams, bool mergeData); ErrCode StopRenderingForm(int64_t formId, const FormRecord &formRecord); @@ -60,7 +60,6 @@ public: void ReconnectRenderService(); void RerenderAll(); - private: bool IsRemoveConnection(int64_t formId); diff --git a/services/src/form_bms_helper.cpp b/services/src/form_bms_helper.cpp index e6e35cdac8..822138df7c 100644 --- a/services/src/form_bms_helper.cpp +++ b/services/src/form_bms_helper.cpp @@ -201,5 +201,33 @@ int32_t FormBmsHelper::GetUidByBundleName(const std::string &bundleName, const i } return IN_PROCESS_CALL(iBundleMgr->GetUidByBundleName(bundleName, userId)); } + +bool FormBmsHelper::GetCompileMode(const std::string &bundleName, const std::string &moduleName, + int32_t userId, int32_t &compileMode) +{ + HILOG_DEBUG("%{public}s called.", __func__); + sptr iBundleMgr = GetBundleMgr(); + if (iBundleMgr == nullptr) { + HILOG_ERROR("iBundleMgr is nullptr"); + return false; + } + int32_t flags = BundleFlag::GET_BUNDLE_DEFAULT; + BundleInfo bundleInfo; + if (!IN_PROCESS_CALL(iBundleMgr->GetBundleInfo(bundleName, flags, bundleInfo, userId))) { + HILOG_ERROR("Get bundle info failed."); + return false; + } + + for (auto hapModuleInfo : bundleInfo.hapModuleInfos) { + if (!moduleName.empty() && hapModuleInfo.moduleName != moduleName) { + continue; + } + compileMode = static_cast(hapModuleInfo.compileMode); + return true; + } + + HILOG_ERROR("Get compile mode failed."); + return false; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/src/form_mgr_adapter.cpp b/services/src/form_mgr_adapter.cpp index e39f30ebb7..e7bdbe2cee 100644 --- a/services/src/form_mgr_adapter.cpp +++ b/services/src/form_mgr_adapter.cpp @@ -450,10 +450,8 @@ int FormMgrAdapter::UpdateForm(const int64_t formId, } if (formRecord.uiSyntax == FormType::ETS) { - nlohmann::json addJsonData = formProviderData.GetData(); - formRecord.formProviderInfo.MergeData(addJsonData); WantParams wantParams; - return FormRenderMgr::GetInstance().RenderForm(formRecord, wantParams); + return FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderData, wantParams, true); } else { // update Form return FormProviderMgr::GetInstance().UpdateForm(matchedFormId, formRecord, formProviderData); @@ -1241,7 +1239,11 @@ ErrCode FormMgrAdapter::CreateFormItemInfo(const BundleInfo &bundleInfo, itemInfo.SetScheduledUpdateTime(formInfo.scheduledUpdateTime); itemInfo.SetJsComponentName(formInfo.jsComponentName); itemInfo.SetFormVisibleNotify(formInfo.formVisibleNotify); - itemInfo.SetFormSrc(formInfo.src); + auto formSrc = formInfo.src; + if (formSrc.rfind(POINT_ETS) == formSrc.size() - POINT_ETS.size()) { + formSrc.erase(formSrc.end() - POINT_ETS.size(), formSrc.end()); + } + itemInfo.SetFormSrc(formSrc); itemInfo.SetFormWindow(formInfo.window); itemInfo.SetType(formInfo.type); itemInfo.SetUiSyntax(formInfo.uiSyntax); @@ -1569,6 +1571,8 @@ ErrCode FormMgrAdapter::AddRequestPublishForm(const FormItemInfo &formItemInfo, int32_t currentUserId = GetCurrentUserId(callingUid); // allot form record FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(formItemInfo, callingUid, currentUserId); + formRecord.formProviderInfo.SetFormData(*formProviderData); + FormRenderMgr::GetInstance().RenderForm(formRecord, want.GetParams()); // render for arkTs form // create form info for js FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formJsInfo); diff --git a/services/src/form_render_connection.cpp b/services/src/form_render_connection.cpp index d52d8c4762..03426bbd23 100644 --- a/services/src/form_render_connection.cpp +++ b/services/src/form_render_connection.cpp @@ -55,6 +55,14 @@ void FormRenderConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &e FormRenderMgr::GetInstance().RerenderAll(); return; } + + int32_t compileMode = 0; + if (!FormBmsHelper::GetInstance().GetCompileMode(formRecord_.bundleName, formRecord_.moduleName, + FormUtil::GetCurrentAccountId(), compileMode)) { + HILOG_INFO("get compile mode failed."); + return; + } + FormRenderMgr::GetInstance().AddConnection(GetFormId(), this); FormRenderMgr::GetInstance().AddRenderDeathRecipient(remoteObject); int32_t callingUid = IPCSkeleton::GetCallingUid(); @@ -64,6 +72,7 @@ void FormRenderConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &e want.SetParams(wantParams_); want.SetParam(Constants::FORM_SUPPLY_UID, bundleUid); want.SetParam(Constants::FORM_CONNECT_ID, this->GetConnectId()); + want.SetParam(Constants::FORM_COMPILE_MODE_KEY, compileMode); FormTaskMgr::GetInstance().PostRenderForm(formRecord_, want, remoteObject); } diff --git a/services/src/form_render_mgr.cpp b/services/src/form_render_mgr.cpp index 5dd96319b8..66404a8968 100644 --- a/services/src/form_render_mgr.cpp +++ b/services/src/form_render_mgr.cpp @@ -48,7 +48,7 @@ ErrCode FormRenderMgr::RenderForm(const FormRecord &formRecord, const WantParams } if (formRecord.formId <= 0) { - HILOG_ERROR("%{public}s fail, formId should be greater than 0", __func__); + HILOG_ERROR("%{public}s fail, formId should be greater than 0.", __func__); return ERR_APPEXECFWK_FORM_INVALID_PARAM; } @@ -67,7 +67,7 @@ ErrCode FormRenderMgr::RenderForm(const FormRecord &formRecord, const WantParams formRenderConnection = new (std::nothrow) FormRenderConnection(formRecord, wantParams); } } - + AddHostToken(formRecord.formId); if (formRenderConnection == nullptr) { @@ -83,8 +83,8 @@ ErrCode FormRenderMgr::RenderForm(const FormRecord &formRecord, const WantParams return ERR_OK; } -ErrCode FormRenderMgr::RenderForm(int64_t formId, const FormProviderInfo &formProviderInfo, - const WantParams &wantParams) +ErrCode FormRenderMgr::UpdateRenderingForm(int64_t formId, const FormProviderData &formProviderData, + const WantParams &wantParams, bool mergeData) { FormRecord formRecord; bool isGetFormRecord = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord); @@ -92,9 +92,21 @@ ErrCode FormRenderMgr::RenderForm(int64_t formId, const FormProviderInfo &formPr HILOG_ERROR("%{public}s fail, not exist such form, formId:%{public}" PRId64 "", __func__, formId); return ERR_APPEXECFWK_FORM_NOT_EXIST_ID; } - formRecord.formProviderInfo = formProviderInfo; + if (mergeData) { + nlohmann::json jsonData = formProviderData.GetData(); + formRecord.formProviderInfo.MergeData(jsonData); + auto providerData = formRecord.formProviderInfo.GetFormData(); + providerData.SetImageDataState(formProviderData.GetImageDataState()); + providerData.SetImageDataMap(formProviderData.GetImageDataMap()); + formRecord.formProviderInfo.SetFormData(providerData); + } else { + formRecord.formProviderInfo.SetFormData(formProviderData); + } - return RenderForm(formRecord, wantParams); + Want want; + want.SetParams(wantParams); + want.SetParam(Constants::FORM_RENDER_TYPE_KEY, Constants::UPDATE_RENDERING_FORM); + return RenderForm(formRecord, want.GetParams()); } ErrCode FormRenderMgr::StopRenderingForm(int64_t formId, const FormRecord &formRecord) diff --git a/services/src/form_supply_callback.cpp b/services/src/form_supply_callback.cpp index b0140ec944..0c2d7249ef 100644 --- a/services/src/form_supply_callback.cpp +++ b/services/src/form_supply_callback.cpp @@ -76,7 +76,8 @@ int FormSupplyCallback::OnAcquire(const FormProviderInfo &formProviderInfo, cons } if (FormRenderMgr::GetInstance().IsNeedRender(formId)) { - return FormRenderMgr::GetInstance().RenderForm(formId, formProviderInfo, want.GetParams()); + return FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderInfo.GetFormData(), + want.GetParams(), false); } int type = want.GetIntParam(Constants::ACQUIRE_TYPE, 0); -- Gitee