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 isCountTimerRefresh for FormRecord.
910  * @param formId The Id of the form.
911  * @param countTimerRefresh true or false.
912  */
SetCountTimerRefresh(const int64_t formId, const bool countTimerRefresh)913 void FormDataMgr::SetCountTimerRefresh(const int64_t formId, const bool countTimerRefresh)
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.isCountTimerRefresh = countTimerRefresh;
922 }
923 
924 /**
925  * @brief Set isTimerRefresh for FormRecord.
926  * @param formId The Id of the form.
927  * @param timerRefresh true or false.
928  */
SetTimerRefresh(const int64_t formId, const bool timerRefresh)929 void FormDataMgr::SetTimerRefresh(const int64_t formId, const bool timerRefresh)
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.isTimerRefresh = timerRefresh;
938 }
939 
940 /**
941  * @brief Get updated form.
942  * @param record FormRecord.
943  * @param targetForms Target forms.
944  * @param updatedForm Updated formnfo.
945  * @return Returns true on success, false on failure.
946  */
GetUpdatedForm(const FormRecord &record, const std::vector<FormInfo> &targetForms, FormInfo &updatedForm)947 bool FormDataMgr::GetUpdatedForm(const FormRecord &record, const std::vector<FormInfo> &targetForms,
948     FormInfo &updatedForm)
949 {
950     if (targetForms.empty()) {
951         HILOG_ERROR("empty targetForms");
952         return false;
953     }
954 
955     for (const FormInfo &item : targetForms) {
956         if (IsSameForm(record, item)) {
957             updatedForm = item;
958             HILOG_DEBUG("find matched form");
959             return true;
960         }
961     }
962     return false;
963 }
964 /**
965  * @brief Set isEnableUpdate for FormRecord.
966  * @param formId The Id of the form.
967  * @param enableUpdate true or false.
968  */
SetEnableUpdate(const int64_t formId, const bool enableUpdate)969 void FormDataMgr::SetEnableUpdate(const int64_t formId, const bool enableUpdate)
970 {
971     std::lock_guard<std::mutex> lock(formRecordMutex_);
972     auto itFormRecord = formRecords_.find(formId);
973     if (itFormRecord == formRecords_.end()) {
974         HILOG_ERROR("form info not find");
975         return;
976     }
977     itFormRecord->second.isEnableUpdate = enableUpdate;
978 }
979 /**
980  * @brief Set update info for FormRecord.
981  * @param formId The Id of the form.
982  * @param enableUpdate true or false.
983  * @param updateDuration Update duration.
984  * @param updateAtHour Update at hour.
985  * @param updateAtMin Update at minute.
986  */
SetUpdateInfo( const int64_t formId, const bool enableUpdate, const long updateDuration, const int updateAtHour, const int updateAtMin)987 void FormDataMgr::SetUpdateInfo(
988     const int64_t formId,
989     const bool enableUpdate,
990     const long updateDuration,
991     const int updateAtHour,
992     const int updateAtMin)
993 {
994     std::lock_guard<std::mutex> lock(formRecordMutex_);
995     auto itFormRecord = formRecords_.find(formId);
996     if (itFormRecord == formRecords_.end()) {
997         HILOG_ERROR("form info not find");
998         return;
999     }
1000 
1001     itFormRecord->second.isEnableUpdate = enableUpdate;
1002     itFormRecord->second.updateDuration = updateDuration;
1003     itFormRecord->second.updateAtHour = updateAtHour;
1004     itFormRecord->second.updateAtMin = updateAtMin;
1005 }
1006 /**
1007  * @brief Check if two forms is same or not.
1008  * @param record FormRecord.
1009  * @param formInfo FormInfo.
1010  * @return Returns true on success, false on failure.
1011  */
IsSameForm(const FormRecord &record, const FormInfo &formInfo)1012 bool FormDataMgr::IsSameForm(const FormRecord &record, const FormInfo &formInfo)
1013 {
1014     if (record.bundleName == formInfo.bundleName
1015         && record.moduleName == formInfo.moduleName
1016         && record.abilityName == formInfo.abilityName
1017         && record.formName == formInfo.name
1018         && std::find(formInfo.supportDimensions.begin(), formInfo.supportDimensions.end(), record.specification)
1019         != formInfo.supportDimensions.end()) {
1020         return true;
1021     }
1022 
1023     return false;
1024 }
1025 /**
1026  * @brief Clean removed form records.
1027  * @param removedForms The id list of the forms.
1028  */
CleanRemovedFormRecords(const std::string &bundleName, std::set<int64_t> &removedForms)1029 void FormDataMgr::CleanRemovedFormRecords(const std::string &bundleName, std::set<int64_t> &removedForms)
1030 {
1031     HILOG_INFO("clean removed form records");
1032     std::lock_guard<std::mutex> lock(formRecordMutex_);
1033     std::map<int64_t, FormRecord>::iterator itFormRecord;
1034     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
1035         auto itForm = std::find(removedForms.begin(), removedForms.end(), itFormRecord->first);
1036         if (itForm != removedForms.end()) {
1037             FormCacheMgr::GetInstance().DeleteData(itFormRecord->first);
1038             FormRenderMgr::GetInstance().StopRenderingForm(itFormRecord->first, itFormRecord->second);
1039             itFormRecord = formRecords_.erase(itFormRecord);
1040         } else {
1041             itFormRecord++;
1042         }
1043     }
1044 }
1045 /**
1046  * @brief Clean removed temp form records.
1047  * @param  bundleName BundleName.
1048  * @param removedForms The id list of the forms.
1049  */
CleanRemovedTempFormRecords(const std::string &bundleName, const int32_t userId, std::set<int64_t> &removedForms)1050 void FormDataMgr::CleanRemovedTempFormRecords(const std::string &bundleName, const int32_t userId,
1051     std::set<int64_t> &removedForms)
1052 {
1053     HILOG_INFO("clean removed form records");
1054     std::set<int64_t> removedTempForms;
1055     {
1056         std::lock_guard<std::mutex> lock(formRecordMutex_);
1057         std::map<int64_t, FormRecord>::iterator itFormRecord;
1058         for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end();) {
1059             if ((itFormRecord->second.formTempFlag) && (bundleName == itFormRecord->second.bundleName)
1060                 && (userId == itFormRecord->second.providerUserId)) {
1061                 removedTempForms.emplace(itFormRecord->second.formId);
1062                 FormRenderMgr::GetInstance().StopRenderingForm(itFormRecord->first, itFormRecord->second);
1063                 itFormRecord = formRecords_.erase(itFormRecord);
1064             } else {
1065                 itFormRecord++;
1066             }
1067         }
1068     }
1069 
1070     if (removedTempForms.size() > 0) {
1071         std::lock_guard<std::mutex> lock(formTempMutex_);
1072         std::vector<int64_t>::iterator itTemp;
1073         for (itTemp = tempForms_.begin(); itTemp != tempForms_.end();) {
1074             if (removedTempForms.find(*itTemp) != removedTempForms.end()) {
1075                 itTemp = tempForms_.erase(itTemp);
1076             } else {
1077                 itTemp++;
1078             }
1079         }
1080         removedForms.merge(removedTempForms);
1081     }
1082 }
1083 /**
1084  * @brief Get recreate form records.
1085  * @param reCreateForms The id list of the forms.
1086  */
GetReCreateFormRecordsByBundleName(const std::string &bundleName, std::set<int64_t> &reCreateForms)1087 void FormDataMgr::GetReCreateFormRecordsByBundleName(const std::string &bundleName, std::set<int64_t> &reCreateForms)
1088 {
1089     std::lock_guard<std::mutex> lock(formRecordMutex_);
1090     std::map<int64_t, FormRecord>::iterator itFormRecord;
1091     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1092         if (bundleName == itFormRecord->second.bundleName) {
1093             reCreateForms.emplace(itFormRecord->second.formId);
1094         }
1095     }
1096 }
1097 /**
1098  * @brief Set form isInited flag.
1099  * @param formId The Id of the form.
1100  * @param isInited isInited property
1101  */
SetFormCacheInited(const int64_t formId, bool isInited)1102 void FormDataMgr::SetFormCacheInited(const int64_t formId, bool isInited)
1103 {
1104     std::lock_guard<std::mutex> lock(formRecordMutex_);
1105     auto itFormRecord = formRecords_.find(formId);
1106     if (itFormRecord == formRecords_.end()) {
1107         HILOG_ERROR("form info not find");
1108         return;
1109     }
1110     itFormRecord->second.isInited = isInited;
1111     itFormRecord->second.needRefresh = !isInited;
1112 }
1113 /**
1114  * @brief Set versionUpgrade.
1115  * @param formId The Id of the form.
1116  * @param versionUpgrade true or false
1117  */
SetVersionUpgrade(const int64_t formId, const bool versionUpgrade)1118 void FormDataMgr::SetVersionUpgrade(const int64_t formId, const bool versionUpgrade)
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.versionUpgrade = versionUpgrade;
1127 }
1128 /**
1129  * @brief Update form for host clients.
1130  * @param formId The Id of the form.
1131  * @param needRefresh true or false
1132  */
UpdateHostNeedRefresh(const int64_t formId, const bool needRefresh)1133 void FormDataMgr::UpdateHostNeedRefresh(const int64_t formId, const bool needRefresh)
1134 {
1135     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1136     std::vector<FormHostRecord>::iterator itHostRecord;
1137     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1138         if (itHostRecord->Contains(formId)) {
1139             itHostRecord->SetNeedRefresh(formId, needRefresh);
1140         }
1141     }
1142 }
1143 
1144 /**
1145  * @brief Update form for host clients.
1146  * @param formId The Id of the form.
1147  * @param formRecord The form info.
1148  * @return Returns true if form update, false if other.
1149  */
UpdateHostForm(const int64_t formId, const FormRecord &formRecord)1150 bool FormDataMgr::UpdateHostForm(const int64_t formId, const FormRecord &formRecord)
1151 {
1152     bool isUpdated = false;
1153     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1154     std::vector<FormHostRecord>::iterator itHostRecord;
1155     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1156         bool enableRefresh = formRecord.isVisible || itHostRecord->IsEnableUpdate(formId) ||
1157                              itHostRecord->IsEnableRefresh(formId);
1158         HILOG_INFO("formId:%{public}" PRId64 " enableRefresh:%{public}d", formId, enableRefresh);
1159         if (enableRefresh) {
1160             // update form
1161             itHostRecord->OnUpdate(formId, formRecord);
1162             // set needRefresh
1163             itHostRecord->SetNeedRefresh(formId, false);
1164             isUpdated = true;
1165         }
1166     }
1167     return isUpdated;
1168 }
1169 
HandleUpdateHostFormFlag(const std::vector<int64_t> &formIds, bool flag, bool isOnlyEnableUpdate, FormHostRecord &formHostRecord, std::vector<int64_t> &refreshForms)1170 ErrCode FormDataMgr::HandleUpdateHostFormFlag(const std::vector<int64_t> &formIds, bool flag, bool isOnlyEnableUpdate,
1171                                               FormHostRecord &formHostRecord, std::vector<int64_t> &refreshForms)
1172 {
1173     for (const int64_t formId : formIds) {
1174         if (formId <= 0) {
1175             HILOG_WARN("formId %{public}" PRId64 " less than 0", formId);
1176             continue;
1177         }
1178 
1179         int64_t matchedFormId = FindMatchedFormId(formId);
1180         if (!formHostRecord.Contains(matchedFormId)) {
1181             HILOG_WARN("form %{public}" PRId64 "not owned by this client, don't need to update flag",
1182                 formId);
1183             continue;
1184         }
1185 
1186         if (isOnlyEnableUpdate) {
1187             // new API: this flag is used only to control enable update
1188             formHostRecord.SetEnableUpdate(matchedFormId, flag);
1189             formHostRecord.SetEnableRefresh(matchedFormId, false);
1190         } else {
1191             // old API: this flag is used to control enable update and visible update
1192             formHostRecord.SetEnableRefresh(matchedFormId, flag);
1193         }
1194 
1195         // set disable
1196         if (!flag) {
1197             HILOG_DEBUG("flag is disable");
1198             continue;
1199         }
1200         FormRecord formRecord;
1201         if (GetFormRecord(matchedFormId, formRecord)) {
1202             if (formRecord.needRefresh) {
1203                 HILOG_DEBUG("formRecord need refresh");
1204                 refreshForms.emplace_back(matchedFormId);
1205                 continue;
1206             }
1207         } else {
1208             HILOG_WARN("not exist such form:%{public}" PRId64 "", matchedFormId);
1209             continue;
1210         }
1211 
1212         // if set enable flag, should check whether to refresh form
1213         if (!formHostRecord.IsNeedRefresh(matchedFormId)) {
1214             HILOG_DEBUG("host need not refresh");
1215             continue;
1216         }
1217 
1218         if (IsFormCached(formRecord)) {
1219             HILOG_DEBUG("form cached");
1220             formHostRecord.OnUpdate(matchedFormId, formRecord);
1221             formHostRecord.SetNeedRefresh(matchedFormId, false);
1222         } else {
1223             HILOG_DEBUG("form no cache");
1224             refreshForms.emplace_back(matchedFormId);
1225             continue;
1226         }
1227     }
1228     return ERR_OK;
1229 }
1230 
1231 /**
1232  * @brief handle update form flag.
1233  * @param formIDs The id of the forms.
1234  * @param callerToken Caller ability token.
1235  * @param flag form flag.
1236  * @param isOnlyEnableUpdate form enable update form flag.
1237  * @param refreshForms Refresh forms
1238  * @return Returns ERR_OK on success, others on failure.
1239  */
UpdateHostFormFlag(const std::vector<int64_t> &formIds, const sptr<IRemoteObject> &callerToken, bool flag, bool isOnlyEnableUpdate, std::vector<int64_t> &refreshForms)1240 ErrCode FormDataMgr::UpdateHostFormFlag(const std::vector<int64_t> &formIds, const sptr<IRemoteObject> &callerToken,
1241                                         bool flag, bool isOnlyEnableUpdate, std::vector<int64_t> &refreshForms)
1242 {
1243     HILOG_DEBUG("start,flag:%{public}d", flag);
1244     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1245     std::vector<FormHostRecord>::iterator itHostRecord;
1246     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
1247         if (callerToken == itHostRecord->GetFormHostClient()) {
1248             HandleUpdateHostFormFlag(formIds, flag, isOnlyEnableUpdate, *itHostRecord, refreshForms);
1249             HILOG_DEBUG("end");
1250             return ERR_OK;
1251         }
1252     }
1253     HILOG_ERROR("can't find target client");
1254     return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1255 }
1256 /**
1257  * @brief Find matched form id.
1258  * @param formId The form id.
1259  * @return Matched form id.
1260  */
FindMatchedFormId(const int64_t formId)1261 int64_t FormDataMgr::FindMatchedFormId(const int64_t formId)
1262 {
1263     uint64_t unsignedFormId = static_cast<uint64_t>(formId);
1264     if ((unsignedFormId & 0xffffffff00000000L) != 0) {
1265         return formId;
1266     }
1267     std::lock_guard<std::mutex> lock(formRecordMutex_);
1268     std::map<int64_t, FormRecord>::iterator itFormRecord;
1269     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1270         uint64_t unsignedFormId = static_cast<uint64_t>(formId);
1271         uint64_t unsignedItFormRecordFirst = static_cast<uint64_t>(itFormRecord->first);
1272         if ((unsignedItFormRecordFirst & 0x00000000ffffffffL) == (unsignedFormId & 0x00000000ffffffffL)) {
1273             return itFormRecord->first;
1274         }
1275     }
1276     return formId;
1277 }
1278 
1279 /**
1280  * @brief Clear host data by uId.
1281  * @param uId The caller uId.
1282  */
ClearHostDataByUId(const int uId)1283 void FormDataMgr::ClearHostDataByUId(const int uId)
1284 {
1285     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1286     std::vector<FormHostRecord>::iterator itHostRecord;
1287     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
1288         if (itHostRecord->GetCallerUid() == uId) {
1289             itHostRecord->CleanResource();
1290             itHostRecord = clientRecords_.erase(itHostRecord);
1291         } else {
1292             itHostRecord++;
1293         }
1294     }
1295 }
1296 /**
1297  * @brief Get no host temp forms.
1298  * @param uid The caller uid.
1299  * @param noHostTempFormsMap no host temp forms.
1300  * @param foundFormsMap Form Id list.
1301  */
GetNoHostTempForms( const int uid, std::map<FormIdKey, std::set<int64_t>> &noHostTempFormsMap, std::map<int64_t, bool> &foundFormsMap)1302 void FormDataMgr::GetNoHostTempForms(
1303     const int uid, std::map<FormIdKey,
1304     std::set<int64_t>> &noHostTempFormsMap,
1305     std::map<int64_t, bool> &foundFormsMap)
1306 {
1307     std::lock_guard<std::mutex> lock(formRecordMutex_);
1308     std::map<int64_t, FormRecord>::iterator itFormRecord;
1309     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
1310         if (!itFormRecord->second.formTempFlag) {
1311             continue; // Not temp form, skip
1312         }
1313 
1314         auto itUid = std::find(itFormRecord->second.formUserUids.begin(),
1315             itFormRecord->second.formUserUids.end(), uid);
1316         if (itUid == itFormRecord->second.formUserUids.end()) {
1317             foundFormsMap.emplace(itFormRecord->second.formId, false);
1318             continue;
1319         }
1320 
1321         itFormRecord->second.formUserUids.erase(itUid);
1322         if (!itFormRecord->second.formUserUids.empty()) {
1323             continue;
1324         }
1325 
1326         FormIdKey formIdKey(itFormRecord->second.bundleName, itFormRecord->second.abilityName);
1327         auto itIdsSet = noHostTempFormsMap.find(formIdKey);
1328         if (itIdsSet == noHostTempFormsMap.end()) {
1329             std::set<int64_t> formIdsSet;
1330             formIdsSet.emplace(itFormRecord->second.formId);
1331             noHostTempFormsMap.emplace(formIdKey, formIdsSet);
1332         } else {
1333             itIdsSet->second.emplace(itFormRecord->second.formId);
1334         }
1335     }
1336 }
1337 /**
1338  * @brief Parse update config.
1339  * @param record The form record.
1340  * @param info The form item info.
1341  */
ParseUpdateConfig(FormRecord &record, const FormItemInfo &info) const1342 void FormDataMgr::ParseUpdateConfig(FormRecord &record, const FormItemInfo &info) const
1343 {
1344     int configDuration = info.GetUpdateDuration();
1345     if (configDuration > 0) {
1346         ParseIntervalConfig(record, configDuration);
1347     } else {
1348         ParseAtTimerConfig(record, info);
1349     }
1350 }
1351 
1352 /**
1353  * @brief Parse update interval config.
1354  * @param record The form record.
1355  * @param configDuration interval duration.
1356  */
ParseIntervalConfig(FormRecord &record, const int configDuration) const1357 void FormDataMgr::ParseIntervalConfig(FormRecord &record, const int configDuration) const
1358 {
1359     HILOG_INFO("configDuration:%{public}d", configDuration);
1360     if (configDuration <= Constants::MIN_CONFIG_DURATION) {
1361         record.updateDuration = Constants::MIN_PERIOD;
1362     } else if (configDuration >= Constants::MAX_CONFIG_DURATION) {
1363         record.updateDuration = Constants::MAX_PERIOD;
1364     } else {
1365         record.updateDuration = configDuration * Constants::TIME_CONVERSION;
1366     }
1367     HILOG_INFO("end");
1368 }
1369 
1370 /**
1371  * @brief Parse at time config.
1372  * @param record The form record.
1373  * @param info form item info.
1374  */
ParseAtTimerConfig(FormRecord &record, const FormItemInfo &info) const1375 void FormDataMgr::ParseAtTimerConfig(FormRecord &record, const FormItemInfo &info) const
1376 {
1377     record.isEnableUpdate = false;
1378     record.updateDuration = 0;
1379     std::string configAtTime = info.GetScheduledUpdateTime();
1380     HILOG_INFO("parseAsUpdateAt updateAt:%{public}s", configAtTime.c_str());
1381     if (configAtTime.empty()) {
1382         return;
1383     }
1384 
1385     std::vector<std::string> temp = FormUtil::StringSplit(configAtTime, Constants::TIME_DELIMETER);
1386     if (temp.size() != Constants::UPDATE_AT_CONFIG_COUNT) {
1387         HILOG_ERROR("invalid config");
1388         return;
1389     }
1390     int hour = -1;
1391     int min = -1;
1392     hour = std::stoi(temp[0]);
1393     min = std::stoi(temp[1]);
1394     if (hour < Constants::MIN_TIME || hour > Constants::MAX_HOUR || min < Constants::MIN_TIME || min >
1395         Constants::MAX_MINUTE) {
1396         HILOG_ERROR("invalid time");
1397         return;
1398     }
1399     record.updateAtHour = hour;
1400     record.updateAtMin = min;
1401     record.isEnableUpdate = true;
1402 }
1403 /**
1404  * @brief check if form cached.
1405  * @param record The form record.
1406  * @return Returns ERR_OK on cached, others on not cached.
1407  */
IsFormCached(const FormRecord record)1408 bool FormDataMgr::IsFormCached(const FormRecord record)
1409 {
1410     if (record.versionUpgrade) {
1411         return false;
1412     }
1413     return FormCacheMgr::GetInstance().NeedAcquireProviderData(record.formId);
1414 }
1415 
1416 /**
1417  * @brief Create form state host record.
1418  * @param provider The provider of the form state
1419  * @param info The form item info.
1420  * @param callerToken The UID of the proxy.
1421  * @param callingUid The UID of the proxy.
1422  * @return Returns true if this function is successfully called; returns false otherwise.
1423  */
CreateFormStateRecord(std::string &provider, const FormItemInfo &info, const sptr<IRemoteObject> &callerToken, int callingUid)1424 bool FormDataMgr::CreateFormStateRecord(std::string &provider, const FormItemInfo &info,
1425                                         const sptr<IRemoteObject> &callerToken, int callingUid)
1426 {
1427     std::lock_guard<std::mutex> lock(formStateRecordMutex_);
1428     auto iter = formStateRecord_.find(provider);
1429     if (iter != formStateRecord_.end()) {
1430         if (iter->second.GetFormHostClient() != callerToken) {
1431             iter->second.SetFormHostClient(callerToken);
1432         }
1433         return true;
1434     }
1435 
1436     FormHostRecord hostRecord;
1437     bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
1438     if (isCreated) {
1439         formStateRecord_.emplace(provider, hostRecord);
1440         return true;
1441     }
1442 
1443     return false;
1444 }
1445 
CreateFormAcquireDataRecord(int64_t requestCode, const FormItemInfo &info, const sptr<IRemoteObject> &callerToken, int callingUid)1446 bool FormDataMgr::CreateFormAcquireDataRecord(int64_t requestCode, const FormItemInfo &info,
1447                                               const sptr<IRemoteObject> &callerToken, int callingUid)
1448 {
1449     std::lock_guard<std::mutex> lock(formAcquireDataRecordMutex_);
1450     auto iter = formAcquireDataRecord_.find(requestCode);
1451     if (iter != formAcquireDataRecord_.end()) {
1452         if (iter->second.GetFormHostClient() != callerToken) {
1453             iter->second.SetFormHostClient(callerToken);
1454         }
1455         return true;
1456     }
1457 
1458     FormHostRecord hostRecord;
1459     bool isCreated = CreateHostRecord(info, callerToken, callingUid, hostRecord);
1460     if (isCreated) {
1461         formAcquireDataRecord_.emplace(requestCode, hostRecord);
1462         return true;
1463     }
1464 
1465     return false;
1466 }
1467 
AcquireFormDataBack(const AAFwk::WantParams &wantParams, int64_t requestCode)1468 ErrCode FormDataMgr::AcquireFormDataBack(const AAFwk::WantParams &wantParams, int64_t requestCode)
1469 {
1470     std::lock_guard<std::mutex> lock(formAcquireDataRecordMutex_);
1471     auto iter = formAcquireDataRecord_.find(requestCode);
1472     if (iter == formAcquireDataRecord_.end()) {
1473         HILOG_ERROR("filed to get form state host record");
1474         return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1475     }
1476     iter->second.OnAcquireFormData(wantParams, requestCode);
1477     iter->second.CleanResource();
1478     formAcquireDataRecord_.erase(iter);
1479     return ERR_OK;
1480 }
1481 
1482 /**
1483  * @brief acquire form state callback.
1484  * @param state form state.
1485  * @param provider provider info.
1486  * @param want The want of onAcquireFormState.
1487  * @return Returns true if this function is successfully called; returns false otherwise.
1488  */
AcquireFormStateBack(AppExecFwk::FormState state, const std::string &provider, const Want &want)1489 ErrCode FormDataMgr::AcquireFormStateBack(AppExecFwk::FormState state, const std::string &provider,
1490                                           const Want &want)
1491 {
1492     std::lock_guard<std::mutex> lock(formStateRecordMutex_);
1493     auto iter = formStateRecord_.find(provider);
1494     if (iter == formStateRecord_.end()) {
1495         HILOG_ERROR("filed to get form state host record");
1496         return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1497     }
1498     iter->second.OnAcquireState(state, want);
1499     iter->second.CleanResource();
1500     formStateRecord_.erase(iter);
1501     return ERR_OK;
1502 }
1503 
1504 /**
1505  * @brief Notify the form is visible or not.
1506  * @param formIds Indicates the ID of the forms.
1507  * @param isVisible Visible or not.
1508  * @param callerToken Host client.
1509  * @return Returns ERR_OK on success, others on failure.
1510  */
NotifyFormsVisible(const std::vector<int64_t> &formIds, bool isVisible, const sptr<IRemoteObject> &callerToken)1511 ErrCode FormDataMgr::NotifyFormsVisible(const std::vector<int64_t> &formIds, bool isVisible,
1512                                         const sptr<IRemoteObject> &callerToken)
1513 {
1514     if (formIds.empty() || callerToken == nullptr) {
1515         HILOG_ERROR("formIds empty");
1516         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1517     }
1518 
1519     std::vector<int64_t> foundFormIds {};
1520     {
1521         HILOG_INFO("get the matched form host record by client stub");
1522         std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1523         for (const FormHostRecord &record : clientRecords_) {
1524             if (callerToken != record.GetFormHostClient()) {
1525                 continue;
1526             }
1527             for (const int64_t formId : formIds) {
1528                 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
1529                 if (CheckInvalidForm(formId) != ERR_OK) {
1530                     continue;
1531                 }
1532                 if (!record.Contains(matchedFormId)) {
1533                     HILOG_ERROR("form not self-owned,form:%{public}" PRId64 ".",
1534                         matchedFormId);
1535                 } else {
1536                     foundFormIds.push_back(matchedFormId);
1537                 }
1538             }
1539             break;
1540         }
1541     }
1542 
1543     if (foundFormIds.empty()) {
1544         HILOG_ERROR("no valid forms found");
1545         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1546     }
1547 
1548     for (auto matchedFormId : foundFormIds) {
1549         SetRecordVisible(matchedFormId, isVisible);
1550     }
1551     return ERR_OK;
1552 }
1553 
1554 /**
1555  * @brief set form record visible.
1556  * @param matchedFormId form id.
1557  * @param isVisible is visible.
1558  * @return Returns true if this function is successfully called; returns false otherwise.
1559  */
SetRecordVisible(int64_t matchedFormId, bool isVisible)1560 ErrCode FormDataMgr::SetRecordVisible(int64_t matchedFormId, bool isVisible)
1561 {
1562     HILOG_INFO("set form record visible");
1563     std::lock_guard<std::mutex> lock(formRecordMutex_);
1564     auto info = formRecords_.find(matchedFormId);
1565     if (info == formRecords_.end()) {
1566         HILOG_ERROR("form info not find");
1567         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
1568     }
1569     info->second.isVisible = isVisible;
1570     HILOG_DEBUG("set isVisible to %{public}d, formId:%{public}" PRId64 " ", isVisible, matchedFormId);
1571     return ERR_OK;
1572 }
1573 
1574 /**
1575  * @brief delete forms by userId.
1576  *
1577  * @param userId user ID.
1578  * @param removedFormIds removed userId.
1579  */
DeleteFormsByUserId(const int32_t userId, std::vector<int64_t> &removedFormIds)1580 void FormDataMgr::DeleteFormsByUserId(const int32_t userId, std::vector<int64_t> &removedFormIds)
1581 {
1582     HILOG_INFO("delete forms by userId");
1583 
1584     // handle formRecords_
1585     std::vector<int64_t> removedTempForms;
1586     {
1587         std::lock_guard<std::mutex> lock(formRecordMutex_);
1588         auto itFormRecord = formRecords_.begin();
1589         while (itFormRecord != formRecords_.end()) {
1590             if (userId == itFormRecord->second.providerUserId) {
1591                 if (itFormRecord->second.formTempFlag) {
1592                     removedTempForms.emplace_back(itFormRecord->second.formId);
1593                 }
1594                 removedFormIds.emplace_back(itFormRecord->second.formId);
1595                 itFormRecord = formRecords_.erase(itFormRecord);
1596             } else {
1597                 ++itFormRecord;
1598             }
1599         }
1600     }
1601 
1602     // handle tempForms_
1603     if (removedTempForms.size() > 0) {
1604         std::lock_guard<std::mutex> lock(formTempMutex_);
1605         std::vector<int64_t>::iterator itTemp;
1606         for (itTemp = tempForms_.begin();itTemp != tempForms_.end();) {
1607             if (std::find(removedTempForms.begin(), removedTempForms.end(), *itTemp) != removedTempForms.end()) {
1608                 itTemp = tempForms_.erase(itTemp);
1609             } else {
1610                 itTemp++;
1611             }
1612         }
1613     }
1614 }
1615 /**
1616  * @brief Clear form records for st limit value test.
1617  */
ClearFormRecords()1618 void FormDataMgr::ClearFormRecords()
1619 {
1620     {
1621         std::lock_guard<std::mutex> lock(formRecordMutex_);
1622         formRecords_.clear();
1623     }
1624     {
1625         std::lock_guard<std::mutex> lock(formTempMutex_);
1626         tempForms_.clear();
1627     }
1628 }
1629 
1630 /**
1631  * @brief handle get no host invalid temp forms.
1632  * @param userId User ID.
1633  * @param callingUid The UID of the proxy.
1634  * @param matchedFormIds The set of the valid forms.
1635  * @param noHostTempFormsMap The map of the no host forms.
1636  * @param foundFormsMap The map of the found forms.
1637  */
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)1638 void FormDataMgr::GetNoHostInvalidTempForms(int32_t userId, int32_t callingUid, std::set<int64_t> &matchedFormIds,
1639                                             std::map<FormIdKey, std::set<int64_t>> &noHostTempFormsMap,
1640                                             std::map<int64_t, bool> &foundFormsMap)
1641 {
1642     std::lock_guard<std::mutex> lock(formRecordMutex_);
1643     for (auto &formRecordInfo : formRecords_) {
1644         int64_t formId = formRecordInfo.first;
1645         FormRecord &formRecord = formRecordInfo.second;
1646 
1647         // Checks the user id and the temp flag.
1648         if (!formRecord.formTempFlag || (userId != formRecord.providerUserId)) {
1649             continue;
1650         }
1651         // check UID
1652         auto iter = std::find(formRecord.formUserUids.begin(), formRecord.formUserUids.end(), callingUid);
1653         if (iter == formRecord.formUserUids.end()) {
1654             continue;
1655         }
1656         // check valid form set
1657         if (matchedFormIds.find(formId) != matchedFormIds.end()) {
1658             continue;
1659         }
1660 
1661         HILOG_DEBUG("found invalid form:%{public}" PRId64 "", formId);
1662         formRecord.formUserUids.erase(iter);
1663         if (formRecord.formUserUids.empty()) {
1664             FormIdKey formIdKey(formRecord.bundleName, formRecord.abilityName);
1665             auto itIdsSet = noHostTempFormsMap.find(formIdKey);
1666             if (itIdsSet == noHostTempFormsMap.end()) {
1667                 std::set<int64_t> formIdsSet;
1668                 formIdsSet.emplace(formId);
1669                 noHostTempFormsMap.emplace(formIdKey, formIdsSet);
1670             } else {
1671                 itIdsSet->second.emplace(formId);
1672             }
1673         } else {
1674             foundFormsMap.emplace(formId, false);
1675         }
1676     }
1677 }
1678 
1679 /**
1680  * @brief handle delete no host temp forms.
1681  * @param callingUid The UID of the proxy.
1682  * @param noHostTempFormsMap The map of the no host forms.
1683  * @param foundFormsMap The map of the found forms.
1684  */
BatchDeleteNoHostTempForms(int32_t callingUid, std::map<FormIdKey, std::set<int64_t>> &noHostTempFormsMap, std::map<int64_t, bool> &foundFormsMap)1685 void FormDataMgr::BatchDeleteNoHostTempForms(int32_t callingUid, std::map<FormIdKey,
1686                                              std::set<int64_t>> &noHostTempFormsMap,
1687                                              std::map<int64_t, bool> &foundFormsMap)
1688 {
1689     std::set<FormIdKey> removableModuleSet;
1690     for (auto &noHostTempForm : noHostTempFormsMap) {
1691         FormIdKey formIdKey = noHostTempForm.first;
1692         std::set<int64_t> &formIdsSet = noHostTempForm.second;
1693         std::string bundleName = formIdKey.bundleName;
1694         std::string abilityName = formIdKey.abilityName;
1695         FormProviderMgr::GetInstance().NotifyProviderFormsBatchDelete(bundleName, abilityName, formIdsSet);
1696         for (int64_t formId: formIdsSet) {
1697             foundFormsMap.emplace(formId, true);
1698             StopRenderingForm(formId);
1699             DeleteFormRecord(formId);
1700             DeleteTempForm(formId);
1701         }
1702     }
1703 }
1704 
1705 /**
1706  * @brief StopRenderingForm.
1707  * @param formId The form id.
1708  */
StopRenderingForm(int32_t formId)1709 void FormDataMgr::StopRenderingForm(int32_t formId)
1710 {
1711     FormRecord formrecord;
1712     GetFormRecord(formId, formrecord);
1713     FormRenderMgr::GetInstance().StopRenderingForm(formId, formrecord);
1714 }
1715 
1716 /**
1717  * @brief delete invalid temp forms.
1718  * @param userId User ID.
1719  * @param callingUid The UID of the proxy.
1720  * @param matchedFormIds The set of the valid forms.
1721  * @param removedFormsMap The map of the removed invalid forms.
1722  * @return Returns ERR_OK on success, others on failure.
1723  */
DeleteInvalidTempForms(int32_t userId, int32_t callingUid, std::set<int64_t> &matchedFormIds, std::map<int64_t, bool> &removedFormsMap)1724 int32_t FormDataMgr::DeleteInvalidTempForms(int32_t userId, int32_t callingUid, std::set<int64_t> &matchedFormIds,
1725                                             std::map<int64_t, bool> &removedFormsMap)
1726 {
1727     HILOG_INFO("userId:%{public}d, callingUid:%{public}d", userId, callingUid);
1728     std::map<int64_t, bool> foundFormsMap {};
1729     std::map<FormIdKey, std::set<int64_t>> noHostTempFormsMap {};
1730     GetNoHostInvalidTempForms(userId, callingUid, matchedFormIds, noHostTempFormsMap, foundFormsMap);
1731     BatchDeleteNoHostTempForms(callingUid, noHostTempFormsMap, foundFormsMap);
1732     HILOG_DEBUG("foundFormsMap size:%{public}zu", foundFormsMap.size());
1733     HILOG_DEBUG("noHostTempFormsMap size:%{public}zu", noHostTempFormsMap.size());
1734 
1735     if (!foundFormsMap.empty()) {
1736         removedFormsMap.insert(foundFormsMap.begin(), foundFormsMap.end());
1737     }
1738     HILOG_INFO("done");
1739     return ERR_OK;
1740 }
1741 
1742 /**
1743  * @brief delete publish forms temp data
1744  * @param userId User ID.
1745  * @param bundleName BundleName.
1746  * @param validFormIds The set of the valid forms.
1747  */
DeleteInvalidPublishForms(int32_t userId, std::string bundleName, std::set<int64_t> &validFormIds)1748 void FormDataMgr::DeleteInvalidPublishForms(int32_t userId, std::string bundleName, std::set<int64_t> &validFormIds)
1749 {
1750     HILOG_INFO("userId:%{public}d, bundleName:%{public}s", userId, bundleName.c_str());
1751 
1752     int32_t deleteNum = 0;
1753     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1754     for (auto iter = formRequestPublishForms_.begin(); iter != formRequestPublishForms_.end();) {
1755         int64_t formId = iter->first;
1756         // check valid form set
1757         if (validFormIds.find(formId) != validFormIds.end()) {
1758             ++iter;
1759             continue;
1760         }
1761 
1762         Want want = iter->second.first;
1763         if (bundleName != want.GetStringParam(Constants::PARAM_BUNDLE_NAME_KEY)) {
1764             ++iter;
1765             continue;
1766         }
1767         if (userId != want.GetIntParam(Constants::PARAM_FORM_USER_ID, -1)) {
1768             ++iter;
1769             continue;
1770         }
1771         ++deleteNum;
1772         iter = formRequestPublishForms_.erase(iter);
1773     }
1774 
1775     HILOG_INFO("delete num:%{public}d", deleteNum);
1776 }
1777 
1778 /**
1779  * @brief clear host data by invalid forms.
1780  * @param callingUid The UID of the proxy.
1781  * @param removedFormsMap The map of the removed invalid forms.
1782  * @return Returns ERR_OK on success, others on failure.
1783  */
ClearHostDataByInvalidForms(int32_t callingUid, std::map<int64_t, bool> &removedFormsMap)1784 int32_t FormDataMgr::ClearHostDataByInvalidForms(int32_t callingUid, std::map<int64_t, bool> &removedFormsMap)
1785 {
1786     HILOG_INFO("start");
1787     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
1788     std::vector<FormHostRecord>::iterator itHostRecord;
1789     for (itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end();) {
1790         if (itHostRecord->GetCallerUid() != callingUid) {
1791             itHostRecord++;
1792             continue;
1793         }
1794         for (auto &removedForm : removedFormsMap) {
1795             if (itHostRecord->Contains(removedForm.first)) {
1796                 itHostRecord->DelForm(removedForm.first);
1797             }
1798         }
1799         if (itHostRecord->IsEmpty()) {
1800             itHostRecord->CleanResource();
1801             itHostRecord = clientRecords_.erase(itHostRecord);
1802         } else {
1803             itHostRecord++;
1804         }
1805     }
1806     HILOG_INFO("done");
1807     return ERR_OK;
1808 }
1809 
AddRequestPublishFormInfo(int64_t formId, const Want &want, std::unique_ptr<FormProviderData> &formProviderData)1810 ErrCode FormDataMgr::AddRequestPublishFormInfo(int64_t formId, const Want &want,
1811                                                std::unique_ptr<FormProviderData> &formProviderData)
1812 {
1813     HILOG_INFO("formId:%{public}" PRId64, formId);
1814     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1815 
1816     auto insertResult = formRequestPublishForms_.insert(
1817         std::make_pair(formId, std::make_pair(want, std::move(formProviderData))));
1818     if (!insertResult.second) {
1819         HILOG_ERROR("fail emplace requestPublishFormInfo");
1820         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1821     }
1822     return ERR_OK;
1823 }
1824 
RemoveRequestPublishFormInfo(int64_t formId)1825 ErrCode FormDataMgr::RemoveRequestPublishFormInfo(int64_t formId)
1826 {
1827     HILOG_INFO("formId:%{public}" PRId64, formId);
1828     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1829     formRequestPublishForms_.erase(formId);
1830     return ERR_OK;
1831 }
1832 
IsRequestPublishForm(int64_t formId)1833 bool FormDataMgr::IsRequestPublishForm(int64_t formId)
1834 {
1835     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1836     return formRequestPublishForms_.find(formId) != formRequestPublishForms_.end();
1837 }
1838 
GetRequestPublishFormInfo(int64_t formId, Want &want, std::unique_ptr<FormProviderData> &formProviderData)1839 ErrCode FormDataMgr::GetRequestPublishFormInfo(int64_t formId, Want &want,
1840                                                std::unique_ptr<FormProviderData> &formProviderData)
1841 {
1842     HILOG_INFO("formId:%{public}" PRId64, formId);
1843     std::lock_guard<std::mutex> lock(formRequestPublishFormsMutex_);
1844     auto result = formRequestPublishForms_.find(formId);
1845     if (result == formRequestPublishForms_.end()) {
1846         HILOG_INFO("invalid formId:%{public}" PRId64, formId);
1847         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
1848     }
1849 
1850     want = result->second.first;
1851     formProviderData = std::move(result->second.second);
1852     formRequestPublishForms_.erase(result);
1853     return ERR_OK;
1854 }
1855 
GetPackageForm(const FormRecord &record, const BundlePackInfo &bundlePackInfo, AbilityFormInfo &abilityFormInfo)1856 bool FormDataMgr::GetPackageForm(const FormRecord &record, const BundlePackInfo &bundlePackInfo,
1857     AbilityFormInfo &abilityFormInfo)
1858 {
1859     HILOG_INFO("moduleName is %{public}s", record.moduleName.c_str());
1860     std::vector<PackageModule> modules = bundlePackInfo.summary.modules;
1861     for (const auto &cfg : modules) {
1862         HILOG_INFO("try module %{public}s", cfg.distro.moduleName.c_str());
1863         if (record.moduleName != cfg.distro.moduleName) {
1864             continue;
1865         }
1866         HILOG_INFO("has the same module");
1867         std::vector<ModuleAbilityInfo> abilities = cfg.abilities;
1868         std::vector<ExtensionAbilities> extensionAbilities = cfg.extensionAbilities;
1869         if (!abilities.empty()) {
1870             return GetAbilityFormInfo(record, abilities, abilityFormInfo);
1871         }
1872         if (!extensionAbilities.empty()) {
1873             return GetAbilityFormInfo(record, extensionAbilities, abilityFormInfo);
1874         }
1875         HILOG_WARN("no ability in module:%{public}s", record.moduleName.c_str());
1876         return false;
1877     }
1878     return false;
1879 }
1880 
1881 template<typename T>
GetAbilityFormInfo(const FormRecord &record, const std::vector<T> &abilities, AbilityFormInfo &abilityFormInfo)1882 bool FormDataMgr::GetAbilityFormInfo(const FormRecord &record, const std::vector<T> &abilities,
1883     AbilityFormInfo &abilityFormInfo)
1884 {
1885     for (const T &abilityInfo : abilities) {
1886         if (abilityInfo.name != record.abilityName) {
1887             continue;
1888         }
1889         std::vector<AbilityFormInfo> forms = abilityInfo.forms;
1890         for (auto &item : forms) {
1891             if (IsSameForm(record, item)) {
1892                 abilityFormInfo = item;
1893                 HILOG_INFO("find matched abilityFormInfo");
1894                 return true;
1895             }
1896         }
1897     }
1898     HILOG_INFO("no matched abilityFormInfo, module:%{public}s", record.moduleName.c_str());
1899     return false;
1900 }
1901 
IsSameForm(const FormRecord &record, const AbilityFormInfo &abilityFormInfo)1902 bool FormDataMgr::IsSameForm(const FormRecord &record, const AbilityFormInfo &abilityFormInfo)
1903 {
1904     auto dimensionIter = Constants::DIMENSION_MAP.find(static_cast<Constants::Dimension>(record.specification));
1905     if (dimensionIter == Constants::DIMENSION_MAP.end()) {
1906         HILOG_ERROR("valid specification:%{public}d", record.specification);
1907         return false;
1908     }
1909     auto dimension = dimensionIter->second;
1910     auto supportDimensions = abilityFormInfo.supportDimensions;
1911     if (record.formName == abilityFormInfo.name &&
1912         std::find(supportDimensions.begin(), supportDimensions.end(), dimension) != supportDimensions.end()) {
1913         return true;
1914     }
1915 
1916     HILOG_INFO("no same form, record:%{public}s, dimension:%{public}s, abilityFormInfo:%{public}s",
1917         record.formName.c_str(), dimension.c_str(), abilityFormInfo.name.c_str());
1918 
1919     return false;
1920 }
1921 
SetRecordNeedFreeInstall(int64_t formId, bool isNeedFreeInstall)1922 bool FormDataMgr::SetRecordNeedFreeInstall(int64_t formId, bool isNeedFreeInstall)
1923 {
1924     HILOG_INFO("call");
1925     std::lock_guard<std::mutex> lock(formRecordMutex_);
1926     auto item = formRecords_.find(formId);
1927     if (item == formRecords_.end()) {
1928         HILOG_ERROR("invalid formRecord");
1929         return false;
1930     }
1931     item->second.needFreeInstall = isNeedFreeInstall;
1932     HILOG_INFO("successfully");
1933     return true;
1934 }
1935 
CheckInvalidForm(const int64_t formId)1936 ErrCode FormDataMgr::CheckInvalidForm(const int64_t formId)
1937 {
1938     // Checks if the formid is valid.
1939     if (formId <= 0) {
1940         HILOG_ERROR("Invalid form id");
1941         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1942     }
1943 
1944     // Gets the corresponding userId by formId.
1945     FormRecord formRecord;
1946     int64_t matchedFormId = FindMatchedFormId(formId);
1947     if (!GetFormRecord(matchedFormId, formRecord)) {
1948         HILOG_ERROR("No matching formRecord was found for the form id");
1949         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1950     }
1951 
1952     // Checks for cross-user operations.
1953     if (formRecord.providerUserId != FormUtil::GetCurrentAccountId()) {
1954         HILOG_ERROR("The form id corresponds to a card that is not for the currently active user");
1955         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1956     }
1957     return ERR_OK;
1958 }
1959 
FillBasicRunningFormInfoByFormRecord(const FormRecord &formRecord, RunningFormInfo &runningFormInfo)1960 void FormDataMgr::FillBasicRunningFormInfoByFormRecord(const FormRecord &formRecord, RunningFormInfo &runningFormInfo)
1961 {
1962     runningFormInfo.formName = formRecord.formName;
1963     runningFormInfo.dimension = formRecord.specification;
1964     runningFormInfo.bundleName = formRecord.bundleName;
1965     runningFormInfo.moduleName = formRecord.moduleName;
1966     runningFormInfo.abilityName = formRecord.abilityName;
1967     runningFormInfo.description = formRecord.description;
1968     runningFormInfo.formLocation = formRecord.formLocation;
1969     runningFormInfo.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
1970     runningFormInfo.recycleStatus = formRecord.recycleStatus;
1971     runningFormInfo.formBundleType = formRecord.formBundleType;
1972     runningFormInfo.userId = formRecord.userId;
1973 }
1974 
GetRunningFormInfosByFormId(const int64_t formId, RunningFormInfo &runningFormInfo)1975 ErrCode FormDataMgr::GetRunningFormInfosByFormId(const int64_t formId, RunningFormInfo &runningFormInfo)
1976 {
1977     HILOG_DEBUG("start");
1978 
1979     // Checks if the formid is valid.
1980     if (formId <= 0) {
1981         HILOG_ERROR("Invalid form id");
1982         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1983     }
1984 
1985     FormRecord formRecord;
1986     int64_t matchedFormId = FindMatchedFormId(formId);
1987     if (!GetFormRecord(matchedFormId, formRecord)) {
1988         HILOG_ERROR("No matching formRecord was found for the form id");
1989         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1990     }
1991 
1992     if (formRecord.providerUserId != FormUtil::GetCurrentAccountId()) {
1993         HILOG_ERROR("The form id corresponds to a card that is not for the currently active user");
1994         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1995     }
1996 
1997     std::vector<FormHostRecord> formHostRecords;
1998     GetFormHostRecord(matchedFormId, formHostRecords);
1999     if (formHostRecords.empty()) {
2000         HILOG_ERROR("empty clientHost");
2001         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2002     }
2003     runningFormInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
2004     runningFormInfo.formId = matchedFormId;
2005     FillBasicRunningFormInfoByFormRecord(formRecord, runningFormInfo);
2006     runningFormInfo.formUsageState = FormUsageState::USED;
2007 
2008     return ERR_OK;
2009 }
2010 
HandleFormAddObserver(const std::string hostBundleName, const int64_t formId)2011 ErrCode FormDataMgr::HandleFormAddObserver(const std::string hostBundleName, const int64_t formId)
2012 {
2013     HILOG_DEBUG("start");
2014     RunningFormInfo runningFormInfo;
2015     ErrCode ret = GetRunningFormInfosByFormId(formId, runningFormInfo);
2016     if (ret != ERR_OK) {
2017         return ret;
2018     }
2019     // if there is a full observer.
2020     FormObserverRecord::GetInstance().onFormAdd("all", runningFormInfo);
2021     // If there is a listener for the current host.
2022     FormObserverRecord::GetInstance().onFormAdd(hostBundleName, runningFormInfo);
2023     return ERR_OK;
2024 }
2025 
HandleFormRemoveObserver(const std::string hostBundleName, const RunningFormInfo runningFormInfo)2026 ErrCode FormDataMgr::HandleFormRemoveObserver(const std::string hostBundleName, const RunningFormInfo runningFormInfo)
2027 {
2028     HILOG_DEBUG("start");
2029     // if there is a full observer.
2030     FormObserverRecord::GetInstance().onFormRemove("all", runningFormInfo);
2031     // If there is a listener for the current host.
2032     FormObserverRecord::GetInstance().onFormRemove(hostBundleName, runningFormInfo);
2033     return ERR_OK;
2034 }
2035 
GetTempFormsCount(int32_t &formCount)2036 int32_t FormDataMgr::GetTempFormsCount(int32_t &formCount)
2037 {
2038     std::lock_guard<std::mutex> lock(formTempMutex_);
2039     formCount = static_cast<int32_t>(tempForms_.size());
2040     HILOG_DEBUG("current exist %{public}d temp forms in system", formCount);
2041     return ERR_OK;
2042 }
2043 
GetCastFormsCount(int32_t &formCount)2044 int32_t FormDataMgr::GetCastFormsCount(int32_t &formCount)
2045 {
2046     std::lock_guard<std::mutex> lock(formRecordMutex_);
2047     for (const auto &recordPair : formRecords_) {
2048         FormRecord record = recordPair.second;
2049         if (!record.formTempFlag) {
2050             formCount++;
2051         }
2052     }
2053     HILOG_DEBUG("current exist %{public}d cast forms in system", formCount);
2054     return ERR_OK;
2055 }
2056 
GetHostFormsCount(const std::string &bundleName, int32_t &formCount)2057 int32_t FormDataMgr::GetHostFormsCount(const std::string &bundleName, int32_t &formCount)
2058 {
2059     if (bundleName.empty()) {
2060         return ERR_OK;
2061     }
2062     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
2063     for (auto &record : clientRecords_) {
2064         if (record.GetHostBundleName() == bundleName) {
2065             formCount = record.GetFormsCount();
2066             break;
2067         }
2068     }
2069     HILOG_DEBUG("current exist %{public}d cast forms in host", formCount);
2070     return ERR_OK;
2071 }
2072 
GetUnusedFormInstancesByFilter( const FormInstancesFilter &formInstancesFilter, std::vector<FormInstance> &formInstances)2073 void FormDataMgr::GetUnusedFormInstancesByFilter(
2074     const FormInstancesFilter &formInstancesFilter, std::vector<FormInstance> &formInstances)
2075 {
2076     HILOG_DEBUG("call");
2077     std::vector<FormDBInfo> formDBInfos;
2078     FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2079     for (const auto& dbInfo : formDBInfos) {
2080         if (formInstancesFilter.bundleName != dbInfo.bundleName) {
2081             continue;
2082         }
2083         if (!formInstancesFilter.moduleName.empty() && formInstancesFilter.moduleName != dbInfo.moduleName) {
2084             continue;
2085         } else if (!formInstancesFilter.abilityName.empty() && formInstancesFilter.abilityName != dbInfo.abilityName) {
2086             continue;
2087         } else if (!formInstancesFilter.formName.empty() && formInstancesFilter.formName != dbInfo.formName) {
2088             continue;
2089         }
2090         auto item = std::find_if(formInstances.begin(), formInstances.end(),
2091             [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2092         if (item != formInstances.end()) {
2093             continue;
2094         }
2095         FormRecord dbRecord;
2096         ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2097         if (getDbRet != ERR_OK) {
2098             continue;
2099         }
2100         FormInstance instance;
2101         instance.formId = dbInfo.formId;
2102         instance.specification = dbRecord.specification;
2103         instance.formVisiblity = static_cast<FormVisibilityType>(dbRecord.formVisibleNotifyState);
2104         instance.bundleName = dbRecord.bundleName;
2105         instance.moduleName = dbRecord.moduleName;
2106         instance.abilityName = dbRecord.abilityName;
2107         instance.formName = dbRecord.formName;
2108         instance.formUsageState = FormUsageState::UNUSED;
2109         instance.description = dbRecord.description;
2110         if (!dbRecord.formUserUids.empty()) {
2111             auto ret =
2112                 FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), instance.formHostName);
2113             if (ret != ERR_OK) {
2114                 HILOG_ERROR("Get bundleName by uid failed");
2115                 continue;
2116             }
2117             formInstances.emplace_back(instance);
2118         }
2119     }
2120 }
2121 
GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter, std::vector<FormInstance> &formInstances)2122 ErrCode FormDataMgr::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
2123     std::vector<FormInstance> &formInstances)
2124 {
2125     HILOG_DEBUG("get form instances by filter");
2126     std::lock_guard<std::mutex> lock(formRecordMutex_);
2127     std::map<int64_t, FormRecord>::iterator itFormRecord;
2128     if (formInstancesFilter.bundleName.empty()) {
2129         HILOG_ERROR("null formInstancesFilter.bundleName");
2130         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2131     }
2132 
2133     for (itFormRecord = formRecords_.begin(); itFormRecord != formRecords_.end(); itFormRecord++) {
2134         if (formInstancesFilter.bundleName == itFormRecord->second.bundleName) {
2135             bool Needgetformhostrecordflag = true;
2136             if (!formInstancesFilter.moduleName.empty() &&
2137                 formInstancesFilter.moduleName != itFormRecord->second.moduleName) {
2138                 Needgetformhostrecordflag = false;
2139             } else if (!formInstancesFilter.abilityName.empty() &&
2140                 formInstancesFilter.abilityName != itFormRecord->second.abilityName) {
2141                 Needgetformhostrecordflag = false;
2142             } else if (!formInstancesFilter.formName.empty() &&
2143                 formInstancesFilter.formName != itFormRecord->second.formName) {
2144                 Needgetformhostrecordflag = false;
2145             }
2146             std::vector<FormHostRecord> formHostRecords;
2147             GetFormHostRecord(itFormRecord->second.formId, formHostRecords);
2148             if (Needgetformhostrecordflag) {
2149                 FormInstance instance;
2150                 for (auto formHostRecord : formHostRecords) {
2151                     instance.formHostName = formHostRecord.GetHostBundleName();
2152                     instance.formId = itFormRecord->second.formId;
2153                     instance.specification = itFormRecord->second.specification;
2154                     instance.formVisiblity =
2155                         static_cast<FormVisibilityType>(itFormRecord->second.formVisibleNotifyState);
2156                     instance.bundleName = itFormRecord->second.bundleName;
2157                     instance.moduleName = itFormRecord->second.moduleName;
2158                     instance.abilityName = itFormRecord->second.abilityName;
2159                     instance.formName = itFormRecord->second.formName;
2160                     instance.description = itFormRecord->second.description;
2161                     formInstances.emplace_back(instance);
2162                 }
2163             }
2164         }
2165     }
2166     if (formInstancesFilter.isUnusedIncluded) {
2167         GetUnusedFormInstancesByFilter(formInstancesFilter, formInstances);
2168     }
2169     return (formInstances.size() == 0) ? ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED : ERR_OK;
2170 }
2171 
GetFormInstanceById(const int64_t formId, FormInstance &formInstance)2172 ErrCode FormDataMgr::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
2173 {
2174     HILOG_DEBUG("get form instance by formId");
2175     bool isFormRecordsEnd = false;
2176     FormRecord formRecord;
2177     {
2178         std::lock_guard<std::mutex> lock(formRecordMutex_);
2179         if (formId <= 0) {
2180             HILOG_ERROR("invalid formId");
2181             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2182         }
2183         auto info = formRecords_.find(formId);
2184         isFormRecordsEnd = info == formRecords_.end();
2185         if (!isFormRecordsEnd) {
2186             formRecord = info->second;
2187         }
2188     }
2189     if (!isFormRecordsEnd) {
2190         std::vector<FormHostRecord> formHostRecords;
2191         GetFormHostRecord(formId, formHostRecords);
2192         if (formHostRecords.empty()) {
2193             HILOG_ERROR("empty clientHost");
2194             return ERR_APPEXECFWK_FORM_COMMON_CODE;
2195         }
2196         formInstance.formHostName = formHostRecords.begin()->GetHostBundleName();
2197         formInstance.formId = formRecord.formId;
2198         formInstance.specification = formRecord.specification;
2199         formInstance.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2200         formInstance.bundleName = formRecord.bundleName;
2201         formInstance.moduleName = formRecord.moduleName;
2202         formInstance.abilityName = formRecord.abilityName;
2203         formInstance.formName = formRecord.formName;
2204         formInstance.userId = formRecord.userId;
2205     } else {
2206         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2207     }
2208     HILOG_DEBUG("get form instance successfully");
2209     return ERR_OK;
2210 }
2211 
GetUnusedFormInstanceById(const int64_t formId, FormInstance &formInstance)2212 ErrCode FormDataMgr::GetUnusedFormInstanceById(const int64_t formId, FormInstance &formInstance)
2213 {
2214     HILOG_DEBUG("call");
2215     FormRecord dbRecord;
2216     ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
2217     if (getDbRet != ERR_OK) {
2218         HILOG_ERROR("Get formRecord by formId failed");
2219         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2220     }
2221     if (dbRecord.formUserUids.empty()) {
2222         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2223     }
2224     auto ret =
2225         FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), formInstance.formHostName);
2226     if (ret != ERR_OK) {
2227         HILOG_ERROR("Get bundleName by uid failed");
2228         return ret;
2229     }
2230     formInstance.formId = formId;
2231     formInstance.specification = dbRecord.specification;
2232     formInstance.formVisiblity = static_cast<FormVisibilityType>(dbRecord.formVisibleNotifyState);
2233     formInstance.bundleName = dbRecord.bundleName;
2234     formInstance.moduleName = dbRecord.moduleName;
2235     formInstance.abilityName = dbRecord.abilityName;
2236     formInstance.formName = dbRecord.formName;
2237     formInstance.formUsageState = FormUsageState::UNUSED;
2238     formInstance.description = dbRecord.description;
2239     formInstance.userId = dbRecord.userId;
2240     return ERR_OK;
2241 }
2242 
GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)2243 ErrCode FormDataMgr::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
2244 {
2245     HILOG_DEBUG("get form instance by formId");
2246     if (formId <= 0) {
2247         HILOG_ERROR("invalid formId");
2248         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2249     }
2250     FormRecord formRecord;
2251     std::vector<FormHostRecord> formHostRecords;
2252     {
2253         std::lock_guard<std::mutex> lock(formRecordMutex_);
2254         auto info = formRecords_.find(formId);
2255         if (info != formRecords_.end()) {
2256             formRecord = info->second;
2257             GetFormHostRecord(formId, formHostRecords);
2258         }
2259     }
2260     ErrCode ret = ERR_OK;
2261     if (!formHostRecords.empty()) {
2262         formInstance.formHostName = formHostRecords.begin()->GetHostBundleName();
2263         formInstance.formId = formRecord.formId;
2264         formInstance.specification = formRecord.specification;
2265         formInstance.formVisiblity = static_cast<FormVisibilityType>(formRecord.formVisibleNotifyState);
2266         formInstance.bundleName = formRecord.bundleName;
2267         formInstance.moduleName = formRecord.moduleName;
2268         formInstance.abilityName = formRecord.abilityName;
2269         formInstance.formName = formRecord.formName;
2270         formInstance.formUsageState = FormUsageState::USED;
2271         formInstance.description = formRecord.description;
2272         formInstance.userId = formRecord.userId;
2273     } else if (isUnusedIncluded) {
2274         ret = GetUnusedFormInstanceById(formId, formInstance);
2275     } else {
2276         ret = ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2277     }
2278     HILOG_DEBUG("End");
2279     return ret;
2280 }
2281 
GetUnusedFormInfos(std::vector<RunningFormInfo> &runningFormInfos)2282 void FormDataMgr::GetUnusedFormInfos(std::vector<RunningFormInfo> &runningFormInfos)
2283 {
2284     HILOG_DEBUG("call");
2285     std::vector<FormDBInfo> formDBInfos;
2286     FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2287     for (const auto& dbInfo : formDBInfos) {
2288         auto item = std::find_if(runningFormInfos.begin(), runningFormInfos.end(),
2289             [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2290         if (item != runningFormInfos.end()) {
2291             continue;
2292         }
2293         FormRecord dbRecord;
2294         ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2295         if (getDbRet != ERR_OK) {
2296             continue;
2297         }
2298         RunningFormInfo info;
2299         info.formId = dbInfo.formId;
2300         FillBasicRunningFormInfoByFormRecord(dbRecord, info);
2301         info.formUsageState = FormUsageState::UNUSED;
2302         if (!dbRecord.formUserUids.empty()) {
2303             auto ret =
2304                 FormBmsHelper::GetInstance().GetBundleNameByUid(*dbRecord.formUserUids.begin(), info.hostBundleName);
2305             if (ret != ERR_OK) {
2306                 HILOG_ERROR("Get bundleName by uid failed");
2307                 continue;
2308             }
2309             runningFormInfos.emplace_back(info);
2310         }
2311     }
2312 }
2313 
GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)2314 ErrCode FormDataMgr::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
2315 {
2316     HILOG_DEBUG("start");
2317     std::lock_guard<std::mutex> lock(formRecordMutex_);
2318     for (auto record : formRecords_) {
2319         if ((!record.second.formTempFlag) &&
2320             ((FormUtil::GetCurrentAccountId() == record.second.providerUserId) ||
2321             (record.second.providerUserId == Constants::DEFAULT_USER_ID))) {
2322             RunningFormInfo info;
2323             info.formId = record.first;
2324             FillBasicRunningFormInfoByFormRecord(record.second, info);
2325             info.formUsageState = FormUsageState::USED;
2326             std::vector<FormHostRecord> formHostRecords;
2327             GetFormHostRecord(record.first, formHostRecords);
2328             if (formHostRecords.empty()) {
2329                 HILOG_ERROR("Get form host failed");
2330                 continue;
2331             }
2332             info.hostBundleName = formHostRecords.begin()->GetHostBundleName();
2333             runningFormInfos.emplace_back(info);
2334         }
2335     }
2336     if (isUnusedIncluded) {
2337         GetUnusedFormInfos(runningFormInfos);
2338     }
2339     return ERR_OK;
2340 }
2341 
GetUnusedFormInfos(const std::string &bundleName, std::vector<RunningFormInfo> &runningFormInfos)2342 void FormDataMgr::GetUnusedFormInfos(const std::string &bundleName, std::vector<RunningFormInfo> &runningFormInfos)
2343 {
2344     HILOG_DEBUG("call");
2345     std::vector<FormDBInfo> formDBInfos;
2346     FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
2347     for (const auto& dbInfo : formDBInfos) {
2348         auto item = std::find_if(runningFormInfos.begin(), runningFormInfos.end(),
2349             [&dbInfo](const auto &it) { return it.formId == dbInfo.formId; });
2350         if (item != runningFormInfos.end()) {
2351             continue;
2352         }
2353         for (auto uid : dbInfo.formUserUids) {
2354             std::string hostBundleName = "";
2355             auto ret = FormBmsHelper::GetInstance().GetBundleNameByUid(uid, hostBundleName);
2356             if (ret != ERR_OK) {
2357                 HILOG_ERROR("Get bundleName by uid failed");
2358                 continue;
2359             }
2360             if (hostBundleName != bundleName) {
2361                 continue;
2362             }
2363             FormRecord dbRecord;
2364             ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(dbInfo.formId, dbRecord);
2365             if (getDbRet != ERR_OK) {
2366                 continue;
2367             }
2368             RunningFormInfo info;
2369             info.formId = dbInfo.formId;
2370             info.hostBundleName = bundleName;
2371             FillBasicRunningFormInfoByFormRecord(dbRecord, info);
2372             info.formUsageState = FormUsageState::UNUSED;
2373             runningFormInfos.emplace_back(info);
2374         }
2375     }
2376 }
2377 
GetRunningFormInfosByBundleName( const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)2378 ErrCode FormDataMgr::GetRunningFormInfosByBundleName(
2379     const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
2380 {
2381     HILOG_DEBUG("start");
2382 
2383     if (bundleName.empty()) {
2384         HILOG_ERROR("empty bundleName");
2385         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2386     }
2387 
2388     std::lock_guard<std::mutex> lock(formRecordMutex_);
2389     for (auto record : formRecords_) {
2390         std::vector<FormHostRecord> formHostRecords;
2391         GetFormHostRecord(record.first, formHostRecords);
2392         if (formHostRecords.empty()) {
2393             HILOG_WARN("Form has released in host, formId = %{public}" PRId64, record.first);
2394             continue;
2395         }
2396         auto hostBundleName = formHostRecords.begin()->GetHostBundleName();
2397         bool flag = (!record.second.formTempFlag) &&
2398             ((FormUtil::GetCurrentAccountId() == record.second.providerUserId) ||
2399             (record.second.providerUserId == Constants::DEFAULT_USER_ID));
2400         if (hostBundleName == bundleName && flag) {
2401             RunningFormInfo info;
2402             info.formId = record.first;
2403             info.hostBundleName = bundleName;
2404             FillBasicRunningFormInfoByFormRecord(record.second, info);
2405             info.formUsageState = FormUsageState::USED;
2406             runningFormInfos.emplace_back(info);
2407         }
2408     }
2409     if (isUnusedIncluded) {
2410         GetUnusedFormInfos(bundleName, runningFormInfos);
2411     }
2412     HILOG_DEBUG(
2413         "bundleName is %{public}s, runningFormInfo.size = %{public}zu", bundleName.c_str(), runningFormInfos.size());
2414     if (runningFormInfos.size() == 0) {
2415         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2416     }
2417     return ERR_OK;
2418 }
2419 
UpdateFormCloudUpdateDuration(const std::string &bundleName, int duration)2420 void FormDataMgr::UpdateFormCloudUpdateDuration(const std::string &bundleName, int duration)
2421 {
2422     HILOG_INFO("bundleName:%{public}s, duration:%{public}d", bundleName.c_str(), duration);
2423     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2424     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2425     if (iter != formCloudUpdateDurationMap_.end()) {
2426         iter->second = duration;
2427         return;
2428     }
2429     formCloudUpdateDurationMap_.emplace(bundleName, duration);
2430 }
2431 
RemoveFormCloudUpdateDuration(const std::string &bundleName)2432 void FormDataMgr::RemoveFormCloudUpdateDuration(const std::string &bundleName)
2433 {
2434     HILOG_DEBUG("call");
2435     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2436     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2437     if (iter != formCloudUpdateDurationMap_.end()) {
2438         HILOG_INFO("bundleName:%{public}s", bundleName.c_str());
2439         formCloudUpdateDurationMap_.erase(bundleName);
2440     }
2441 }
2442 
GetFormCloudUpdateDuration(const std::string &bundleName) const2443 int FormDataMgr::GetFormCloudUpdateDuration(const std::string &bundleName) const
2444 {
2445     HILOG_DEBUG("call");
2446     int duration = 0;
2447     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2448     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2449     if (iter != formCloudUpdateDurationMap_.end()) {
2450         duration = iter->second;
2451         HILOG_INFO("%{public}s has form cloud update duration:%{public}d", bundleName.c_str(), duration);
2452     }
2453     return duration;
2454 }
2455 
HasFormCloudUpdateDuration(const std::string &bundleName) const2456 bool FormDataMgr::HasFormCloudUpdateDuration(const std::string &bundleName) const
2457 {
2458     HILOG_DEBUG("call");
2459     std::lock_guard<std::mutex> lock(formCloudUpdateDurationMapMutex_);
2460     auto iter = formCloudUpdateDurationMap_.find(bundleName);
2461     if (iter != formCloudUpdateDurationMap_.end()) {
2462         HILOG_INFO("Has cloud update duration, bundleName:%{public}s", bundleName.c_str());
2463         return true;
2464     }
2465     HILOG_INFO("Not has cloud update duration, bundleName:%{public}s", bundleName.c_str());
2466     return false;
2467 }
2468 
UpdateFormLocation(const int64_t &formId, const int32_t &formLocation)2469 ErrCode FormDataMgr::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation)
2470 {
2471     std::lock_guard<std::mutex> lock(formRecordMutex_);
2472     auto info = formRecords_.find(formId);
2473     if (info == formRecords_.end()) {
2474         HILOG_INFO("form info not find, formId:%{public}" PRId64 " formLocation:%{public}d",
2475             formId, formLocation);
2476         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2477     }
2478     info->second.formLocation = (Constants::FormLocation)formLocation;
2479     HILOG_INFO("success, formId:%{public}" PRId64 " formLocation:%{public}d",
2480         formId, formLocation);
2481     return ERR_OK;
2482 }
2483 
GetRecordsByFormType(const int32_t formRefreshType, std::vector<FormRecord> &visibleFormRecords, std::vector<FormRecord> &invisibleFormRecords)2484 ErrCode FormDataMgr::GetRecordsByFormType(const int32_t formRefreshType,
2485     std::vector<FormRecord> &visibleFormRecords, std::vector<FormRecord> &invisibleFormRecords)
2486 {
2487     HILOG_INFO("formRefreshType:%{public}d", formRefreshType);
2488     std::lock_guard<std::mutex> lock(formRecordMutex_);
2489     for (auto formRecord : formRecords_) {
2490         if (!FormTrustMgr::GetInstance().IsTrust(formRecord.second.bundleName)) {
2491             HILOG_ERROR("ignore,%{public}s is unTrust.", formRecord.second.bundleName.c_str());
2492             continue;
2493         }
2494         if (FormBundleForbidMgr::GetInstance().IsBundleForbidden(formRecord.second.bundleName)) {
2495             HILOG_ERROR("ignore,%{public}s is forbidden.", formRecord.second.bundleName.c_str());
2496             continue;
2497         }
2498         if (formRefreshType == Constants::REFRESH_APP_FORM) {
2499             if (formRecord.second.formBundleType != BundleType::APP) {
2500                 continue;
2501             }
2502         } else if (formRefreshType == Constants::REFRESH_ATOMIC_FORM) {
2503             if (formRecord.second.formBundleType != BundleType::ATOMIC_SERVICE) {
2504                 continue;
2505             }
2506         } else if (formRefreshType == Constants::REFRESH_SYSTEMAPP_FORM) {
2507             if (!formRecord.second.isSystemApp) {
2508                 continue;
2509             }
2510         }
2511         if (formRecord.second.formVisibleNotifyState == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
2512             visibleFormRecords.emplace_back(formRecord.second);
2513             continue;
2514         }
2515         invisibleFormRecords.emplace_back(formRecord.second);
2516     }
2517     return ERR_OK;
2518 }
2519 
SetFormEnable(const int64_t formId, const bool enable)2520 ErrCode FormDataMgr::SetFormEnable(const int64_t formId, const bool enable)
2521 {
2522     std::lock_guard<std::mutex> lock(formRecordMutex_);
2523     auto itFormRecord = formRecords_.find(formId);
2524     if (itFormRecord == formRecords_.end()) {
2525         HILOG_ERROR("form info not find");
2526         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2527     }
2528     itFormRecord->second.enableForm = enable;
2529     HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d", formId, enable);
2530     return ERR_OK;
2531 }
2532 
SetRefreshDuringDisableForm(const int64_t formId, const bool enable)2533 ErrCode FormDataMgr::SetRefreshDuringDisableForm(const int64_t formId, const bool enable)
2534 {
2535     std::lock_guard<std::mutex> lock(formRecordMutex_);
2536     auto itFormRecord = formRecords_.find(formId);
2537     if (itFormRecord == formRecords_.end()) {
2538         HILOG_ERROR("form info not find");
2539         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2540     }
2541     itFormRecord->second.isRefreshDuringDisableForm = enable;
2542     HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d",
2543         formId, enable);
2544     return ERR_OK;
2545 }
2546 
SetUpdateDuringDisableForm(const int64_t formId, const bool enable)2547 ErrCode FormDataMgr::SetUpdateDuringDisableForm(const int64_t formId, const bool enable)
2548 {
2549     std::lock_guard<std::mutex> lock(formRecordMutex_);
2550     auto itFormRecord = formRecords_.find(formId);
2551     if (itFormRecord == formRecords_.end()) {
2552         HILOG_ERROR("form info not find");
2553         return ERR_APPEXECFWK_FORM_INVALID_FORM_ID;
2554     }
2555     itFormRecord->second.isUpdateDuringDisableForm = enable;
2556     HILOG_INFO("formId:%{public}" PRId64 " enable:%{public}d",
2557         formId, enable);
2558     return ERR_OK;
2559 }
2560 
EnableForms(const std::vector<FormRecord> &&formRecords, const bool enable)2561 void FormDataMgr::EnableForms(const std::vector<FormRecord> &&formRecords, const bool enable)
2562 {
2563     HILOG_INFO("start");
2564     std::lock_guard<std::mutex> lock(formHostRecordMutex_);
2565     for (auto itHostRecord = clientRecords_.begin(); itHostRecord != clientRecords_.end(); itHostRecord++) {
2566         std::vector<int64_t> matchedFormIds;
2567         for (auto formRecord : formRecords) {
2568             if (itHostRecord->Contains(formRecord.formId)) {
2569                 matchedFormIds.emplace_back(formRecord.formId);
2570             }
2571         }
2572         if (!matchedFormIds.empty()) {
2573             itHostRecord->OnEnableForms(matchedFormIds, enable);
2574         }
2575     }
2576 }
2577 
GetFormIdsByUserId(int32_t userId, std::vector<int64_t> &formIds)2578 void FormDataMgr::GetFormIdsByUserId(int32_t userId, std::vector<int64_t> &formIds)
2579 {
2580     std::lock_guard<std::mutex> lock(formRecordMutex_);
2581     for (auto formRecord : formRecords_) {
2582         if (formRecord.second.userId == userId) {
2583             formIds.emplace_back(formRecord.second.formId);
2584         }
2585     }
2586     HILOG_INFO("userId:%{public}d, size:%{public}zu", userId, formIds.size());
2587 }
2588 }  // namespace AppExecFwk
2589 }  // namespace OHOS
2590