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