1  /*
2   * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   *     http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #include "form_data_mgr.h"
17  
18  #include <cinttypes>
19  #include <type_traits>
20  
21  #include "fms_log_wrapper.h"
22  #include "form_bms_helper.h"
23  #include "form_bundle_forbid_mgr.h"
24  #include "form_cache_mgr.h"
25  #include "form_constants.h"
26  #include "form_data_proxy_mgr.h"
27  #include "form_db_cache.h"
28  #include "form_mgr_errors.h"
29  #include "form_observer_record.h"
30  #include "form_provider_mgr.h"
31  #include "form_record.h"
32  #include "form_render_mgr.h"
33  #include "form_task_mgr.h"
34  #include "form_trust_mgr.h"
35  #include "form_util.h"
36  #include "form_xml_parser.h"
37  #include "ipc_skeleton.h"
38  #include "js_form_state_observer_interface.h"
39  #include "running_form_info.h"
40  #include "form_record_report.h"
41  #include "form_event_report.h"
42  
43  namespace OHOS {
44  namespace AppExecFwk {
FormDataMgr()45  FormDataMgr::FormDataMgr()
46  {
47      HILOG_INFO("create");
48  }
~FormDataMgr()49  FormDataMgr::~FormDataMgr()
50  {
51      HILOG_INFO("destroy");
52  }
53  
54  /**
55   * @brief Allot form info by item info.
56   * @param formInfo Form item info.
57   * @param callingUid The UID of the proxy.
58   * @param userId User ID.
59   * @return Returns form record.
60   */
AllotFormRecord(const FormItemInfo & formInfo,const int callingUid,const int32_t userId)61  FormRecord FormDataMgr::AllotFormRecord(const FormItemInfo &formInfo, const int callingUid, const int32_t userId)
62  {
63      HILOG_INFO("call");
64      if (formInfo.IsTemporaryForm() && !ExistTempForm(formInfo.GetFormId())) {
65          std::lock_guard<std::mutex> lock(formTempMutex_);
66          tempForms_.emplace_back(formInfo.GetFormId());
67      }
68      FormRecord record;
69      {
70          std::lock_guard<std::mutex> lock(formRecordMutex_);
71          if (formRecords_.empty()) { // formRecords_ is empty, create a new one
72              HILOG_DEBUG("form info not exist");
73              record = CreateFormRecord(formInfo, callingUid, userId);
74              formRecords_.emplace(formInfo.GetFormId(), record);
75          } else {
76              auto info = formRecords_.find(formInfo.GetFormId());
77              if (info == formRecords_.end()) {
78                  HILOG_DEBUG("form info not find");
79                  record = CreateFormRecord(formInfo, callingUid, userId);
80                  formRecords_.emplace(formInfo.GetFormId(), record);
81              } else {
82                  record = info->second;
83              }
84          }
85      }
86      HILOG_INFO("end");
87      return record;
88  }
89  /**
90   * @brief Delete form js info by form record.
91   * @param formId The Id of the form.
92   * @return Returns true if this function is successfully called; returns false otherwise.
93   */
DeleteFormRecord(const int64_t formId)94  bool FormDataMgr::DeleteFormRecord(const int64_t formId)
95  {
96      HILOG_INFO("delete");
97      std::lock_guard<std::mutex> lock(formRecordMutex_);
98      auto iter = formRecords_.find(formId);
99      if (iter == formRecords_.end()) {
100          HILOG_ERROR("form record not exist");
101          return false;
102      }
103      formRecords_.erase(iter);
104      FormUtil::DeleteFormId(formId);
105      return true;
106  }
107  /**
108   * @brief Allot form host record by caller token.
109   * @param info The form item info.
110   * @param callerToken callerToken
111   * @param formId The Id of the form.
112   * @param callingUid The UID of the proxy.
113   * @return Returns true if this function is successfully called; returns false otherwise.
114   */
AllotFormHostRecord(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const int64_t formId,const int callingUid)115  bool FormDataMgr::AllotFormHostRecord(const FormItemInfo &info, const sptr<IRemoteObject> &callerToken,
116      const int64_t formId, const int callingUid)
117  {
118      HILOG_INFO("call");
119      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
120      for (auto &record : clientRecords_) {
121          if (callerToken == record.GetFormHostClient()) {
122              if (record.GetFormsCount() == 0) {
123                  FormTaskMgr::GetInstance().CancelDelayTask(
124                      std::make_pair((int64_t)TaskType::DELETE_FORM_HOST_RECORD, callingUid));
125                  HILOG_INFO("cancel delay task of recheck whether need clean form host");
126              }
127              record.AddForm(formId);
128              HILOG_INFO("addForm");
129              return true;
130          }
131      }
132      FormHostRecord hostRecord;
133      bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
134      if (isCreated) {
135          hostRecord.AddForm(formId);
136          clientRecords_.emplace_back(hostRecord);
137          HILOG_INFO("emplace");
138          return true;
139      }
140      return false;
141  }
142  /**
143   * @brief Create host record.
144   * @param info The form item info.
145   * @param callerToken The UID of the proxy.
146   * @param callingUid The UID of the proxy.
147   * @param record The form host record.
148   * @return Returns true if this function is successfully called; returns false otherwise.
149   */
CreateHostRecord(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const int callingUid,FormHostRecord & record)150  bool FormDataMgr::CreateHostRecord(const FormItemInfo &info, const sptr<IRemoteObject> &callerToken,
151      const int callingUid, FormHostRecord& record)
152  {
153      if (callerToken == nullptr) {
154          HILOG_ERROR("invalid param");
155          return false;
156      }
157  
158      record = FormHostRecord::CreateRecord(info, callerToken, callingUid);
159      return true;
160  }
161  /**
162   * @brief Create form record.
163   * @param formInfo The form item info.
164   * @param callingUid The UID of the proxy.
165   * @param userId User ID.
166   * @return Form record.
167   */
CreateFormRecord(const FormItemInfo & formInfo,const int callingUid,const int32_t userId) const168  FormRecord FormDataMgr::CreateFormRecord(const FormItemInfo &formInfo, const int callingUid, const int32_t userId) const
169  {
170      HILOG_INFO("create");
171      FormRecord newRecord;
172      newRecord.formId = formInfo.GetFormId();
173      newRecord.userId = userId;
174      newRecord.providerUserId = FormUtil::GetCurrentAccountId();
175      newRecord.packageName = formInfo.GetPackageName();
176      newRecord.bundleName = formInfo.GetProviderBundleName();
177      newRecord.moduleName = formInfo.GetModuleName();
178      newRecord.abilityName = formInfo.GetAbilityName();
179      newRecord.formName = formInfo.GetFormName();
180      newRecord.specification = formInfo.GetSpecificationId();
181      newRecord.isEnableUpdate = formInfo.IsEnableUpdateFlag();
182      newRecord.formTempFlag = formInfo.IsTemporaryForm();
183      newRecord.formVisibleNotify = formInfo.IsFormVisibleNotify();
184      newRecord.jsFormCodePath = formInfo.GetHapSourceByModuleName(newRecord.moduleName);
185      newRecord.formSrc = formInfo.GetFormSrc();
186      newRecord.formWindow = formInfo.GetFormWindow();
187      newRecord.versionName = formInfo.GetVersionName();
188      newRecord.versionCode = formInfo.GetVersionCode();
189      newRecord.compatibleVersion = formInfo.GetCompatibleVersion();
190      newRecord.formVisibleNotifyState = 0;
191      newRecord.type = formInfo.GetType();
192      newRecord.uiSyntax = formInfo.GetUiSyntax();
193      newRecord.isDynamic = formInfo.IsDynamic();
194      newRecord.transparencyEnabled = formInfo.IsTransparencyEnabled();
195      newRecord.privacyLevel = formInfo.GetPrivacyLevel();
196      newRecord.isSystemApp = formInfo.GetSystemAppFlag();
197      newRecord.description = formInfo.GetDescription();
198      newRecord.formLocation = formInfo.GetFormLocation();
199      newRecord.isThemeForm = formInfo.GetIsThemeForm();
200      newRecord.enableForm = formInfo.IsEnableForm();
201      if (newRecord.isEnableUpdate) {
202          ParseUpdateConfig(newRecord, formInfo);
203      }
204      if (std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(),
205          callingUid) == newRecord.formUserUids.end()) {
206          newRecord.formUserUids.emplace_back(callingUid);
207      }
208      newRecord.isDataProxy = formInfo.GetDataProxyFlag();
209      newRecord.uid = formInfo.GetProviderUid();
210      newRecord.modulePkgNameMap = formInfo.GetModulePkgNameMap();
211      newRecord.formBundleType = formInfo.GetFormBundleType();
212      formInfo.GetHapSourceDirs(newRecord.hapSourceDirs);
213      newRecord.renderingMode = formInfo.GetRenderingMode();
214      HILOG_DEBUG("end");
215      return newRecord;
216  }
217  /**
218   * @brief Create form js info by form record.
219   * @param formId The Id of the form.
220   * @param record Form record.
221   * @param formInfo Js form info.
222   */
CreateFormJsInfo(const int64_t formId,const FormRecord & record,FormJsInfo & formInfo)223  void FormDataMgr::CreateFormJsInfo(const int64_t formId, const FormRecord &record, FormJsInfo &formInfo)
224  {
225      formInfo.formId = formId;
226      formInfo.bundleName = record.bundleName;
227      formInfo.abilityName = record.abilityName;
228      formInfo.formName = record.formName;
229      formInfo.moduleName = record.moduleName;
230      formInfo.formTempFlag = record.formTempFlag;
231      formInfo.jsFormCodePath = record.jsFormCodePath;
232      formInfo.formSrc = record.formSrc;
233      formInfo.formWindow = record.formWindow;
234      formInfo.versionCode = record.versionCode;
235      formInfo.versionName = record.versionName;
236      formInfo.compatibleVersion = record.compatibleVersion;
237      formInfo.type = record.type;
238      formInfo.uiSyntax = record.uiSyntax;
239      formInfo.isDynamic = record.isDynamic;
240      formInfo.transparencyEnabled = record.transparencyEnabled;
241  }
242  
SetConfigMap(const std::map<std::string,int32_t> & configMap)243  void FormDataMgr::SetConfigMap(const std::map<std::string, int32_t> &configMap)
244  {
245      std::lock_guard<std::mutex> lock(formConfigMapMutex_);
246      formConfigMap_ = configMap;
247  }
248  
GetConfigParamFormMap(const std::string & key,int32_t & value) const249  void FormDataMgr::GetConfigParamFormMap(const std::string &key, int32_t &value) const
250  {
251      std::lock_guard<std::mutex> lock(formConfigMapMutex_);
252      if (formConfigMap_.empty()) {
253          HILOG_ERROR("empty configMap");
254          return;
255      }
256      auto iter = formConfigMap_.find(key);
257      if (iter == formConfigMap_.end()) {
258          HILOG_ERROR("no corresponding value found, use the default value");
259          return;
260      }
261      value = iter->second;
262      HILOG_INFO("key:%{public}s, value:%{public}d", key.c_str(), value);
263  }
264  
RecycleAllRecyclableForms() const265  void FormDataMgr::RecycleAllRecyclableForms() const
266  {
267      HILOG_INFO("start");
268      std::vector<int64_t> formIds;
269      {
270          std::lock_guard<std::mutex> lock(formRecordMutex_);
271          for (auto itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
272              if (itFormRecord->second.recycleStatus ==  RecycleStatus::RECYCLABLE) {
273                  formIds.emplace_back(itFormRecord->first);
274              }
275          }
276      }
277  
278      {
279          std::lock_guard<std::mutex> lock(formHostRecordMutex_);
280          for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
281              std::vector<int64_t> matchedFormIds;
282              for (const int64_t &formId : formIds) {
283                  if (itHostRecord->Contains(formId)) {
284                      matchedFormIds.emplace_back(formId);
285                  }
286              }
287              if (!matchedFormIds.empty()) {
288                  Want want;
289                  itHostRecord->OnRecycleForms(matchedFormIds, want);
290              }
291          }
292      }
293  }
294  
RecycleForms(const std::vector<int64_t> & formIds,const int & callingUid,const Want & want) const295  void FormDataMgr::RecycleForms(const std::vector<int64_t> &formIds, const int &callingUid, const Want &want) const
296  {
297      HILOG_INFO("start callingUid:%{public}d", callingUid);
298      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
299      for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
300          if (itHostRecord->GetCallerUid() != callingUid) {
301              continue;
302          }
303          std::vector<int64_t> matchedFormIds;
304          for (const int64_t &formId : formIds) {
305              if (itHostRecord->Contains(formId)) {
306                  matchedFormIds.emplace_back(formId);
307              }
308          }
309          if (!matchedFormIds.empty()) {
310              itHostRecord->OnRecycleForms(matchedFormIds, want);
311          }
312          break;
313      }
314  }
315  
316  /**
317   * @brief Check temp form count is max.
318   * @return Returns ERR_OK if the temp form not reached; returns ERR_MAX_SYSTEM_TEMP_FORMS is reached.
319   */
CheckTempEnoughForm() const320  int FormDataMgr::CheckTempEnoughForm() const
321  {
322      int32_t maxTempSize = Constants::MAX_TEMP_FORMS;
323      GetConfigParamFormMap(Constants::MAX_TEMP_FORM_SIZE, maxTempSize);
324      maxTempSize = ((maxTempSize > Constants::MAX_TEMP_FORMS) || (maxTempSize < 0)) ?
325          Constants::MAX_TEMP_FORMS : maxTempSize;
326      HILOG_DEBUG("maxTempSize:%{public}d", maxTempSize);
327  
328      std::lock_guard<std::mutex> lock(formTempMutex_);
329      if (static_cast<int32_t>(tempForms_.size()) >= maxTempSize) {
330          HILOG_WARN("already exist %{public}d temp forms in system", maxTempSize);
331          FormEventReport::SendFormFailedEvent(FormEventName::ADD_FORM_FAILED, HiSysEventType::FAULT,
332              static_cast<int64_t>(AddFormFiledErrorType::NUMBER_EXCEEDING_LIMIT));
333          return ERR_APPEXECFWK_FORM_MAX_SYSTEM_TEMP_FORMS;
334      }
335      return ERR_OK;
336  }
337  /**
338   * @brief Check form count is max.
339   * @param callingUid The UID of the proxy.
340   * @param currentUserId The current userId.
341   * @return Returns true if this function is successfully called; returns false otherwise.
342   */
CheckEnoughForm(const int callingUid,const int32_t currentUserId) const343  int FormDataMgr::CheckEnoughForm(const int callingUid, const int32_t currentUserId) const
344  {
345      HILOG_INFO("callingUid:%{public}d, currentUserId:%{public}d", callingUid, currentUserId);
346  
347      int callingUidFormCounts = 0;
348      int32_t maxFormsSize = Constants::MAX_FORMS;
349      GetConfigParamFormMap(Constants::MAX_NORMAL_FORM_SIZE, maxFormsSize);
350      maxFormsSize = ((maxFormsSize > Constants::MAX_FORMS) || (maxFormsSize < 0)) ?
351          Constants::MAX_FORMS : maxFormsSize;
352      HILOG_DEBUG("maxFormsSize:%{public}d", maxFormsSize);
353  
354      int32_t maxRecordPerApp = Constants::MAX_RECORD_PER_APP;
355      GetConfigParamFormMap(Constants::HOST_MAX_FORM_SIZE, maxRecordPerApp);
356      maxRecordPerApp = ((maxRecordPerApp > Constants::MAX_RECORD_PER_APP) || (maxRecordPerApp < 0)) ?
357          Constants::MAX_RECORD_PER_APP : maxRecordPerApp;
358      HILOG_DEBUG("maxRecordPerApp:%{public}d", maxRecordPerApp);
359  
360      if (maxRecordPerApp == 0) {
361          HILOG_ERROR("The maximum number of normal cards in pre host is 0");
362          return ERR_APPEXECFWK_FORM_MAX_FORMS_PER_CLIENT;
363      }
364  
365      std::lock_guard<std::mutex> lock(formRecordMutex_);
366      std::vector<FormDBInfo> formDbInfos;
367      FormDbCache::GetInstance().GetAllFormInfo(formDbInfos);
368      HILOG_INFO("already use %{public}zu forms", formDbInfos.size());
369      if (static_cast<int32_t>(formDbInfos.size()) >= maxFormsSize) {
370          HILOG_WARN("exceeds max form number %{public}d", maxFormsSize);
371          FormEventReport::SendFormFailedEvent(FormEventName::ADD_FORM_FAILED, HiSysEventType::FAULT,
372              static_cast<int64_t>(AddFormFiledErrorType::NUMBER_EXCEEDING_LIMIT));
373          return ERR_APPEXECFWK_FORM_MAX_SYSTEM_FORMS;
374      }
375  
376      int32_t currentAccountId = FormUtil::GetCurrentAccountId();
377      for (const auto &record : formDbInfos) {
378          if ((record.providerUserId == currentAccountId)) {
379              HILOG_DEBUG("called by currentActiveUser");
380              for (const auto &userUid : record.formUserUids) {
381                  if (userUid != callingUid) {
382                      continue;
383                  }
384                  if (++callingUidFormCounts >= maxRecordPerApp) {
385                      HILOG_WARN("already use %{public}d forms", maxRecordPerApp);
386                      return ERR_APPEXECFWK_FORM_MAX_FORMS_PER_CLIENT;
387                  }
388                  break;
389              }
390          }
391      }
392  
393      return ERR_OK;
394  }
395  /**
396   * @brief Delete temp form.
397   * @param formId The Id of the form.
398   * @return Returns true if this function is successfully called; returns false otherwise.
399   */
DeleteTempForm(const int64_t formId)400  bool FormDataMgr::DeleteTempForm(const int64_t formId)
401  {
402      std::lock_guard<std::mutex> lock(formTempMutex_);
403      auto iter = std::find(tempForms_.begin(), tempForms_.end(), formId);
404      if (iter == tempForms_.end()) {
405          HILOG_ERROR("tempForm not exist");
406          return false;
407      }
408      tempForms_.erase(iter);
409      return true;
410  }
411  /**
412   * @brief Check temp form is exist.
413   * @param formId The Id of the form.
414   * @return Returns true if the temp form is exist; returns false is not exist.
415   */
ExistTempForm(const int64_t formId) const416  bool FormDataMgr::ExistTempForm(const int64_t formId) const
417  {
418      std::lock_guard<std::mutex> lock(formTempMutex_);
419      return (std::find(tempForms_.begin(), tempForms_.end(), formId) != tempForms_.end());
420  }
421  /**
422   * @brief Check calling uid is valid.
423   * @param formUserUids The form user uids.
424   * @return Returns true if this user uid is valid; returns false otherwise.
425   */
IsCallingUidValid(const std::vector<int> & formUserUids) const426  bool FormDataMgr::IsCallingUidValid(const std::vector<int> &formUserUids) const
427  {
428      if (formUserUids.empty()) {
429          HILOG_ERROR("empty formUserUids");
430          return false;
431      }
432      for (const auto &userUid : formUserUids) {
433          if (userUid == IPCSkeleton::GetCallingUid()) {
434              return true;
435          }
436      }
437      HILOG_ERROR("not find valid uid");
438      return false;
439  }
440  /**
441   * @brief Modify form temp flag by formId.
442   * @param formId The Id of the form.
443   * @param formTempFlag The form temp flag.
444   * @return Returns true if this function is successfully called; returns false otherwise.
445   */
ModifyFormTempFlag(const int64_t formId,const bool formTempFlag)446  bool FormDataMgr::ModifyFormTempFlag(const int64_t formId, const bool formTempFlag)
447  {
448      HILOG_INFO("modify form temp flag by formId");
449      std::lock_guard<std::mutex> lock(formRecordMutex_);
450      if (!(formRecords_.count(formId) > 0)) {
451          HILOG_ERROR("formInfo not exist");
452          return false;
453      }
454      formRecords_[formId].formTempFlag = formTempFlag;
455      return true;
456  }
457  /**
458   * @brief Add form user uid from form record.
459   * @param formId The Id of the form.
460   * @param formRecord The form record.
461   * @return Returns true if this function is successfully called; returns false otherwise.
462   */
AddFormUserUid(const int64_t formId,const int formUserUid)463  bool FormDataMgr::AddFormUserUid(const int64_t formId, const int formUserUid)
464  {
465      HILOG_INFO("add form user uid by formId");
466      std::lock_guard<std::mutex> lock(formRecordMutex_);
467      if (!(formRecords_.count(formId) > 0)) {
468          HILOG_ERROR("formInfo not exist");
469          return false;
470      }
471      if (std::find(formRecords_[formId].formUserUids.begin(), formRecords_[formId].formUserUids.end(),
472          formUserUid) == formRecords_[formId].formUserUids.end()) {
473          formRecords_[formId].formUserUids.emplace_back(formUserUid);
474      }
475      return true;
476  }
477  /**
478   * @brief Delete form user uid from form record.
479   * @param formId The Id of the form.
480   * @param uid calling user id.
481   * @return Returns true if this function is successfully called; returns false otherwise.
482   */
DeleteFormUserUid(const int64_t formId,const int uid)483  bool FormDataMgr::DeleteFormUserUid(const int64_t formId, const int uid)
484  {
485      HILOG_INFO("formId:%{public}" PRId64 ", uid:%{public}d", formId, uid);
486      std::lock_guard<std::mutex> lock(formRecordMutex_);
487      if (formRecords_.count(formId) > 0) {
488          auto iter = std::find(formRecords_.at(formId).formUserUids.begin(),
489              formRecords_.at(formId).formUserUids.end(), uid);
490          if (iter != formRecords_.at(formId).formUserUids.end()) {
491              formRecords_.at(formId).formUserUids.erase(iter);
492          }
493          return true;
494      } else {
495          HILOG_ERROR("formInfo not find");
496          return false;
497      }
498  }
499  /**
500   * @brief Update form record.
501   * @param formId The Id of the form.
502   * @param formRecord The form record.
503   * @return Returns true if this function is successfully called; returns false otherwise.
504   */
UpdateFormRecord(const int64_t formId,const FormRecord & formRecord)505  bool FormDataMgr::UpdateFormRecord(const int64_t formId, const FormRecord &formRecord)
506  {
507      HILOG_DEBUG("get form record by formId");
508      std::lock_guard<std::mutex> lock(formRecordMutex_);
509      auto info = formRecords_.find(formId);
510      if (info != formRecords_.end()) {
511          formRecords_[formId] = formRecord;
512          return true;
513      }
514      return false;
515  }
516  /**
517   * @brief Get form record.
518   * @param formId The Id of the form.
519   * @param formRecord The form record.
520   * @return Returns true if this function is successfully called; returns false otherwise.
521   */
GetFormRecord(const int64_t formId,FormRecord & formRecord) const522  bool FormDataMgr::GetFormRecord(const int64_t formId, FormRecord &formRecord) const
523  {
524      HILOG_DEBUG("get form record by formId");
525      std::lock_guard<std::mutex> lock(formRecordMutex_);
526      auto info = formRecords_.find(formId);
527      if (info == formRecords_.end()) {
528          HILOG_ERROR("formInfo not find");
529          return false;
530      }
531      formRecord = info->second;
532  
533      HILOG_DEBUG("get form record successfully");
534      return true;
535  }
536  /**
537   * @brief Get form record.
538   * @param bundleName Bundle name.
539   * @param formInfos The form record.
540   * @return Returns true if this function is successfully called; returns false otherwise.
541   */
GetFormRecord(const std::string & bundleName,std::vector<FormRecord> & formInfos,int32_t userId) const542  bool FormDataMgr::GetFormRecord(const std::string &bundleName, std::vector<FormRecord> &formInfos, int32_t userId) const
543  {
544      HILOG_DEBUG("get form record by bundleName");
545      std::lock_guard<std::mutex> lock(formRecordMutex_);
546      for (auto itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
547          if (bundleName == itFormRecord->second.bundleName &&
548              (userId == Constants::INVALID_USER_ID || userId == itFormRecord->second.userId)) {
549              formInfos.emplace_back(itFormRecord->second);
550          }
551      }
552      if (formInfos.size() > 0) {
553          return true;
554      } else {
555          HILOG_DEBUG("formInfo not find");
556          return false;
557      }
558  }
559  
560  /**
561   * @brief Get temporary form record.
562   * @param formTempRecords The temp form record.
563   * @return Returns true if this function is successfully called; returns false otherwise.
564   */
GetTempFormRecord(std::vector<FormRecord> & formTempRecords)565  bool FormDataMgr::GetTempFormRecord(std::vector<FormRecord> &formTempRecords)
566  {
567      HILOG_INFO("Get temporary form record");
568      std::lock_guard<std::mutex> lock(formRecordMutex_);
569      std::map<int64_t, FormRecord>::iterator itFormRecord;
570      for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
571          if (itFormRecord->second.formTempFlag) {
572              formTempRecords.emplace_back(itFormRecord->second);
573          }
574      }
575      if (!formTempRecords.empty()) {
576          return true;
577      } else {
578          HILOG_INFO("The count of temporary form is zero");
579          return false;
580      }
581  }
582  /**
583   * @brief Check form record is exist.
584   * @param formId The Id of the form.
585   * @return Returns true if the form record is exist; returns false is not exist.
586   */
ExistFormRecord(const int64_t formId) const587  bool FormDataMgr::ExistFormRecord(const int64_t formId) const
588  {
589      HILOG_INFO("check form record is exist");
590      std::lock_guard<std::mutex> lock(formRecordMutex_);
591      return (formRecords_.count(formId) > 0);
592  }
593  /**
594   * @brief Has form user uids in form record.
595   * @param formId The Id of the form.
596   * @return Returns true if this form has form user uids; returns false is not has.
597   */
HasFormUserUids(const int64_t formId) const598  bool FormDataMgr::HasFormUserUids(const int64_t formId) const
599  {
600      HILOG_INFO("check form has user uids");
601      FormRecord record;
602      if (GetFormRecord(formId, record)) {
603          return record.formUserUids.empty() ? false : true;
604      }
605      return false;
606  }
607  /**
608   * @brief Get form host record.
609   * @param formId The id of the form.
610   * @param formHostRecord The form host record.
611   */
GetFormHostRecord(const int64_t formId,std::vector<FormHostRecord> & formHostRecords) const612  void FormDataMgr::GetFormHostRecord(const int64_t formId, std::vector<FormHostRecord> &formHostRecords) const
613  {
614      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
615      for (auto &record : clientRecords_) {
616          if (record.Contains(formId)) {
617              formHostRecords.emplace_back(record);
618          }
619      }
620      HILOG_DEBUG("get form host record by formId, size is %{public}zu", formHostRecords.size());
621  }
GetFormHostRemoteObj(const int64_t formId,std::vector<sptr<IRemoteObject>> & formHostObjs) const622  void FormDataMgr::GetFormHostRemoteObj(const int64_t formId, std::vector<sptr<IRemoteObject>> &formHostObjs) const
623  {
624      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
625      for (auto &record : clientRecords_) {
626          if (record.Contains(formId)) {
627              formHostObjs.emplace_back(record.GetFormHostClient());
628          }
629      }
630      HILOG_DEBUG("Get form host remote object by formId, size is %{public}zu", formHostObjs.size());
631  }
632  /**
633   * @brief Delete form host record.
634   * @param callerToken The client stub of the form host record.
635   * @param formId The id of the form.
636   * @return Returns true if this function is successfully called; returns false otherwise.
637   */
DeleteHostRecord(const sptr<IRemoteObject> & callerToken,const int64_t formId)638  bool FormDataMgr::DeleteHostRecord(const sptr<IRemoteObject> &callerToken, const int64_t formId)
639  {
640      HILOG_INFO("call");
641      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
642      std::vector<FormHostRecord>::iterator iter;
643      for (iter = clientRecords_.begin(); iter != clientRecords_.end(); ++iter) {
644          if (callerToken == iter->GetFormHostClient()) {
645              iter->DelForm(formId);
646              if (iter->IsEmpty()) {
647                  HILOG_INFO("post delay recheck whether need clean form host task");
648                  FormTaskMgr::GetInstance().PostDelayRecheckWhetherNeedCleanFormHostTask(
649                      iter->GetCallerUid(), callerToken);
650              }
651              break;
652          }
653      }
654      return true;
655  }
656  /**
657   * @brief Recheck whether need clean form host.
658   * @param callerToken The client stub of the form host record.
659   */
RecheckWhetherNeedCleanFormHost(const sptr<IRemoteObject> & callerToken)660  bool FormDataMgr::RecheckWhetherNeedCleanFormHost(const sptr<IRemoteObject> &callerToken)
661  {
662      HILOG_INFO("call");
663      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
664      std::vector<FormHostRecord>::iterator iter;
665      for (iter = clientRecords_.begin(); iter != clientRecords_.end(); ++iter) {
666          if (callerToken == iter->GetFormHostClient()) {
667              if (iter->IsEmpty()) {
668                  HILOG_INFO("clientRecords_ is empty, clean form host");
669                  iter->CleanResource();
670                  iter = clientRecords_.erase(iter);
671                  FormRenderMgr::GetInstance().CleanFormHost(callerToken, iter->GetCallerUid());
672                  return true;
673              }
674              break;
675          }
676      }
677      HILOG_INFO("no need to clean form host");
678      return false;
679  }
680  /**
681   * @brief Clean removed forms form host.
682   * @param removedFormIds The id list of the forms.
683   */
CleanHostRemovedForms(const std::vector<int64_t> & removedFormIds)684  void FormDataMgr::CleanHostRemovedForms(const std::vector<int64_t> &removedFormIds)
685  {
686      HILOG_INFO("delete form host record by formId list");
687      std::vector<int64_t> matchedIds;
688      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
689      std::vector<FormHostRecord>::iterator itHostRecord;
690      for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
691          for (const int64_t& formId : removedFormIds) {
692              if (itHostRecord->Contains(formId)) {
693                  matchedIds.emplace_back(formId);
694                  itHostRecord->DelForm(formId);
695              }
696          }
697          if (!matchedIds.empty()) {
698              HILOG_INFO("OnFormUninstalled");
699              itHostRecord->OnFormUninstalled(matchedIds);
700          }
701      }
702  
703      HILOG_INFO("end");
704  }
705  
UpdateHostForms(const std::vector<int64_t> & updateFormIds)706  void FormDataMgr::UpdateHostForms(const std::vector<int64_t> &updateFormIds)
707  {
708      HILOG_INFO("update form host record by formId list");
709      std::vector<int64_t> matchedIds;
710      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
711      for (FormHostRecord &record : clientRecords_) {
712          for (const int64_t &formId : updateFormIds) {
713              if (record.Contains(formId)) {
714                  matchedIds.emplace_back(formId);
715              }
716          }
717          if (!matchedIds.empty()) {
718              HILOG_INFO("OnFormUninstalled");
719              record.OnFormUninstalled(matchedIds);
720              matchedIds.clear();
721          }
722      }
723      HILOG_INFO("end");
724  }
725  
726  /**
727   * @brief Handle form host died.
728   * @param remoteHost Form host proxy object.
729   */
HandleHostDied(const sptr<IRemoteObject> & remoteHost)730  void FormDataMgr::HandleHostDied(const sptr<IRemoteObject> &remoteHost)
731  {
732      std::vector<int64_t> recordTempForms;
733      int remoteHostCallerUid = 0;
734      {
735          std::lock_guard<std::mutex> lock(formHostRecordMutex_);
736          std::vector<FormHostRecord>::iterator itHostRecord;
737          for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
738              if (remoteHost == itHostRecord->GetFormHostClient()) {
739                  HandleHostDiedForTempForms(*itHostRecord, recordTempForms);
740                  HILOG_INFO("find died client,remove it");
741                  itHostRecord->CleanResource();
742                  remoteHostCallerUid = itHostRecord->GetCallerUid();
743                  itHostRecord = clientRecords_.erase(itHostRecord);
744                  break;
745              } else {
746                  itHostRecord++;
747              }
748          }
749      }
750      {
751          std::lock_guard<std::mutex> lock(formRecordMutex_);
752          std::map<int64_t, FormRecord>::iterator itFormRecord;
753          for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
754              int64_t formId = itFormRecord->first;
755              // if temp form, remove it
756              if (std::find(recordTempForms.begin(), recordTempForms.end(), formId) != recordTempForms.end()) {
757                  FormRecord formRecord = itFormRecord->second;
758                  itFormRecord = formRecords_.erase(itFormRecord);
759                  FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, formRecord);
760                  FormDataProxyMgr::GetInstance().UnsubscribeFormData(formId);
761              } else {
762                  itFormRecord++;
763              }
764          }
765      }
766      {
767          std::lock_guard<std::mutex> lock(formStateRecordMutex_);
768          std::map<std::string, FormHostRecord>::iterator itFormStateRecord;
769          for (itFormStateRecord = formStateRecord_.begin(); itFormStateRecord != formStateRecord_.end();) {
770              if (remoteHost == itFormStateRecord->second.GetFormHostClient()) {
771                  HILOG_INFO("find died client, remove it from formStateRecord_");
772                  itFormStateRecord->second.CleanResource();
773                  itFormStateRecord = formStateRecord_.erase(itFormStateRecord);
774                  break;
775              } else {
776                  itFormStateRecord++;
777              }
778          }
779      }
780      FormRenderMgr::GetInstance().CleanFormHost(remoteHost, remoteHostCallerUid);
781  }
782  
783  /**
784   * @brief Get the temp forms from host and delete temp form in cache.
785   * @param record The form record.
786   * @param recordTempForms gotten the temp forms.
787   */
HandleHostDiedForTempForms(const FormHostRecord & record,std::vector<int64_t> & recordTempForms)788  void FormDataMgr::HandleHostDiedForTempForms(const FormHostRecord &record, std::vector<int64_t> &recordTempForms)
789  {
790      std::lock_guard<std::mutex> lock(formTempMutex_);
791      std::vector<int64_t>::iterator itForm;
792      for (itForm = tempForms_.begin(); itForm != tempForms_.end();) {
793          if (record.Contains(*itForm)) {
794              recordTempForms.emplace_back(*itForm);
795              itForm = tempForms_.erase(itForm);
796          } else {
797              itForm++;
798          }
799      }
800  }
801  
802  /**
803   * @brief Refresh enable or not.
804   * @param formId The Id of the form.
805   * @return true on enable, false on disable.
806   */
IsEnableRefresh(int64_t formId)807  bool FormDataMgr::IsEnableRefresh(int64_t formId)
808  {
809      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
810      for (auto &record : clientRecords_) {
811          if (record.IsEnableRefresh(formId)) {
812              return true;
813          }
814      }
815  
816      return false;
817  }
818  
819  /**
820   * @brief update enable or not.
821   * @param formId The Id of the form.
822   * @return true on enable, false on disable.
823   */
IsEnableUpdate(int64_t formId)824  bool FormDataMgr::IsEnableUpdate(int64_t formId)
825  {
826      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
827      for (auto &record : clientRecords_) {
828          if (record.IsEnableUpdate(formId)) {
829              return true;
830          }
831      }
832      return false;
833  }
834  
PaddingUdidHash(const int64_t formId)835  int64_t FormDataMgr::PaddingUdidHash(const int64_t formId)
836  {
837      if (!GenerateUdidHash()) {
838          return -1;
839      }
840      // Compatible with int form id.
841      uint64_t unsignedFormId = static_cast<uint64_t>(formId);
842      if ((unsignedFormId & 0xffffffff00000000L) == 0) {
843          uint64_t unsignedUdidHash  = static_cast<uint64_t>(udidHash_);
844          uint64_t unsignedUdidHashFormId = unsignedUdidHash | unsignedFormId;
845          int64_t udidHashFormId = static_cast<int64_t>(unsignedUdidHashFormId);
846          return udidHashFormId;
847      }
848      return formId;
849  }
850  
851  /**
852   * @brief Generate form id.
853   * @return form id.
854   */
GenerateFormId()855  int64_t FormDataMgr::GenerateFormId()
856  {
857      // generate by udidHash_
858      if (!GenerateUdidHash()) {
859          HILOG_ERROR("generateFormId no invalid udidHash_");
860          return -1;
861      }
862      return FormUtil::GenerateFormId(udidHash_);
863  }
864  /**
865   * @brief Generate udid.
866   * @return Returns true if this function is successfully called; returns false otherwise.
867   */
GenerateUdidHash()868  bool FormDataMgr::GenerateUdidHash()
869  {
870      if (udidHash_ != Constants::INVALID_UDID_HASH) {
871          return true;
872      }
873  
874      bool genUdid = FormUtil::GenerateUdidHash(udidHash_);
875      if (!genUdid) {
876          HILOG_ERROR("fail generate udid");
877          return false;
878      }
879  
880      return true;
881  }
882  /**
883   * @brief Get udid.
884   * @return udid.
885   */
GetUdidHash() const886  int64_t FormDataMgr::GetUdidHash() const
887  {
888      return udidHash_;
889  }
890  /**
891   * @brief Set udid.
892   * @param udidHash udid.
893   */
SetUdidHash(const int64_t udidHash)894  void FormDataMgr::SetUdidHash(const int64_t udidHash)
895  {
896      udidHash_ = udidHash;
897  }
898  
899  /**
900   * @brief Get the matched form host record by client stub.
901   *
902   * @param callerToken The client stub of the form host record.
903   * @param formHostRecord The form host record.
904   * @return Returns true if this function is successfully called, returns false otherwise.
905   */
GetMatchedHostClient(const sptr<IRemoteObject> & callerToken,FormHostRecord & formHostRecord) const906  bool FormDataMgr::GetMatchedHostClient(const sptr<IRemoteObject> &callerToken, FormHostRecord &formHostRecord) const
907  {
908      HILOG_DEBUG("get the matched form host record by client stub");
909      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
910      for (const FormHostRecord &record : clientRecords_) {
911          if (callerToken == record.GetFormHostClient()) {
912              formHostRecord = record;
913              return true;
914          }
915      }
916  
917      HILOG_ERROR("form host record not find");
918      return false;
919  }
920  
921  /**
922   * @brief Set needRefresh for FormRecord.
923   * @param formId The Id of the form.
924   * @param needRefresh true or false.
925   */
SetNeedRefresh(const int64_t formId,const bool needRefresh)926  void FormDataMgr::SetNeedRefresh(const int64_t formId, const bool needRefresh)
927  {
928      std::lock_guard<std::mutex> lock(formRecordMutex_);
929      auto itFormRecord = formRecords_.find(formId);
930      if (itFormRecord == formRecords_.end()) {
931          HILOG_ERROR("form info not find");
932          return;
933      }
934      itFormRecord->second.needRefresh = needRefresh;
935  }
936  
937  /**
938   * @brief Set needRefresh for FormRecord.
939   * @param formId The Id of the form.
940   * @param needRefresh true or false.
941   */
SetNeedAddForm(const int64_t formId,const bool needAddForm)942  void FormDataMgr::SetNeedAddForm(const int64_t formId, const bool needAddForm)
943  {
944      std::lock_guard<std::mutex> lock(formRecordMutex_);
945      auto itFormRecord = formRecords_.find(formId);
946      if (itFormRecord == formRecords_.end()) {
947          HILOG_ERROR("form info not find");
948          return;
949      }
950      itFormRecord->second.needAddForm = needAddForm;
951  }
952  
953  /**
954   * @brief Set isCountTimerRefresh for FormRecord.
955   * @param formId The Id of the form.
956   * @param countTimerRefresh true or false.
957   */
SetCountTimerRefresh(const int64_t formId,const bool countTimerRefresh)958  void FormDataMgr::SetCountTimerRefresh(const int64_t formId, const bool countTimerRefresh)
959  {
960      std::lock_guard<std::mutex> lock(formRecordMutex_);
961      auto itFormRecord = formRecords_.find(formId);
962      if (itFormRecord == formRecords_.end()) {
963          HILOG_ERROR("form info not find");
964          return;
965      }
966      itFormRecord->second.isCountTimerRefresh = countTimerRefresh;
967  }
968  
969  /**
970   * @brief Set isTimerRefresh for FormRecord.
971   * @param formId The Id of the form.
972   * @param timerRefresh true or false.
973   */
SetTimerRefresh(const int64_t formId,const bool timerRefresh)974  void FormDataMgr::SetTimerRefresh(const int64_t formId, const bool timerRefresh)
975  {
976      std::lock_guard<std::mutex> lock(formRecordMutex_);
977      auto itFormRecord = formRecords_.find(formId);
978      if (itFormRecord == formRecords_.end()) {
979          HILOG_ERROR("form info not find");
980          return;
981      }
982      itFormRecord->second.isTimerRefresh = timerRefresh;
983  }
984  
985  /**
986   * @brief Get updated form.
987   * @param record FormRecord.
988   * @param targetForms Target forms.
989   * @param updatedForm Updated formnfo.
990   * @return Returns true on success, false on failure.
991   */
GetUpdatedForm(const FormRecord & record,const std::vector<FormInfo> & targetForms,FormInfo & updatedForm)992  bool FormDataMgr::GetUpdatedForm(const FormRecord &record, const std::vector<FormInfo> &targetForms,
993      FormInfo &updatedForm)
994  {
995      if (targetForms.empty()) {
996          HILOG_ERROR("empty targetForms");
997          return false;
998      }
999  
1000      for (const FormInfo &item : targetForms) {
1001          if (IsSameForm(record, item)) {
1002              updatedForm = item;
1003              HILOG_DEBUG("find matched form");
1004              return true;
1005          }
1006      }
1007      return false;
1008  }
1009  /**
1010   * @brief Set isEnableUpdate for FormRecord.
1011   * @param formId The Id of the form.
1012   * @param enableUpdate true or false.
1013   */
SetEnableUpdate(const int64_t formId,const bool enableUpdate)1014  void FormDataMgr::SetEnableUpdate(const int64_t formId, const bool enableUpdate)
1015  {
1016      std::lock_guard<std::mutex> lock(formRecordMutex_);
1017      auto itFormRecord = formRecords_.find(formId);
1018      if (itFormRecord == formRecords_.end()) {
1019          HILOG_ERROR("form info not find");
1020          return;
1021      }
1022      itFormRecord->second.isEnableUpdate = enableUpdate;
1023  }
1024  /**
1025   * @brief Set update info for FormRecord.
1026   * @param formId The Id of the form.
1027   * @param enableUpdate true or false.
1028   * @param updateDuration Update duration.
1029   * @param updateAtHour Update at hour.
1030   * @param updateAtMin Update at minute.
1031   */
SetUpdateInfo(const int64_t formId,const bool enableUpdate,const long updateDuration,const int updateAtHour,const int updateAtMin)1032  void FormDataMgr::SetUpdateInfo(
1033      const int64_t formId,
1034      const bool enableUpdate,
1035      const long updateDuration,
1036      const int updateAtHour,
1037      const int updateAtMin)
1038  {
1039      std::lock_guard<std::mutex> lock(formRecordMutex_);
1040      auto itFormRecord = formRecords_.find(formId);
1041      if (itFormRecord == formRecords_.end()) {
1042          HILOG_ERROR("form info not find");
1043          return;
1044      }
1045  
1046      itFormRecord->second.isEnableUpdate = enableUpdate;
1047      itFormRecord->second.updateDuration = updateDuration;
1048      itFormRecord->second.updateAtHour = updateAtHour;
1049      itFormRecord->second.updateAtMin = updateAtMin;
1050  }
1051  /**
1052   * @brief Check if two forms is same or not.
1053   * @param record FormRecord.
1054   * @param formInfo FormInfo.
1055   * @return Returns true on success, false on failure.
1056   */
IsSameForm(const FormRecord & record,const FormInfo & formInfo)1057  bool FormDataMgr::IsSameForm(const FormRecord &record, const FormInfo &formInfo)
1058  {
1059      if (record.bundleName == formInfo.bundleName
1060          && record.moduleName == formInfo.moduleName
1061          && record.abilityName == formInfo.abilityName
1062          && record.formName == formInfo.name
1063          && std::find(formInfo.supportDimensions.begin(), formInfo.supportDimensions.end(), record.specification)
1064          != formInfo.supportDimensions.end()) {
1065          return true;
1066      }
1067  
1068      return false;
1069  }
1070  /**
1071   * @brief Clean removed form records.
1072   * @param removedForms The id list of the forms.
1073   */
CleanRemovedFormRecords(const std::string & bundleName,std::set<int64_t> & removedForms)1074  void FormDataMgr::CleanRemovedFormRecords(const std::string &bundleName, std::set<int64_t> &removedForms)
1075  {
1076      HILOG_INFO("clean removed form records");
1077      std::lock_guard<std::mutex> lock(formRecordMutex_);
1078      std::map<int64_t, FormRecord>::iterator itFormRecord;
1079      for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
1080          auto itForm = std::find(removedForms.begin(), removedForms.end(), itFormRecord->first);
1081          if (itForm != removedForms.end()) {
1082              FormCacheMgr::GetInstance().DeleteData(itFormRecord->first);
1083              FormRenderMgr::GetInstance().StopRenderingForm(itFormRecord->first, itFormRecord->second);
1084              itFormRecord = formRecords_.erase(itFormRecord);
1085          } else {
1086              itFormRecord++;
1087          }
1088      }
1089  }
1090  /**
1091   * @brief Clean removed temp form records.
1092   * @param  bundleName BundleName.
1093   * @param removedForms The id list of the forms.
1094   */
CleanRemovedTempFormRecords(const std::string & bundleName,const int32_t userId,std::set<int64_t> & removedForms)1095  void FormDataMgr::CleanRemovedTempFormRecords(const std::string &bundleName, const int32_t userId,
1096      std::set<int64_t> &removedForms)
1097  {
1098      HILOG_INFO("clean removed form records");
1099      std::set<int64_t> removedTempForms;
1100      {
1101          std::lock_guard<std::mutex> lock(formRecordMutex_);
1102          std::map<int64_t, FormRecord>::iterator itFormRecord;
1103          for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
1104              if ((itFormRecord->second.formTempFlag) && (bundleName == itFormRecord->second.bundleName)
1105                  && (userId == itFormRecord->second.providerUserId)) {
1106                  removedTempForms.emplace(itFormRecord->second.formId);
1107                  FormRenderMgr::GetInstance().StopRenderingForm(itFormRecord->first, itFormRecord->second);
1108                  itFormRecord = formRecords_.erase(itFormRecord);
1109              } else {
1110                  itFormRecord++;
1111              }
1112          }
1113      }
1114  
1115      if (removedTempForms.size() > 0) {
1116          std::lock_guard<std::mutex> lock(formTempMutex_);
1117          std::vector<int64_t>::iterator itTemp;
1118          for (itTemp = tempForms_.begin(); itTemp != tempForms_.end();) {
1119              if (removedTempForms.find(*itTemp) != removedTempForms.end()) {
1120                  itTemp = tempForms_.erase(itTemp);
1121              } else {
1122                  itTemp++;
1123              }
1124          }
1125          removedForms.merge(removedTempForms);
1126      }
1127  }
1128  /**
1129   * @brief Get recreate form records.
1130   * @param reCreateForms The id list of the forms.
1131   */
GetReCreateFormRecordsByBundleName(const std::string & bundleName,std::set<int64_t> & reCreateForms)1132  void FormDataMgr::GetReCreateFormRecordsByBundleName(const std::string &bundleName, std::set<int64_t> &reCreateForms)
1133  {
1134      std::lock_guard<std::mutex> lock(formRecordMutex_);
1135      std::map<int64_t, FormRecord>::iterator itFormRecord;
1136      for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1137          if (bundleName == itFormRecord->second.bundleName) {
1138              reCreateForms.emplace(itFormRecord->second.formId);
1139          }
1140      }
1141  }
1142  /**
1143   * @brief Set form isInited flag.
1144   * @param formId The Id of the form.
1145   * @param isInited isInited property
1146   */
SetFormCacheInited(const int64_t formId,bool isInited)1147  void FormDataMgr::SetFormCacheInited(const int64_t formId, bool isInited)
1148  {
1149      std::lock_guard<std::mutex> lock(formRecordMutex_);
1150      auto itFormRecord = formRecords_.find(formId);
1151      if (itFormRecord == formRecords_.end()) {
1152          HILOG_ERROR("form info not find");
1153          return;
1154      }
1155      itFormRecord->second.isInited = isInited;
1156      itFormRecord->second.needRefresh = !isInited;
1157  }
1158  /**
1159   * @brief Set versionUpgrade.
1160   * @param formId The Id of the form.
1161   * @param versionUpgrade true or false
1162   */
SetVersionUpgrade(const int64_t formId,const bool versionUpgrade)1163  void FormDataMgr::SetVersionUpgrade(const int64_t formId, const bool versionUpgrade)
1164  {
1165      std::lock_guard<std::mutex> lock(formRecordMutex_);
1166      auto itFormRecord = formRecords_.find(formId);
1167      if (itFormRecord == formRecords_.end()) {
1168          HILOG_ERROR("form info not find");
1169          return;
1170      }
1171      itFormRecord->second.versionUpgrade = versionUpgrade;
1172  }
1173  /**
1174   * @brief Update form for host clients.
1175   * @param formId The Id of the form.
1176   * @param needRefresh true or false
1177   */
UpdateHostNeedRefresh(const int64_t formId,const bool needRefresh)1178  void FormDataMgr::UpdateHostNeedRefresh(const int64_t formId, const bool needRefresh)
1179  {
1180      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1181      std::vector<FormHostRecord>::iterator itHostRecord;
1182      for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1183          if (itHostRecord->Contains(formId)) {
1184              itHostRecord->SetNeedRefresh(formId, needRefresh);
1185          }
1186      }
1187  }
1188  
1189  /**
1190   * @brief Update form for host clients.
1191   * @param formId The Id of the form.
1192   * @param formRecord The form info.
1193   * @return Returns true if form update, false if other.
1194   */
UpdateHostForm(const int64_t formId,const FormRecord & formRecord)1195  bool FormDataMgr::UpdateHostForm(const int64_t formId, const FormRecord &formRecord)
1196  {
1197      bool isUpdated = false;
1198      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1199      std::vector<FormHostRecord>::iterator itHostRecord;
1200      for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1201          bool enableRefresh = formRecord.isVisible || itHostRecord->IsEnableUpdate(formId) ||
1202                               itHostRecord->IsEnableRefresh(formId);
1203          HILOG_INFO("formId:%{public}" PRId64 " enableRefresh:%{public}d", formId, enableRefresh);
1204          if (enableRefresh) {
1205              // update form
1206              itHostRecord->OnUpdate(formId, formRecord);
1207              // set needRefresh
1208              itHostRecord->SetNeedRefresh(formId, false);
1209              isUpdated = true;
1210          }
1211      }
1212      return isUpdated;
1213  }
1214  
HandleUpdateHostFormFlag(const std::vector<int64_t> & formIds,bool flag,bool isOnlyEnableUpdate,FormHostRecord & formHostRecord,std::vector<int64_t> & refreshForms)1215  ErrCode FormDataMgr::HandleUpdateHostFormFlag(const std::vector<int64_t> &formIds, bool flag, bool isOnlyEnableUpdate,
1216                                                FormHostRecord &formHostRecord, std::vector<int64_t> &refreshForms)
1217  {
1218      for (const int64_t formId : formIds) {
1219          if (formId <= 0) {
1220              HILOG_WARN("formId %{public}" PRId64 " less than 0", formId);
1221              continue;
1222          }
1223  
1224          int64_t matchedFormId = FindMatchedFormId(formId);
1225          if (!formHostRecord.Contains(matchedFormId)) {
1226              HILOG_WARN("form %{public}" PRId64 "not owned by this client, don't need to update flag",
1227                  formId);
1228              continue;
1229          }
1230  
1231          if (isOnlyEnableUpdate) {
1232              // new API: this flag is used only to control enable update
1233              formHostRecord.SetEnableUpdate(matchedFormId, flag);
1234              formHostRecord.SetEnableRefresh(matchedFormId, false);
1235          } else {
1236              // old API: this flag is used to control enable update and visible update
1237              formHostRecord.SetEnableRefresh(matchedFormId, flag);
1238          }
1239  
1240          // set disable
1241          if (!flag) {
1242              HILOG_DEBUG("flag is disable");
1243              continue;
1244          }
1245          FormRecord formRecord;
1246          if (GetFormRecord(matchedFormId, formRecord)) {
1247              if (formRecord.needRefresh) {
1248                  HILOG_DEBUG("formRecord need refresh");
1249                  refreshForms.emplace_back(matchedFormId);
1250                  continue;
1251              }
1252          } else {
1253              HILOG_WARN("not exist such form:%{public}" PRId64 "", matchedFormId);
1254              continue;
1255          }
1256  
1257          // if set enable flag, should check whether to refresh form
1258          if (!formHostRecord.IsNeedRefresh(matchedFormId)) {
1259              HILOG_DEBUG("host need not refresh");
1260              continue;
1261          }
1262  
1263          if (IsFormCached(formRecord)) {
1264              HILOG_DEBUG("form cached");
1265              formHostRecord.OnUpdate(matchedFormId, formRecord);
1266              formHostRecord.SetNeedRefresh(matchedFormId, false);
1267          } else {
1268              HILOG_DEBUG("form no cache");
1269              refreshForms.emplace_back(matchedFormId);
1270              continue;
1271          }
1272      }
1273      return ERR_OK;
1274  }
1275  
1276  /**
1277   * @brief handle update form flag.
1278   * @param formIDs The id of the forms.
1279   * @param callerToken Caller ability token.
1280   * @param flag form flag.
1281   * @param isOnlyEnableUpdate form enable update form flag.
1282   * @param refreshForms Refresh forms
1283   * @return Returns ERR_OK on success, others on failure.
1284   */
UpdateHostFormFlag(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool flag,bool isOnlyEnableUpdate,std::vector<int64_t> & refreshForms)1285  ErrCode FormDataMgr::UpdateHostFormFlag(const std::vector<int64_t> &formIds, const sptr<IRemoteObject> &callerToken,
1286                                          bool flag, bool isOnlyEnableUpdate, std::vector<int64_t> &refreshForms)
1287  {
1288      HILOG_DEBUG("start,flag:%{public}d", flag);
1289      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1290      std::vector<FormHostRecord>::iterator itHostRecord;
1291      for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1292          if (callerToken == itHostRecord->GetFormHostClient()) {
1293              HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, *itHostRecord, refreshForms);
1294              HILOG_DEBUG("end");
1295              return ERR_OK;
1296          }
1297      }
1298      HILOG_ERROR("can't find target client");
1299      return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1300  }
1301  /**
1302   * @brief Find matched form id.
1303   * @param formId The form id.
1304   * @return Matched form id.
1305   */
FindMatchedFormId(const int64_t formId)1306  int64_t FormDataMgr::FindMatchedFormId(const int64_t formId)
1307  {
1308      uint64_t unsignedFormId = static_cast<uint64_t>(formId);
1309      if ((unsignedFormId & 0xffffffff00000000L) != 0) {
1310          return formId;
1311      }
1312      std::lock_guard<std::mutex> lock(formRecordMutex_);
1313      std::map<int64_t, FormRecord>::iterator itFormRecord;
1314      for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1315          uint64_t unsignedFormId = static_cast<uint64_t>(formId);
1316          uint64_t unsignedItFormRecordFirst = static_cast<uint64_t>(itFormRecord->first);
1317          if ((unsignedItFormRecordFirst & 0x00000000ffffffffL) == (unsignedFormId & 0x00000000ffffffffL)) {
1318              return itFormRecord->first;
1319          }
1320      }
1321      return formId;
1322  }
1323  
1324  /**
1325   * @brief Clear host data by uId.
1326   * @param uId The caller uId.
1327   */
ClearHostDataByUId(const int uId)1328  void FormDataMgr::ClearHostDataByUId(const int uId)
1329  {
1330      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1331      std::vector<FormHostRecord>::iterator itHostRecord;
1332      for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
1333          if (itHostRecord->GetCallerUid() == uId) {
1334              itHostRecord->CleanResource();
1335              itHostRecord = clientRecords_.erase(itHostRecord);
1336          } else {
1337              itHostRecord++;
1338          }
1339      }
1340  }
1341  /**
1342   * @brief Get no host temp forms.
1343   * @param uid The caller uid.
1344   * @param noHostTempFormsMap no host temp forms.
1345   * @param foundFormsMap Form Id list.
1346   */
GetNoHostTempForms(const int uid,std::map<FormIdKey,std::set<int64_t>> & noHostTempFormsMap,std::map<int64_t,bool> & foundFormsMap)1347  void FormDataMgr::GetNoHostTempForms(
1348      const int uid, std::map<FormIdKey,
1349      std::set<int64_t>> &noHostTempFormsMap,
1350      std::map<int64_t, bool> &foundFormsMap)
1351  {
1352      std::lock_guard<std::mutex> lock(formRecordMutex_);
1353      std::map<int64_t, FormRecord>::iterator itFormRecord;
1354      for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1355          if (!itFormRecord->second.formTempFlag) {
1356              continue; // Not temp form, skip
1357          }
1358  
1359          auto itUid = std::find(itFormRecord->second.formUserUids.begin(),
1360              itFormRecord->second.formUserUids.end(), uid);
1361          if (itUid == itFormRecord->second.formUserUids.end()) {
1362              foundFormsMap.emplace(itFormRecord->second.formId, false);
1363              continue;
1364          }
1365  
1366          itFormRecord->second.formUserUids.erase(itUid);
1367          if (!itFormRecord->second.formUserUids.empty()) {
1368              continue;
1369          }
1370  
1371          FormIdKey formIdKey(itFormRecord->second.bundleName, itFormRecord->second.abilityName);
1372          auto itIdsSet = noHostTempFormsMap.find(formIdKey);
1373          if (itIdsSet == noHostTempFormsMap.end()) {
1374              std::set<int64_t> formIdsSet;
1375              formIdsSet.emplace(itFormRecord->second.formId);
1376              noHostTempFormsMap.emplace(formIdKey, formIdsSet);
1377          } else {
1378              itIdsSet->second.emplace(itFormRecord->second.formId);
1379          }
1380      }
1381  }
1382  /**
1383   * @brief Parse update config.
1384   * @param record The form record.
1385   * @param info The form item info.
1386   */
ParseUpdateConfig(FormRecord & record,const FormItemInfo & info) const1387  void FormDataMgr::ParseUpdateConfig(FormRecord &record, const FormItemInfo &info) const
1388  {
1389      int configDuration = info.GetUpdateDuration();
1390      if (configDuration > 0) {
1391          ParseIntervalConfig(record, configDuration);
1392      } else {
1393          ParseAtTimerConfig(record, info);
1394      }
1395  }
1396  
1397  /**
1398   * @brief Parse update interval config.
1399   * @param record The form record.
1400   * @param configDuration interval duration.
1401   */
ParseIntervalConfig(FormRecord & record,const int configDuration) const1402  void FormDataMgr::ParseIntervalConfig(FormRecord &record, const int configDuration) const
1403  {
1404      HILOG_INFO("configDuration:%{public}d", configDuration);
1405      if (configDuration <= Constants::MIN_CONFIG_DURATION) {
1406          record.updateDuration = Constants::MIN_PERIOD;
1407      } else if (configDuration >= Constants::MAX_CONFIG_DURATION) {
1408          record.updateDuration = Constants::MAX_PERIOD;
1409      } else {
1410          record.updateDuration = configDuration * Constants::TIME_CONVERSION;
1411      }
1412      HILOG_INFO("end");
1413  }
1414  
1415  /**
1416   * @brief Parse at time config.
1417   * @param record The form record.
1418   * @param info form item info.
1419   */
ParseAtTimerConfig(FormRecord & record,const FormItemInfo & info) const1420  void FormDataMgr::ParseAtTimerConfig(FormRecord &record, const FormItemInfo &info) const
1421  {
1422      record.isEnableUpdate = false;
1423      record.updateDuration = 0;
1424      std::string configAtTime = info.GetScheduledUpdateTime();
1425      HILOG_INFO("parseAsUpdateAt updateAt:%{public}s", configAtTime.c_str());
1426      if (configAtTime.empty()) {
1427          return;
1428      }
1429  
1430      std::vector<std::string> temp = FormUtil::StringSplit(configAtTime, Constants::TIME_DELIMETER);
1431      if (temp.size() != Constants::UPDATE_AT_CONFIG_COUNT) {
1432          HILOG_ERROR("invalid config");
1433          return;
1434      }
1435      int hour = -1;
1436      int min = -1;
1437      hour = std::stoi(temp[0]);
1438      min = std::stoi(temp[1]);
1439      if (hour < Constants::MIN_TIME || hour > Constants::MAX_HOUR || min < Constants::MIN_TIME || min >
1440          Constants::MAX_MINUTE) {
1441          HILOG_ERROR("invalid time");
1442          return;
1443      }
1444      record.updateAtHour = hour;
1445      record.updateAtMin = min;
1446      record.isEnableUpdate = true;
1447  }
1448  /**
1449   * @brief check if form cached.
1450   * @param record The form record.
1451   * @return Returns ERR_OK on cached, others on not cached.
1452   */
IsFormCached(const FormRecord record)1453  bool FormDataMgr::IsFormCached(const FormRecord record)
1454  {
1455      if (record.versionUpgrade) {
1456          return false;
1457      }
1458      return FormCacheMgr::GetInstance().NeedAcquireProviderData(record.formId);
1459  }
1460  
1461  /**
1462   * @brief Create form state host record.
1463   * @param provider The provider of the form state
1464   * @param info The form item info.
1465   * @param callerToken The UID of the proxy.
1466   * @param callingUid The UID of the proxy.
1467   * @return Returns true if this function is successfully called; returns false otherwise.
1468   */
CreateFormStateRecord(std::string & provider,const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,int callingUid)1469  bool FormDataMgr::CreateFormStateRecord(std::string &provider, const FormItemInfo &info,
1470                                          const sptr<IRemoteObject> &callerToken, int callingUid)
1471  {
1472      std::lock_guard<std::mutex> lock(formStateRecordMutex_);
1473      auto iter = formStateRecord_.find(provider);
1474      if (iter != formStateRecord_.end()) {
1475          if (iter->second.GetFormHostClient() != callerToken) {
1476              iter->second.SetFormHostClient(callerToken);
1477          }
1478          return true;
1479      }
1480  
1481      FormHostRecord hostRecord;
1482      bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
1483      if (isCreated) {
1484          formStateRecord_.emplace(provider, hostRecord);
1485          return true;
1486      }
1487  
1488      return false;
1489  }
1490  
CreateFormAcquireDataRecord(int64_t requestCode,const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,int callingUid)1491  bool FormDataMgr::CreateFormAcquireDataRecord(int64_t requestCode, const FormItemInfo &info,
1492                                                const sptr<IRemoteObject> &callerToken, int callingUid)
1493  {
1494      std::lock_guard<std::mutex> lock(formAcquireDataRecordMutex_);
1495      auto iter = formAcquireDataRecord_.find(requestCode);
1496      if (iter != formAcquireDataRecord_.end()) {
1497          if (iter->second.GetFormHostClient() != callerToken) {
1498              iter->second.SetFormHostClient(callerToken);
1499          }
1500          return true;
1501      }
1502  
1503      FormHostRecord hostRecord;
1504      bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
1505      if (isCreated) {
1506          formAcquireDataRecord_.emplace(requestCode, hostRecord);
1507          return true;
1508      }
1509  
1510      return false;
1511  }
1512  
AcquireFormDataBack(const AAFwk::WantParams & wantParams,int64_t requestCode)1513  ErrCode FormDataMgr::AcquireFormDataBack(const AAFwk::WantParams &wantParams, int64_t requestCode)
1514  {
1515      std::lock_guard<std::mutex> lock(formAcquireDataRecordMutex_);
1516      auto iter = formAcquireDataRecord_.find(requestCode);
1517      if (iter == formAcquireDataRecord_.end()) {
1518          HILOG_ERROR("filed to get form state host record");
1519          return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1520      }
1521      iter->second.OnAcquireFormData(wantParams, requestCode);
1522      iter->second.CleanResource();
1523      formAcquireDataRecord_.erase(iter);
1524      return ERR_OK;
1525  }
1526  
1527  /**
1528   * @brief acquire form state callback.
1529   * @param state form state.
1530   * @param provider provider info.
1531   * @param want The want of onAcquireFormState.
1532   * @return Returns true if this function is successfully called; returns false otherwise.
1533   */
AcquireFormStateBack(AppExecFwk::FormState state,const std::string & provider,const Want & want)1534  ErrCode FormDataMgr::AcquireFormStateBack(AppExecFwk::FormState state, const std::string &provider,
1535                                            const Want &want)
1536  {
1537      std::lock_guard<std::mutex> lock(formStateRecordMutex_);
1538      auto iter = formStateRecord_.find(provider);
1539      if (iter == formStateRecord_.end()) {
1540          HILOG_ERROR("filed to get form state host record");
1541          return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1542      }
1543      iter->second.OnAcquireState(state, want);
1544      iter->second.CleanResource();
1545      formStateRecord_.erase(iter);
1546      return ERR_OK;
1547  }
1548  
1549  /**
1550   * @brief Notify the form is visible or not.
1551   * @param formIds Indicates the ID of the forms.
1552   * @param isVisible Visible or not.
1553   * @param callerToken Host client.
1554   * @return Returns ERR_OK on success, others on failure.
1555   */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)1556  ErrCode FormDataMgr::NotifyFormsVisible(const std::vector<int64_t> &formIds, bool isVisible,
1557                                          const sptr<IRemoteObject> &callerToken)
1558  {
1559      if (formIds.empty() || callerToken == nullptr) {
1560          HILOG_ERROR("formIds empty");
1561          return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1562      }
1563  
1564      std::vector<int64_t> foundFormIds {};
1565      {
1566          HILOG_INFO("get the matched form host record by client stub");
1567          std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1568          for (const FormHostRecord &record : clientRecords_) {
1569              if (callerToken != record.GetFormHostClient()) {
1570                  continue;
1571              }
1572              for (const int64_t formId : formIds) {
1573                  int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
1574                  if (CheckInvalidForm(formId) != ERR_OK) {
1575                      continue;
1576                  }
1577                  if (!record.Contains(matchedFormId)) {
1578                      HILOG_ERROR("form not self-owned,form:%{public}" PRId64 ".",
1579                          matchedFormId);
1580                  } else {
1581                      foundFormIds.push_back(matchedFormId);
1582                  }
1583              }
1584              break;
1585          }
1586      }
1587  
1588      if (foundFormIds.empty()) {
1589          HILOG_ERROR("no valid forms found");
1590          return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1591      }
1592  
1593      for (auto matchedFormId : foundFormIds) {
1594          SetRecordVisible(matchedFormId, isVisible);
1595      }
1596      return ERR_OK;
1597  }
1598  
1599  /**
1600   * @brief set form record visible.
1601   * @param matchedFormId form id.
1602   * @param isVisible is visible.
1603   * @return Returns true if this function is successfully called; returns false otherwise.
1604   */
SetRecordVisible(int64_t matchedFormId,bool isVisible)1605  ErrCode FormDataMgr::SetRecordVisible(int64_t matchedFormId, bool isVisible)
1606  {
1607      HILOG_INFO("set form record visible");
1608      std::lock_guard<std::mutex> lock(formRecordMutex_);
1609      auto info = formRecords_.find(matchedFormId);
1610      if (info == formRecords_.end()) {
1611          HILOG_ERROR("form info not find");
1612          return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
1613      }
1614      info->second.isVisible = isVisible;
1615      HILOG_DEBUG("set isVisible to %{public}d, formId:%{public}" PRId64 " ", isVisible, matchedFormId);
1616      return ERR_OK;
1617  }
1618  
1619  /**
1620   * @brief delete forms by userId.
1621   *
1622   * @param userId user ID.
1623   * @param removedFormIds removed userId.
1624   */
DeleteFormsByUserId(const int32_t userId,std::vector<int64_t> & removedFormIds)1625  void FormDataMgr::DeleteFormsByUserId(const int32_t userId, std::vector<int64_t> &removedFormIds)
1626  {
1627      HILOG_INFO("delete forms by userId");
1628  
1629      // handle formRecords_
1630      std::vector<int64_t> removedTempForms;
1631      {
1632          std::lock_guard<std::mutex> lock(formRecordMutex_);
1633          auto itFormRecord = formRecords_.begin();
1634          while (itFormRecord != formRecords_.end()) {
1635              if (userId == itFormRecord->second.providerUserId) {
1636                  if (itFormRecord->second.formTempFlag) {
1637                      removedTempForms.emplace_back(itFormRecord->second.formId);
1638                  }
1639                  removedFormIds.emplace_back(itFormRecord->second.formId);
1640                  itFormRecord = formRecords_.erase(itFormRecord);
1641              } else {
1642                  ++itFormRecord;
1643              }
1644          }
1645      }
1646  
1647      // handle tempForms_
1648      if (removedTempForms.size() > 0) {
1649          std::lock_guard<std::mutex> lock(formTempMutex_);
1650          std::vector<int64_t>::iterator itTemp;
1651          for (itTemp = tempForms_.begin();itTemp != tempForms_.end();) {
1652              if (std::find(removedTempForms.begin(), removedTempForms.end(), *itTemp) != removedTempForms.end()) {
1653                  itTemp = tempForms_.erase(itTemp);
1654              } else {
1655                  itTemp++;
1656              }
1657          }
1658      }
1659  }
1660  /**
1661   * @brief Clear form records for st limit value test.
1662   */
ClearFormRecords()1663  void FormDataMgr::ClearFormRecords()
1664  {
1665      {
1666          std::lock_guard<std::mutex> lock(formRecordMutex_);
1667          formRecords_.clear();
1668      }
1669      {
1670          std::lock_guard<std::mutex> lock(formTempMutex_);
1671          tempForms_.clear();
1672      }
1673  }
1674  
1675  /**
1676   * @brief handle get no host invalid temp forms.
1677   * @param userId User ID.
1678   * @param callingUid The UID of the proxy.
1679   * @param matchedFormIds The set of the valid forms.
1680   * @param noHostTempFormsMap The map of the no host forms.
1681   * @param foundFormsMap The map of the found forms.
1682   */
GetNoHostInvalidTempForms(int32_t userId,int32_t callingUid,std::set<int64_t> & matchedFormIds,std::map<FormIdKey,std::set<int64_t>> & noHostTempFormsMap,std::map<int64_t,bool> & foundFormsMap)1683  void FormDataMgr::GetNoHostInvalidTempForms(int32_t userId, int32_t callingUid, std::set<int64_t> &matchedFormIds,
1684                                              std::map<FormIdKey, std::set<int64_t>> &noHostTempFormsMap,
1685                                              std::map<int64_t, bool> &foundFormsMap)
1686  {
1687      std::lock_guard<std::mutex> lock(formRecordMutex_);
1688      for (auto &formRecordInfo : formRecords_) {
1689          int64_t formId = formRecordInfo.first;
1690          FormRecord &formRecord = formRecordInfo.second;
1691  
1692          // Checks the user id and the temp flag.
1693          if (!formRecord.formTempFlag || (userId != formRecord.providerUserId)) {
1694              continue;
1695          }
1696          // check UID
1697          auto iter = std::find(formRecord.formUserUids.begin(), formRecord.formUserUids.end(), callingUid);
1698          if (iter == formRecord.formUserUids.end()) {
1699              continue;
1700          }
1701          // check valid form set
1702          if (matchedFormIds.find(formId) != matchedFormIds.end()) {
1703              continue;
1704          }
1705  
1706          HILOG_DEBUG("found invalid form:%{public}" PRId64 "", formId);
1707          formRecord.formUserUids.erase(iter);
1708          if (formRecord.formUserUids.empty()) {
1709              FormIdKey formIdKey(formRecord.bundleName, formRecord.abilityName);
1710              auto itIdsSet = noHostTempFormsMap.find(formIdKey);
1711              if (itIdsSet == noHostTempFormsMap.end()) {
1712                  std::set<int64_t> formIdsSet;
1713                  formIdsSet.emplace(formId);
1714                  noHostTempFormsMap.emplace(formIdKey, formIdsSet);
1715              } else {
1716                  itIdsSet->second.emplace(formId);
1717              }
1718          } else {
1719              foundFormsMap.emplace(formId, false);
1720          }
1721      }
1722  }
1723  
1724  /**
1725   * @brief handle delete no host temp forms.
1726   * @param callingUid The UID of the proxy.
1727   * @param noHostTempFormsMap The map of the no host forms.
1728   * @param foundFormsMap The map of the found forms.
1729   */
BatchDeleteNoHostTempForms(int32_t callingUid,std::map<FormIdKey,std::set<int64_t>> & noHostTempFormsMap,std::map<int64_t,bool> & foundFormsMap)1730  void FormDataMgr::BatchDeleteNoHostTempForms(int32_t callingUid, std::map<FormIdKey,
1731                                               std::set<int64_t>> &noHostTempFormsMap,
1732                                               std::map<int64_t, bool> &foundFormsMap)
1733  {
1734      std::set<FormIdKey> removableModuleSet;
1735      for (auto &noHostTempForm : noHostTempFormsMap) {
1736          FormIdKey formIdKey = noHostTempForm.first;
1737          std::set<int64_t> &formIdsSet = noHostTempForm.second;
1738          std::string bundleName = formIdKey.bundleName;
1739          std::string abilityName = formIdKey.abilityName;
1740          FormProviderMgr::GetInstance().NotifyProviderFormsBatchDelete(bundleName, abilityName, formIdsSet);
1741          for (int64_t formId: formIdsSet) {
1742              foundFormsMap.emplace(formId, true);
1743              StopRenderingForm(formId);
1744              DeleteFormRecord(formId);
1745              DeleteTempForm(formId);
1746          }
1747      }
1748  }
1749  
1750  /**
1751   * @brief StopRenderingForm.
1752   * @param formId The form id.
1753   */
StopRenderingForm(int32_t formId)1754  void FormDataMgr::StopRenderingForm(int32_t formId)
1755  {
1756      FormRecord formrecord;
1757      GetFormRecord(formId, formrecord);
1758      FormRenderMgr::GetInstance().StopRenderingForm(formId, formrecord);
1759  }
1760  
1761  /**
1762   * @brief delete invalid temp forms.
1763   * @param userId User ID.
1764   * @param callingUid The UID of the proxy.
1765   * @param matchedFormIds The set of the valid forms.
1766   * @param removedFormsMap The map of the removed invalid forms.
1767   * @return Returns ERR_OK on success, others on failure.
1768   */
DeleteInvalidTempForms(int32_t userId,int32_t callingUid,std::set<int64_t> & matchedFormIds,std::map<int64_t,bool> & removedFormsMap)1769  int32_t FormDataMgr::DeleteInvalidTempForms(int32_t userId, int32_t callingUid, std::set<int64_t> &matchedFormIds,
1770                                              std::map<int64_t, bool> &removedFormsMap)
1771  {
1772      HILOG_INFO("userId:%{public}d, callingUid:%{public}d", userId, callingUid);
1773      std::map<int64_t, bool> foundFormsMap {};
1774      std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap {};
1775      GetNoHostInvalidTempForms(userId, callingUid, matchedFormIds, noHostTempFormsMap, foundFormsMap);
1776      BatchDeleteNoHostTempForms(callingUid, noHostTempFormsMap, foundFormsMap);
1777      HILOG_DEBUG("foundFormsMap size:%{public}zu", foundFormsMap.size());
1778      HILOG_DEBUG("noHostTempFormsMap size:%{public}zu", noHostTempFormsMap.size());
1779  
1780      if (!foundFormsMap.empty()) {
1781          removedFormsMap.insert(foundFormsMap.begin(), foundFormsMap.end());
1782      }
1783      HILOG_INFO("done");
1784      return ERR_OK;
1785  }
1786  
1787  /**
1788   * @brief delete publish forms temp data
1789   * @param userId User ID.
1790   * @param bundleName BundleName.
1791   * @param validFormIds The set of the valid forms.
1792   */
DeleteInvalidPublishForms(int32_t userId,std::string bundleName,std::set<int64_t> & validFormIds)1793  void FormDataMgr::DeleteInvalidPublishForms(int32_t userId, std::string bundleName, std::set<int64_t> &validFormIds)
1794  {
1795      HILOG_INFO("userId:%{public}d, bundleName:%{public}s", userId, bundleName.c_str());
1796  
1797      int32_t deleteNum = 0;
1798      std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1799      for (auto iter = formRequestPublishForms_.begin(); iter != formRequestPublishForms_.end();) {
1800          int64_t formId = iter->first;
1801          // check valid form set
1802          if (validFormIds.find(formId) != validFormIds.end()) {
1803              ++iter;
1804              continue;
1805          }
1806  
1807          Want want = iter->second.first;
1808          if (bundleName != want.GetStringParam(Constants::PARAM_BUNDLE_NAME_KEY)) {
1809              ++iter;
1810              continue;
1811          }
1812          if (userId != want.GetIntParam(Constants::PARAM_FORM_USER_ID, -1)) {
1813              ++iter;
1814              continue;
1815          }
1816          ++deleteNum;
1817          iter = formRequestPublishForms_.erase(iter);
1818      }
1819  
1820      HILOG_INFO("delete num:%{public}d", deleteNum);
1821  }
1822  
1823  /**
1824   * @brief clear host data by invalid forms.
1825   * @param callingUid The UID of the proxy.
1826   * @param removedFormsMap The map of the removed invalid forms.
1827   * @return Returns ERR_OK on success, others on failure.
1828   */
ClearHostDataByInvalidForms(int32_t callingUid,std::map<int64_t,bool> & removedFormsMap)1829  int32_t FormDataMgr::ClearHostDataByInvalidForms(int32_t callingUid, std::map<int64_t, bool> &removedFormsMap)
1830  {
1831      HILOG_INFO("start");
1832      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1833      std::vector<FormHostRecord>::iterator itHostRecord;
1834      for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
1835          if (itHostRecord->GetCallerUid() != callingUid) {
1836              itHostRecord++;
1837              continue;
1838          }
1839          for (auto &removedForm : removedFormsMap) {
1840              if (itHostRecord->Contains(removedForm.first)) {
1841                  itHostRecord->DelForm(removedForm.first);
1842              }
1843          }
1844          if (itHostRecord->IsEmpty()) {
1845              itHostRecord->CleanResource();
1846              itHostRecord = clientRecords_.erase(itHostRecord);
1847          } else {
1848              itHostRecord++;
1849          }
1850      }
1851      HILOG_INFO("done");
1852      return ERR_OK;
1853  }
1854  
AddRequestPublishFormInfo(int64_t formId,const Want & want,std::unique_ptr<FormProviderData> & formProviderData)1855  ErrCode FormDataMgr::AddRequestPublishFormInfo(int64_t formId, const Want &want,
1856                                                 std::unique_ptr<FormProviderData> &formProviderData)
1857  {
1858      HILOG_INFO("formId:%{public}" PRId64, formId);
1859      std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1860  
1861      auto insertResult = formRequestPublishForms_.insert(
1862          std::make_pair(formId, std::make_pair(want, std::move(formProviderData))));
1863      if (!insertResult.second) {
1864          HILOG_ERROR("fail emplace requestPublishFormInfo");
1865          return ERR_APPEXECFWK_FORM_COMMON_CODE;
1866      }
1867      return ERR_OK;
1868  }
1869  
RemoveRequestPublishFormInfo(int64_t formId)1870  ErrCode FormDataMgr::RemoveRequestPublishFormInfo(int64_t formId)
1871  {
1872      HILOG_INFO("formId:%{public}" PRId64, formId);
1873      std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1874      formRequestPublishForms_.erase(formId);
1875      return ERR_OK;
1876  }
1877  
IsRequestPublishForm(int64_t formId)1878  bool FormDataMgr::IsRequestPublishForm(int64_t formId)
1879  {
1880      std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1881      return formRequestPublishForms_.find(formId) != formRequestPublishForms_.end();
1882  }
1883  
GetRequestPublishFormInfo(int64_t formId,Want & want,std::unique_ptr<FormProviderData> & formProviderData)1884  ErrCode FormDataMgr::GetRequestPublishFormInfo(int64_t formId, Want &want,
1885                                                 std::unique_ptr<FormProviderData> &formProviderData)
1886  {
1887      HILOG_INFO("formId:%{public}" PRId64, formId);
1888      std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1889      auto result = formRequestPublishForms_.find(formId);
1890      if (result == formRequestPublishForms_.end()) {
1891          HILOG_INFO("invalid formId:%{public}" PRId64, formId);
1892          return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
1893      }
1894  
1895      want = result->second.first;
1896      formProviderData = std::move(result->second.second);
1897      formRequestPublishForms_.erase(result);
1898      return ERR_OK;
1899  }
1900  
GetPackageForm(const FormRecord & record,const BundlePackInfo & bundlePackInfo,AbilityFormInfo & abilityFormInfo)1901  bool FormDataMgr::GetPackageForm(const FormRecord &record, const BundlePackInfo &bundlePackInfo,
1902      AbilityFormInfo &abilityFormInfo)
1903  {
1904      HILOG_INFO("moduleName is %{public}s", record.moduleName.c_str());
1905      std::vector<PackageModule> modules = bundlePackInfo.summary.modules;
1906      for (const auto &cfg : modules) {
1907          HILOG_INFO("try module %{public}s", cfg.distro.moduleName.c_str());
1908          if (record.moduleName != cfg.distro.moduleName) {
1909              continue;
1910          }
1911          HILOG_INFO("has the same module");
1912          std::vector<ModuleAbilityInfo> abilities = cfg.abilities;
1913          std::vector<ExtensionAbilities> extensionAbilities = cfg.extensionAbilities;
1914          if (!abilities.empty()) {
1915              return GetAbilityFormInfo(record, abilities, abilityFormInfo);
1916          }
1917          if (!extensionAbilities.empty()) {
1918              return GetAbilityFormInfo(record, extensionAbilities, abilityFormInfo);
1919          }
1920          HILOG_WARN("no ability in module:%{public}s", record.moduleName.c_str());
1921          return false;
1922      }
1923      return false;
1924  }
1925  
1926  template<typename T>
GetAbilityFormInfo(const FormRecord & record,const std::vector<T> & abilities,AbilityFormInfo & abilityFormInfo)1927  bool FormDataMgr::GetAbilityFormInfo(const FormRecord &record, const std::vector<T> &abilities,
1928      AbilityFormInfo &abilityFormInfo)
1929  {
1930      for (const T &abilityInfo : abilities) {
1931          if (abilityInfo.name != record.abilityName) {
1932              continue;
1933          }
1934          std::vector<AbilityFormInfo> forms = abilityInfo.forms;
1935          for (auto &item : forms) {
1936              if (IsSameForm(record, item)) {
1937                  abilityFormInfo = item;
1938                  HILOG_INFO("find matched abilityFormInfo");
1939                  return true;
1940              }
1941          }
1942      }
1943      HILOG_INFO("no matched abilityFormInfo, module:%{public}s", record.moduleName.c_str());
1944      return false;
1945  }
1946  
IsSameForm(const FormRecord & record,const AbilityFormInfo & abilityFormInfo)1947  bool FormDataMgr::IsSameForm(const FormRecord &record, const AbilityFormInfo &abilityFormInfo)
1948  {
1949      auto dimensionIter = Constants::DIMENSION_MAP.find(static_cast<Constants::Dimension>(record.specification));
1950      if (dimensionIter == Constants::DIMENSION_MAP.end()) {
1951          HILOG_ERROR("valid specification:%{public}d", record.specification);
1952          return false;
1953      }
1954      auto dimension = dimensionIter->second;
1955      auto supportDimensions = abilityFormInfo.supportDimensions;
1956      if (record.formName == abilityFormInfo.name &&
1957          std::find(supportDimensions.begin(), supportDimensions.end(), dimension) != supportDimensions.end()) {
1958          return true;
1959      }
1960  
1961      HILOG_INFO("no same form, record:%{public}s, dimension:%{public}s, abilityFormInfo:%{public}s",
1962          record.formName.c_str(), dimension.c_str(), abilityFormInfo.name.c_str());
1963  
1964      return false;
1965  }
1966  
SetRecordNeedFreeInstall(int64_t formId,bool isNeedFreeInstall)1967  bool FormDataMgr::SetRecordNeedFreeInstall(int64_t formId, bool isNeedFreeInstall)
1968  {
1969      HILOG_INFO("call");
1970      std::lock_guard<std::mutex> lock(formRecordMutex_);
1971      auto item = formRecords_.find(formId);
1972      if (item == formRecords_.end()) {
1973          HILOG_ERROR("invalid formRecord");
1974          return false;
1975      }
1976      item->second.needFreeInstall = isNeedFreeInstall;
1977      HILOG_INFO("successfully");
1978      return true;
1979  }
1980  
CheckInvalidForm(const int64_t formId)1981  ErrCode FormDataMgr::CheckInvalidForm(const int64_t formId)
1982  {
1983      // Checks if the formid is valid.
1984      if (formId <= 0) {
1985          HILOG_ERROR("Invalid form id");
1986          return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1987      }
1988  
1989      // Gets the corresponding userId by formId.
1990      FormRecord formRecord;
1991      int64_t matchedFormId = FindMatchedFormId(formId);
1992      if (!GetFormRecord(matchedFormId, formRecord)) {
1993          HILOG_ERROR("No matching formRecord was found for the form id");
1994          return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1995      }
1996  
1997      // Checks for cross-user operations.
1998      if (formRecord.providerUserId != FormUtil::GetCurrentAccountId()) {
1999          HILOG_ERROR("The form id corresponds to a card that is not for the currently active user");
2000          return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
2001      }
2002      return ERR_OK;
2003  }
2004  
FillBasicRunningFormInfoByFormRecord(const FormRecord & formRecord,RunningFormInfo & runningFormInfo)2005  void FormDataMgr::FillBasicRunningFormInfoByFormRecord(const FormRecord &formRecord, RunningFormInfo &runningFormInfo)
2006  {
2007      runningFormInfo.formName = formRecord.formName;
2008      runningFormInfo.dimension = formRecord.specification;
2009      runningFormInfo.bundleName = formRecord.bundleName;
2010      runningFormInfo.moduleName = formRecord.moduleName;
2011      runningFormInfo.abilityName = formRecord.abilityName;
2012      runningFormInfo.description = formRecord.description;
2013      runningFormInfo.formLocation = formRecord.formLocation;
2014      runningFormInfo.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2015      runningFormInfo.recycleStatus = formRecord.recycleStatus;
2016      runningFormInfo.formBundleType = formRecord.formBundleType;
2017  }
2018  
GetRunningFormInfosByFormId(const int64_t formId,RunningFormInfo & runningFormInfo)2019  ErrCode FormDataMgr::GetRunningFormInfosByFormId(const int64_t formId, RunningFormInfo &runningFormInfo)
2020  {
2021      HILOG_DEBUG("start");
2022  
2023      // Checks if the formid is valid.
2024      if (formId <= 0) {
2025          HILOG_ERROR("Invalid form id");
2026          return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2027      }
2028  
2029      FormRecord formRecord;
2030      int64_t matchedFormId = FindMatchedFormId(formId);
2031      if (!GetFormRecord(matchedFormId, formRecord)) {
2032          HILOG_ERROR("No matching formRecord was found for the form id");
2033          return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2034      }
2035  
2036      if (formRecord.providerUserId != FormUtil::GetCurrentAccountId()) {
2037          HILOG_ERROR("The form id corresponds to a card that is not for the currently active user");
2038          return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
2039      }
2040  
2041      std::vector<FormHostRecord> formHostRecords;
2042      GetFormHostRecord(matchedFormId, formHostRecords);
2043      if (formHostRecords.empty()) {
2044          HILOG_ERROR("empty clientHost");
2045          return ERR_APPEXECFWK_FORM_COMMON_CODE;
2046      }
2047      runningFormInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
2048      runningFormInfo.formId = matchedFormId;
2049      FillBasicRunningFormInfoByFormRecord(formRecord, runningFormInfo);
2050      runningFormInfo.formUsageState = FormUsageState::USED;
2051  
2052      return ERR_OK;
2053  }
2054  
HandleFormAddObserver(const std::string hostBundleName,const int64_t formId)2055  ErrCode FormDataMgr::HandleFormAddObserver(const std::string hostBundleName, const int64_t formId)
2056  {
2057      HILOG_DEBUG("start");
2058      RunningFormInfo runningFormInfo;
2059      ErrCode ret = GetRunningFormInfosByFormId(formId, runningFormInfo);
2060      if (ret != ERR_OK) {
2061          return ret;
2062      }
2063      // if there is a full observer.
2064      FormObserverRecord::GetInstance().onFormAdd("all", runningFormInfo);
2065      // If there is a listener for the current host.
2066      FormObserverRecord::GetInstance().onFormAdd(hostBundleName, runningFormInfo);
2067      return ERR_OK;
2068  }
2069  
HandleFormRemoveObserver(const std::string hostBundleName,const RunningFormInfo runningFormInfo)2070  ErrCode FormDataMgr::HandleFormRemoveObserver(const std::string hostBundleName, const RunningFormInfo runningFormInfo)
2071  {
2072      HILOG_DEBUG("start");
2073      // if there is a full observer.
2074      FormObserverRecord::GetInstance().onFormRemove("all", runningFormInfo);
2075      // If there is a listener for the current host.
2076      FormObserverRecord::GetInstance().onFormRemove(hostBundleName, runningFormInfo);
2077      return ERR_OK;
2078  }
2079  
GetTempFormsCount(int32_t & formCount)2080  int32_t FormDataMgr::GetTempFormsCount(int32_t &formCount)
2081  {
2082      std::lock_guard<std::mutex> lock(formTempMutex_);
2083      formCount = static_cast<int32_t>(tempForms_.size());
2084      HILOG_DEBUG("current exist %{public}d temp forms in system", formCount);
2085      return ERR_OK;
2086  }
2087  
GetCastFormsCount(int32_t & formCount)2088  int32_t FormDataMgr::GetCastFormsCount(int32_t &formCount)
2089  {
2090      std::lock_guard<std::mutex> lock(formRecordMutex_);
2091      for (const auto &recordPair : formRecords_) {
2092          FormRecord record = recordPair.second;
2093          if (!record.formTempFlag) {
2094              formCount++;
2095          }
2096      }
2097      HILOG_DEBUG("current exist %{public}d cast forms in system", formCount);
2098      return ERR_OK;
2099  }
2100  
GetHostFormsCount(const std::string & bundleName,int32_t & formCount)2101  int32_t FormDataMgr::GetHostFormsCount(const std::string &bundleName, int32_t &formCount)
2102  {
2103      if (bundleName.empty()) {
2104          return ERR_OK;
2105      }
2106      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
2107      for (auto &record : clientRecords_) {
2108          if (record.GetHostBundleName() == bundleName) {
2109              formCount = record.GetFormsCount();
2110              break;
2111          }
2112      }
2113      HILOG_DEBUG("current exist %{public}d cast forms in host", formCount);
2114      return ERR_OK;
2115  }
2116  
GetUnusedFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)2117  void FormDataMgr::GetUnusedFormInstancesByFilter(
2118      const FormInstancesFilter &formInstancesFilter, std::vector<FormInstance> &formInstances)
2119  {
2120      HILOG_DEBUG("call");
2121      std::vector<FormDBInfo> formDBInfos;
2122      FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2123      for (const auto& dbInfo : formDBInfos) {
2124          if (formInstancesFilter.bundleName != dbInfo.bundleName) {
2125              continue;
2126          }
2127          if (!formInstancesFilter.moduleName.empty() && formInstancesFilter.moduleName != dbInfo.moduleName) {
2128              continue;
2129          } else if (!formInstancesFilter.abilityName.empty() && formInstancesFilter.abilityName != dbInfo.abilityName) {
2130              continue;
2131          } else if (!formInstancesFilter.formName.empty() && formInstancesFilter.formName != dbInfo.formName) {
2132              continue;
2133          }
2134          auto item = std::find_if(formInstances.begin(), formInstances.end(),
2135              [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2136          if (item != formInstances.end()) {
2137              continue;
2138          }
2139          FormRecord dbRecord;
2140          ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2141          if (getDbRet != ERR_OK) {
2142              continue;
2143          }
2144          FormInstance instance;
2145          instance.formId = dbInfo.formId;
2146          instance.specification = dbRecord.specification;
2147          instance.formVisiblity = static_cast<FormVisibilityType>(dbRecord.formVisibleNotifyState);
2148          instance.bundleName = dbRecord.bundleName;
2149          instance.moduleName = dbRecord.moduleName;
2150          instance.abilityName = dbRecord.abilityName;
2151          instance.formName = dbRecord.formName;
2152          instance.formUsageState = FormUsageState::UNUSED;
2153          instance.description = dbRecord.description;
2154          if (!dbRecord.formUserUids.empty()) {
2155              auto ret =
2156                  FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), instance.formHostName);
2157              if (ret != ERR_OK) {
2158                  HILOG_ERROR("Get bundleName by uid failed");
2159                  continue;
2160              }
2161              formInstances.emplace_back(instance);
2162          }
2163      }
2164  }
2165  
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)2166  ErrCode FormDataMgr::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
2167      std::vector<FormInstance> &formInstances)
2168  {
2169      HILOG_DEBUG("get form instances by filter");
2170      std::lock_guard<std::mutex> lock(formRecordMutex_);
2171      std::map<int64_t, FormRecord>::iterator itFormRecord;
2172      if (formInstancesFilter.bundleName.empty()) {
2173          HILOG_ERROR("null formInstancesFilter.bundleName");
2174          return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2175      }
2176  
2177      for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
2178          if (formInstancesFilter.bundleName == itFormRecord->second.bundleName) {
2179              bool Needgetformhostrecordflag = true;
2180              if (!formInstancesFilter.moduleName.empty() &&
2181                  formInstancesFilter.moduleName != itFormRecord->second.moduleName) {
2182                  Needgetformhostrecordflag = false;
2183              } else if (!formInstancesFilter.abilityName.empty() &&
2184                  formInstancesFilter.abilityName != itFormRecord->second.abilityName) {
2185                  Needgetformhostrecordflag = false;
2186              } else if (!formInstancesFilter.formName.empty() &&
2187                  formInstancesFilter.formName != itFormRecord->second.formName) {
2188                  Needgetformhostrecordflag = false;
2189              }
2190              std::vector<FormHostRecord> formHostRecords;
2191              GetFormHostRecord(itFormRecord->second.formId, formHostRecords);
2192              if (Needgetformhostrecordflag) {
2193                  FormInstance instance;
2194                  for (auto formHostRecord : formHostRecords) {
2195                      instance.formHostName = formHostRecord.GetHostBundleName();
2196                      instance.formId = itFormRecord->second.formId;
2197                      instance.specification = itFormRecord->second.specification;
2198                      instance.formVisiblity =
2199                          static_cast<FormVisibilityType>(itFormRecord->second.formVisibleNotifyState);
2200                      instance.bundleName = itFormRecord->second.bundleName;
2201                      instance.moduleName = itFormRecord->second.moduleName;
2202                      instance.abilityName = itFormRecord->second.abilityName;
2203                      instance.formName = itFormRecord->second.formName;
2204                      instance.description = itFormRecord->second.description;
2205                      formInstances.emplace_back(instance);
2206                  }
2207              }
2208          }
2209      }
2210      if (formInstancesFilter.isUnusedIncluded) {
2211          GetUnusedFormInstancesByFilter(formInstancesFilter, formInstances);
2212      }
2213      return (formInstances.size() == 0) ? ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED : ERR_OK;
2214  }
2215  
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)2216  ErrCode FormDataMgr::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
2217  {
2218      HILOG_DEBUG("get form instance by formId");
2219      bool isFormRecordsEnd = false;
2220      FormRecord formRecord;
2221      {
2222          std::lock_guard<std::mutex> lock(formRecordMutex_);
2223          if (formId <= 0) {
2224              HILOG_ERROR("invalid formId");
2225              return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2226          }
2227          auto info = formRecords_.find(formId);
2228          isFormRecordsEnd = info == formRecords_.end();
2229          if (!isFormRecordsEnd) {
2230              formRecord = info->second;
2231          }
2232      }
2233      if (!isFormRecordsEnd) {
2234          std::vector<FormHostRecord> formHostRecords;
2235          GetFormHostRecord(formId, formHostRecords);
2236          if (formHostRecords.empty()) {
2237              HILOG_ERROR("empty clientHost");
2238              return ERR_APPEXECFWK_FORM_COMMON_CODE;
2239          }
2240          formInstance.formHostName = formHostRecords.begin()->GetHostBundleName();
2241          formInstance.formId = formRecord.formId;
2242          formInstance.specification = formRecord.specification;
2243          formInstance.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2244          formInstance.bundleName = formRecord.bundleName;
2245          formInstance.moduleName = formRecord.moduleName;
2246          formInstance.abilityName = formRecord.abilityName;
2247          formInstance.formName = formRecord.formName;
2248      } else {
2249          return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2250      }
2251      HILOG_DEBUG("get form instance successfully");
2252      return ERR_OK;
2253  }
2254  
GetUnusedFormInstanceById(const int64_t formId,FormInstance & formInstance)2255  ErrCode FormDataMgr::GetUnusedFormInstanceById(const int64_t formId, FormInstance &formInstance)
2256  {
2257      HILOG_DEBUG("call");
2258      FormRecord dbRecord;
2259      ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
2260      if (getDbRet != ERR_OK) {
2261          HILOG_ERROR("Get formRecord by formId failed");
2262          return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2263      }
2264      if (dbRecord.formUserUids.empty()) {
2265          return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2266      }
2267      auto ret =
2268          FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), formInstance.formHostName);
2269      if (ret != ERR_OK) {
2270          HILOG_ERROR("Get bundleName by uid failed");
2271          return ret;
2272      }
2273      formInstance.formId = formId;
2274      formInstance.specification = dbRecord.specification;
2275      formInstance.formVisiblity = static_cast<FormVisibilityType>(dbRecord.formVisibleNotifyState);
2276      formInstance.bundleName = dbRecord.bundleName;
2277      formInstance.moduleName = dbRecord.moduleName;
2278      formInstance.abilityName = dbRecord.abilityName;
2279      formInstance.formName = dbRecord.formName;
2280      formInstance.formUsageState = FormUsageState::UNUSED;
2281      formInstance.description = dbRecord.description;
2282      return ERR_OK;
2283  }
2284  
GetFormInstanceById(const int64_t formId,bool isUnusedIncluded,FormInstance & formInstance)2285  ErrCode FormDataMgr::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
2286  {
2287      HILOG_DEBUG("get form instance by formId");
2288      if (formId <= 0) {
2289          HILOG_ERROR("invalid formId");
2290          return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2291      }
2292      bool isFormRecordsEnd = false;
2293      FormRecord formRecord;
2294      std::vector<FormHostRecord> formHostRecords;
2295      {
2296          std::lock_guard<std::mutex> lock(formRecordMutex_);
2297          auto info = formRecords_.find(formId);
2298          isFormRecordsEnd = info == formRecords_.end();
2299          if (!isFormRecordsEnd) {
2300              formRecord = info->second;
2301          }
2302      }
2303      if (!isFormRecordsEnd) {
2304          GetFormHostRecord(formId, formHostRecords);
2305      }
2306      ErrCode ret = ERR_OK;
2307      if (!formHostRecords.empty()) {
2308          formInstance.formHostName = formHostRecords.begin()->GetHostBundleName();
2309          formInstance.formId = formRecord.formId;
2310          formInstance.specification = formRecord.specification;
2311          formInstance.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2312          formInstance.bundleName = formRecord.bundleName;
2313          formInstance.moduleName = formRecord.moduleName;
2314          formInstance.abilityName = formRecord.abilityName;
2315          formInstance.formName = formRecord.formName;
2316          formInstance.formUsageState = FormUsageState::USED;
2317          formInstance.description = formRecord.description;
2318      } else if (isUnusedIncluded) {
2319          ret = GetUnusedFormInstanceById(formId, formInstance);
2320      } else {
2321          ret = ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2322      }
2323      HILOG_DEBUG("End");
2324      return ret;
2325  }
2326  
GetUnusedFormInfos(std::vector<RunningFormInfo> & runningFormInfos)2327  void FormDataMgr::GetUnusedFormInfos(std::vector<RunningFormInfo> &runningFormInfos)
2328  {
2329      HILOG_DEBUG("call");
2330      std::vector<FormDBInfo> formDBInfos;
2331      FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2332      for (const auto& dbInfo : formDBInfos) {
2333          auto item = std::find_if(runningFormInfos.begin(), runningFormInfos.end(),
2334              [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2335          if (item != runningFormInfos.end()) {
2336              continue;
2337          }
2338          FormRecord dbRecord;
2339          ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2340          if (getDbRet != ERR_OK) {
2341              continue;
2342          }
2343          RunningFormInfo info;
2344          info.formId = dbInfo.formId;
2345          FillBasicRunningFormInfoByFormRecord(dbRecord, info);
2346          info.formUsageState = FormUsageState::UNUSED;
2347          if (!dbRecord.formUserUids.empty()) {
2348              auto ret =
2349                  FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), info.hostBundleName);
2350              if (ret != ERR_OK) {
2351                  HILOG_ERROR("Get bundleName by uid failed");
2352                  continue;
2353              }
2354              runningFormInfos.emplace_back(info);
2355          }
2356      }
2357  }
2358  
GetRunningFormInfos(bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)2359  ErrCode FormDataMgr::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
2360  {
2361      HILOG_DEBUG("start");
2362      std::lock_guard<std::mutex> lock(formRecordMutex_);
2363      for (auto record : formRecords_) {
2364          if ((!record.second.formTempFlag) &&
2365              ((FormUtil::GetCurrentAccountId() == record.second.providerUserId) ||
2366              (record.second.providerUserId == Constants::DEFAULT_USER_ID))) {
2367              RunningFormInfo info;
2368              info.formId = record.first;
2369              FillBasicRunningFormInfoByFormRecord(record.second, info);
2370              info.formUsageState = FormUsageState::USED;
2371              std::vector<FormHostRecord> formHostRecords;
2372              GetFormHostRecord(record.first, formHostRecords);
2373              if (formHostRecords.empty()) {
2374                  HILOG_ERROR("Get form host failed");
2375                  continue;
2376              }
2377              info.hostBundleName = formHostRecords.begin()->GetHostBundleName();
2378              runningFormInfos.emplace_back(info);
2379          }
2380      }
2381      if (isUnusedIncluded) {
2382          GetUnusedFormInfos(runningFormInfos);
2383      }
2384      return ERR_OK;
2385  }
2386  
GetUnusedFormInfos(const std::string & bundleName,std::vector<RunningFormInfo> & runningFormInfos)2387  void FormDataMgr::GetUnusedFormInfos(const std::string &bundleName, std::vector<RunningFormInfo> &runningFormInfos)
2388  {
2389      HILOG_DEBUG("call");
2390      std::vector<FormDBInfo> formDBInfos;
2391      FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2392      for (const auto& dbInfo : formDBInfos) {
2393          auto item = std::find_if(runningFormInfos.begin(), runningFormInfos.end(),
2394              [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2395          if (item != runningFormInfos.end()) {
2396              continue;
2397          }
2398          for (auto uid : dbInfo.formUserUids) {
2399              std::string hostBundleName = "";
2400              auto ret = FormBmsHelper::GetInstance().GetBundleNameByUid(uid, hostBundleName);
2401              if (ret != ERR_OK) {
2402                  HILOG_ERROR("Get bundleName by uid failed");
2403                  continue;
2404              }
2405              if (hostBundleName != bundleName) {
2406                  continue;
2407              }
2408              FormRecord dbRecord;
2409              ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2410              if (getDbRet != ERR_OK) {
2411                  continue;
2412              }
2413              RunningFormInfo info;
2414              info.formId = dbInfo.formId;
2415              info.hostBundleName = bundleName;
2416              FillBasicRunningFormInfoByFormRecord(dbRecord, info);
2417              info.formUsageState = FormUsageState::UNUSED;
2418              runningFormInfos.emplace_back(info);
2419          }
2420      }
2421  }
2422  
GetRunningFormInfosByBundleName(const std::string & bundleName,bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)2423  ErrCode FormDataMgr::GetRunningFormInfosByBundleName(
2424      const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
2425  {
2426      HILOG_DEBUG("start");
2427  
2428      if (bundleName.empty()) {
2429          HILOG_ERROR("empty bundleName");
2430          return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2431      }
2432  
2433      std::lock_guard<std::mutex> lock(formRecordMutex_);
2434      for (auto record : formRecords_) {
2435          std::vector<FormHostRecord> formHostRecords;
2436          GetFormHostRecord(record.first, formHostRecords);
2437          if (formHostRecords.empty()) {
2438              HILOG_WARN("Form has released in host, formId = %{public}" PRId64, record.first);
2439              continue;
2440          }
2441          auto hostBundleName = formHostRecords.begin()->GetHostBundleName();
2442          bool flag = (!record.second.formTempFlag) &&
2443              ((FormUtil::GetCurrentAccountId() == record.second.providerUserId) ||
2444              (record.second.providerUserId == Constants::DEFAULT_USER_ID));
2445          if (hostBundleName == bundleName && flag) {
2446              RunningFormInfo info;
2447              info.formId = record.first;
2448              info.hostBundleName = bundleName;
2449              FillBasicRunningFormInfoByFormRecord(record.second, info);
2450              info.formUsageState = FormUsageState::USED;
2451              runningFormInfos.emplace_back(info);
2452          }
2453      }
2454      if (isUnusedIncluded) {
2455          GetUnusedFormInfos(bundleName, runningFormInfos);
2456      }
2457      HILOG_DEBUG(
2458          "bundleName is %{public}s, runningFormInfo.size = %{public}zu", bundleName.c_str(), runningFormInfos.size());
2459      if (runningFormInfos.size() == 0) {
2460          return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2461      }
2462      return ERR_OK;
2463  }
2464  
UpdateFormCloudUpdateDuration(const std::string & bundleName,int duration)2465  void FormDataMgr::UpdateFormCloudUpdateDuration(const std::string &bundleName, int duration)
2466  {
2467      HILOG_INFO("bundleName:%{public}s, duration:%{public}d", bundleName.c_str(), duration);
2468      std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2469      auto iter = formCloudUpdateDurationMap_.find(bundleName);
2470      if (iter != formCloudUpdateDurationMap_.end()) {
2471          iter->second = duration;
2472          return;
2473      }
2474      formCloudUpdateDurationMap_.emplace(bundleName, duration);
2475  }
2476  
RemoveFormCloudUpdateDuration(const std::string & bundleName)2477  void FormDataMgr::RemoveFormCloudUpdateDuration(const std::string &bundleName)
2478  {
2479      HILOG_DEBUG("call");
2480      std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2481      auto iter = formCloudUpdateDurationMap_.find(bundleName);
2482      if (iter != formCloudUpdateDurationMap_.end()) {
2483          HILOG_INFO("bundleName:%{public}s", bundleName.c_str());
2484          formCloudUpdateDurationMap_.erase(bundleName);
2485      }
2486  }
2487  
GetFormCloudUpdateDuration(const std::string & bundleName) const2488  int FormDataMgr::GetFormCloudUpdateDuration(const std::string &bundleName) const
2489  {
2490      HILOG_DEBUG("call");
2491      int duration = 0;
2492      std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2493      auto iter = formCloudUpdateDurationMap_.find(bundleName);
2494      if (iter != formCloudUpdateDurationMap_.end()) {
2495          duration = iter->second;
2496          HILOG_INFO("%{public}s has form cloud update duration:%{public}d", bundleName.c_str(), duration);
2497      }
2498      return duration;
2499  }
2500  
HasFormCloudUpdateDuration(const std::string & bundleName) const2501  bool FormDataMgr::HasFormCloudUpdateDuration(const std::string &bundleName) const
2502  {
2503      HILOG_DEBUG("call");
2504      std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2505      auto iter = formCloudUpdateDurationMap_.find(bundleName);
2506      if (iter != formCloudUpdateDurationMap_.end()) {
2507          HILOG_INFO("Has cloud update duration, bundleName:%{public}s", bundleName.c_str());
2508          return true;
2509      }
2510      HILOG_INFO("Not has cloud update duration, bundleName:%{public}s", bundleName.c_str());
2511      return false;
2512  }
2513  
UpdateFormLocation(const int64_t & formId,const int32_t & formLocation)2514  ErrCode FormDataMgr::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation)
2515  {
2516      std::lock_guard<std::mutex> lock(formRecordMutex_);
2517      auto info = formRecords_.find(formId);
2518      if (info == formRecords_.end()) {
2519          HILOG_INFO("form info not find, formId:%{public}" PRId64 " formLocation:%{public}d",
2520              formId, formLocation);
2521          return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2522      }
2523      info->second.formLocation = (Constants::FormLocation)formLocation;
2524      HILOG_INFO("success, formId:%{public}" PRId64 " formLocation:%{public}d",
2525          formId, formLocation);
2526      return ERR_OK;
2527  }
2528  
GetRecordsByFormType(const int32_t formRefreshType,std::vector<FormRecord> & visibleFormRecords,std::vector<FormRecord> & invisibleFormRecords)2529  ErrCode FormDataMgr::GetRecordsByFormType(const int32_t formRefreshType,
2530      std::vector<FormRecord> &visibleFormRecords, std::vector<FormRecord> &invisibleFormRecords)
2531  {
2532      HILOG_INFO("formRefreshType:%{public}d", formRefreshType);
2533      std::lock_guard<std::mutex> lock(formRecordMutex_);
2534      for (auto formRecord : formRecords_) {
2535          if (!FormTrustMgr::GetInstance().IsTrust(formRecord.second.bundleName)) {
2536              HILOG_ERROR("ignore,%{public}s is unTrust.", formRecord.second.bundleName.c_str());
2537              continue;
2538          }
2539          if (FormBundleForbidMgr::GetInstance().IsBundleForbidden(formRecord.second.bundleName)) {
2540              HILOG_ERROR("ignore,%{public}s is forbidden.", formRecord.second.bundleName.c_str());
2541              continue;
2542          }
2543          if (formRefreshType == Constants::REFRESH_APP_FORM) {
2544              if (formRecord.second.formBundleType != BundleType::APP) {
2545                  continue;
2546              }
2547          } else if (formRefreshType == Constants::REFRESH_ATOMIC_FORM) {
2548              if (formRecord.second.formBundleType != BundleType::ATOMIC_SERVICE) {
2549                  continue;
2550              }
2551          } else if (formRefreshType == Constants::REFRESH_SYSTEMAPP_FORM) {
2552              if (!formRecord.second.isSystemApp) {
2553                  continue;
2554              }
2555          }
2556          if (formRecord.second.formVisibleNotifyState == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
2557              visibleFormRecords.emplace_back(formRecord.second);
2558              continue;
2559          }
2560          invisibleFormRecords.emplace_back(formRecord.second);
2561      }
2562      return ERR_OK;
2563  }
2564  
SetFormEnable(const int64_t formId,const bool enable)2565  ErrCode FormDataMgr::SetFormEnable(const int64_t formId, const bool enable)
2566  {
2567      std::lock_guard<std::mutex> lock(formRecordMutex_);
2568      auto itFormRecord = formRecords_.find(formId);
2569      if (itFormRecord == formRecords_.end()) {
2570          HILOG_ERROR("form info not find");
2571          return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2572      }
2573      itFormRecord->second.enableForm = enable;
2574      HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d", formId, enable);
2575      return ERR_OK;
2576  }
2577  
SetRefreshDuringDisableForm(const int64_t formId,const bool enable)2578  ErrCode FormDataMgr::SetRefreshDuringDisableForm(const int64_t formId, const bool enable)
2579  {
2580      std::lock_guard<std::mutex> lock(formRecordMutex_);
2581      auto itFormRecord = formRecords_.find(formId);
2582      if (itFormRecord == formRecords_.end()) {
2583          HILOG_ERROR("form info not find");
2584          return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2585      }
2586      itFormRecord->second.isRefreshDuringDisableForm = enable;
2587      HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d",
2588          formId, enable);
2589      return ERR_OK;
2590  }
2591  
SetUpdateDuringDisableForm(const int64_t formId,const bool enable)2592  ErrCode FormDataMgr::SetUpdateDuringDisableForm(const int64_t formId, const bool enable)
2593  {
2594      std::lock_guard<std::mutex> lock(formRecordMutex_);
2595      auto itFormRecord = formRecords_.find(formId);
2596      if (itFormRecord == formRecords_.end()) {
2597          HILOG_ERROR("form info not find");
2598          return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2599      }
2600      itFormRecord->second.isUpdateDuringDisableForm = enable;
2601      HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d",
2602          formId, enable);
2603      return ERR_OK;
2604  }
2605  
EnableForms(const std::vector<FormRecord> && formRecords,const bool enable)2606  void FormDataMgr::EnableForms(const std::vector<FormRecord> &&formRecords, const bool enable)
2607  {
2608      HILOG_INFO("start");
2609      std::lock_guard<std::mutex> lock(formHostRecordMutex_);
2610      for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
2611          std::vector<int64_t> matchedFormIds;
2612          for (auto formRecord : formRecords) {
2613              if (itHostRecord->Contains(formRecord.formId)) {
2614                  matchedFormIds.emplace_back(formRecord.formId);
2615              }
2616          }
2617          if (!matchedFormIds.empty()) {
2618              itHostRecord->OnEnableForms(matchedFormIds, enable);
2619          }
2620      }
2621  }
2622  
GetFormIdsByUserId(int32_t userId,std::vector<int64_t> & formIds)2623  void FormDataMgr::GetFormIdsByUserId(int32_t userId, std::vector<int64_t> &formIds)
2624  {
2625      std::lock_guard<std::mutex> lock(formRecordMutex_);
2626      for (auto formRecord : formRecords_) {
2627          if (formRecord.second.userId == userId) {
2628              formIds.emplace_back(formRecord.second.formId);
2629          }
2630      }
2631      HILOG_INFO("userId:%{public}d, size:%{public}zu", userId, formIds.size());
2632  }
2633  }  // namespace AppExecFwk
2634  }  // namespace OHOS
2635