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