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