• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "data_center/form_data_mgr.h"
17 
18 #include <cinttypes>
19 #include <type_traits>
20 
21 #include "fms_log_wrapper.h"
22 #include "bms_mgr/form_bms_helper.h"
23 #include "feature/bundle_forbidden/form_bundle_forbid_mgr.h"
24 #include "data_center/form_cache_mgr.h"
25 #include "form_constants.h"
26 #include "data_center/form_basic_info_mgr.h"
27 #include "data_center/form_data_proxy_mgr.h"
28 #include "data_center/database/form_db_cache.h"
29 #include "form_mgr_errors.h"
30 #include "form_observer/form_observer_record.h"
31 #include "form_provider/form_provider_mgr.h"
32 #include "data_center/form_record/form_record.h"
33 #include "form_render/form_render_mgr.h"
34 #include "common/util/form_trust_mgr.h"
35 #include "common/util/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 "data_center/form_record/form_record_report.h"
41 #include "common/event/form_event_report.h"
42 #include "common/util/form_task_common.h"
43 #include "form_mgr/form_mgr_queue.h"
44 #include "status_mgr_center/form_status.h"
45 #include "parameter.h"
46 #include "parameters.h"
47 
48 namespace OHOS {
49 namespace AppExecFwk {
50 namespace {
51 constexpr char MEMMORY_WATERMARK[] = "resourceschedule.memmgr.min.memmory.watermark";
52 
OnMemoryWatermarkChange(const char * key,const char * value,void * context)53 static void OnMemoryWatermarkChange(const char *key, const char *value, [[maybe_unused]] void *context)
54 {
55     HILOG_INFO("OnMemoryWatermarkChange, key: %{public}s, value: %{public}s", key, value);
56     bool isLowMemory = (std::string(value) == "true");
57     FormDataMgr::GetInstance().SetIsLowMemory(isLowMemory);
58     if (!isLowMemory) {
59         FormRenderMgr::GetInstance().RerenderAllFormsImmediate(FormUtil::GetCurrentAccountId());
60     }
61 }
62 }
63 
FormDataMgr()64 FormDataMgr::FormDataMgr()
65 {
66     HILOG_INFO("create");
67     InitLowMemoryStatus();
68 }
~FormDataMgr()69 FormDataMgr::~FormDataMgr()
70 {
71     HILOG_INFO("destroy");
72 }
73 
74 /**
75  * @brief Allot form info by item info.
76  * @param formInfo Form item info.
77  * @param callingUid The UID of the proxy.
78  * @param userId User ID.
79  * @return Returns form record.
80  */
AllotFormRecord(const FormItemInfo & formInfo,const int callingUid,const int32_t userId)81 FormRecord FormDataMgr::AllotFormRecord(const FormItemInfo &formInfo, const int callingUid, const int32_t userId)
82 {
83     HILOG_INFO("call formId: %{public}" PRId64 " userId: %{public}d callingUid: %{public}d",
84         formInfo.GetFormId(), userId, callingUid);
85     if (formInfo.IsTemporaryForm() && !ExistTempForm(formInfo.GetFormId())) {
86         std::lock_guard<std::mutex> lock(formTempMutex_);
87         tempForms_.emplace_back(formInfo.GetFormId());
88     }
89     FormRecord record;
90     {
91         std::lock_guard<std::mutex> lock(formRecordMutex_);
92         if (formRecords_.empty()) { // formRecords_ is empty, create a new one
93             HILOG_DEBUG("form info not exist");
94             record = CreateFormRecord(formInfo, callingUid, userId);
95             formRecords_.emplace(formInfo.GetFormId(), record);
96         } else {
97             auto info = formRecords_.find(formInfo.GetFormId());
98             if (info == formRecords_.end()) {
99                 HILOG_DEBUG("form info not find");
100                 record = CreateFormRecord(formInfo, callingUid, userId);
101                 formRecords_.emplace(formInfo.GetFormId(), record);
102             } else {
103                 record = info->second;
104             }
105         }
106     }
107     HILOG_INFO("end formId: %{public}" PRId64, formInfo.GetFormId());
108     FormBasicInfo basic {
109         record.formId, record.abilityName, record.bundleName, record.moduleName, record.formName, record.packageName
110     };
111     FormBasicInfoMgr::GetInstance().AddFormBasicInfo(basic);
112     return record;
113 }
114 /**
115  * @brief Delete form js info by form record.
116  * @param formId The Id of the form.
117  * @return Returns true if this function is successfully called; returns false otherwise.
118  */
DeleteFormRecord(const int64_t formId)119 bool FormDataMgr::DeleteFormRecord(const int64_t formId)
120 {
121     HILOG_INFO("delete record, form:%{public}" PRId64, formId);
122     std::lock_guard<std::mutex> lock(formRecordMutex_);
123     auto iter = formRecords_.find(formId);
124     if (iter == formRecords_.end()) {
125         HILOG_ERROR("form record not exist");
126         return false;
127     }
128     formRecords_.erase(iter);
129     FormUtil::DeleteFormId(formId);
130     FormBasicInfoMgr::GetInstance().DeleteFormBasicInfo(formId);
131     return true;
132 }
133 
134 /**
135  * @brief Allot form host record by caller token.
136  * @param info The form item info.
137  * @param callerToken callerToken
138  * @param formId The Id of the form.
139  * @param callingUid The UID of the proxy.
140  * @return Returns true if this function is successfully called; returns false otherwise.
141  */
AllotFormHostRecord(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const int64_t formId,const int callingUid)142 bool FormDataMgr::AllotFormHostRecord(const FormItemInfo &info, const sptr<IRemoteObject> &callerToken,
143     const int64_t formId, const int callingUid)
144 {
145     HILOG_INFO("call formId: %{public}" PRId64, formId);
146     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
147     for (auto &record : clientRecords_) {
148         if (callerToken == record.GetFormHostClient()) {
149             if (record.GetFormsCount() == 0) {
150                 FormMgrQueue::GetInstance().CancelDelayTask(
151                     std::make_pair((int64_t)TaskType::DELETE_FORM_HOST_RECORD, callingUid));
152                 HILOG_INFO("cancel delay task of recheck whether need clean form host");
153             }
154             record.AddForm(formId);
155             HILOG_INFO("addForm");
156             return true;
157         }
158     }
159     FormHostRecord hostRecord;
160     bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
161     if (isCreated) {
162         hostRecord.AddForm(formId);
163         clientRecords_.emplace_back(hostRecord);
164         HILOG_INFO("emplace");
165         return true;
166     }
167     return false;
168 }
169 /**
170  * @brief Create host record.
171  * @param info The form item info.
172  * @param callerToken The UID of the proxy.
173  * @param callingUid The UID of the proxy.
174  * @param record The form host record.
175  * @return Returns true if this function is successfully called; returns false otherwise.
176  */
CreateHostRecord(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const int callingUid,FormHostRecord & record)177 bool FormDataMgr::CreateHostRecord(const FormItemInfo &info, const sptr<IRemoteObject> &callerToken,
178     const int callingUid, FormHostRecord& record)
179 {
180     if (callerToken == nullptr) {
181         HILOG_ERROR("invalid param");
182         return false;
183     }
184 
185     record = FormHostRecord::CreateRecord(info, callerToken, callingUid);
186     return true;
187 }
188 
initFormRecord(FormRecord & newRecord,const FormItemInfo & formInfo)189 static void initFormRecord(FormRecord &newRecord, const FormItemInfo &formInfo)
190 {
191     newRecord.formId = formInfo.GetFormId();
192     newRecord.providerUserId = FormUtil::GetCurrentAccountId();
193     newRecord.packageName = formInfo.GetPackageName();
194     newRecord.bundleName = formInfo.GetProviderBundleName();
195     newRecord.moduleName = formInfo.GetModuleName();
196     newRecord.abilityName = formInfo.GetAbilityName();
197     newRecord.formName = formInfo.GetFormName();
198     newRecord.specification = formInfo.GetSpecificationId();
199     newRecord.isEnableUpdate = formInfo.IsEnableUpdateFlag();
200     newRecord.formTempFlag = formInfo.IsTemporaryForm();
201     newRecord.formVisibleNotify = formInfo.IsFormVisibleNotify();
202     newRecord.isDistributedForm = formInfo.IsDistributedForm();
203     newRecord.uiModule = formInfo.GetUiModuleName();
204     newRecord.jsFormCodePath =
205         formInfo.GetHapSourceByModuleName(newRecord.isDistributedForm ? newRecord.uiModule : newRecord.moduleName);
206     newRecord.formSrc = formInfo.GetFormSrc();
207     newRecord.formWindow = formInfo.GetFormWindow();
208     newRecord.versionName = formInfo.GetVersionName();
209     newRecord.versionCode = formInfo.GetVersionCode();
210     newRecord.compatibleVersion = formInfo.GetCompatibleVersion();
211     newRecord.formVisibleNotifyState = 0;
212     newRecord.type = formInfo.GetType();
213     newRecord.uiSyntax = formInfo.GetUiSyntax();
214     newRecord.isDynamic = formInfo.IsDynamic();
215     newRecord.transparencyEnabled = formInfo.IsTransparencyEnabled();
216     newRecord.privacyLevel = formInfo.GetPrivacyLevel();
217     newRecord.isSystemApp = formInfo.GetSystemAppFlag();
218     newRecord.description = formInfo.GetDescription();
219     newRecord.formLocation = formInfo.GetFormLocation();
220     newRecord.isThemeForm = formInfo.GetIsThemeForm();
221     newRecord.enableForm = formInfo.IsEnableForm();
222     newRecord.lockForm = formInfo.IsLockForm();
223     newRecord.protectForm = formInfo.IsLockForm();
224 }
225 
226 /**
227  * @brief Create form record.
228  * @param formInfo The form item info.
229  * @param callingUid The UID of the proxy.
230  * @param userId User ID.
231  * @return Form record.
232  */
CreateFormRecord(const FormItemInfo & formInfo,const int callingUid,const int32_t userId) const233 FormRecord FormDataMgr::CreateFormRecord(const FormItemInfo &formInfo, const int callingUid, const int32_t userId) const
234 {
235     HILOG_INFO("create formId: %{public}" PRId64 " userId: %{public}d", formInfo.GetFormId(), userId);
236     FormRecord newRecord;
237     initFormRecord(newRecord, formInfo);
238     newRecord.userId = userId;
239     if (newRecord.isEnableUpdate) {
240         ParseUpdateConfig(newRecord, formInfo);
241     }
242     if (std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(),
243         callingUid) == newRecord.formUserUids.end()) {
244         newRecord.formUserUids.emplace_back(callingUid);
245     }
246     newRecord.isDataProxy = formInfo.GetDataProxyFlag();
247     newRecord.uid = formInfo.GetProviderUid();
248     newRecord.modulePkgNameMap = formInfo.GetModulePkgNameMap();
249     newRecord.formBundleType = formInfo.GetFormBundleType();
250     formInfo.GetHapSourceDirs(newRecord.hapSourceDirs);
251     newRecord.renderingMode = formInfo.GetRenderingMode();
252     newRecord.conditionUpdate = formInfo.GetConditionUpdate();
253     newRecord.isDataProxyIgnoreFormVisible = formInfo.GetDataProxyIgnoreFormVisibility();
254     HILOG_DEBUG("end");
255     return newRecord;
256 }
257 /**
258  * @brief Create form js info by form record.
259  * @param formId The Id of the form.
260  * @param record Form record.
261  * @param formInfo Js form info.
262  */
CreateFormJsInfo(const int64_t formId,const FormRecord & record,FormJsInfo & formInfo)263 void FormDataMgr::CreateFormJsInfo(const int64_t formId, const FormRecord &record, FormJsInfo &formInfo)
264 {
265     formInfo.formId = formId;
266     formInfo.bundleName = record.bundleName;
267     formInfo.abilityName = record.abilityName;
268     formInfo.formName = record.formName;
269     formInfo.moduleName = record.isDistributedForm ? record.uiModule : record.moduleName;
270     formInfo.formTempFlag = record.formTempFlag;
271     formInfo.jsFormCodePath = record.jsFormCodePath;
272     formInfo.formSrc = record.formSrc;
273     formInfo.formWindow = record.formWindow;
274     formInfo.versionCode = record.versionCode;
275     formInfo.versionName = record.versionName;
276     formInfo.compatibleVersion = record.compatibleVersion;
277     formInfo.type = record.type;
278     formInfo.uiSyntax = record.uiSyntax;
279     formInfo.isDynamic = record.isDynamic;
280     formInfo.transparencyEnabled = record.transparencyEnabled;
281     formInfo.modulePkgNameMap = record.modulePkgNameMap;
282     formInfo.formData = record.formProviderInfo.GetFormDataString();
283     formInfo.formProviderData = record.formProviderInfo.GetFormData();
284 }
285 
SetConfigMap(const std::map<std::string,int32_t> & configMap)286 void FormDataMgr::SetConfigMap(const std::map<std::string, int32_t> &configMap)
287 {
288     std::lock_guard<std::mutex> lock(formConfigMapMutex_);
289     formConfigMap_ = configMap;
290 }
291 
GetConfigParamFormMap(const std::string & key,int32_t & value) const292 void FormDataMgr::GetConfigParamFormMap(const std::string &key, int32_t &value) const
293 {
294     std::lock_guard<std::mutex> lock(formConfigMapMutex_);
295     if (formConfigMap_.empty()) {
296         HILOG_ERROR("empty configMap");
297         return;
298     }
299     auto iter = formConfigMap_.find(key);
300     if (iter == formConfigMap_.end()) {
301         HILOG_ERROR("no corresponding value found, use the default value");
302         return;
303     }
304     value = iter->second;
305     HILOG_INFO("key:%{public}s, value:%{public}d", key.c_str(), value);
306 }
307 
RecycleAllRecyclableForms() const308 void FormDataMgr::RecycleAllRecyclableForms() const
309 {
310     HILOG_INFO("start");
311     std::vector<int64_t> formIds;
312     {
313         std::lock_guard<std::mutex> lock(formRecordMutex_);
314         for (auto itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
315             if (itFormRecord->second.recycleStatus == RecycleStatus::RECYCLABLE) {
316                 formIds.emplace_back(itFormRecord->first);
317             }
318         }
319     }
320 
321     {
322         std::lock_guard<std::mutex> lock(formHostRecordMutex_);
323         for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
324             std::vector<int64_t> matchedFormIds;
325             for (const int64_t &formId : formIds) {
326                 if (itHostRecord->Contains(formId)) {
327                     matchedFormIds.emplace_back(formId);
328                 }
329             }
330             if (!matchedFormIds.empty()) {
331                 Want want;
332                 itHostRecord->OnRecycleForms(matchedFormIds, want);
333             }
334         }
335     }
336 }
337 
RecycleForms(const std::vector<int64_t> & formIds,const int & callingUid,const Want & want) const338 void FormDataMgr::RecycleForms(const std::vector<int64_t> &formIds, const int &callingUid, const Want &want) const
339 {
340     HILOG_INFO("start callingUid:%{public}d", callingUid);
341     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
342     for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
343         if (itHostRecord->GetCallerUid() != callingUid) {
344             continue;
345         }
346         std::vector<int64_t> matchedFormIds;
347         for (const int64_t &formId : formIds) {
348             if (itHostRecord->Contains(formId)) {
349                 matchedFormIds.emplace_back(formId);
350             }
351         }
352         if (!matchedFormIds.empty()) {
353             itHostRecord->OnRecycleForms(matchedFormIds, want);
354         }
355         break;
356     }
357 }
358 
359 /**
360  * @brief Check temp form count is max.
361  * @return Returns ERR_OK if the temp form not reached; returns ERR_MAX_SYSTEM_TEMP_FORMS is reached.
362  */
CheckTempEnoughForm() const363 int FormDataMgr::CheckTempEnoughForm() const
364 {
365     int32_t maxTempSize = Constants::MAX_TEMP_FORMS;
366     GetConfigParamFormMap(Constants::MAX_TEMP_FORM_SIZE, maxTempSize);
367     maxTempSize = ((maxTempSize > Constants::MAX_TEMP_FORMS) || (maxTempSize < 0)) ?
368         Constants::MAX_TEMP_FORMS : maxTempSize;
369     HILOG_DEBUG("maxTempSize:%{public}d", maxTempSize);
370 
371     if (GetTempFormCount() >= maxTempSize) {
372         HILOG_WARN("already exist %{public}d temp forms in system", maxTempSize);
373         FormEventReport::SendFormFailedEvent(FormEventName::ADD_FORM_FAILED, 0, "", "",
374             static_cast<int32_t>(AddFormFiledErrorType::NUMBER_EXCEEDING_LIMIT),
375             ERR_APPEXECFWK_FORM_MAX_SYSTEM_TEMP_FORMS);
376         return ERR_APPEXECFWK_FORM_MAX_SYSTEM_TEMP_FORMS;
377     }
378     return ERR_OK;
379 }
380 
381 /**
382  * @brief Check form count is max.
383  * @param callingUid The UID of the proxy.
384  * @param currentUserId The current userId.
385  * @return Returns true if this function is successfully called; returns false otherwise.
386  */
CheckEnoughForm(const int callingUid,const int32_t currentUserId) const387 int FormDataMgr::CheckEnoughForm(const int callingUid, const int32_t currentUserId) const
388 {
389     HILOG_INFO("callingUid:%{public}d, currentUserId:%{public}d", callingUid, currentUserId);
390 
391     int32_t maxFormsSize = Constants::MAX_FORMS;
392     GetConfigParamFormMap(Constants::MAX_NORMAL_FORM_SIZE, maxFormsSize);
393     maxFormsSize = ((maxFormsSize > Constants::MAX_FORMS) || (maxFormsSize < 0)) ?
394         Constants::MAX_FORMS : maxFormsSize;
395     HILOG_DEBUG("maxFormsSize:%{public}d", maxFormsSize);
396 
397     int32_t maxRecordPerApp = Constants::MAX_RECORD_PER_APP;
398     GetConfigParamFormMap(Constants::HOST_MAX_FORM_SIZE, maxRecordPerApp);
399     maxRecordPerApp = ((maxRecordPerApp > Constants::MAX_RECORD_PER_APP) || (maxRecordPerApp < 0)) ?
400         Constants::MAX_RECORD_PER_APP : maxRecordPerApp;
401     HILOG_DEBUG("maxRecordPerApp:%{public}d", maxRecordPerApp);
402 
403     if (maxRecordPerApp == 0) {
404         HILOG_ERROR("The maximum number of normal cards in pre host is 0");
405         return ERR_APPEXECFWK_FORM_MAX_FORMS_PER_CLIENT;
406     }
407 
408     const auto formDbInfoSize = FormDbCache::GetInstance().GetAllFormInfoSize();
409     HILOG_INFO("already use %{public}d forms by userId", formDbInfoSize);
410     if (formDbInfoSize >= maxFormsSize) {
411         HILOG_WARN("exceeds max form number %{public}d", maxFormsSize);
412         FormEventReport::SendFormFailedEvent(FormEventName::ADD_FORM_FAILED, 0, "", "",
413             static_cast<int32_t>(AddFormFiledErrorType::NUMBER_EXCEEDING_LIMIT),
414             ERR_APPEXECFWK_FORM_MAX_SYSTEM_FORMS);
415         return ERR_APPEXECFWK_FORM_MAX_SYSTEM_FORMS;
416     }
417 
418     int32_t currentAccountId = FormUtil::GetCurrentAccountId();
419     int callingUidFormCounts = FormDbCache::GetInstance().GetFormCountsByCallingUid(currentAccountId, callingUid);
420     if (callingUidFormCounts >= maxRecordPerApp) {
421         HILOG_WARN("already use %{public}d forms by userId==currentAccountId", maxRecordPerApp);
422         return ERR_APPEXECFWK_FORM_MAX_FORMS_PER_CLIENT;
423     }
424 
425     return ERR_OK;
426 }
427 
428 /**
429  * @brief Delete temp form.
430  * @param formId The Id of the form.
431  * @return Returns true if this function is successfully called; returns false otherwise.
432  */
DeleteTempForm(const int64_t formId)433 bool FormDataMgr::DeleteTempForm(const int64_t formId)
434 {
435     std::lock_guard<std::mutex> lock(formTempMutex_);
436     auto iter = std::find(tempForms_.begin(), tempForms_.end(), formId);
437     if (iter == tempForms_.end()) {
438         HILOG_ERROR("not find tempForm:%{public}" PRId64, formId);
439         return false;
440     }
441     tempForms_.erase(iter);
442     return true;
443 }
444 /**
445  * @brief Check temp form is exist.
446  * @param formId The Id of the form.
447  * @return Returns true if the temp form is exist; returns false is not exist.
448  */
ExistTempForm(const int64_t formId) const449 bool FormDataMgr::ExistTempForm(const int64_t formId) const
450 {
451     std::lock_guard<std::mutex> lock(formTempMutex_);
452     return (std::find(tempForms_.begin(), tempForms_.end(), formId) != tempForms_.end());
453 }
454 /**
455  * @brief Check calling uid is valid.
456  * @param formUserUids The form user uids.
457  * @return Returns true if this user uid is valid; returns false otherwise.
458  */
IsCallingUidValid(const std::vector<int> & formUserUids) const459 bool FormDataMgr::IsCallingUidValid(const std::vector<int> &formUserUids) const
460 {
461     if (formUserUids.empty()) {
462         HILOG_ERROR("empty formUserUids");
463         return false;
464     }
465     for (const auto &userUid : formUserUids) {
466         if (userUid == IPCSkeleton::GetCallingUid()) {
467             return true;
468         }
469     }
470     HILOG_ERROR("not find valid uid");
471     return false;
472 }
473 /**
474  * @brief Modify form temp flag by formId.
475  * @param formId The Id of the form.
476  * @param formTempFlag The form temp flag.
477  * @return Returns true if this function is successfully called; returns false otherwise.
478  */
ModifyFormTempFlag(const int64_t formId,const bool formTempFlag)479 bool FormDataMgr::ModifyFormTempFlag(const int64_t formId, const bool formTempFlag)
480 {
481     HILOG_INFO("modify form temp flag by formId");
482     std::lock_guard<std::mutex> lock(formRecordMutex_);
483     if (!(formRecords_.count(formId) > 0)) {
484         HILOG_ERROR("formInfo not exist");
485         return false;
486     }
487     formRecords_[formId].formTempFlag = formTempFlag;
488     return true;
489 }
490 /**
491  * @brief Add form user uid from form record.
492  * @param formId The Id of the form.
493  * @param formRecord The form record.
494  * @return Returns true if this function is successfully called; returns false otherwise.
495  */
AddFormUserUid(const int64_t formId,const int formUserUid)496 bool FormDataMgr::AddFormUserUid(const int64_t formId, const int formUserUid)
497 {
498     HILOG_INFO("add form user uid by formId");
499     std::lock_guard<std::mutex> lock(formRecordMutex_);
500     if (!(formRecords_.count(formId) > 0)) {
501         HILOG_ERROR("formInfo not exist");
502         return false;
503     }
504     if (std::find(formRecords_[formId].formUserUids.begin(), formRecords_[formId].formUserUids.end(),
505         formUserUid) == formRecords_[formId].formUserUids.end()) {
506         formRecords_[formId].formUserUids.emplace_back(formUserUid);
507     }
508     return true;
509 }
510 /**
511  * @brief Delete form user uid from form record.
512  * @param formId The Id of the form.
513  * @param uid calling user id.
514  * @return Returns true if this function is successfully called; returns false otherwise.
515  */
DeleteFormUserUid(const int64_t formId,const int uid)516 bool FormDataMgr::DeleteFormUserUid(const int64_t formId, const int uid)
517 {
518     HILOG_INFO("formId:%{public}" PRId64 ", uid:%{public}d", formId, uid);
519     std::lock_guard<std::mutex> lock(formRecordMutex_);
520     if (formRecords_.count(formId) > 0) {
521         auto iter = std::find(formRecords_.at(formId).formUserUids.begin(),
522             formRecords_.at(formId).formUserUids.end(), uid);
523         if (iter != formRecords_.at(formId).formUserUids.end()) {
524             formRecords_.at(formId).formUserUids.erase(iter);
525         }
526         return true;
527     } else {
528         HILOG_ERROR("formInfo not find");
529         return false;
530     }
531 }
532 /**
533  * @brief Update form record.
534  * @param formId The Id of the form.
535  * @param formRecord The form record.
536  * @return Returns true if this function is successfully called; returns false otherwise.
537  */
UpdateFormRecord(const int64_t formId,const FormRecord & formRecord)538 bool FormDataMgr::UpdateFormRecord(const int64_t formId, const FormRecord &formRecord)
539 {
540     HILOG_DEBUG("get form record by formId");
541     std::lock_guard<std::mutex> lock(formRecordMutex_);
542     auto info = formRecords_.find(formId);
543     if (info != formRecords_.end()) {
544         formRecords_[formId] = formRecord;
545         return true;
546     }
547     return false;
548 }
549 /**
550  * @brief Get form record.
551  * @param formId The Id of the form.
552  * @param formRecord The form record.
553  * @return Returns true if this function is successfully called; returns false otherwise.
554  */
GetFormRecord(const int64_t formId,FormRecord & formRecord) const555 bool FormDataMgr::GetFormRecord(const int64_t formId, FormRecord &formRecord) const
556 {
557     HILOG_DEBUG("get form record by formId");
558     std::lock_guard<std::mutex> lock(formRecordMutex_);
559     auto info = formRecords_.find(formId);
560     if (info == formRecords_.end()) {
561         HILOG_ERROR("formInfo not find");
562         return false;
563     }
564     formRecord = info->second;
565 
566     HILOG_DEBUG("get form record successfully");
567     return true;
568 }
569 /**
570  * @brief Get form record.
571  * @param bundleName Bundle name.
572  * @param formInfos The form record.
573  * @return Returns true if this function is successfully called; returns false otherwise.
574  */
GetFormRecord(const std::string & bundleName,std::vector<FormRecord> & formInfos,int32_t userId) const575 bool FormDataMgr::GetFormRecord(const std::string &bundleName, std::vector<FormRecord> &formInfos, int32_t userId) const
576 {
577     HILOG_DEBUG("get form record by bundleName");
578     std::lock_guard<std::mutex> lock(formRecordMutex_);
579     for (auto itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
580         if (bundleName == itFormRecord->second.bundleName &&
581             (userId == Constants::INVALID_USER_ID || userId == itFormRecord->second.userId)) {
582             formInfos.emplace_back(itFormRecord->second);
583         }
584     }
585     if (formInfos.size() > 0) {
586         return true;
587     } else {
588         HILOG_DEBUG("formInfo not find");
589         return false;
590     }
591 }
592 
593 /**
594  * @brief Get form record.
595  * @param formId The Id of the form.
596  * @param formRecord The form record.
597  * @return Set true if DataProxy Update.
598  */
SetDataProxyUpdate(const int64_t formId)599 void FormDataMgr::SetDataProxyUpdate(const int64_t formId)
600 {
601     HILOG_DEBUG("get form record by formId");
602     std::lock_guard<std::mutex> lock(formRecordMutex_);
603     auto info = formRecords_.find(formId);
604     if (info != formRecords_.end()) {
605         info->second.isDataProxyUpdate = true;
606     }
607 }
608 
609 /**
610  * @brief DataProxy update ignore visibility check.
611  * @param formRecord The form record.
612  * @return return true if DataProxy Update.
613  */
IsDataProxyIgnoreFormVisibility(const int64_t formId) const614 bool FormDataMgr::IsDataProxyIgnoreFormVisibility(const int64_t formId) const
615 {
616     std::lock_guard<std::mutex> lock(formRecordMutex_);
617     auto info = formRecords_.find(formId);
618     if (info != formRecords_.end()) {
619         return info->second.isDataProxyUpdate && info->second.isDataProxyIgnoreFormVisible;
620     }
621     return false;
622 }
623 
624 
625 /**
626  * @brief Set dataProxy update flage default.
627  * @param formRecord The form record.
628  */
ResetDataProxyUpdate(const int64_t formId)629 void FormDataMgr::ResetDataProxyUpdate (const int64_t formId)
630 {
631     std::lock_guard<std::mutex> lock(formRecordMutex_);
632     auto info = formRecords_.find(formId);
633     if (info != formRecords_.end()) {
634         info->second.isDataProxyUpdate = false;
635     }
636 }
637 
638 /**
639  * @brief Get published form record by formId.
640  * @param bundleName Bundle name.
641  * @param formInfo The form record.
642  * @param formId The Id of the form.
643  * @param userId User ID.
644  * @return Returns ERR_OK on success, others on failure.
645  */
GetPublishedFormInfoById(const std::string & bundleName,RunningFormInfo & formInfo,const int64_t & formId,int32_t userId) const646 ErrCode FormDataMgr::GetPublishedFormInfoById(const std::string &bundleName, RunningFormInfo &formInfo,
647     const int64_t &formId, int32_t userId) const
648 {
649     HILOG_DEBUG("get form record by bundleName & formId");
650     std::lock_guard<std::mutex> lock(formRecordMutex_);
651     for (auto itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
652         if (bundleName == itFormRecord->second.bundleName && formId == itFormRecord->second.formId &&
653             (userId == Constants::INVALID_USER_ID || userId == itFormRecord->second.userId)) {
654             formInfo.formId = itFormRecord->second.formId;
655             FillBasicRunningFormInfoByFormRecord(itFormRecord->second, formInfo);
656             HILOG_DEBUG("GetPublishedFormInfoById success, formId:%{public}" PRId64, formId);
657             return ERR_OK;
658         }
659     }
660     HILOG_DEBUG("formInfo not find");
661     return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
662 }
663 
664 /**
665  * @brief Get published form records.
666  * @param bundleName Bundle name.
667  * @param formInfos The form record list.
668  * @param userId User ID.
669  * @return Returns ERR_OK on success, others on failure.
670  */
GetPublishedFormInfos(const std::string & bundleName,std::vector<RunningFormInfo> & formInfos,int32_t userId) const671 ErrCode FormDataMgr::GetPublishedFormInfos(const std::string &bundleName, std::vector<RunningFormInfo> &formInfos,
672     int32_t userId) const
673 {
674     HILOG_DEBUG("get form record by bundleName");
675     std::lock_guard<std::mutex> lock(formRecordMutex_);
676     for (auto itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
677         if (bundleName == itFormRecord->second.bundleName &&
678             (userId == Constants::INVALID_USER_ID || userId == itFormRecord->second.userId)) {
679             RunningFormInfo formInfo;
680             formInfo.formId = itFormRecord->second.formId;
681             FillBasicRunningFormInfoByFormRecord(itFormRecord->second, formInfo);
682             formInfos.emplace_back(formInfo);
683         }
684     }
685     if (formInfos.size() > 0) {
686         HILOG_DEBUG("GetPublishedFormInfos success, size:%{public}zu", formInfos.size());
687         return ERR_OK;
688     } else {
689         HILOG_DEBUG("formInfo not find");
690         return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
691     }
692 }
693 
694 /**
695  * @brief Get form record.
696  * @param conditionType condition Type.
697  * @param formInfos The form record.
698  * @return Returns true if this function is successfully called; returns false otherwise.
699  */
GetFormRecordByCondition(int32_t conditionType,std::vector<FormRecord> & formInfos) const700 bool FormDataMgr::GetFormRecordByCondition(int32_t conditionType, std::vector<FormRecord> &formInfos) const
701 {
702     HILOG_DEBUG("get form record by conditionType");
703     std::lock_guard<std::mutex> lock(formRecordMutex_);
704     for (auto itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
705         std::vector<int32_t> conditionUpdate = itFormRecord->second.conditionUpdate;
706         for (int32_t item : conditionUpdate) {
707             if (item == conditionType) {
708                 formInfos.emplace_back(itFormRecord->second);
709                 break;
710             }
711         }
712     }
713     if (formInfos.size() > 0) {
714         return true;
715     } else {
716         HILOG_DEBUG("formInfo not find");
717         return false;
718     }
719 }
720 
721 /**
722  * @brief Get temporary form record.
723  * @param formTempRecords The temp form record.
724  * @return Returns true if this function is successfully called; returns false otherwise.
725  */
GetTempFormRecord(std::vector<FormRecord> & formTempRecords)726 bool FormDataMgr::GetTempFormRecord(std::vector<FormRecord> &formTempRecords)
727 {
728     HILOG_INFO("Get temporary form record");
729     std::lock_guard<std::mutex> lock(formRecordMutex_);
730     std::map<int64_t, FormRecord>::iterator itFormRecord;
731     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
732         if (itFormRecord->second.formTempFlag) {
733             formTempRecords.emplace_back(itFormRecord->second);
734         }
735     }
736     if (!formTempRecords.empty()) {
737         return true;
738     } else {
739         HILOG_INFO("The count of temporary form is zero");
740         return false;
741     }
742 }
743 /**
744  * @brief Check form record is exist.
745  * @param formId The Id of the form.
746  * @return Returns true if the form record is exist; returns false is not exist.
747  */
ExistFormRecord(const int64_t formId) const748 bool FormDataMgr::ExistFormRecord(const int64_t formId) const
749 {
750     HILOG_INFO("check form record is exist");
751     std::lock_guard<std::mutex> lock(formRecordMutex_);
752     return (formRecords_.count(formId) > 0);
753 }
754 /**
755  * @brief Has form user uids in form record.
756  * @param formId The Id of the form.
757  * @return Returns true if this form has form user uids; returns false is not has.
758  */
HasFormUserUids(const int64_t formId) const759 bool FormDataMgr::HasFormUserUids(const int64_t formId) const
760 {
761     HILOG_INFO("check form has user uids");
762     FormRecord record;
763     if (GetFormRecord(formId, record)) {
764         return record.formUserUids.empty() ? false : true;
765     }
766     return false;
767 }
768 /**
769  * @brief Get form host record.
770  * @param formId The id of the form.
771  * @param formHostRecord The form host record.
772  */
GetFormHostRecord(const int64_t formId,std::vector<FormHostRecord> & formHostRecords) const773 void FormDataMgr::GetFormHostRecord(const int64_t formId, std::vector<FormHostRecord> &formHostRecords) const
774 {
775     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
776     for (auto &record : clientRecords_) {
777         if (record.Contains(formId)) {
778             formHostRecords.emplace_back(record);
779         }
780     }
781     HILOG_DEBUG("get form host record by formId, size is %{public}zu", formHostRecords.size());
782 }
GetFormHostRemoteObj(const int64_t formId,std::vector<sptr<IRemoteObject>> & formHostObjs) const783 void FormDataMgr::GetFormHostRemoteObj(const int64_t formId, std::vector<sptr<IRemoteObject>> &formHostObjs) const
784 {
785     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
786     for (auto &record : clientRecords_) {
787         if (record.Contains(formId)) {
788             formHostObjs.emplace_back(record.GetFormHostClient());
789         }
790     }
791     if (formHostObjs.empty()) {
792         HILOG_WARN("empty formHostObjs");
793         return;
794     }
795     HILOG_DEBUG("Get form host remote object by formId, size is %{public}zu", formHostObjs.size());
796 }
797 /**
798  * @brief Delete form host record.
799  * @param callerToken The client stub of the form host record.
800  * @param formId The id of the form.
801  * @return Returns true if this function is successfully called; returns false otherwise.
802  */
DeleteHostRecord(const sptr<IRemoteObject> & callerToken,const int64_t formId)803 bool FormDataMgr::DeleteHostRecord(const sptr<IRemoteObject> &callerToken, const int64_t formId)
804 {
805     HILOG_WARN("form: %{public}" PRId64, formId);
806     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
807     std::vector<FormHostRecord>::iterator iter;
808     for (iter = clientRecords_.begin(); iter != clientRecords_.end(); ++iter) {
809         if (callerToken == iter->GetFormHostClient()) {
810             iter->DelForm(formId);
811             if (iter->IsEmpty()) {
812                 HILOG_INFO("post delay recheck whether need clean form host task");
813                 PostDelayRecheckWhetherNeedCleanFormHostTask(iter->GetCallerUid(), callerToken);
814             }
815             break;
816         }
817     }
818     return true;
819 }
820 /**
821  * @brief Recheck whether need clean form host.
822  * @param callerToken The client stub of the form host record.
823  */
RecheckWhetherNeedCleanFormHost(const sptr<IRemoteObject> & callerToken)824 bool FormDataMgr::RecheckWhetherNeedCleanFormHost(const sptr<IRemoteObject> &callerToken)
825 {
826     HILOG_INFO("call");
827     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
828     std::vector<FormHostRecord>::iterator iter;
829     for (iter = clientRecords_.begin(); iter != clientRecords_.end(); ++iter) {
830         if (callerToken == iter->GetFormHostClient()) {
831             if (iter->IsEmpty()) {
832                 HILOG_WARN("clientRecords_ is empty, clean form host");
833                 iter->CleanResource();
834                 iter = clientRecords_.erase(iter);
835                 FormRenderMgr::GetInstance().CleanFormHost(callerToken, iter->GetCallerUid());
836                 return true;
837             }
838             break;
839         }
840     }
841     HILOG_INFO("no need to clean form host");
842     return false;
843 }
844 /**
845  * @brief Clean removed forms form host.
846  * @param removedFormIds The id list of the forms.
847  */
CleanHostRemovedForms(const std::vector<int64_t> & removedFormIds)848 void FormDataMgr::CleanHostRemovedForms(const std::vector<int64_t> &removedFormIds)
849 {
850     HILOG_INFO("delete form host record by formId list");
851     std::vector<int64_t> matchedIds;
852     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
853     std::vector<FormHostRecord>::iterator itHostRecord;
854     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
855         for (const int64_t& formId : removedFormIds) {
856             if (itHostRecord->Contains(formId)) {
857                 matchedIds.emplace_back(formId);
858                 itHostRecord->DelForm(formId);
859             }
860         }
861         if (!matchedIds.empty()) {
862             HILOG_INFO("OnFormUninstalled");
863             itHostRecord->OnFormUninstalled(matchedIds);
864         }
865     }
866 
867     HILOG_INFO("end");
868 }
869 
UpdateHostForms(const std::vector<int64_t> & updateFormIds)870 void FormDataMgr::UpdateHostForms(const std::vector<int64_t> &updateFormIds)
871 {
872     HILOG_INFO("update form host record by formId list");
873     std::vector<int64_t> matchedIds;
874     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
875     for (FormHostRecord &record : clientRecords_) {
876         for (const int64_t &formId : updateFormIds) {
877             if (record.Contains(formId)) {
878                 matchedIds.emplace_back(formId);
879             }
880         }
881         if (!matchedIds.empty()) {
882             HILOG_INFO("OnFormUninstalled");
883             record.OnFormUninstalled(matchedIds);
884             matchedIds.clear();
885         }
886     }
887     HILOG_INFO("end");
888 }
889 
890 /**
891  * @brief Handle form host died.
892  * @param remoteHost Form host proxy object.
893  */
HandleHostDied(const sptr<IRemoteObject> & remoteHost)894 void FormDataMgr::HandleHostDied(const sptr<IRemoteObject> &remoteHost)
895 {
896     std::vector<int64_t> recordTempForms;
897     int remoteHostCallerUid = 0;
898     {
899         std::lock_guard<std::mutex> lock(formHostRecordMutex_);
900         std::vector<FormHostRecord>::iterator itHostRecord;
901         for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
902             if (remoteHost == itHostRecord->GetFormHostClient()) {
903                 HandleHostDiedForTempForms(*itHostRecord, recordTempForms);
904                 HILOG_INFO("find died client,remove it");
905                 itHostRecord->CleanResource();
906                 remoteHostCallerUid = itHostRecord->GetCallerUid();
907                 itHostRecord = clientRecords_.erase(itHostRecord);
908                 break;
909             } else {
910                 itHostRecord++;
911             }
912         }
913     }
914     {
915         std::lock_guard<std::mutex> lock(formRecordMutex_);
916         std::map<int64_t, FormRecord>::iterator itFormRecord;
917         for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
918             int64_t formId = itFormRecord->first;
919             // if temp form, remove it
920             if (std::find(recordTempForms.begin(), recordTempForms.end(), formId) != recordTempForms.end()) {
921                 FormRecord formRecord = itFormRecord->second;
922                 itFormRecord = formRecords_.erase(itFormRecord);
923                 FormBasicInfoMgr::GetInstance().DeleteFormBasicInfo(formId);
924                 FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, formRecord);
925                 FormDataProxyMgr::GetInstance().UnsubscribeFormData(formId);
926             } else {
927                 itFormRecord++;
928             }
929         }
930     }
931     {
932         std::lock_guard<std::mutex> lock(formStateRecordMutex_);
933         std::map<std::string, FormHostRecord>::iterator itFormStateRecord;
934         for (itFormStateRecord = formStateRecord_.begin(); itFormStateRecord != formStateRecord_.end();) {
935             if (remoteHost == itFormStateRecord->second.GetFormHostClient()) {
936                 HILOG_INFO("find died client, remove it from formStateRecord_");
937                 itFormStateRecord->second.CleanResource();
938                 itFormStateRecord = formStateRecord_.erase(itFormStateRecord);
939                 break;
940             } else {
941                 itFormStateRecord++;
942             }
943         }
944     }
945     FormRenderMgr::GetInstance().CleanFormHost(remoteHost, remoteHostCallerUid);
946 }
947 
948 /**
949  * @brief Get the temp forms from host and delete temp form in cache.
950  * @param record The form record.
951  * @param recordTempForms gotten the temp forms.
952  */
HandleHostDiedForTempForms(const FormHostRecord & record,std::vector<int64_t> & recordTempForms)953 void FormDataMgr::HandleHostDiedForTempForms(const FormHostRecord &record, std::vector<int64_t> &recordTempForms)
954 {
955     std::lock_guard<std::mutex> lock(formTempMutex_);
956     std::vector<int64_t>::iterator itForm;
957     for (itForm = tempForms_.begin(); itForm != tempForms_.end();) {
958         if (record.Contains(*itForm)) {
959             recordTempForms.emplace_back(*itForm);
960             itForm = tempForms_.erase(itForm);
961         } else {
962             itForm++;
963         }
964     }
965 }
966 
967 /**
968  * @brief Refresh enable or not.
969  * @param formId The Id of the form.
970  * @return true on enable, false on disable.
971  */
IsEnableRefresh(int64_t formId)972 bool FormDataMgr::IsEnableRefresh(int64_t formId)
973 {
974     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
975     for (auto &record : clientRecords_) {
976         if (record.IsEnableRefresh(formId)) {
977             return true;
978         }
979     }
980 
981     return false;
982 }
983 
984 /**
985  * @brief update enable or not.
986  * @param formId The Id of the form.
987  * @return true on enable, false on disable.
988  */
IsEnableUpdate(int64_t formId)989 bool FormDataMgr::IsEnableUpdate(int64_t formId)
990 {
991     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
992     for (auto &record : clientRecords_) {
993         if (record.IsEnableUpdate(formId)) {
994             return true;
995         }
996     }
997     return false;
998 }
999 
PaddingUdidHash(const int64_t formId)1000 int64_t FormDataMgr::PaddingUdidHash(const int64_t formId)
1001 {
1002     if (!GenerateUdidHash()) {
1003         return -1;
1004     }
1005     // Compatible with int form id.
1006     uint64_t unsignedFormId = static_cast<uint64_t>(formId);
1007     if ((unsignedFormId & 0xffffffff00000000L) == 0) {
1008         uint64_t unsignedUdidHash  = static_cast<uint64_t>(udidHash_);
1009         uint64_t unsignedUdidHashFormId = unsignedUdidHash | unsignedFormId;
1010         int64_t udidHashFormId = static_cast<int64_t>(unsignedUdidHashFormId);
1011         return udidHashFormId;
1012     }
1013     return formId;
1014 }
1015 
1016 /**
1017  * @brief Generate form id.
1018  * @return form id.
1019  */
GenerateFormId()1020 int64_t FormDataMgr::GenerateFormId()
1021 {
1022     // generate by udidHash_
1023     if (!GenerateUdidHash()) {
1024         HILOG_ERROR("generateFormId no invalid udidHash_");
1025         return -1;
1026     }
1027     return FormUtil::GenerateFormId(udidHash_);
1028 }
1029 /**
1030  * @brief Generate udid.
1031  * @return Returns true if this function is successfully called; returns false otherwise.
1032  */
GenerateUdidHash()1033 bool FormDataMgr::GenerateUdidHash()
1034 {
1035     if (udidHash_ != Constants::INVALID_UDID_HASH) {
1036         return true;
1037     }
1038 
1039     bool genUdid = FormUtil::GenerateUdidHash(udidHash_);
1040     if (!genUdid) {
1041         HILOG_ERROR("fail generate udid");
1042         return false;
1043     }
1044 
1045     return true;
1046 }
1047 /**
1048  * @brief Get udid.
1049  * @return udid.
1050  */
GetUdidHash() const1051 int64_t FormDataMgr::GetUdidHash() const
1052 {
1053     return udidHash_;
1054 }
1055 /**
1056  * @brief Set udid.
1057  * @param udidHash udid.
1058  */
SetUdidHash(const int64_t udidHash)1059 void FormDataMgr::SetUdidHash(const int64_t udidHash)
1060 {
1061     udidHash_ = udidHash;
1062 }
1063 
1064 /**
1065  * @brief Get the matched form host record by client stub.
1066  *
1067  * @param callerToken The client stub of the form host record.
1068  * @param formHostRecord The form host record.
1069  * @return Returns true if this function is successfully called, returns false otherwise.
1070  */
GetMatchedHostClient(const sptr<IRemoteObject> & callerToken,FormHostRecord & formHostRecord) const1071 bool FormDataMgr::GetMatchedHostClient(const sptr<IRemoteObject> &callerToken, FormHostRecord &formHostRecord) const
1072 {
1073     HILOG_DEBUG("get the matched form host record by client stub");
1074     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1075     for (const FormHostRecord &record : clientRecords_) {
1076         if (callerToken == record.GetFormHostClient()) {
1077             formHostRecord = record;
1078             return true;
1079         }
1080     }
1081 
1082     HILOG_ERROR("form host record not find");
1083     return false;
1084 }
1085 
1086 /**
1087  * @brief Set needRefresh for FormRecord.
1088  * @param formId The Id of the form.
1089  * @param needRefresh true or false.
1090  */
SetNeedRefresh(const int64_t formId,const bool needRefresh)1091 void FormDataMgr::SetNeedRefresh(const int64_t formId, const bool needRefresh)
1092 {
1093     std::lock_guard<std::mutex> lock(formRecordMutex_);
1094     auto itFormRecord = formRecords_.find(formId);
1095     if (itFormRecord == formRecords_.end()) {
1096         HILOG_ERROR("form info not find");
1097         return;
1098     }
1099     itFormRecord->second.needRefresh = needRefresh;
1100 }
1101 
1102 /**
1103  * @brief Set needRefresh for FormRecord.
1104  * @param formId The Id of the form.
1105  * @param needRefresh true or false.
1106  */
SetRefreshType(const int64_t formId,const int refreshType)1107 void FormDataMgr::SetRefreshType(const int64_t formId, const int refreshType)
1108 {
1109     std::lock_guard<std::mutex> lock(formRecordMutex_);
1110     auto itFormRecord = formRecords_.find(formId);
1111     if (itFormRecord == formRecords_.end()) {
1112         HILOG_ERROR("form info not find");
1113         return;
1114     }
1115     itFormRecord->second.refreshType = refreshType;
1116 }
1117 
1118 /**
1119  * @brief get needRefresh for FormRecord.
1120  * @param formId The Id of the form.
1121  * @param needRefresh true or false.
1122  */
GetRefreshType(const int64_t formId,int & refreshType)1123 void FormDataMgr::GetRefreshType(const int64_t formId, int &refreshType)
1124 {
1125     std::lock_guard<std::mutex> lock(formRecordMutex_);
1126     auto itFormRecord = formRecords_.find(formId);
1127     if (itFormRecord == formRecords_.end()) {
1128         HILOG_ERROR("form info not find");
1129         return;
1130     }
1131     refreshType = itFormRecord->second.refreshType;
1132 }
1133 
1134 /**
1135  * @brief Set needRefresh for FormRecord.
1136  * @param formId The Id of the form.
1137  * @param needRefresh true or false.
1138  */
SetNeedAddForm(const int64_t formId,const bool needAddForm)1139 void FormDataMgr::SetNeedAddForm(const int64_t formId, const bool needAddForm)
1140 {
1141     std::lock_guard<std::mutex> lock(formRecordMutex_);
1142     auto itFormRecord = formRecords_.find(formId);
1143     if (itFormRecord == formRecords_.end()) {
1144         HILOG_ERROR("form info not find");
1145         return;
1146     }
1147     itFormRecord->second.needAddForm = needAddForm;
1148 }
1149 
1150 /**
1151  * @brief Set isCountTimerRefresh for FormRecord.
1152  * @param formId The Id of the form.
1153  * @param countTimerRefresh true or false.
1154  */
SetCountTimerRefresh(const int64_t formId,const bool countTimerRefresh)1155 void FormDataMgr::SetCountTimerRefresh(const int64_t formId, const bool countTimerRefresh)
1156 {
1157     std::lock_guard<std::mutex> lock(formRecordMutex_);
1158     auto itFormRecord = formRecords_.find(formId);
1159     if (itFormRecord == formRecords_.end()) {
1160         HILOG_ERROR("form info not find");
1161         return;
1162     }
1163     itFormRecord->second.isCountTimerRefresh = countTimerRefresh;
1164 }
1165 
1166 /**
1167  * @brief Set isTimerRefresh for FormRecord.
1168  * @param formId The Id of the form.
1169  * @param timerRefresh true or false.
1170  */
SetTimerRefresh(const int64_t formId,const bool timerRefresh)1171 void FormDataMgr::SetTimerRefresh(const int64_t formId, const bool timerRefresh)
1172 {
1173     std::lock_guard<std::mutex> lock(formRecordMutex_);
1174     auto itFormRecord = formRecords_.find(formId);
1175     if (itFormRecord == formRecords_.end()) {
1176         HILOG_ERROR("form info not find");
1177         return;
1178     }
1179     itFormRecord->second.isTimerRefresh = timerRefresh;
1180 }
1181 
1182 /**
1183  * @brief Set isHostRefresh for FormRecord.
1184  * @param formId The Id of the form.
1185  * @param hostRefresh true or false.
1186  */
SetHostRefresh(const int64_t formId,const bool hostRefresh)1187 void FormDataMgr::SetHostRefresh(const int64_t formId, const bool hostRefresh)
1188 {
1189     std::lock_guard<std::mutex> lock(formRecordMutex_);
1190     auto itFormRecord = formRecords_.find(formId);
1191     if (itFormRecord == formRecords_.end()) {
1192         HILOG_ERROR("form info not find, form:%{public}" PRId64, formId);
1193         return;
1194     }
1195     itFormRecord->second.isHostRefresh = hostRefresh;
1196 }
1197 
1198 /**
1199  * @brief Clear want cache for FormRecord.
1200  * @param formId The Id of the form.
1201  */
ClearWantCache(const int64_t formId)1202 void FormDataMgr::ClearWantCache(const int64_t formId)
1203 {
1204     std::lock_guard<std::mutex> lock(formRecordMutex_);
1205     auto itFormRecord = formRecords_.find(formId);
1206     if (itFormRecord == formRecords_.end()) {
1207         HILOG_ERROR("form info not find, form:%{public}" PRId64, formId);
1208         return;
1209     }
1210     itFormRecord->second.wantCacheMap.clear();
1211 }
1212 
1213 /**
1214  * @brief Clear host refresh flag.
1215  * @param formId The Id of the form.
1216  */
ClearHostRefreshFlag(const int64_t formId)1217 void FormDataMgr::ClearHostRefreshFlag(const int64_t formId)
1218 {
1219     std::lock_guard<std::mutex> lock(formRecordMutex_);
1220     auto itFormRecord = formRecords_.find(formId);
1221     if (itFormRecord == formRecords_.end()) {
1222         HILOG_ERROR("form info not find, form:%{public}" PRId64, formId);
1223         return;
1224     }
1225     if (itFormRecord->second.isHostRefresh) {
1226         HILOG_INFO("clean host refresh flag, form:%{public}" PRId64, formId);
1227         itFormRecord->second.isHostRefresh = false;
1228         itFormRecord->second.wantCacheMap.clear();
1229     }
1230 }
1231 
1232 /**
1233  * @brief Get updated form.
1234  * @param record FormRecord.
1235  * @param targetForms Target forms.
1236  * @param updatedForm Updated formnfo.
1237  * @return Returns true on success, false on failure.
1238  */
GetUpdatedForm(const FormRecord & record,const std::vector<FormInfo> & targetForms,FormInfo & updatedForm)1239 bool FormDataMgr::GetUpdatedForm(const FormRecord &record, const std::vector<FormInfo> &targetForms,
1240     FormInfo &updatedForm)
1241 {
1242     if (targetForms.empty()) {
1243         HILOG_ERROR("empty targetForms");
1244         return false;
1245     }
1246 
1247     for (const FormInfo &item : targetForms) {
1248         if (IsSameForm(record, item)) {
1249             updatedForm = item;
1250             HILOG_DEBUG("find matched form");
1251             return true;
1252         }
1253     }
1254     return false;
1255 }
1256 /**
1257  * @brief Set isEnableUpdate for FormRecord.
1258  * @param formId The Id of the form.
1259  * @param enableUpdate true or false.
1260  */
SetEnableUpdate(const int64_t formId,const bool enableUpdate)1261 void FormDataMgr::SetEnableUpdate(const int64_t formId, const bool enableUpdate)
1262 {
1263     std::lock_guard<std::mutex> lock(formRecordMutex_);
1264     auto itFormRecord = formRecords_.find(formId);
1265     if (itFormRecord == formRecords_.end()) {
1266         HILOG_ERROR("form info not find");
1267         return;
1268     }
1269     itFormRecord->second.isEnableUpdate = enableUpdate;
1270 }
1271 /**
1272  * @brief Set update info for FormRecord.
1273  * @param formId The Id of the form.
1274  * @param enableUpdate true or false.
1275  * @param updateDuration Update duration.
1276  * @param updateAtHour Update at hour.
1277  * @param updateAtMin Update at minute.
1278  */
SetUpdateInfo(const int64_t formId,const bool enableUpdate,const long updateDuration,const int updateAtHour,const int updateAtMin,const std::vector<std::vector<int>> updateAtTimes)1279 void FormDataMgr::SetUpdateInfo(
1280     const int64_t formId,
1281     const bool enableUpdate,
1282     const long updateDuration,
1283     const int updateAtHour,
1284     const int updateAtMin,
1285     const std::vector<std::vector<int>> updateAtTimes)
1286 {
1287     std::lock_guard<std::mutex> lock(formRecordMutex_);
1288     auto itFormRecord = formRecords_.find(formId);
1289     if (itFormRecord == formRecords_.end()) {
1290         HILOG_ERROR("form info not find");
1291         return;
1292     }
1293 
1294     itFormRecord->second.isEnableUpdate = enableUpdate;
1295     itFormRecord->second.updateDuration = updateDuration;
1296     itFormRecord->second.updateAtHour = updateAtHour;
1297     itFormRecord->second.updateAtMin = updateAtMin;
1298     itFormRecord->second.updateAtTimes = updateAtTimes;
1299 }
1300 /**
1301  * @brief Check if two forms is same or not.
1302  * @param record FormRecord.
1303  * @param formInfo FormInfo.
1304  * @return Returns true on success, false on failure.
1305  */
IsSameForm(const FormRecord & record,const FormInfo & formInfo)1306 bool FormDataMgr::IsSameForm(const FormRecord &record, const FormInfo &formInfo)
1307 {
1308     if (record.bundleName == formInfo.bundleName
1309         && record.moduleName == formInfo.moduleName
1310         && record.abilityName == formInfo.abilityName
1311         && record.formName == formInfo.name
1312         && std::find(formInfo.supportDimensions.begin(), formInfo.supportDimensions.end(), record.specification)
1313         != formInfo.supportDimensions.end()) {
1314         return true;
1315     }
1316 
1317     return false;
1318 }
1319 /**
1320  * @brief Clean removed form records.
1321  * @param removedForms The id list of the forms.
1322  */
CleanRemovedFormRecords(const std::string & bundleName,std::set<int64_t> & removedForms)1323 void FormDataMgr::CleanRemovedFormRecords(const std::string &bundleName, std::set<int64_t> &removedForms)
1324 {
1325     HILOG_INFO("clean removed form records");
1326     std::lock_guard<std::mutex> lock(formRecordMutex_);
1327     std::map<int64_t, FormRecord>::iterator itFormRecord;
1328     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
1329         auto itForm = std::find(removedForms.begin(), removedForms.end(), itFormRecord->first);
1330         if (itForm != removedForms.end()) {
1331             FormCacheMgr::GetInstance().DeleteData(itFormRecord->first);
1332             FormRenderMgr::GetInstance().StopRenderingForm(itFormRecord->first, itFormRecord->second);
1333             itFormRecord = formRecords_.erase(itFormRecord);
1334             FormBasicInfoMgr::GetInstance().DeleteFormBasicInfo(itFormRecord->first);
1335         } else {
1336             itFormRecord++;
1337         }
1338     }
1339 }
1340 /**
1341  * @brief Clean removed temp form records.
1342  * @param  bundleName BundleName.
1343  * @param removedForms The id list of the forms.
1344  */
CleanRemovedTempFormRecords(const std::string & bundleName,const int32_t userId,std::set<int64_t> & removedForms)1345 void FormDataMgr::CleanRemovedTempFormRecords(const std::string &bundleName, const int32_t userId,
1346     std::set<int64_t> &removedForms)
1347 {
1348     HILOG_INFO("clean removed form records");
1349     std::set<int64_t> removedTempForms;
1350     {
1351         std::lock_guard<std::mutex> lock(formRecordMutex_);
1352         std::map<int64_t, FormRecord>::iterator itFormRecord;
1353         for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
1354             if ((itFormRecord->second.formTempFlag) && (bundleName == itFormRecord->second.bundleName)
1355                 && (userId == itFormRecord->second.providerUserId)) {
1356                 removedTempForms.emplace(itFormRecord->second.formId);
1357                 FormRenderMgr::GetInstance().StopRenderingForm(itFormRecord->first, itFormRecord->second);
1358                 itFormRecord = formRecords_.erase(itFormRecord);
1359                 FormBasicInfoMgr::GetInstance().DeleteFormBasicInfo(itFormRecord->first);
1360             } else {
1361                 itFormRecord++;
1362             }
1363         }
1364     }
1365 
1366     if (removedTempForms.size() > 0) {
1367         std::lock_guard<std::mutex> lock(formTempMutex_);
1368         std::vector<int64_t>::iterator itTemp;
1369         for (itTemp = tempForms_.begin(); itTemp != tempForms_.end();) {
1370             if (removedTempForms.find(*itTemp) != removedTempForms.end()) {
1371                 itTemp = tempForms_.erase(itTemp);
1372             } else {
1373                 itTemp++;
1374             }
1375         }
1376         removedForms.merge(removedTempForms);
1377     }
1378 }
1379 /**
1380  * @brief Get recreate form records.
1381  * @param reCreateForms The id list of the forms.
1382  */
GetReCreateFormRecordsByBundleName(const std::string & bundleName,std::set<int64_t> & reCreateForms)1383 void FormDataMgr::GetReCreateFormRecordsByBundleName(const std::string &bundleName, std::set<int64_t> &reCreateForms)
1384 {
1385     std::lock_guard<std::mutex> lock(formRecordMutex_);
1386     std::map<int64_t, FormRecord>::iterator itFormRecord;
1387     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1388         if (bundleName == itFormRecord->second.bundleName) {
1389             reCreateForms.emplace(itFormRecord->second.formId);
1390         }
1391     }
1392 }
1393 /**
1394  * @brief Set form isInited flag.
1395  * @param formId The Id of the form.
1396  * @param isInited isInited property
1397  */
SetFormCacheInited(const int64_t formId,bool isInited)1398 void FormDataMgr::SetFormCacheInited(const int64_t formId, bool isInited)
1399 {
1400     std::lock_guard<std::mutex> lock(formRecordMutex_);
1401     auto itFormRecord = formRecords_.find(formId);
1402     if (itFormRecord == formRecords_.end()) {
1403         HILOG_ERROR("form info not find");
1404         return;
1405     }
1406     itFormRecord->second.isInited = isInited;
1407     itFormRecord->second.needRefresh = !isInited;
1408 }
1409 /**
1410  * @brief Set versionUpgrade.
1411  * @param formId The Id of the form.
1412  * @param versionUpgrade true or false
1413  */
SetVersionUpgrade(const int64_t formId,const bool versionUpgrade)1414 void FormDataMgr::SetVersionUpgrade(const int64_t formId, const bool versionUpgrade)
1415 {
1416     std::lock_guard<std::mutex> lock(formRecordMutex_);
1417     auto itFormRecord = formRecords_.find(formId);
1418     if (itFormRecord == formRecords_.end()) {
1419         HILOG_ERROR("form info not find");
1420         return;
1421     }
1422     itFormRecord->second.versionUpgrade = versionUpgrade;
1423 }
1424 /**
1425  * @brief Update form for host clients.
1426  * @param formId The Id of the form.
1427  * @param needRefresh true or false
1428  */
UpdateHostNeedRefresh(const int64_t formId,const bool needRefresh)1429 void FormDataMgr::UpdateHostNeedRefresh(const int64_t formId, const bool needRefresh)
1430 {
1431     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1432     std::vector<FormHostRecord>::iterator itHostRecord;
1433     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1434         if (itHostRecord->Contains(formId)) {
1435             itHostRecord->SetNeedRefresh(formId, needRefresh);
1436         }
1437     }
1438 }
1439 
1440 /**
1441  * @brief Update form for host clients.
1442  * @param formId The Id of the form.
1443  * @param formRecord The form info.
1444  * @return Returns true if form update, false if other.
1445  */
UpdateHostForm(const int64_t formId,const FormRecord & formRecord)1446 bool FormDataMgr::UpdateHostForm(const int64_t formId, const FormRecord &formRecord)
1447 {
1448     bool isUpdated = false;
1449     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1450     std::vector<FormHostRecord>::iterator itHostRecord;
1451     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1452         bool enableRefresh = formRecord.isVisible || itHostRecord->IsEnableUpdate(formId) ||
1453                              itHostRecord->IsEnableRefresh(formId);
1454         HILOG_INFO("formId:%{public}" PRId64 " enableRefresh:%{public}d", formId, enableRefresh);
1455         if (enableRefresh) {
1456             // update form
1457             itHostRecord->OnUpdate(formId, formRecord);
1458             // set needRefresh
1459             itHostRecord->SetNeedRefresh(formId, false);
1460             isUpdated = true;
1461         }
1462     }
1463     return isUpdated;
1464 }
1465 
HandleUpdateHostFormFlag(const std::vector<int64_t> & formIds,bool flag,bool isOnlyEnableUpdate,FormHostRecord & formHostRecord,std::vector<int64_t> & refreshForms)1466 ErrCode FormDataMgr::HandleUpdateHostFormFlag(const std::vector<int64_t> &formIds, bool flag, bool isOnlyEnableUpdate,
1467                                               FormHostRecord &formHostRecord, std::vector<int64_t> &refreshForms)
1468 {
1469     for (const int64_t formId : formIds) {
1470         if (formId <= 0) {
1471             HILOG_WARN("formId %{public}" PRId64 " less than 0", formId);
1472             continue;
1473         }
1474 
1475         int64_t matchedFormId = FindMatchedFormId(formId);
1476         if (!formHostRecord.Contains(matchedFormId)) {
1477             HILOG_WARN("form %{public}" PRId64 "not owned by this client, don't need to update flag",
1478                 formId);
1479             continue;
1480         }
1481 
1482         if (isOnlyEnableUpdate) {
1483             // new API: this flag is used only to control enable update
1484             formHostRecord.SetEnableUpdate(matchedFormId, flag);
1485             formHostRecord.SetEnableRefresh(matchedFormId, false);
1486         } else {
1487             // old API: this flag is used to control enable update and visible update
1488             formHostRecord.SetEnableRefresh(matchedFormId, flag);
1489         }
1490 
1491         // set disable
1492         if (!flag) {
1493             HILOG_DEBUG("flag is disable");
1494             continue;
1495         }
1496         FormRecord formRecord;
1497         if (GetFormRecord(matchedFormId, formRecord)) {
1498             if (formRecord.needRefresh) {
1499                 HILOG_DEBUG("formRecord need refresh");
1500                 refreshForms.emplace_back(matchedFormId);
1501                 continue;
1502             }
1503         } else {
1504             HILOG_WARN("not exist such form:%{public}" PRId64 "", matchedFormId);
1505             continue;
1506         }
1507 
1508         // if set enable flag, should check whether to refresh form
1509         if (!formHostRecord.IsNeedRefresh(matchedFormId)) {
1510             HILOG_DEBUG("host need not refresh");
1511             continue;
1512         }
1513 
1514         if (IsFormCached(formRecord)) {
1515             HILOG_DEBUG("form cached");
1516             formHostRecord.OnUpdate(matchedFormId, formRecord);
1517             formHostRecord.SetNeedRefresh(matchedFormId, false);
1518         } else {
1519             HILOG_DEBUG("form no cache");
1520             refreshForms.emplace_back(matchedFormId);
1521             continue;
1522         }
1523     }
1524     return ERR_OK;
1525 }
1526 
1527 /**
1528  * @brief handle update form flag.
1529  * @param formIDs The id of the forms.
1530  * @param callerToken Caller ability token.
1531  * @param flag form flag.
1532  * @param isOnlyEnableUpdate form enable update form flag.
1533  * @param refreshForms Refresh forms
1534  * @return Returns ERR_OK on success, others on failure.
1535  */
UpdateHostFormFlag(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool flag,bool isOnlyEnableUpdate,std::vector<int64_t> & refreshForms)1536 ErrCode FormDataMgr::UpdateHostFormFlag(const std::vector<int64_t> &formIds, const sptr<IRemoteObject> &callerToken,
1537                                         bool flag, bool isOnlyEnableUpdate, std::vector<int64_t> &refreshForms)
1538 {
1539     HILOG_DEBUG("start,flag:%{public}d", flag);
1540     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1541     std::vector<FormHostRecord>::iterator itHostRecord;
1542     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1543         if (callerToken == itHostRecord->GetFormHostClient()) {
1544             HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, *itHostRecord, refreshForms);
1545             HILOG_DEBUG("end");
1546             return ERR_OK;
1547         }
1548     }
1549     HILOG_ERROR("can't find target client");
1550     return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1551 }
1552 /**
1553  * @brief Find matched form id.
1554  * @param formId The form id.
1555  * @return Matched form id.
1556  */
FindMatchedFormId(const int64_t formId)1557 int64_t FormDataMgr::FindMatchedFormId(const int64_t formId)
1558 {
1559     uint64_t unsignedFormId = static_cast<uint64_t>(formId);
1560     if ((unsignedFormId & 0xffffffff00000000L) != 0) {
1561         return formId;
1562     }
1563     std::lock_guard<std::mutex> lock(formRecordMutex_);
1564     std::map<int64_t, FormRecord>::iterator itFormRecord;
1565     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1566         uint64_t unsignedFormId = static_cast<uint64_t>(formId);
1567         uint64_t unsignedItFormRecordFirst = static_cast<uint64_t>(itFormRecord->first);
1568         if ((unsignedItFormRecordFirst & 0x00000000ffffffffL) == (unsignedFormId & 0x00000000ffffffffL)) {
1569             return itFormRecord->first;
1570         }
1571     }
1572     return formId;
1573 }
1574 
1575 /**
1576  * @brief Clear host data by uId.
1577  * @param uId The caller uId.
1578  */
ClearHostDataByUId(const int uId)1579 void FormDataMgr::ClearHostDataByUId(const int uId)
1580 {
1581     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1582     std::vector<FormHostRecord>::iterator itHostRecord;
1583     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
1584         if (itHostRecord->GetCallerUid() == uId) {
1585             itHostRecord->CleanResource();
1586             itHostRecord = clientRecords_.erase(itHostRecord);
1587         } else {
1588             itHostRecord++;
1589         }
1590     }
1591 }
1592 /**
1593  * @brief Get no host temp forms.
1594  * @param uid The caller uid.
1595  * @param noHostTempFormsMap no host temp forms.
1596  * @param foundFormsMap Form Id list.
1597  */
GetNoHostTempForms(const int uid,std::map<FormIdKey,std::set<int64_t>> & noHostTempFormsMap,std::map<int64_t,bool> & foundFormsMap)1598 void FormDataMgr::GetNoHostTempForms(
1599     const int uid, std::map<FormIdKey,
1600     std::set<int64_t>> &noHostTempFormsMap,
1601     std::map<int64_t, bool> &foundFormsMap)
1602 {
1603     std::lock_guard<std::mutex> lock(formRecordMutex_);
1604     std::map<int64_t, FormRecord>::iterator itFormRecord;
1605     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1606         if (!itFormRecord->second.formTempFlag) {
1607             continue; // Not temp form, skip
1608         }
1609 
1610         auto itUid = std::find(itFormRecord->second.formUserUids.begin(),
1611             itFormRecord->second.formUserUids.end(), uid);
1612         if (itUid == itFormRecord->second.formUserUids.end()) {
1613             foundFormsMap.emplace(itFormRecord->second.formId, false);
1614             continue;
1615         }
1616 
1617         itFormRecord->second.formUserUids.erase(itUid);
1618         if (!itFormRecord->second.formUserUids.empty()) {
1619             continue;
1620         }
1621 
1622         FormIdKey formIdKey(itFormRecord->second.bundleName, itFormRecord->second.abilityName);
1623         auto itIdsSet = noHostTempFormsMap.find(formIdKey);
1624         if (itIdsSet == noHostTempFormsMap.end()) {
1625             std::set<int64_t> formIdsSet;
1626             formIdsSet.emplace(itFormRecord->second.formId);
1627             noHostTempFormsMap.emplace(formIdKey, formIdsSet);
1628         } else {
1629             itIdsSet->second.emplace(itFormRecord->second.formId);
1630         }
1631     }
1632 }
1633 /**
1634  * @brief Parse update config.
1635  * @param record The form record.
1636  * @param info The form item info.
1637  */
ParseUpdateConfig(FormRecord & record,const FormItemInfo & info) const1638 void FormDataMgr::ParseUpdateConfig(FormRecord &record, const FormItemInfo &info) const
1639 {
1640     int configDuration = info.GetUpdateDuration();
1641     if (configDuration > 0) {
1642         ParseIntervalConfig(record, configDuration);
1643     } else {
1644         record.isEnableUpdate = false;
1645         ParseAtTimerConfig(record, info);
1646         ParseMultiUpdateTimeConfig(record, info);
1647     }
1648 }
1649 
1650 /**
1651  * @brief Parse update interval config.
1652  * @param record The form record.
1653  * @param configDuration interval duration.
1654  */
ParseIntervalConfig(FormRecord & record,const int configDuration) const1655 void FormDataMgr::ParseIntervalConfig(FormRecord &record, const int configDuration) const
1656 {
1657     HILOG_INFO("configDuration:%{public}d formId: %{public}" PRId64, configDuration, record.formId);
1658     if (configDuration <= Constants::MIN_CONFIG_DURATION) {
1659         record.updateDuration = Constants::MIN_PERIOD;
1660     } else if (configDuration >= Constants::MAX_CONFIG_DURATION) {
1661         record.updateDuration = Constants::MAX_PERIOD;
1662     } else {
1663         record.updateDuration = configDuration * Constants::TIME_CONVERSION;
1664     }
1665     HILOG_INFO("end");
1666 }
1667 
ParseMultiUpdateTimeConfig(FormRecord & record,const FormItemInfo & info) const1668 void FormDataMgr::ParseMultiUpdateTimeConfig(FormRecord &record, const FormItemInfo &info) const
1669 {
1670     std::string configAtMultiTime = info.GetMultiScheduledUpdateTime();
1671     HILOG_INFO("ParseMultiUpdateTimeConfig updateAt:%{public}s", configAtMultiTime.c_str());
1672     if (configAtMultiTime.empty()) {
1673         return;
1674     }
1675     std::vector<std::string> timeList = FormUtil::StringSplit(configAtMultiTime, Constants::TIMES_DELIMETER);
1676     if (timeList.size() > Constants::UPDATE_AT_CONFIG_MAX_COUNT) {
1677         HILOG_ERROR("invalid config, size: %{public}zu", timeList.size());
1678         return;
1679     }
1680     std::vector<std::vector<int>> updateAtTimes;
1681     for (const auto &time : timeList) {
1682         std::vector<std::string> temp = FormUtil::StringSplit(time, Constants::TIME_DELIMETER);
1683         if (temp.size() != Constants::UPDATE_AT_CONFIG_COUNT) {
1684             HILOG_ERROR("invalid config");
1685             continue;
1686         }
1687         int hour = FormUtil::ConvertStringToInt(temp[0]);
1688         int min = FormUtil::ConvertStringToInt(temp[1]);
1689         if (hour < Constants::MIN_TIME || hour > Constants::MAX_HOUR || min < Constants::MIN_TIME || min >
1690             Constants::MAX_MINUTE) {
1691             HILOG_ERROR("invalid time, hour:%{public}d, min:%{public}d", hour, min);
1692             continue;
1693         }
1694         std::vector<int> newElement = {hour, min};
1695         updateAtTimes.push_back(newElement);
1696     }
1697 
1698     HILOG_INFO("parseAsUpdateAt updateAtTimes size:%{public}zu", updateAtTimes.size());
1699     if (updateAtTimes.size() > 0) {
1700         record.updateAtTimes = updateAtTimes;
1701         record.isEnableUpdate = true;
1702     }
1703 }
1704 
1705 /**
1706  * @brief Parse at time config.
1707  * @param record The form record.
1708  * @param info form item info.
1709  */
ParseAtTimerConfig(FormRecord & record,const FormItemInfo & info) const1710 void FormDataMgr::ParseAtTimerConfig(FormRecord &record, const FormItemInfo &info) const
1711 {
1712     record.updateDuration = 0;
1713     std::string configAtTime = info.GetScheduledUpdateTime();
1714     HILOG_INFO("parseAsUpdateAt updateAt:%{public}s", configAtTime.c_str());
1715     if (configAtTime.empty()) {
1716         return;
1717     }
1718 
1719     std::vector<std::string> temp = FormUtil::StringSplit(configAtTime, Constants::TIME_DELIMETER);
1720     if (temp.size() != Constants::UPDATE_AT_CONFIG_COUNT) {
1721         HILOG_ERROR("invalid config");
1722         return;
1723     }
1724     int hour = -1;
1725     int min = -1;
1726     hour = FormUtil::ConvertStringToInt(temp[0]);
1727     min = FormUtil::ConvertStringToInt(temp[1]);
1728     if (hour < Constants::MIN_TIME || hour > Constants::MAX_HOUR || min < Constants::MIN_TIME || min >
1729         Constants::MAX_MINUTE) {
1730         HILOG_ERROR("invalid time");
1731         return;
1732     }
1733     record.updateAtHour = hour;
1734     record.updateAtMin = min;
1735     record.isEnableUpdate = true;
1736 }
1737 /**
1738  * @brief check if form cached.
1739  * @param record The form record.
1740  * @return Returns ERR_OK on cached, others on not cached.
1741  */
IsFormCached(const FormRecord record)1742 bool FormDataMgr::IsFormCached(const FormRecord record)
1743 {
1744     if (record.versionUpgrade) {
1745         return false;
1746     }
1747     return FormCacheMgr::GetInstance().NeedAcquireProviderData(record.formId);
1748 }
1749 
1750 /**
1751  * @brief Create form state host record.
1752  * @param provider The provider of the form state
1753  * @param info The form item info.
1754  * @param callerToken The UID of the proxy.
1755  * @param callingUid The UID of the proxy.
1756  * @return Returns true if this function is successfully called; returns false otherwise.
1757  */
CreateFormStateRecord(std::string & provider,const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,int callingUid)1758 bool FormDataMgr::CreateFormStateRecord(std::string &provider, const FormItemInfo &info,
1759                                         const sptr<IRemoteObject> &callerToken, int callingUid)
1760 {
1761     std::lock_guard<std::mutex> lock(formStateRecordMutex_);
1762     auto iter = formStateRecord_.find(provider);
1763     if (iter != formStateRecord_.end()) {
1764         if (iter->second.GetFormHostClient() != callerToken) {
1765             iter->second.SetFormHostClient(callerToken);
1766         }
1767         return true;
1768     }
1769 
1770     FormHostRecord hostRecord;
1771     bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
1772     if (isCreated) {
1773         formStateRecord_.emplace(provider, hostRecord);
1774         return true;
1775     }
1776 
1777     return false;
1778 }
1779 
CreateFormAcquireDataRecord(int64_t requestCode,const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,int callingUid)1780 bool FormDataMgr::CreateFormAcquireDataRecord(int64_t requestCode, const FormItemInfo &info,
1781                                               const sptr<IRemoteObject> &callerToken, int callingUid)
1782 {
1783     std::lock_guard<std::mutex> lock(formAcquireDataRecordMutex_);
1784     auto iter = formAcquireDataRecord_.find(requestCode);
1785     if (iter != formAcquireDataRecord_.end()) {
1786         if (iter->second.GetFormHostClient() != callerToken) {
1787             iter->second.SetFormHostClient(callerToken);
1788         }
1789         return true;
1790     }
1791 
1792     FormHostRecord hostRecord;
1793     bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
1794     if (isCreated) {
1795         formAcquireDataRecord_.emplace(requestCode, hostRecord);
1796         return true;
1797     }
1798 
1799     return false;
1800 }
1801 
AcquireFormDataBack(const AAFwk::WantParams & wantParams,int64_t requestCode)1802 ErrCode FormDataMgr::AcquireFormDataBack(const AAFwk::WantParams &wantParams, int64_t requestCode)
1803 {
1804     std::lock_guard<std::mutex> lock(formAcquireDataRecordMutex_);
1805     auto iter = formAcquireDataRecord_.find(requestCode);
1806     if (iter == formAcquireDataRecord_.end()) {
1807         HILOG_ERROR("filed to get form state host record");
1808         return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1809     }
1810     iter->second.OnAcquireFormData(wantParams, requestCode);
1811     iter->second.CleanResource();
1812     formAcquireDataRecord_.erase(iter);
1813     return ERR_OK;
1814 }
1815 
1816 /**
1817  * @brief acquire form state callback.
1818  * @param state form state.
1819  * @param provider provider info.
1820  * @param want The want of onAcquireFormState.
1821  * @return Returns true if this function is successfully called; returns false otherwise.
1822  */
AcquireFormStateBack(AppExecFwk::FormState state,const std::string & provider,const Want & want)1823 ErrCode FormDataMgr::AcquireFormStateBack(AppExecFwk::FormState state, const std::string &provider,
1824                                           const Want &want)
1825 {
1826     std::lock_guard<std::mutex> lock(formStateRecordMutex_);
1827     auto iter = formStateRecord_.find(provider);
1828     if (iter == formStateRecord_.end()) {
1829         HILOG_ERROR("filed to get form state host record");
1830         return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1831     }
1832     iter->second.OnAcquireState(state, want);
1833     iter->second.CleanResource();
1834     formStateRecord_.erase(iter);
1835     return ERR_OK;
1836 }
1837 
1838 /**
1839  * @brief Notify the form is visible or not.
1840  * @param formIds Indicates the ID of the forms.
1841  * @param isVisible Visible or not.
1842  * @param callerToken Host client.
1843  * @return Returns ERR_OK on success, others on failure.
1844  */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)1845 ErrCode FormDataMgr::NotifyFormsVisible(const std::vector<int64_t> &formIds, bool isVisible,
1846                                         const sptr<IRemoteObject> &callerToken)
1847 {
1848     if (formIds.empty() || callerToken == nullptr) {
1849         HILOG_ERROR("formIds empty");
1850         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1851     }
1852 
1853     std::vector<int64_t> foundFormIds {};
1854     {
1855         HILOG_INFO("get the matched form host record by client stub");
1856         std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1857         for (const FormHostRecord &record : clientRecords_) {
1858             if (callerToken != record.GetFormHostClient()) {
1859                 continue;
1860             }
1861             for (const int64_t formId : formIds) {
1862                 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
1863                 if (CheckInvalidForm(formId) != ERR_OK) {
1864                     continue;
1865                 }
1866                 if (!record.Contains(matchedFormId)) {
1867                     HILOG_ERROR("form not self-owned,form:%{public}" PRId64 ".",
1868                         matchedFormId);
1869                 } else {
1870                     foundFormIds.push_back(matchedFormId);
1871                 }
1872             }
1873             break;
1874         }
1875     }
1876 
1877     if (foundFormIds.empty()) {
1878         HILOG_ERROR("no valid forms found");
1879         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1880     }
1881 
1882     for (auto matchedFormId : foundFormIds) {
1883         SetRecordVisible(matchedFormId, isVisible);
1884     }
1885     return ERR_OK;
1886 }
1887 
1888 /**
1889  * @brief set form record visible.
1890  * @param matchedFormId form id.
1891  * @param isVisible is visible.
1892  * @return Returns true if this function is successfully called; returns false otherwise.
1893  */
SetRecordVisible(int64_t matchedFormId,bool isVisible)1894 ErrCode FormDataMgr::SetRecordVisible(int64_t matchedFormId, bool isVisible)
1895 {
1896     HILOG_INFO("set form record visible");
1897     std::lock_guard<std::mutex> lock(formRecordMutex_);
1898     auto info = formRecords_.find(matchedFormId);
1899     if (info == formRecords_.end()) {
1900         HILOG_ERROR("form info not find");
1901         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
1902     }
1903     info->second.isVisible = isVisible;
1904     HILOG_DEBUG("set isVisible to %{public}d, formId:%{public}" PRId64 " ", isVisible, matchedFormId);
1905     return ERR_OK;
1906 }
1907 
1908 /**
1909  * @brief delete forms by userId.
1910  *
1911  * @param userId user ID.
1912  * @param removedFormIds removed userId.
1913  */
DeleteFormsByUserId(const int32_t userId,std::vector<int64_t> & removedFormIds)1914 void FormDataMgr::DeleteFormsByUserId(const int32_t userId, std::vector<int64_t> &removedFormIds)
1915 {
1916     HILOG_WARN("delete forms, userId: %{public}d", userId);
1917     // handle formRecords_
1918     std::vector<int64_t> removedTempForms;
1919     {
1920         std::lock_guard<std::mutex> lock(formRecordMutex_);
1921         auto itFormRecord = formRecords_.begin();
1922         while (itFormRecord != formRecords_.end()) {
1923             if (userId == itFormRecord->second.providerUserId) {
1924                 if (itFormRecord->second.formTempFlag) {
1925                     removedTempForms.emplace_back(itFormRecord->second.formId);
1926                 }
1927                 removedFormIds.emplace_back(itFormRecord->second.formId);
1928                 itFormRecord = formRecords_.erase(itFormRecord);
1929                 FormBasicInfoMgr::GetInstance().DeleteFormBasicInfo(itFormRecord->second.formId);
1930             } else {
1931                 ++itFormRecord;
1932             }
1933         }
1934     }
1935 
1936     // handle tempForms_
1937     if (removedTempForms.size() > 0) {
1938         std::lock_guard<std::mutex> lock(formTempMutex_);
1939         std::vector<int64_t>::iterator itTemp;
1940         for (itTemp = tempForms_.begin();itTemp != tempForms_.end();) {
1941             if (std::find(removedTempForms.begin(), removedTempForms.end(), *itTemp) != removedTempForms.end()) {
1942                 itTemp = tempForms_.erase(itTemp);
1943             } else {
1944                 itTemp++;
1945             }
1946         }
1947     }
1948 }
1949 /**
1950  * @brief Clear form records for st limit value test.
1951  */
ClearFormRecords()1952 void FormDataMgr::ClearFormRecords()
1953 {
1954     {
1955         std::lock_guard<std::mutex> lock(formRecordMutex_);
1956         formRecords_.clear();
1957     }
1958     {
1959         std::lock_guard<std::mutex> lock(formTempMutex_);
1960         tempForms_.clear();
1961     }
1962 }
1963 
1964 /**
1965  * @brief handle get no host invalid temp forms.
1966  * @param userId User ID.
1967  * @param callingUid The UID of the proxy.
1968  * @param matchedFormIds The set of the valid forms.
1969  * @param noHostTempFormsMap The map of the no host forms.
1970  * @param foundFormsMap The map of the found forms.
1971  */
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)1972 void FormDataMgr::GetNoHostInvalidTempForms(int32_t userId, int32_t callingUid, std::set<int64_t> &matchedFormIds,
1973                                             std::map<FormIdKey, std::set<int64_t>> &noHostTempFormsMap,
1974                                             std::map<int64_t, bool> &foundFormsMap)
1975 {
1976     std::lock_guard<std::mutex> lock(formRecordMutex_);
1977     for (auto &formRecordInfo : formRecords_) {
1978         int64_t formId = formRecordInfo.first;
1979         FormRecord &formRecord = formRecordInfo.second;
1980 
1981         // Checks the user id and the temp flag.
1982         if (!formRecord.formTempFlag || (userId != formRecord.providerUserId)) {
1983             continue;
1984         }
1985         // check UID
1986         auto iter = std::find(formRecord.formUserUids.begin(), formRecord.formUserUids.end(), callingUid);
1987         if (iter == formRecord.formUserUids.end()) {
1988             continue;
1989         }
1990         // check valid form set
1991         if (matchedFormIds.find(formId) != matchedFormIds.end()) {
1992             continue;
1993         }
1994 
1995         HILOG_DEBUG("found invalid form:%{public}" PRId64 "", formId);
1996         formRecord.formUserUids.erase(iter);
1997         if (formRecord.formUserUids.empty()) {
1998             FormIdKey formIdKey(formRecord.bundleName, formRecord.abilityName);
1999             auto itIdsSet = noHostTempFormsMap.find(formIdKey);
2000             if (itIdsSet == noHostTempFormsMap.end()) {
2001                 std::set<int64_t> formIdsSet;
2002                 formIdsSet.emplace(formId);
2003                 noHostTempFormsMap.emplace(formIdKey, formIdsSet);
2004             } else {
2005                 itIdsSet->second.emplace(formId);
2006             }
2007         } else {
2008             foundFormsMap.emplace(formId, false);
2009         }
2010     }
2011 }
2012 
2013 /**
2014  * @brief handle delete no host temp forms.
2015  * @param callingUid The UID of the proxy.
2016  * @param noHostTempFormsMap The map of the no host forms.
2017  * @param foundFormsMap The map of the found forms.
2018  */
BatchDeleteNoHostTempForms(int32_t callingUid,std::map<FormIdKey,std::set<int64_t>> & noHostTempFormsMap,std::map<int64_t,bool> & foundFormsMap)2019 void FormDataMgr::BatchDeleteNoHostTempForms(int32_t callingUid, std::map<FormIdKey,
2020                                              std::set<int64_t>> &noHostTempFormsMap,
2021                                              std::map<int64_t, bool> &foundFormsMap)
2022 {
2023     std::set<FormIdKey> removableModuleSet;
2024     for (auto &noHostTempForm : noHostTempFormsMap) {
2025         FormIdKey formIdKey = noHostTempForm.first;
2026         std::set<int64_t> &formIdsSet = noHostTempForm.second;
2027         std::string bundleName = formIdKey.bundleName;
2028         std::string abilityName = formIdKey.abilityName;
2029         FormProviderMgr::GetInstance().NotifyProviderFormsBatchDelete(bundleName, abilityName, formIdsSet);
2030         for (int64_t formId: formIdsSet) {
2031             foundFormsMap.emplace(formId, true);
2032             StopRenderingForm(formId);
2033             DeleteFormRecord(formId);
2034             DeleteTempForm(formId);
2035         }
2036     }
2037 }
2038 
2039 /**
2040  * @brief StopRenderingForm.
2041  * @param formId The form id.
2042  */
StopRenderingForm(int32_t formId)2043 void FormDataMgr::StopRenderingForm(int32_t formId)
2044 {
2045     FormRecord formrecord;
2046     GetFormRecord(formId, formrecord);
2047     FormRenderMgr::GetInstance().StopRenderingForm(formId, formrecord);
2048 }
2049 
2050 /**
2051  * @brief delete invalid temp forms.
2052  * @param userId User ID.
2053  * @param callingUid The UID of the proxy.
2054  * @param matchedFormIds The set of the valid forms.
2055  * @param removedFormsMap The map of the removed invalid forms.
2056  * @return Returns ERR_OK on success, others on failure.
2057  */
DeleteInvalidTempForms(int32_t userId,int32_t callingUid,std::set<int64_t> & matchedFormIds,std::map<int64_t,bool> & removedFormsMap)2058 int32_t FormDataMgr::DeleteInvalidTempForms(int32_t userId, int32_t callingUid, std::set<int64_t> &matchedFormIds,
2059                                             std::map<int64_t, bool> &removedFormsMap)
2060 {
2061     HILOG_INFO("userId:%{public}d, callingUid:%{public}d", userId, callingUid);
2062     std::map<int64_t, bool> foundFormsMap {};
2063     std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap {};
2064     GetNoHostInvalidTempForms(userId, callingUid, matchedFormIds, noHostTempFormsMap, foundFormsMap);
2065     BatchDeleteNoHostTempForms(callingUid, noHostTempFormsMap, foundFormsMap);
2066     HILOG_DEBUG("foundFormsMap size:%{public}zu", foundFormsMap.size());
2067     HILOG_DEBUG("noHostTempFormsMap size:%{public}zu", noHostTempFormsMap.size());
2068 
2069     if (!foundFormsMap.empty()) {
2070         removedFormsMap.insert(foundFormsMap.begin(), foundFormsMap.end());
2071     }
2072     HILOG_INFO("done");
2073     return ERR_OK;
2074 }
2075 
2076 /**
2077  * @brief delete publish forms temp data
2078  * @param userId User ID.
2079  * @param bundleName BundleName.
2080  * @param validFormIds The set of the valid forms.
2081  */
DeleteInvalidPublishForms(int32_t userId,std::string bundleName,std::set<int64_t> & validFormIds)2082 void FormDataMgr::DeleteInvalidPublishForms(int32_t userId, std::string bundleName, std::set<int64_t> &validFormIds)
2083 {
2084     HILOG_INFO("userId:%{public}d, bundleName:%{public}s", userId, bundleName.c_str());
2085 
2086     int32_t deleteNum = 0;
2087     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
2088     for (auto iter = formRequestPublishForms_.begin(); iter != formRequestPublishForms_.end();) {
2089         int64_t formId = iter->first;
2090         // check valid form set
2091         if (validFormIds.find(formId) != validFormIds.end()) {
2092             ++iter;
2093             continue;
2094         }
2095 
2096         Want want = iter->second.first;
2097         if (bundleName != want.GetStringParam(Constants::PARAM_BUNDLE_NAME_KEY)) {
2098             ++iter;
2099             continue;
2100         }
2101         if (userId != want.GetIntParam(Constants::PARAM_FORM_USER_ID, -1)) {
2102             ++iter;
2103             continue;
2104         }
2105         ++deleteNum;
2106         iter = formRequestPublishForms_.erase(iter);
2107     }
2108 
2109     HILOG_INFO("delete num:%{public}d", deleteNum);
2110 }
2111 
2112 /**
2113  * @brief clear host data by invalid forms.
2114  * @param callingUid The UID of the proxy.
2115  * @param removedFormsMap The map of the removed invalid forms.
2116  * @return Returns ERR_OK on success, others on failure.
2117  */
ClearHostDataByInvalidForms(int32_t callingUid,std::map<int64_t,bool> & removedFormsMap)2118 int32_t FormDataMgr::ClearHostDataByInvalidForms(int32_t callingUid, std::map<int64_t, bool> &removedFormsMap)
2119 {
2120     HILOG_INFO("start");
2121     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
2122     std::vector<FormHostRecord>::iterator itHostRecord;
2123     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
2124         if (itHostRecord->GetCallerUid() != callingUid) {
2125             itHostRecord++;
2126             continue;
2127         }
2128         for (auto &removedForm : removedFormsMap) {
2129             if (itHostRecord->Contains(removedForm.first)) {
2130                 itHostRecord->DelForm(removedForm.first);
2131             }
2132         }
2133         if (itHostRecord->IsEmpty()) {
2134             itHostRecord->CleanResource();
2135             itHostRecord = clientRecords_.erase(itHostRecord);
2136         } else {
2137             itHostRecord++;
2138         }
2139     }
2140     HILOG_INFO("done");
2141     return ERR_OK;
2142 }
2143 
AddRequestPublishFormInfo(int64_t formId,const Want & want,std::unique_ptr<FormProviderData> & formProviderData)2144 ErrCode FormDataMgr::AddRequestPublishFormInfo(int64_t formId, const Want &want,
2145                                                std::unique_ptr<FormProviderData> &formProviderData)
2146 {
2147     HILOG_INFO("formId:%{public}" PRId64, formId);
2148     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
2149 
2150     auto insertResult = formRequestPublishForms_.insert(
2151         std::make_pair(formId, std::make_pair(want, std::move(formProviderData))));
2152     if (!insertResult.second) {
2153         HILOG_ERROR("fail emplace requestPublishFormInfo");
2154         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2155     }
2156     return ERR_OK;
2157 }
2158 
RemoveRequestPublishFormInfo(int64_t formId)2159 ErrCode FormDataMgr::RemoveRequestPublishFormInfo(int64_t formId)
2160 {
2161     HILOG_INFO("formId:%{public}" PRId64, formId);
2162     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
2163     formRequestPublishForms_.erase(formId);
2164     return ERR_OK;
2165 }
2166 
IsRequestPublishForm(int64_t formId)2167 bool FormDataMgr::IsRequestPublishForm(int64_t formId)
2168 {
2169     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
2170     return formRequestPublishForms_.find(formId) != formRequestPublishForms_.end();
2171 }
2172 
GetRequestPublishFormInfo(int64_t formId,Want & want,std::unique_ptr<FormProviderData> & formProviderData)2173 ErrCode FormDataMgr::GetRequestPublishFormInfo(int64_t formId, Want &want,
2174                                                std::unique_ptr<FormProviderData> &formProviderData)
2175 {
2176     HILOG_INFO("formId:%{public}" PRId64, formId);
2177     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
2178     auto result = formRequestPublishForms_.find(formId);
2179     if (result == formRequestPublishForms_.end()) {
2180         HILOG_INFO("invalid formId:%{public}" PRId64, formId);
2181         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2182     }
2183 
2184     want = result->second.first;
2185     formProviderData = std::move(result->second.second);
2186     formRequestPublishForms_.erase(result);
2187     return ERR_OK;
2188 }
2189 
GetPackageForm(const FormRecord & record,const BundlePackInfo & bundlePackInfo,AbilityFormInfo & abilityFormInfo)2190 bool FormDataMgr::GetPackageForm(const FormRecord &record, const BundlePackInfo &bundlePackInfo,
2191     AbilityFormInfo &abilityFormInfo)
2192 {
2193     HILOG_INFO("moduleName is %{public}s", record.moduleName.c_str());
2194     std::vector<PackageModule> modules = bundlePackInfo.summary.modules;
2195     for (const auto &cfg : modules) {
2196         HILOG_INFO("try module %{public}s", cfg.distro.moduleName.c_str());
2197         if (record.moduleName != cfg.distro.moduleName) {
2198             continue;
2199         }
2200         HILOG_INFO("has the same module");
2201         std::vector<ModuleAbilityInfo> abilities = cfg.abilities;
2202         std::vector<ExtensionAbilities> extensionAbilities = cfg.extensionAbilities;
2203         if (!abilities.empty()) {
2204             return GetAbilityFormInfo(record, abilities, abilityFormInfo);
2205         }
2206         if (!extensionAbilities.empty()) {
2207             return GetAbilityFormInfo(record, extensionAbilities, abilityFormInfo);
2208         }
2209         HILOG_WARN("no ability in module:%{public}s", record.moduleName.c_str());
2210         return false;
2211     }
2212     return false;
2213 }
2214 
2215 template<typename T>
GetAbilityFormInfo(const FormRecord & record,const std::vector<T> & abilities,AbilityFormInfo & abilityFormInfo)2216 bool FormDataMgr::GetAbilityFormInfo(const FormRecord &record, const std::vector<T> &abilities,
2217     AbilityFormInfo &abilityFormInfo)
2218 {
2219     for (const T &abilityInfo : abilities) {
2220         if (abilityInfo.name != record.abilityName) {
2221             continue;
2222         }
2223         std::vector<AbilityFormInfo> forms = abilityInfo.forms;
2224         for (auto &item : forms) {
2225             if (IsSameForm(record, item)) {
2226                 abilityFormInfo = item;
2227                 HILOG_INFO("find matched abilityFormInfo");
2228                 return true;
2229             }
2230         }
2231     }
2232     HILOG_INFO("no matched abilityFormInfo, module:%{public}s", record.moduleName.c_str());
2233     return false;
2234 }
2235 
IsSameForm(const FormRecord & record,const AbilityFormInfo & abilityFormInfo)2236 bool FormDataMgr::IsSameForm(const FormRecord &record, const AbilityFormInfo &abilityFormInfo)
2237 {
2238     auto dimensionIter = Constants::DIMENSION_MAP.find(static_cast<Constants::Dimension>(record.specification));
2239     if (dimensionIter == Constants::DIMENSION_MAP.end()) {
2240         HILOG_ERROR("valid specification:%{public}d", record.specification);
2241         return false;
2242     }
2243     auto dimension = dimensionIter->second;
2244     auto supportDimensions = abilityFormInfo.supportDimensions;
2245     if (record.formName == abilityFormInfo.name &&
2246         std::find(supportDimensions.begin(), supportDimensions.end(), dimension) != supportDimensions.end()) {
2247         return true;
2248     }
2249 
2250     HILOG_INFO("no same form, record:%{public}s, dimension:%{public}s, abilityFormInfo:%{public}s",
2251         record.formName.c_str(), dimension.c_str(), abilityFormInfo.name.c_str());
2252 
2253     return false;
2254 }
2255 
SetRecordNeedFreeInstall(int64_t formId,bool isNeedFreeInstall)2256 bool FormDataMgr::SetRecordNeedFreeInstall(int64_t formId, bool isNeedFreeInstall)
2257 {
2258     HILOG_INFO("call");
2259     std::lock_guard<std::mutex> lock(formRecordMutex_);
2260     auto item = formRecords_.find(formId);
2261     if (item == formRecords_.end()) {
2262         HILOG_ERROR("invalid formRecord");
2263         return false;
2264     }
2265     item->second.needFreeInstall = isNeedFreeInstall;
2266     HILOG_INFO("successfully");
2267     return true;
2268 }
2269 
CheckInvalidForm(const int64_t formId)2270 ErrCode FormDataMgr::CheckInvalidForm(const int64_t formId)
2271 {
2272     // Checks if the formid is valid.
2273     if (formId <= 0) {
2274         HILOG_ERROR("Invalid form id");
2275         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2276     }
2277 
2278     // Gets the corresponding userId by formId.
2279     FormRecord formRecord;
2280     int64_t matchedFormId = FindMatchedFormId(formId);
2281     if (!GetFormRecord(matchedFormId, formRecord)) {
2282         HILOG_ERROR("No matching formRecord was found for the form id");
2283         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2284     }
2285 
2286     // Checks for cross-user operations.
2287     if (formRecord.providerUserId != FormUtil::GetCurrentAccountId()) {
2288         HILOG_ERROR("The form id corresponds to a card that is not for the currently active user");
2289         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
2290     }
2291     return ERR_OK;
2292 }
2293 
FillBasicRunningFormInfoByFormRecord(const FormRecord & formRecord,RunningFormInfo & runningFormInfo) const2294 void FormDataMgr::FillBasicRunningFormInfoByFormRecord(const FormRecord &formRecord,
2295                                                        RunningFormInfo &runningFormInfo) const
2296 {
2297     runningFormInfo.formName = formRecord.formName;
2298     runningFormInfo.dimension = formRecord.specification;
2299     runningFormInfo.bundleName = formRecord.bundleName;
2300     runningFormInfo.moduleName = formRecord.moduleName;
2301     runningFormInfo.abilityName = formRecord.abilityName;
2302     runningFormInfo.description = formRecord.description;
2303     runningFormInfo.formLocation = formRecord.formLocation;
2304     runningFormInfo.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2305     runningFormInfo.recycleStatus = formRecord.recycleStatus;
2306     runningFormInfo.formBundleType = formRecord.formBundleType;
2307     runningFormInfo.userId = formRecord.userId;
2308 }
2309 
GetRunningFormInfosByFormId(const int64_t formId,RunningFormInfo & runningFormInfo)2310 ErrCode FormDataMgr::GetRunningFormInfosByFormId(const int64_t formId, RunningFormInfo &runningFormInfo)
2311 {
2312     HILOG_DEBUG("start");
2313 
2314     // Checks if the formid is valid.
2315     if (formId <= 0) {
2316         HILOG_ERROR("Invalid form id");
2317         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2318     }
2319 
2320     FormRecord formRecord;
2321     int64_t matchedFormId = FindMatchedFormId(formId);
2322     if (!GetFormRecord(matchedFormId, formRecord)) {
2323         HILOG_ERROR("No matching formRecord was found for the form id");
2324         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2325     }
2326 
2327     if (formRecord.providerUserId != FormUtil::GetCurrentAccountId()) {
2328         HILOG_ERROR("The form id corresponds to a card that is not for the currently active user");
2329         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
2330     }
2331 
2332     std::vector<FormHostRecord> formHostRecords;
2333     GetFormHostRecord(matchedFormId, formHostRecords);
2334     if (formHostRecords.empty()) {
2335         HILOG_ERROR("empty clientHost");
2336         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2337     }
2338     runningFormInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
2339     runningFormInfo.formId = matchedFormId;
2340     FillBasicRunningFormInfoByFormRecord(formRecord, runningFormInfo);
2341     runningFormInfo.formUsageState = FormUsageState::USED;
2342 
2343     return ERR_OK;
2344 }
2345 
HandleFormAddObserver(const std::string hostBundleName,const int64_t formId)2346 ErrCode FormDataMgr::HandleFormAddObserver(const std::string hostBundleName, const int64_t formId)
2347 {
2348     HILOG_DEBUG("start");
2349     RunningFormInfo runningFormInfo;
2350     ErrCode ret = GetRunningFormInfosByFormId(formId, runningFormInfo);
2351     if (ret != ERR_OK) {
2352         return ret;
2353     }
2354     // if there is a full observer.
2355     FormObserverRecord::GetInstance().onFormAdd("all", runningFormInfo);
2356     // If there is a listener for the current host.
2357     FormObserverRecord::GetInstance().onFormAdd(hostBundleName, runningFormInfo);
2358     return ERR_OK;
2359 }
2360 
HandleFormRemoveObserver(const std::string hostBundleName,const RunningFormInfo runningFormInfo)2361 ErrCode FormDataMgr::HandleFormRemoveObserver(const std::string hostBundleName, const RunningFormInfo runningFormInfo)
2362 {
2363     HILOG_DEBUG("start");
2364     // if there is a full observer.
2365     FormObserverRecord::GetInstance().onFormRemove("all", runningFormInfo);
2366     // If there is a listener for the current host.
2367     FormObserverRecord::GetInstance().onFormRemove(hostBundleName, runningFormInfo);
2368     return ERR_OK;
2369 }
2370 
GetTempFormsCount(int32_t & formCount)2371 int32_t FormDataMgr::GetTempFormsCount(int32_t &formCount)
2372 {
2373     std::lock_guard<std::mutex> lock(formTempMutex_);
2374     formCount = static_cast<int32_t>(tempForms_.size());
2375     HILOG_DEBUG("current exist %{public}d temp forms in system", formCount);
2376     return ERR_OK;
2377 }
2378 
GetCastFormsCount(int32_t & formCount)2379 int32_t FormDataMgr::GetCastFormsCount(int32_t &formCount)
2380 {
2381     std::lock_guard<std::mutex> lock(formRecordMutex_);
2382     for (const auto &recordPair : formRecords_) {
2383         FormRecord record = recordPair.second;
2384         if (!record.formTempFlag) {
2385             formCount++;
2386         }
2387     }
2388     HILOG_DEBUG("current exist %{public}d cast forms in system", formCount);
2389     return ERR_OK;
2390 }
2391 
GetHostFormsCount(const std::string & bundleName,int32_t & formCount)2392 int32_t FormDataMgr::GetHostFormsCount(const std::string &bundleName, int32_t &formCount)
2393 {
2394     if (bundleName.empty()) {
2395         return ERR_OK;
2396     }
2397     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
2398     for (auto &record : clientRecords_) {
2399         if (record.GetHostBundleName() == bundleName) {
2400             formCount = record.GetFormsCount();
2401             break;
2402         }
2403     }
2404     HILOG_DEBUG("current exist %{public}d cast forms in host", formCount);
2405     return ERR_OK;
2406 }
2407 
GetUnusedFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)2408 void FormDataMgr::GetUnusedFormInstancesByFilter(
2409     const FormInstancesFilter &formInstancesFilter, std::vector<FormInstance> &formInstances)
2410 {
2411     HILOG_DEBUG("call");
2412     std::vector<FormDBInfo> formDBInfos;
2413     FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2414     for (const auto& dbInfo : formDBInfos) {
2415         if (formInstancesFilter.bundleName != dbInfo.bundleName) {
2416             continue;
2417         }
2418         if (!formInstancesFilter.moduleName.empty() && formInstancesFilter.moduleName != dbInfo.moduleName) {
2419             continue;
2420         } else if (!formInstancesFilter.abilityName.empty() && formInstancesFilter.abilityName != dbInfo.abilityName) {
2421             continue;
2422         } else if (!formInstancesFilter.formName.empty() && formInstancesFilter.formName != dbInfo.formName) {
2423             continue;
2424         }
2425         auto item = std::find_if(formInstances.begin(), formInstances.end(),
2426             [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2427         if (item != formInstances.end()) {
2428             continue;
2429         }
2430         FormRecord dbRecord;
2431         ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2432         if (getDbRet != ERR_OK) {
2433             continue;
2434         }
2435         FormInstance instance;
2436         instance.formId = dbInfo.formId;
2437         instance.specification = dbRecord.specification;
2438         instance.formVisiblity = static_cast<FormVisibilityType>(dbRecord.formVisibleNotifyState);
2439         instance.bundleName = dbRecord.bundleName;
2440         instance.moduleName = dbRecord.moduleName;
2441         instance.abilityName = dbRecord.abilityName;
2442         instance.formName = dbRecord.formName;
2443         instance.formUsageState = FormUsageState::UNUSED;
2444         instance.description = dbRecord.description;
2445         if (!dbRecord.formUserUids.empty()) {
2446             auto ret =
2447                 FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), instance.formHostName);
2448             if (ret != ERR_OK) {
2449                 HILOG_ERROR("Get bundleName by uid failed");
2450                 continue;
2451             }
2452             formInstances.emplace_back(instance);
2453         }
2454     }
2455 }
2456 
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)2457 ErrCode FormDataMgr::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
2458     std::vector<FormInstance> &formInstances)
2459 {
2460     HILOG_DEBUG("get form instances by filter");
2461     std::lock_guard<std::mutex> lock(formRecordMutex_);
2462     std::map<int64_t, FormRecord>::iterator itFormRecord;
2463     if (formInstancesFilter.bundleName.empty()) {
2464         HILOG_ERROR("null formInstancesFilter.bundleName");
2465         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2466     }
2467 
2468     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
2469         if (formInstancesFilter.bundleName == itFormRecord->second.bundleName) {
2470             bool Needgetformhostrecordflag = true;
2471             if (!formInstancesFilter.moduleName.empty() &&
2472                 formInstancesFilter.moduleName != itFormRecord->second.moduleName) {
2473                 Needgetformhostrecordflag = false;
2474             } else if (!formInstancesFilter.abilityName.empty() &&
2475                 formInstancesFilter.abilityName != itFormRecord->second.abilityName) {
2476                 Needgetformhostrecordflag = false;
2477             } else if (!formInstancesFilter.formName.empty() &&
2478                 formInstancesFilter.formName != itFormRecord->second.formName) {
2479                 Needgetformhostrecordflag = false;
2480             }
2481             std::vector<FormHostRecord> formHostRecords;
2482             GetFormHostRecord(itFormRecord->second.formId, formHostRecords);
2483             if (Needgetformhostrecordflag) {
2484                 FormInstance instance;
2485                 for (auto formHostRecord : formHostRecords) {
2486                     instance.formHostName = formHostRecord.GetHostBundleName();
2487                     instance.formId = itFormRecord->second.formId;
2488                     instance.specification = itFormRecord->second.specification;
2489                     instance.formVisiblity =
2490                         static_cast<FormVisibilityType>(itFormRecord->second.formVisibleNotifyState);
2491                     instance.bundleName = itFormRecord->second.bundleName;
2492                     instance.moduleName = itFormRecord->second.moduleName;
2493                     instance.abilityName = itFormRecord->second.abilityName;
2494                     instance.formName = itFormRecord->second.formName;
2495                     instance.description = itFormRecord->second.description;
2496                     formInstances.emplace_back(instance);
2497                 }
2498             }
2499         }
2500     }
2501     if (formInstancesFilter.isUnusedIncluded) {
2502         GetUnusedFormInstancesByFilter(formInstancesFilter, formInstances);
2503     }
2504     return (formInstances.size() == 0) ? ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED : ERR_OK;
2505 }
2506 
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)2507 ErrCode FormDataMgr::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
2508 {
2509     HILOG_DEBUG("get form instance by formId");
2510     bool notFindFormRecord  = false;
2511     if (formId <= 0) {
2512         HILOG_ERROR("invalid formId");
2513         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2514     }
2515     FormRecord formRecord;
2516     notFindFormRecord  = GetFormRecordById(formId, formRecord);
2517     if (!notFindFormRecord) {
2518         std::vector<FormHostRecord> formHostRecords;
2519         GetFormHostRecord(formId, formHostRecords);
2520         if (formHostRecords.empty()) {
2521             HILOG_ERROR("empty clientHost");
2522             return ERR_APPEXECFWK_FORM_COMMON_CODE;
2523         }
2524         formInstance.formHostName = formHostRecords.begin()->GetHostBundleName();
2525         formInstance.formId = formRecord.formId;
2526         formInstance.specification = formRecord.specification;
2527         formInstance.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2528         formInstance.bundleName = formRecord.bundleName;
2529         formInstance.moduleName = formRecord.moduleName;
2530         formInstance.abilityName = formRecord.abilityName;
2531         formInstance.formName = formRecord.formName;
2532         formInstance.userId = formRecord.userId;
2533     } else {
2534         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2535     }
2536     HILOG_DEBUG("get form instance successfully");
2537     return ERR_OK;
2538 }
2539 
GetUnusedFormInstanceById(const int64_t formId,FormInstance & formInstance)2540 ErrCode FormDataMgr::GetUnusedFormInstanceById(const int64_t formId, FormInstance &formInstance)
2541 {
2542     HILOG_DEBUG("call");
2543     FormRecord dbRecord;
2544     ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
2545     if (getDbRet != ERR_OK) {
2546         HILOG_ERROR("Get formRecord by formId failed");
2547         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2548     }
2549     if (dbRecord.formUserUids.empty()) {
2550         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2551     }
2552     auto ret =
2553         FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), formInstance.formHostName);
2554     if (ret != ERR_OK) {
2555         HILOG_ERROR("Get bundleName by uid failed");
2556         return ret;
2557     }
2558     formInstance.formId = formId;
2559     formInstance.specification = dbRecord.specification;
2560     formInstance.formVisiblity = static_cast<FormVisibilityType>(dbRecord.formVisibleNotifyState);
2561     formInstance.bundleName = dbRecord.bundleName;
2562     formInstance.moduleName = dbRecord.moduleName;
2563     formInstance.abilityName = dbRecord.abilityName;
2564     formInstance.formName = dbRecord.formName;
2565     formInstance.formUsageState = FormUsageState::UNUSED;
2566     formInstance.description = dbRecord.description;
2567     formInstance.userId = dbRecord.userId;
2568     return ERR_OK;
2569 }
2570 
GetFormInstanceById(const int64_t formId,bool isUnusedIncluded,FormInstance & formInstance)2571 ErrCode FormDataMgr::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
2572 {
2573     HILOG_DEBUG("get form instance by formId");
2574     if (formId <= 0) {
2575         HILOG_ERROR("invalid formId");
2576         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2577     }
2578     FormRecord formRecord;
2579     std::vector<FormHostRecord> formHostRecords;
2580     bool isFormRecordsEnd = GetFormRecordById(formId, formRecord);
2581     if (!isFormRecordsEnd) {
2582         GetFormHostRecord(formId, formHostRecords);
2583     }
2584     ErrCode ret = ERR_OK;
2585     if (!formHostRecords.empty()) {
2586         formInstance.formHostName = formHostRecords.begin()->GetHostBundleName();
2587         formInstance.formId = formRecord.formId;
2588         formInstance.specification = formRecord.specification;
2589         formInstance.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2590         formInstance.bundleName = formRecord.bundleName;
2591         formInstance.moduleName = formRecord.moduleName;
2592         formInstance.abilityName = formRecord.abilityName;
2593         formInstance.formName = formRecord.formName;
2594         formInstance.formUsageState = FormUsageState::USED;
2595         formInstance.description = formRecord.description;
2596         formInstance.userId = formRecord.userId;
2597     } else if (isUnusedIncluded) {
2598         ret = GetUnusedFormInstanceById(formId, formInstance);
2599     } else {
2600         ret = ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2601     }
2602     HILOG_DEBUG("End");
2603     return ret;
2604 }
2605 
GetUnusedFormInfos(std::vector<RunningFormInfo> & runningFormInfos)2606 void FormDataMgr::GetUnusedFormInfos(std::vector<RunningFormInfo> &runningFormInfos)
2607 {
2608     HILOG_DEBUG("call");
2609     std::vector<FormDBInfo> formDBInfos;
2610     FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2611     for (const auto& dbInfo : formDBInfos) {
2612         auto item = std::find_if(runningFormInfos.begin(), runningFormInfos.end(),
2613             [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2614         if (item != runningFormInfos.end()) {
2615             continue;
2616         }
2617         FormRecord dbRecord;
2618         ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2619         if (getDbRet != ERR_OK) {
2620             continue;
2621         }
2622         RunningFormInfo info;
2623         info.formId = dbInfo.formId;
2624         FillBasicRunningFormInfoByFormRecord(dbRecord, info);
2625         info.formUsageState = FormUsageState::UNUSED;
2626         if (!dbRecord.formUserUids.empty()) {
2627             auto ret =
2628                 FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), info.hostBundleName);
2629             if (ret != ERR_OK) {
2630                 HILOG_ERROR("Get bundleName by uid failed");
2631                 continue;
2632             }
2633             runningFormInfos.emplace_back(info);
2634         }
2635     }
2636 }
2637 
GetRunningFormInfos(bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)2638 ErrCode FormDataMgr::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
2639 {
2640     HILOG_DEBUG("start");
2641     std::lock_guard<std::mutex> lock(formRecordMutex_);
2642     for (auto record : formRecords_) {
2643         if ((!record.second.formTempFlag) &&
2644             ((FormUtil::GetCurrentAccountId() == record.second.providerUserId) ||
2645             (record.second.providerUserId == Constants::DEFAULT_USER_ID))) {
2646             RunningFormInfo info;
2647             info.formId = record.first;
2648             FillBasicRunningFormInfoByFormRecord(record.second, info);
2649             info.formUsageState = FormUsageState::USED;
2650             std::vector<FormHostRecord> formHostRecords;
2651             GetFormHostRecord(record.first, formHostRecords);
2652             if (formHostRecords.empty()) {
2653                 HILOG_ERROR("Get form host failed");
2654                 continue;
2655             }
2656             info.hostBundleName = formHostRecords.begin()->GetHostBundleName();
2657             runningFormInfos.emplace_back(info);
2658         }
2659     }
2660     if (isUnusedIncluded) {
2661         GetUnusedFormInfos(runningFormInfos);
2662     }
2663     return ERR_OK;
2664 }
2665 
GetUnusedFormInfos(const std::string & bundleName,std::vector<RunningFormInfo> & runningFormInfos)2666 void FormDataMgr::GetUnusedFormInfos(const std::string &bundleName, std::vector<RunningFormInfo> &runningFormInfos)
2667 {
2668     HILOG_DEBUG("call");
2669     std::vector<FormDBInfo> formDBInfos;
2670     FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2671     for (const auto& dbInfo : formDBInfos) {
2672         auto item = std::find_if(runningFormInfos.begin(), runningFormInfos.end(),
2673             [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2674         if (item != runningFormInfos.end()) {
2675             continue;
2676         }
2677         for (auto uid : dbInfo.formUserUids) {
2678             std::string hostBundleName = "";
2679             auto ret = FormBmsHelper::GetInstance().GetBundleNameByUid(uid, hostBundleName);
2680             if (ret != ERR_OK) {
2681                 HILOG_ERROR("Get bundleName by uid failed");
2682                 continue;
2683             }
2684             if (hostBundleName != bundleName) {
2685                 continue;
2686             }
2687             FormRecord dbRecord;
2688             ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2689             if (getDbRet != ERR_OK) {
2690                 continue;
2691             }
2692             RunningFormInfo info;
2693             info.formId = dbInfo.formId;
2694             info.hostBundleName = bundleName;
2695             FillBasicRunningFormInfoByFormRecord(dbRecord, info);
2696             info.formUsageState = FormUsageState::UNUSED;
2697             runningFormInfos.emplace_back(info);
2698         }
2699     }
2700 }
2701 
GetRunningFormInfosByBundleName(const std::string & bundleName,bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)2702 ErrCode FormDataMgr::GetRunningFormInfosByBundleName(
2703     const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
2704 {
2705     HILOG_DEBUG("start");
2706 
2707     if (bundleName.empty()) {
2708         HILOG_ERROR("empty bundleName");
2709         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2710     }
2711 
2712     std::lock_guard<std::mutex> lock(formRecordMutex_);
2713     for (auto record : formRecords_) {
2714         std::vector<FormHostRecord> formHostRecords;
2715         GetFormHostRecord(record.first, formHostRecords);
2716         if (formHostRecords.empty()) {
2717             HILOG_WARN("Form has released in host, formId = %{public}" PRId64, record.first);
2718             continue;
2719         }
2720         auto hostBundleName = formHostRecords.begin()->GetHostBundleName();
2721         bool flag = (!record.second.formTempFlag) &&
2722             ((FormUtil::GetCurrentAccountId() == record.second.providerUserId) ||
2723             (record.second.providerUserId == Constants::DEFAULT_USER_ID));
2724         if (hostBundleName == bundleName && flag) {
2725             RunningFormInfo info;
2726             info.formId = record.first;
2727             info.hostBundleName = bundleName;
2728             FillBasicRunningFormInfoByFormRecord(record.second, info);
2729             info.formUsageState = FormUsageState::USED;
2730             runningFormInfos.emplace_back(info);
2731         }
2732     }
2733     if (isUnusedIncluded) {
2734         GetUnusedFormInfos(bundleName, runningFormInfos);
2735     }
2736     HILOG_DEBUG(
2737         "bundleName is %{public}s, runningFormInfo.size = %{public}zu", bundleName.c_str(), runningFormInfos.size());
2738     if (runningFormInfos.size() == 0) {
2739         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2740     }
2741     return ERR_OK;
2742 }
2743 
UpdateFormCloudUpdateDuration(const std::string & bundleName,int duration)2744 void FormDataMgr::UpdateFormCloudUpdateDuration(const std::string &bundleName, int duration)
2745 {
2746     HILOG_INFO("bundleName:%{public}s, duration:%{public}d", bundleName.c_str(), duration);
2747     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2748     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2749     if (iter != formCloudUpdateDurationMap_.end()) {
2750         iter->second = duration;
2751         return;
2752     }
2753     formCloudUpdateDurationMap_.emplace(bundleName, duration);
2754 }
2755 
RemoveFormCloudUpdateDuration(const std::string & bundleName)2756 void FormDataMgr::RemoveFormCloudUpdateDuration(const std::string &bundleName)
2757 {
2758     HILOG_DEBUG("call");
2759     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2760     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2761     if (iter != formCloudUpdateDurationMap_.end()) {
2762         HILOG_INFO("bundleName:%{public}s", bundleName.c_str());
2763         formCloudUpdateDurationMap_.erase(bundleName);
2764     }
2765 }
2766 
GetFormCloudUpdateDuration(const std::string & bundleName) const2767 int FormDataMgr::GetFormCloudUpdateDuration(const std::string &bundleName) const
2768 {
2769     HILOG_DEBUG("call");
2770     int duration = 0;
2771     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2772     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2773     if (iter != formCloudUpdateDurationMap_.end()) {
2774         duration = iter->second;
2775         HILOG_INFO("%{public}s has form cloud update duration:%{public}d", bundleName.c_str(), duration);
2776     }
2777     return duration;
2778 }
2779 
HasFormCloudUpdateDuration(const std::string & bundleName) const2780 bool FormDataMgr::HasFormCloudUpdateDuration(const std::string &bundleName) const
2781 {
2782     HILOG_DEBUG("call");
2783     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2784     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2785     if (iter != formCloudUpdateDurationMap_.end()) {
2786         HILOG_INFO("Has cloud update duration, bundleName:%{public}s", bundleName.c_str());
2787         return true;
2788     }
2789     HILOG_INFO("Not has cloud update duration, bundleName:%{public}s", bundleName.c_str());
2790     return false;
2791 }
2792 
UpdateFormLocation(const int64_t & formId,const int32_t & formLocation)2793 ErrCode FormDataMgr::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation)
2794 {
2795     std::lock_guard<std::mutex> lock(formRecordMutex_);
2796     auto info = formRecords_.find(formId);
2797     if (info == formRecords_.end()) {
2798         HILOG_INFO("form info not find, formId:%{public}" PRId64 " formLocation:%{public}d",
2799             formId, formLocation);
2800         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2801     }
2802     info->second.formLocation = (Constants::FormLocation)formLocation;
2803     HILOG_INFO("success, formId:%{public}" PRId64 " formLocation:%{public}d",
2804         formId, formLocation);
2805     return ERR_OK;
2806 }
2807 
GetRecordsByFormType(const int32_t formRefreshType,std::vector<FormRecord> & visibleFormRecords,std::vector<FormRecord> & invisibleFormRecords)2808 ErrCode FormDataMgr::GetRecordsByFormType(const int32_t formRefreshType,
2809     std::vector<FormRecord> &visibleFormRecords, std::vector<FormRecord> &invisibleFormRecords)
2810 {
2811     HILOG_INFO("formRefreshType:%{public}d", formRefreshType);
2812     std::lock_guard<std::mutex> lock(formRecordMutex_);
2813     for (auto formRecord : formRecords_) {
2814         if (!FormTrustMgr::GetInstance().IsTrust(formRecord.second.bundleName)) {
2815             HILOG_ERROR("ignore,%{public}s is unTrust.", formRecord.second.bundleName.c_str());
2816             continue;
2817         }
2818         if (FormBundleForbidMgr::GetInstance().IsBundleForbidden(formRecord.second.bundleName)) {
2819             HILOG_ERROR("ignore,%{public}s is forbidden.", formRecord.second.bundleName.c_str());
2820             continue;
2821         }
2822         if (formRefreshType == Constants::REFRESH_APP_FORM) {
2823             if (formRecord.second.formBundleType != BundleType::APP) {
2824                 continue;
2825             }
2826         } else if (formRefreshType == Constants::REFRESH_ATOMIC_FORM) {
2827             if (formRecord.second.formBundleType != BundleType::ATOMIC_SERVICE) {
2828                 continue;
2829             }
2830         } else if (formRefreshType == Constants::REFRESH_SYSTEMAPP_FORM) {
2831             if (!formRecord.second.isSystemApp) {
2832                 continue;
2833             }
2834         }
2835         if (formRecord.second.formVisibleNotifyState == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
2836             visibleFormRecords.emplace_back(formRecord.second);
2837             continue;
2838         }
2839         invisibleFormRecords.emplace_back(formRecord.second);
2840     }
2841     return ERR_OK;
2842 }
2843 
SetFormLock(const int64_t formId,const bool lock)2844 ErrCode FormDataMgr::SetFormLock(const int64_t formId, const bool lock)
2845 {
2846     std::lock_guard<std::mutex> lockMutex(formRecordMutex_);
2847     auto itFormRecord = formRecords_.find(formId);
2848     if (itFormRecord == formRecords_.end()) {
2849         HILOG_ERROR("form info not find");
2850         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2851     }
2852     itFormRecord->second.lockForm = lock;
2853     HILOG_INFO("formId:%{public}" PRId64 " lock:%{public}d", formId, lock);
2854     return ERR_OK;
2855 }
2856 
GetFormLock(const int64_t formId,bool & lock)2857 ErrCode FormDataMgr::GetFormLock(const int64_t formId, bool &lock)
2858 {
2859     std::lock_guard<std::mutex> lockMutex(formRecordMutex_);
2860     auto itFormRecord = formRecords_.find(formId);
2861     if (itFormRecord == formRecords_.end()) {
2862         HILOG_ERROR("form info not find");
2863         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2864     }
2865     lock = itFormRecord->second.lockForm;
2866     HILOG_INFO("formId:%{public}" PRId64 " lock:%{public}d", formId, lock);
2867     return ERR_OK;
2868 }
2869 
SetFormProtect(const int64_t formId,const bool protect)2870 ErrCode FormDataMgr::SetFormProtect(const int64_t formId, const bool protect)
2871 {
2872     std::lock_guard<std::mutex> lockMutex(formRecordMutex_);
2873     auto itFormRecord = formRecords_.find(formId);
2874     if (itFormRecord == formRecords_.end()) {
2875         HILOG_ERROR("form info not find");
2876         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2877     }
2878     itFormRecord->second.protectForm = protect;
2879     HILOG_INFO("formId:%{public}" PRId64 " protect:%{public}d", formId, protect);
2880     return ERR_OK;
2881 }
2882 
GetFormProtect(const int64_t formId,bool & protect)2883 ErrCode FormDataMgr::GetFormProtect(const int64_t formId, bool &protect)
2884 {
2885     std::lock_guard<std::mutex> lockMutex(formRecordMutex_);
2886     auto itFormRecord = formRecords_.find(formId);
2887     if (itFormRecord == formRecords_.end()) {
2888         HILOG_ERROR("form info not find");
2889         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2890     }
2891     protect = itFormRecord->second.protectForm;
2892     HILOG_INFO("formId:%{public}" PRId64 " protect:%{public}d", formId, protect);
2893     return ERR_OK;
2894 }
2895 
SetFormEnable(const int64_t formId,const bool enable)2896 ErrCode FormDataMgr::SetFormEnable(const int64_t formId, const bool enable)
2897 {
2898     std::lock_guard<std::mutex> lock(formRecordMutex_);
2899     auto itFormRecord = formRecords_.find(formId);
2900     if (itFormRecord == formRecords_.end()) {
2901         HILOG_ERROR("form info not find");
2902         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2903     }
2904     itFormRecord->second.enableForm = enable;
2905     HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d", formId, enable);
2906     return ERR_OK;
2907 }
2908 
SetRefreshDuringDisableForm(const int64_t formId,const bool enable)2909 ErrCode FormDataMgr::SetRefreshDuringDisableForm(const int64_t formId, const bool enable)
2910 {
2911     std::lock_guard<std::mutex> lock(formRecordMutex_);
2912     auto itFormRecord = formRecords_.find(formId);
2913     if (itFormRecord == formRecords_.end()) {
2914         HILOG_ERROR("form info not find");
2915         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2916     }
2917     itFormRecord->second.isRefreshDuringDisableForm = enable;
2918     HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d",
2919         formId, enable);
2920     return ERR_OK;
2921 }
2922 
SetUpdateDuringDisableForm(const int64_t formId,const bool enable)2923 ErrCode FormDataMgr::SetUpdateDuringDisableForm(const int64_t formId, const bool enable)
2924 {
2925     std::lock_guard<std::mutex> lock(formRecordMutex_);
2926     auto itFormRecord = formRecords_.find(formId);
2927     if (itFormRecord == formRecords_.end()) {
2928         HILOG_ERROR("form info not find");
2929         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2930     }
2931     itFormRecord->second.isUpdateDuringDisableForm = enable;
2932     HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d",
2933         formId, enable);
2934     return ERR_OK;
2935 }
2936 
LockForms(const std::vector<FormRecord> && formRecords,const bool lock)2937 void FormDataMgr::LockForms(const std::vector<FormRecord> &&formRecords, const bool lock)
2938 {
2939     HILOG_INFO("LockForms start");
2940     std::lock_guard<std::mutex> lockMutex(formHostRecordMutex_);
2941     for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
2942         std::vector<int64_t> matchedFormIds;
2943         for (auto formRecord : formRecords) {
2944             if (itHostRecord->Contains(formRecord.formId)) {
2945                 matchedFormIds.emplace_back(formRecord.formId);
2946             }
2947         }
2948         if (!matchedFormIds.empty()) {
2949             itHostRecord->OnLockForms(matchedFormIds, lock);
2950         }
2951     }
2952 }
2953 
EnableForms(const std::vector<FormRecord> && formRecords,const bool enable)2954 void FormDataMgr::EnableForms(const std::vector<FormRecord> &&formRecords, const bool enable)
2955 {
2956     HILOG_INFO("start");
2957     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
2958     for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
2959         std::vector<int64_t> matchedFormIds;
2960         for (auto formRecord : formRecords) {
2961             if (itHostRecord->Contains(formRecord.formId)) {
2962                 matchedFormIds.emplace_back(formRecord.formId);
2963             }
2964         }
2965         if (!matchedFormIds.empty()) {
2966             itHostRecord->OnEnableForms(matchedFormIds, enable);
2967         }
2968     }
2969 }
2970 
GetFormIdsByUserId(int32_t userId,std::vector<int64_t> & formIds)2971 void FormDataMgr::GetFormIdsByUserId(int32_t userId, std::vector<int64_t> &formIds)
2972 {
2973     std::lock_guard<std::mutex> lock(formRecordMutex_);
2974     for (auto formRecord : formRecords_) {
2975         if (formRecord.second.userId == userId) {
2976             formIds.emplace_back(formRecord.second.formId);
2977         }
2978     }
2979     HILOG_INFO("userId:%{public}d, size:%{public}zu", userId, formIds.size());
2980 }
2981 
SetFormVisible(int64_t formId,bool isVisible)2982 void FormDataMgr::SetFormVisible(int64_t formId, bool isVisible)
2983 {
2984     std::lock_guard<std::shared_mutex> lock(formVisibleMapMutex_);
2985     auto search = formVisibleMap_.find(formId);
2986     if (search == formVisibleMap_.end()) {
2987         formVisibleMap_.emplace(formId, isVisible);
2988     } else {
2989         search->second = isVisible;
2990     }
2991 
2992     HILOG_INFO("set isVisible to %{public}d, formId:%{public}" PRId64 " ", isVisible, formId);
2993 }
2994 
DeleteFormVisible(int64_t formId)2995 void FormDataMgr::DeleteFormVisible(int64_t formId)
2996 {
2997     std::lock_guard<std::shared_mutex> lock(formVisibleMapMutex_);
2998     auto search = formVisibleMap_.find(formId);
2999     if (search != formVisibleMap_.end()) {
3000         formVisibleMap_.erase(formId);
3001     }
3002 }
3003 
GetFormCanUpdate(int64_t formId)3004 bool FormDataMgr::GetFormCanUpdate(int64_t formId)
3005 {
3006     std::lock_guard<std::shared_mutex> lock(formVisibleMapMutex_);
3007     auto search = formVisibleMap_.find(formId);
3008     if (search == formVisibleMap_.end()) {
3009         HILOG_ERROR("form Id not find");
3010         formVisibleMap_.emplace(formId, true);
3011         return true;
3012     }
3013     return search->second;
3014 }
3015 
MergeFormWant(const Want & newWant,Want & oldWant)3016 void FormDataMgr::MergeFormWant(const Want &newWant, Want &oldWant)
3017 {
3018     std::map<std::string, sptr<IInterface>> newWantMap;
3019     WantParams newWantParams = newWant.GetParams();
3020     WantParams oldWantParams = oldWant.GetParams();
3021     newWantMap = newWantParams.GetParams();
3022     for (auto it = newWantMap.begin(); it != newWantMap.end(); it++) {
3023         oldWantParams.SetParam(it->first, it->second);
3024     }
3025     oldWant.SetParams(oldWantParams);
3026 }
3027 
UpdateFormWant(const int64_t formId,const Want & want,FormRecord & record)3028 void FormDataMgr::UpdateFormWant(const int64_t formId, const Want &want, FormRecord &record)
3029 {
3030     if (record.wantCacheMap.size() != 0) {
3031         MergeFormWant(want, record.wantCacheMap[formId]);
3032         return;
3033     }
3034     record.wantCacheMap[formId] = want;
3035 }
3036 
GetFormRecordsByUserId(const int32_t userId,std::vector<FormRecord> & formRecords)3037 void FormDataMgr::GetFormRecordsByUserId(const int32_t userId, std::vector<FormRecord> &formRecords)
3038 {
3039     std::lock_guard<std::mutex> lock(formRecordMutex_);
3040     for (auto formRecord : formRecords_) {
3041         if (formRecord.second.userId == userId) {
3042             formRecords.emplace_back(formRecord.second);
3043         }
3044     }
3045     HILOG_INFO("userId:%{public}d, size:%{public}zu", userId, formRecords.size());
3046 }
3047 
3048 /**
3049  * @brief get temp forms count.
3050  * @return Return the temp forms number.
3051  */
GetTempFormCount() const3052 int32_t FormDataMgr::GetTempFormCount() const
3053 {
3054     std::lock_guard<std::mutex> lock(formTempMutex_);
3055     return static_cast<int32_t>(tempForms_.size());
3056 }
3057 
3058 /**
3059  * @brief get formRecord by formId
3060  * @param formId form id.
3061  * @param formRecord form record.
3062  * @return Returns true on success, false on failure.
3063  */
GetFormRecordById(const int64_t formId,FormRecord & formRecord)3064 bool FormDataMgr::GetFormRecordById(const int64_t formId, FormRecord &formRecord)
3065 {
3066     bool notFindFormRecord  = false;
3067     std::lock_guard<std::mutex> lock(formRecordMutex_);
3068     auto info = formRecords_.find(formId);
3069     notFindFormRecord  = info == formRecords_.end();
3070     if (!notFindFormRecord) {
3071         formRecord = info->second;
3072     }
3073     return notFindFormRecord ;
3074 }
3075 
PostDelayRecheckWhetherNeedCleanFormHostTask(const int callerUid,const sptr<IRemoteObject> & remoteObjectOfHost)3076 void FormDataMgr::PostDelayRecheckWhetherNeedCleanFormHostTask(
3077     const int callerUid, const sptr<IRemoteObject> &remoteObjectOfHost)
3078 {
3079     HILOG_DEBUG("start");
3080 
3081     auto recheckWhetherNeedCleanFormHost = [remoteObjectOfHost]() {
3082         FormDataMgr::GetInstance().RecheckWhetherNeedCleanFormHost(remoteObjectOfHost);
3083     };
3084     FormMgrQueue::GetInstance().ScheduleDelayTask(
3085         std::make_pair((int64_t)TaskType::DELETE_FORM_HOST_RECORD, static_cast<int64_t>(callerUid)),
3086         CLEAN_FORM_HOST_TASK_DELAY_TIME,
3087         recheckWhetherNeedCleanFormHost);
3088     HILOG_DEBUG("end");
3089 }
3090 
GetFormAbilityInfo(const FormRecord & record) const3091 FormRecord FormDataMgr::GetFormAbilityInfo(const FormRecord &record) const
3092 {
3093     FormRecord newRecord;
3094     newRecord.bundleName = record.bundleName;
3095     newRecord.moduleName = record.moduleName;
3096     newRecord.abilityName = record.abilityName;
3097     newRecord.isInited = record.isInited;
3098     newRecord.versionUpgrade = record.versionUpgrade;
3099     newRecord.needFreeInstall = record.needFreeInstall;
3100     newRecord.providerUserId = record.providerUserId;
3101     return newRecord;
3102 }
3103 
UpdateFormRecordSetIsExistRecycleTask(const int64_t formId,bool isExistRecycleTask)3104 bool FormDataMgr::UpdateFormRecordSetIsExistRecycleTask(const int64_t formId, bool isExistRecycleTask)
3105 {
3106     std::lock_guard<std::mutex> lock(formRecordMutex_);
3107     auto info = formRecords_.find(formId);
3108     if (info == formRecords_.end()) {
3109         HILOG_WARN("form %{public}" PRId64 " not exist", formId);
3110         return false;
3111     }
3112     info->second.isExistRecycleTask = isExistRecycleTask;
3113     HILOG_DEBUG("update form %{public}" PRId64 " isExistRecycleTask:%{public}d", formId, isExistRecycleTask);
3114     return true;
3115 }
3116 
InitLowMemoryStatus()3117 void FormDataMgr::InitLowMemoryStatus()
3118 {
3119     std::string param = OHOS::system::GetParameter(MEMMORY_WATERMARK, "unknown");
3120     isLowMemory_.store(param == "true");
3121     WatchParameter(MEMMORY_WATERMARK, OnMemoryWatermarkChange, nullptr);
3122 }
3123 
SetIsLowMemory(bool isLowMemory)3124 void FormDataMgr::SetIsLowMemory(bool isLowMemory)
3125 {
3126     isLowMemory_.store(isLowMemory);
3127 }
3128 
IsLowMemory() const3129 bool FormDataMgr::IsLowMemory() const
3130 {
3131     return isLowMemory_.load();
3132 }
3133 
SetSpecification(const int64_t formId,const int32_t specification)3134 ErrCode FormDataMgr::SetSpecification(const int64_t formId, const int32_t specification)
3135 {
3136     if (specification < static_cast<int32_t>(Constants::Dimension::DIMENSION_MIN) ||
3137         specification > static_cast<int32_t>(Constants::Dimension::DIMENSION_MAX)) {
3138         HILOG_ERROR("Invalid specification");
3139         return ERR_APPEXECFWK_FORM_DIMENSION_ERROR;
3140     }
3141     std::lock_guard<std::mutex> lockMutex(formRecordMutex_);
3142     auto itFormRecord = formRecords_.find(formId);
3143     if (itFormRecord == formRecords_.end()) {
3144         HILOG_ERROR("form info not find");
3145         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
3146     }
3147     itFormRecord->second.specification = specification;
3148     HILOG_INFO("formId:%{public}" PRId64 " specification:%{public}d", formId, specification);
3149     return ERR_OK;
3150 }
3151 
GetFormVisible(int64_t formId)3152 bool FormDataMgr::GetFormVisible(int64_t formId)
3153 {
3154     std::lock_guard<std::shared_mutex> lock(formVisibleMapMutex_);
3155     auto search = formVisibleMap_.find(formId);
3156     if (search != formVisibleMap_.end()) {
3157         return search->second;
3158     }
3159     // When visibility is not set, it is visible by default
3160     return true;
3161 }
3162 }  // namespace AppExecFwk
3163 }  // namespace OHOS
3164