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