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