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