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