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