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