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