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