1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "form_mgr_adapter.h"
17
18 #include <cinttypes>
19 #include <regex>
20 #include <unordered_set>
21
22 #include "ability_manager_errors.h"
23 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
24 #include "bundle_active_client.h"
25 #endif
26 #ifdef SUPPORT_ERMS
27 #include "erms_mgr_interface.h"
28 #endif
29 #include "fms_log_wrapper.h"
30 #include "form_acquire_connection.h"
31 #include "form_acquire_data_connection.h"
32 #include "form_acquire_state_connection.h"
33 #include "form_ams_helper.h"
34 #include "form_background_connection.h"
35 #include "form_bms_helper.h"
36 #include "form_cache_mgr.h"
37 #include "form_cast_temp_connection.h"
38 #include "form_constants.h"
39 #include "form_data_mgr.h"
40 #include "form_data_proxy_mgr.h"
41 #include "form_db_cache.h"
42 #include "form_db_info.h"
43 #include "form_dump_mgr.h"
44 #include "form_event_notify_connection.h"
45 #include "form_info_mgr.h"
46 #include "form_mgr_errors.h"
47 #include "form_publish_interceptor_interface.h"
48 #include "form_observer_record.h"
49 #include "form_provider_info.h"
50 #include "form_provider_interface.h"
51 #include "form_provider_mgr.h"
52 #include "form_render_connection.h"
53 #include "form_render_mgr.h"
54 #include "form_share_mgr.h"
55 #include "form_supply_callback.h"
56 #include "form_timer_mgr.h"
57 #include "form_trust_mgr.h"
58 #include "form_util.h"
59 #include "hitrace_meter.h"
60 #include "if_system_ability_manager.h"
61 #include "in_process_call_wrapper.h"
62 #include "ipc_skeleton.h"
63 #include "iservice_registry.h"
64 #include "js_form_state_observer_interface.h"
65 #include "nlohmann/json.hpp"
66 #include "os_account_manager.h"
67 #include "system_ability_definition.h"
68
69 namespace OHOS {
70 namespace AppExecFwk {
71 #ifdef SUPPORT_ERMS
72 using namespace OHOS::EcologicalRuleMgrService;
73 #endif
74 namespace {
75 constexpr int32_t CALLING_UID_TRANSFORM_DIVISOR = 200000;
76 constexpr int32_t SYSTEM_UID = 1000;
77 const std::string POINT_ETS = ".ets";
78
79 const std::string EMPTY_BUNDLE = "";
80 } // namespace
81
FormMgrAdapter()82 FormMgrAdapter::FormMgrAdapter()
83 {
84 }
~FormMgrAdapter()85 FormMgrAdapter::~FormMgrAdapter()
86 {
87 }
88 /**
89 * @brief Add form with want, send want to form manager service.
90 * @param formId The Id of the forms to add.
91 * @param want The want of the form to add.
92 * @param callerToken Caller ability token.
93 * @param formInfo Form info.
94 * @return Returns ERR_OK on success, others on failure.
95 */
AddForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo)96 int FormMgrAdapter::AddForm(const int64_t formId, const Want &want,
97 const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo)
98 {
99 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
100 HILOG_DEBUG("called.");
101 if (formId < 0 || callerToken == nullptr) {
102 HILOG_ERROR("fail, callerToken can not be NULL");
103 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
104 }
105
106 // check form count limit
107 bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
108 int callingUid = IPCSkeleton::GetCallingUid();
109 int checkCode = 0;
110 auto ret = 0;
111 if (tempFormFlag && !FormRenderMgr::GetInstance().IsRerenderForRenderServiceDied(formId)) {
112 if (formId > 0) {
113 HILOG_ERROR("fail, temp form id is invalid, formId:%{public}" PRId64 "", formId);
114 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
115 }
116 checkCode = FormDataMgr::GetInstance().CheckTempEnoughForm();
117 } else {
118 if (formId == 0) {
119 // get current userId
120 int32_t currentUserId = GetCurrentUserId(callingUid);
121 checkCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, currentUserId);
122 }
123 }
124 if (checkCode != 0) {
125 HILOG_ERROR("fail, too much forms in system");
126 return checkCode;
127 }
128
129 // get from config info
130 FormItemInfo formItemInfo;
131 int32_t errCode = GetFormConfigInfo(want, formItemInfo);
132 if (errCode != ERR_OK) {
133 HILOG_ERROR("fail, get form config info failed.");
134 return errCode;
135 }
136 formItemInfo.SetFormId(formId);
137 if (!FormTrustMgr::GetInstance().IsTrust(formItemInfo.GetProviderBundleName())) {
138 HILOG_ERROR("AddForm fail, %{public}s is unTrust",
139 formItemInfo.GetProviderBundleName().c_str());
140 return ERR_APPEXECFWK_FORM_NOT_TRUST;
141 }
142
143 // publish form
144 if (formId > 0 && FormDataMgr::GetInstance().IsRequestPublishForm(formId)) {
145 ret = AddRequestPublishForm(formItemInfo, want, callerToken, formInfo);
146 if (ret != ERR_OK) {
147 HILOG_ERROR("failed, add request publish form failed.");
148 return ret;
149 }
150 if (!tempFormFlag && (ret == ERR_OK)) {
151 HILOG_DEBUG("Checks if there is a listener listening for adding form");
152 HandleFormAddObserver(formInfo.formId);
153 }
154 }
155
156 Want newWant(want);
157 // in application form
158 if (formItemInfo.GetProviderBundleName() == formItemInfo.GetHostBundleName()) {
159 HILOG_DEBUG("form in application");
160 newWant.SetParam(Constants::PARAM_FORM_HOST_TOKEN, callerToken);
161 }
162
163 WantParams wantParams = newWant.GetParams();
164 // share form
165 if (formId == 0 && DelayedSingleton<FormShareMgr>::GetInstance()->IsShareForm(newWant)) {
166 DelayedSingleton<FormShareMgr>::GetInstance()->AddProviderData(newWant, wantParams);
167 }
168 //Specify the form Id
169 bool specificFormFlag = false;
170 if (want.HasParameter(Constants::PARAM_FORM_MIGRATE_FORM_KEY)) {
171 specificFormFlag = want.GetBoolParam(Constants::PARAM_FORM_MIGRATE_FORM_KEY, false);
172 wantParams.Remove(Constants::PARAM_FORM_MIGRATE_FORM_KEY);
173 }
174 if (formId > 0) {
175 if (specificFormFlag) {
176 ret = AllotFormBySpecificId(formItemInfo, callerToken, wantParams, formInfo);
177 } else {
178 ret = AllotFormById(formItemInfo, callerToken, wantParams, formInfo);
179 }
180 } else {
181 ret = AllotFormByInfo(formItemInfo, callerToken, wantParams, formInfo);
182 if (!tempFormFlag && (ret == ERR_OK)) {
183 HILOG_DEBUG("Checks if there is a listener listening for adding form");
184 HandleFormAddObserver(formInfo.formId);
185 }
186 }
187
188 if (ret != ERR_OK) {
189 HILOG_ERROR("failed, allot form failed.");
190 return ret;
191 }
192
193 return ret;
194 }
195
HandleFormAddObserver(const int64_t formId)196 ErrCode FormMgrAdapter::HandleFormAddObserver(const int64_t formId)
197 {
198 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
199 std::string hostBundleName;
200 auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
201 if (ret != ERR_OK) {
202 HILOG_ERROR("failed to get BundleName");
203 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
204 }
205
206 // Checks if there is a observer on the current host.
207 return FormDataMgr::GetInstance().HandleFormAddObserver(hostBundleName, formId);
208 }
209
HandleFormRemoveObserver(const RunningFormInfo runningFormInfo)210 ErrCode FormMgrAdapter::HandleFormRemoveObserver(const RunningFormInfo runningFormInfo)
211 {
212 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
213 std::string hostBundleName;
214 auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
215 if (ret != ERR_OK) {
216 HILOG_ERROR("failed to get BundleName");
217 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
218 }
219
220 // Checks if there is a observer on the current host.
221 return FormDataMgr::GetInstance().HandleFormRemoveObserver(hostBundleName, runningFormInfo);
222 }
223
224 /**
225 * @brief Delete forms with formIds, send formIds to form manager service.
226 * @param formId The Id of the forms to delete.
227 * @param callerToken Caller ability token.
228 * @return Returns ERR_OK on success, others on failure.
229 */
DeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)230 int FormMgrAdapter::DeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
231 {
232 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
233 if (formId <= 0 || callerToken == nullptr) {
234 HILOG_ERROR("%{public}s, deleteForm invalid param", __func__);
235 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
236 }
237
238 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
239 // remove connection for in application form
240 FormSupplyCallback::GetInstance()->RemoveConnection(matchedFormId, callerToken);
241 FormDataProxyMgr::GetInstance().UnsubscribeFormData(matchedFormId);
242 if (FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
243 // delete temp form if receive delete form call
244 return HandleDeleteTempForm(matchedFormId, callerToken);
245 }
246 RunningFormInfo runningFormInfo;
247 FormDataMgr::GetInstance().GetRunningFormInfosByFormId(matchedFormId, runningFormInfo);
248 auto ret = HandleDeleteForm(matchedFormId, callerToken);
249 if (ret != ERR_OK) {
250 HILOG_ERROR("delete form failed.");
251 return ret;
252 }
253 HILOG_DEBUG("Checks if there is a listener listening for release form");
254 HandleFormRemoveObserver(runningFormInfo);
255 return ERR_OK;
256 }
257
258 /**
259 * @brief Stop rendering form.
260 * @param formId The Id of the forms to delete.
261 * @param compId The compId of the forms to delete.
262 * @return Returns ERR_OK on success, others on failure.
263 */
StopRenderingForm(const int64_t formId,const std::string & compId)264 int FormMgrAdapter::StopRenderingForm(const int64_t formId, const std::string &compId)
265 {
266 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
267 if (formId <= 0 || compId.empty()) {
268 HILOG_ERROR("%{public}s, deleteForm invalid param", __func__);
269 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
270 }
271
272 FormRecord record;
273 FormDataMgr::GetInstance().GetFormRecord(formId, record);
274 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, compId);
275 return ERR_OK;
276 }
277
278 /**
279 * @brief Release forms with formIds, send formIds to form Mgr service.
280 * @param formId The Id of the forms to release.
281 * @param callerToken Caller ability token.
282 * @param delCache Delete Cache or not.
283 * @return Returns ERR_OK on success, others on failure.
284 */
ReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const bool delCache)285 int FormMgrAdapter::ReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const bool delCache)
286 {
287 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
288 HILOG_INFO("%{public}s called.", __func__);
289 if (formId <= 0 || callerToken == nullptr) {
290 HILOG_ERROR("%{public}s, releaseForm invalid param", __func__);
291 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
292 }
293 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
294 // remove connection for in application form
295 FormSupplyCallback::GetInstance()->RemoveConnection(matchedFormId, callerToken);
296 if (FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
297 // delete temp form if receive release form call
298 return HandleDeleteTempForm(matchedFormId, callerToken);
299 }
300 FormRecord record;
301 FormDataMgr::GetInstance().GetFormRecord(formId, record);
302 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
303 FormRecord dbRecord;
304 if (FormDbCache::GetInstance().GetDBRecord(matchedFormId, dbRecord) != ERR_OK) {
305 HILOG_ERROR("%{public}s, not exist such db form:%{public}" PRId64 "", __func__, formId);
306 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
307 }
308 int callingUid = IPCSkeleton::GetCallingUid();
309 bool isSelfDbFormId = (FormUtil::GetCurrentAccountId() == dbRecord.providerUserId) &&
310 ((std::find(dbRecord.formUserUids.begin(), dbRecord.formUserUids.end(), callingUid)
311 != dbRecord.formUserUids.end()) ? true : false);
312 if (!isSelfDbFormId) {
313 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
314 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
315 }
316 if (delCache) {
317 ErrCode result = HandleReleaseForm(matchedFormId, callerToken);
318 if (result != ERR_OK) {
319 HILOG_ERROR("%{public}s, release form error.", __func__);
320 return result;
321 }
322 }
323
324 if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, matchedFormId)) {
325 HILOG_ERROR("%{public}s, failed to remove host record", __func__);
326 return ERR_APPEXECFWK_FORM_COMMON_CODE;
327 }
328 if (!FormTimerMgr::GetInstance().RemoveFormTimer(matchedFormId)) {
329 HILOG_ERROR("%{public}s, remove timer error", __func__);
330 return ERR_APPEXECFWK_FORM_COMMON_CODE;
331 }
332 return ERR_OK;
333 }
334
335 /**
336 * @brief Handle release form.
337 * @param formId The form id.
338 * @param callerToken Caller ability token.
339 * @return Returns ERR_OK on success, others on failure.
340 */
HandleReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)341 ErrCode FormMgrAdapter::HandleReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
342 {
343 HILOG_INFO("%{public}s called.", __func__);
344 if (!FormDataMgr::GetInstance().ExistFormRecord(formId)) {
345 HILOG_ERROR("%{public}s, not exist such db or temp form:%{public}" PRId64 "", __func__, formId);
346 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
347 }
348
349 FormHostRecord hostRecord;
350 bool hasRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, hostRecord);
351 bool isSelfId = hasRecord && hostRecord.Contains(formId);
352 if (!isSelfId) {
353 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
354 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
355 }
356
357 HILOG_DEBUG("%{public}s, release formRecords, formId: %{public}" PRId64 "", __func__, formId);
358 FormDataMgr::GetInstance().DeleteFormUserUid(formId, IPCSkeleton::GetCallingUid());
359 if (!FormDataMgr::GetInstance().HasFormUserUids(formId)) {
360 FormDataMgr::GetInstance().DeleteFormRecord(formId);
361 if (!FormTimerMgr::GetInstance().RemoveFormTimer(formId)) {
362 HILOG_ERROR("%{public}s, remove timer error", __func__);
363 return ERR_APPEXECFWK_FORM_COMMON_CODE;
364 }
365 }
366 return ERR_OK;
367 }
368
369 /**
370 * @brief Handle delete form.
371 * @param formId The form id.
372 * @param callerToken Caller ability token.
373 * @return Returns ERR_OK on success, others on failure.
374 */
HandleDeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)375 ErrCode FormMgrAdapter::HandleDeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
376 {
377 HILOG_DEBUG("called.");
378 FormRecord dbRecord;
379 if (FormDbCache::GetInstance().GetDBRecord(formId, dbRecord) != ERR_OK) {
380 HILOG_ERROR("%{public}s, not exist such db form:%{public}" PRId64 "", __func__, formId);
381 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
382 }
383 FormRecord record;
384 FormDataMgr::GetInstance().GetFormRecord(formId, record);
385 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
386 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
387 DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
388 record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_REMOVED);
389 #endif
390 int callingUid = IPCSkeleton::GetCallingUid();
391 int32_t userId = FormUtil::GetCurrentAccountId();
392 bool isSelfDbFormId = (userId == dbRecord.providerUserId) && ((std::find(dbRecord.formUserUids.begin(),
393 dbRecord.formUserUids.end(), callingUid) != dbRecord.formUserUids.end()) ? true : false);
394 if (!isSelfDbFormId) {
395 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 ", callingUid:%{public}d",
396 __func__, formId, callingUid);
397 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
398 }
399
400 ErrCode result = HandleDeleteFormCache(dbRecord, callingUid, formId);
401 if (result != ERR_OK) {
402 return result;
403 }
404
405 if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, formId)) {
406 HILOG_ERROR("%{public}s, failed to remove host record", __func__);
407 return ERR_APPEXECFWK_FORM_COMMON_CODE;
408 }
409
410 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
411 DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
412 #endif
413 return ERR_OK;
414 }
415
416 /**
417 * @brief Handle delete temp form.
418 * @param formId The form id.
419 * @param callerToken Caller ability token.
420 * @return Returns ERR_OK on success, others on failure.
421 */
HandleDeleteTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)422 ErrCode FormMgrAdapter::HandleDeleteTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
423 {
424 HILOG_INFO("%{public}s called.", __func__);
425 int uid = IPCSkeleton::GetCallingUid();
426 FormRecord record;
427 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, record);
428 bool isSelfTempFormId = false;
429 if (isFormRecExist && record.formTempFlag) {
430 isSelfTempFormId = (FormUtil::GetCurrentAccountId() == record.providerUserId) &&
431 ((std::find(record.formUserUids.begin(), record.formUserUids.end(), uid) !=
432 record.formUserUids.end()) ? true : false);
433 }
434 if (!isSelfTempFormId) {
435 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
436 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
437 }
438 FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
439 FormDataMgr::GetInstance().DeleteFormUserUid(formId, uid);
440 if (!FormDataMgr::GetInstance().HasFormUserUids(formId)) {
441 int result = FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, record);
442 if (result != ERR_OK) {
443 HILOG_ERROR("%{public}s, failed!", __func__);
444 FormDataMgr::GetInstance().AddFormUserUid(formId, uid);
445 return result;
446 }
447 if (!FormDataMgr::GetInstance().DeleteTempForm(formId)) {
448 HILOG_ERROR("%{public}s, form id is not existed.", __func__);
449 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
450 }
451 FormDataMgr::GetInstance().DeleteFormRecord(formId);
452 if (!FormCacheMgr::GetInstance().DeleteData(formId)) {
453 HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
454 return ERR_APPEXECFWK_FORM_COMMON_CODE;
455 }
456 }
457
458 if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, formId)) {
459 HILOG_ERROR("%{public}s, failed to remove host record", __func__);
460 return ERR_APPEXECFWK_FORM_COMMON_CODE;
461 }
462
463 HILOG_DEBUG("%{public}s, record.formUserUids size: %{public}zu", __func__, record.formUserUids.size());
464 return ERR_OK;
465 }
466
467 /**
468 * @brief Handle delete form cache.
469 * @param dbRecord Form storage information.
470 * @param uid calling user id.
471 * @param formId The form id.
472 * @return Returns ERR_OK on success, others on failure.
473 */
HandleDeleteFormCache(FormRecord & dbRecord,const int uid,const int64_t formId)474 ErrCode FormMgrAdapter::HandleDeleteFormCache(FormRecord &dbRecord, const int uid, const int64_t formId)
475 {
476 HILOG_DEBUG("delete formDBRecords, formId: %{public}" PRId64 "", formId);
477 auto iter = std::find(dbRecord.formUserUids.begin(), dbRecord.formUserUids.end(), uid);
478 if (iter != dbRecord.formUserUids.end()) {
479 dbRecord.formUserUids.erase(iter);
480 }
481
482 ErrCode result = ERR_OK;
483 if (dbRecord.formUserUids.empty()) {
484 result = FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, dbRecord);
485 if (result != ERR_OK) {
486 HILOG_ERROR("%{public}s, failed to notify provider form delete", __func__);
487 return result;
488 }
489 if (!FormDataMgr::GetInstance().DeleteFormRecord(formId)) {
490 HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
491 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
492 }
493 if (result = FormDbCache::GetInstance().DeleteFormInfo(formId); result != ERR_OK) {
494 HILOG_ERROR("failed to remove db data");
495 return result;
496 }
497
498 int32_t matchCount = FormDbCache::GetInstance().GetMatchCount(dbRecord.bundleName, dbRecord.moduleName);
499 if (matchCount == 0) {
500 FormBmsHelper::GetInstance().NotifyModuleRemovable(dbRecord.bundleName, dbRecord.moduleName);
501 }
502
503 if (!FormCacheMgr::GetInstance().DeleteData(formId)) {
504 HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
505 return ERR_APPEXECFWK_FORM_COMMON_CODE;
506 }
507 if (!FormTimerMgr::GetInstance().RemoveFormTimer(formId)) {
508 HILOG_ERROR("%{public}s, remove timer error", __func__);
509 return ERR_APPEXECFWK_FORM_COMMON_CODE;
510 }
511 return ERR_OK;
512 }
513
514 if (result = FormDbCache::GetInstance().UpdateDBRecord(formId, dbRecord); result != ERR_OK) {
515 return result;
516 }
517
518 HILOG_DEBUG("%{public}s, dbRecord.formUserUids size: %{public}zu", __func__, dbRecord.formUserUids.size());
519 FormBmsHelper::GetInstance().NotifyModuleNotRemovable(dbRecord.bundleName, dbRecord.moduleName);
520 FormDataMgr::GetInstance().DeleteFormUserUid(formId, uid);
521 return result;
522 }
523
UpdateForm(const int64_t formId,const std::string & bundleName,const FormProviderData & formProviderData,const std::vector<FormDataProxy> & formDataProxies)524 int FormMgrAdapter::UpdateForm(const int64_t formId, const std::string &bundleName,
525 const FormProviderData &formProviderData, const std::vector<FormDataProxy> &formDataProxies)
526 {
527 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
528 HILOG_DEBUG("UpdateForm start.");
529
530 // check formId and bundleName
531 if (formId <= 0 || bundleName.empty()) {
532 HILOG_ERROR("%{public}s error, invalid formId or bundleName.", __func__);
533 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
534 }
535
536 // find matched formId
537 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
538
539 // check exist and get the formRecord
540 FormRecord formRecord;
541 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
542 HILOG_ERROR("%{public}s error, not exist such form:%{public}" PRId64 ".", __func__, matchedFormId);
543 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
544 }
545
546 // Checks if the form provider is the currently active user.
547 if (FormUtil::GetCurrentAccountId() != formRecord.providerUserId) {
548 HILOG_ERROR("fail, not under current user.");
549 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
550 }
551
552 // check bundleName match
553 if (formRecord.bundleName.compare(bundleName) != 0) {
554 HILOG_ERROR("%{public}s error, not match bundleName:%{public}s.", __func__, bundleName.c_str());
555 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
556 }
557
558 int32_t ret = ERR_OK;
559 if (formRecord.uiSyntax == FormType::ETS) {
560 WantParams wantParams;
561 ret = FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderData, wantParams, true);
562 } else {
563 // update Form
564 ret = FormProviderMgr::GetInstance().UpdateForm(matchedFormId, formRecord, formProviderData);
565 }
566
567 if (!formDataProxies.empty()) {
568 FormDataProxyMgr::GetInstance().UpdateSubscribeFormData(matchedFormId, formDataProxies);
569 }
570 return ret;
571 }
572
573 /**
574 * @brief Request form with formId and want, send formId and want to form manager service.
575 * @param formId The Id of the form to update.
576 * @param callerToken Caller ability token.
577 * @param want The want of the form to request.
578 * @return Returns ERR_OK on success, others on failure.
579 */
RequestForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const Want & want)580 int FormMgrAdapter::RequestForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const Want &want)
581 {
582 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
583 HILOG_INFO("%{public}s called.", __func__);
584 if (formId <= 0 || callerToken == nullptr) {
585 HILOG_ERROR("%{public}s fail, invalid formId or callerToken.", __func__);
586 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
587 }
588
589 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
590 if (!FormDataMgr::GetInstance().ExistFormRecord(matchedFormId)) {
591 HILOG_ERROR("%{public}s fail, not exist such formId:%{public}" PRId64 ".", __func__, matchedFormId);
592 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
593 }
594
595 FormHostRecord formHostRecord;
596 bool isHostExist = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
597 if (!isHostExist) {
598 HILOG_ERROR("%{public}s fail, cannot find target client.", __func__);
599 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
600 }
601
602 if (!formHostRecord.Contains(matchedFormId)) {
603 HILOG_ERROR("%{public}s fail, form is not self-owned.", __func__);
604 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
605 }
606
607 HILOG_INFO("%{public}s, find target client.", __func__);
608 Want reqWant(want);
609 int32_t currentActiveUserId = FormUtil::GetCurrentAccountId();
610 reqWant.SetParam(Constants::PARAM_FORM_USER_ID, currentActiveUserId);
611 return FormProviderMgr::GetInstance().RefreshForm(matchedFormId, reqWant, true);
612 }
613
614 /**
615 * @brief Form visible/invisible notify, send formIds to form manager service.
616 * @param formIds The vector of form Ids.
617 * @param callerToken Caller ability token.
618 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
619 * @return Returns ERR_OK on success, others on failure.
620 */
NotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,const int32_t formVisibleType)621 ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
622 const sptr<IRemoteObject> &callerToken, const int32_t formVisibleType)
623 {
624 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
625 HILOG_DEBUG("called.");
626 if (callerToken == nullptr) {
627 HILOG_ERROR("fail, callerToken can not be NULL.");
628 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
629 }
630
631 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
632 if (iBundleMgr == nullptr) {
633 HILOG_ERROR("fail, failed to get IBundleMgr.");
634 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
635 }
636
637 int64_t matchedFormId = 0;
638 int32_t userId = FormUtil::GetCurrentAccountId();
639 std::map<std::string, std::vector<int64_t>> eventMaps;
640 std::map<std::string, std::vector<FormInstance>> formInstanceMaps;
641 std::string specialFlag = "#";
642 for (int64_t formId : formIds) {
643 if (formId <= 0) {
644 HILOG_WARN("formId %{public}" PRId64 " is less than 0", formId);
645 continue;
646 }
647 matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
648 FormRecord formRecord;
649
650 // Update provider info to host
651 if (!UpdateProviderInfoToHost(matchedFormId, userId, callerToken, formVisibleType, formRecord)) {
652 continue;
653 }
654 bool isVisibility = (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE));
655 FormInstance formInstance;
656 // Get the updated card status
657 FormDataMgr::GetInstance().GetFormInstanceById(matchedFormId, false, formInstance);
658 std::string formHostName = formInstance.formHostName;
659 std::string formAllHostName = EMPTY_BUNDLE;
660 for (auto formObserver : formObservers_) {
661 if (formObserver.first == formHostName + specialFlag + std::to_string(isVisibility) ||
662 formObserver.first == formAllHostName + specialFlag + std::to_string(isVisibility)) {
663 auto observer = formInstanceMaps.find(formObserver.first);
664 if (observer == formInstanceMaps.end()) {
665 std::vector<FormInstance> formInstances;
666 formInstances.emplace_back(formInstance);
667 formInstanceMaps.emplace(formObserver.first, formInstances);
668 } else {
669 observer->second.emplace_back(formInstance);
670 }
671 }
672 }
673
674 // Check if the form provider is system app
675 if (!formRecord.isSystemApp) {
676 continue;
677 }
678
679 // Check the value of formVisibleNotify.
680 AppExecFwk::ApplicationInfo info;
681
682 if (!IN_PROCESS_CALL(iBundleMgr->GetApplicationInfo(formRecord.bundleName,
683 AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO, formRecord.providerUserId, info))) {
684 HILOG_ERROR("failed to get Application info.");
685 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
686 }
687
688 if (!info.formVisibleNotify) {
689 HILOG_DEBUG("the value of formVisibleNotify is false.");
690 continue;
691 }
692
693 // Create eventMaps
694 if (!CreateHandleEventMap(matchedFormId, formRecord, eventMaps)) {
695 continue;
696 }
697 }
698
699 for (auto formObserver : formObservers_) {
700 sptr<AbilityRuntime::IJsFormStateObserver> remoteJsFormStateObserver =
701 iface_cast<AbilityRuntime::IJsFormStateObserver>(formObserver.second);
702 auto observer = formInstanceMaps.find(formObserver.first);
703 if (observer != formInstanceMaps.end()) {
704 if (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
705 remoteJsFormStateObserver->NotifyWhetherFormsVisible(FormVisibilityType::VISIBLE,
706 formObserver.first, observer->second);
707 } else if (formVisibleType == static_cast<int32_t>(FormVisibilityType::INVISIBLE)){
708 remoteJsFormStateObserver->NotifyWhetherFormsVisible(FormVisibilityType::INVISIBLE, formObserver.first,
709 observer->second);
710 }
711 }
712 }
713 for (auto iter = eventMaps.begin(); iter != eventMaps.end(); iter++) {
714 if (HandleEventNotify(iter->first, iter->second, formVisibleType) != ERR_OK) {
715 HILOG_WARN("%{public}s fail, HandleEventNotify error, key is %{public}s.", __func__, iter->first.c_str());
716 }
717 }
718 if (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
719 FormDataProxyMgr::GetInstance().EnableSubscribeFormData(formIds);
720 } else if (formVisibleType == static_cast<int32_t>(FormVisibilityType::INVISIBLE)) {
721 FormDataProxyMgr::GetInstance().DisableSubscribeFormData(formIds);
722 }
723
724 return ERR_OK;
725 }
726
727 /**
728 * @brief Temp form to normal form.
729 * @param formId The Id of the form.
730 * @param callerToken Caller ability token.
731 * @return Returns ERR_OK on success, others on failure.
732 */
CastTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)733 int FormMgrAdapter::CastTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
734 {
735 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
736 if (formId <= 0 || callerToken == nullptr) {
737 HILOG_ERROR("%{public}s, invalid formId or callerToken", __func__);
738 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
739 }
740
741 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
742 if (!FormDataMgr::GetInstance().ExistFormRecord(matchedFormId) ||
743 !FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
744 HILOG_ERROR("%{public}s, not exist such temp form:%{public}" PRId64 "", __func__, matchedFormId);
745 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
746 }
747
748 FormHostRecord record;
749 bool hasRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, record);
750 if (!hasRecord || !record.Contains(matchedFormId)) {
751 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, matchedFormId);
752 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
753 }
754
755 int callingUid = IPCSkeleton::GetCallingUid();
756 int32_t userId = GetCurrentUserId(callingUid);
757 int checkCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, userId);
758 if (checkCode != 0) {
759 HILOG_ERROR("%{public}s, %{public}" PRId64 " failed,because if too mush forms", __func__, matchedFormId);
760 return checkCode;
761 }
762
763 FormRecord formRecord;
764 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
765 HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 ".", __func__, matchedFormId);
766 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
767 }
768 int bindSupplierCheckCode = HandleCastTempForm(matchedFormId, formRecord);
769 if (bindSupplierCheckCode != 0) {
770 HILOG_ERROR("%{public}s, cast temp form bindSupplier failed", __func__);
771 return bindSupplierCheckCode;
772 }
773
774 if (!FormDataMgr::GetInstance().DeleteTempForm(matchedFormId)) {
775 HILOG_ERROR("%{public}s fail, delete temp form error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
776 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
777 }
778 if (!FormDataMgr::GetInstance().ModifyFormTempFlag(matchedFormId, false)) {
779 HILOG_ERROR("%{public}s fail, modify form temp flag error, formId:%{public}" PRId64 ".",
780 __func__, matchedFormId);
781 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
782 }
783 if (!FormDataMgr::GetInstance().AddFormUserUid(matchedFormId, callingUid)) {
784 HILOG_ERROR("%{public}s fail, add form user uid error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
785 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
786 }
787
788 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
789 HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 ".", __func__, matchedFormId);
790 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
791 }
792
793 ErrCode errorCode = FormDbCache::GetInstance().UpdateDBRecord(matchedFormId, formRecord);
794 if (errorCode != ERR_OK) {
795 HILOG_ERROR("%{public}s fail, update db record error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
796 return errorCode;
797 }
798
799 // start timer
800 return AddFormTimer(formRecord);
801 }
802 /**
803 * @brief Handle cast temp form.
804 * @param formId The form id.
805 * @param record Form information.
806 * @return Returns ERR_OK on success, others on failure.
807 */
HandleCastTempForm(const int64_t formId,const FormRecord & record)808 ErrCode FormMgrAdapter::HandleCastTempForm(const int64_t formId, const FormRecord &record)
809 {
810 HILOG_DEBUG("%{public}s, cast temp form to normal form, notify supplier, package:%{public}s, class:%{public}s",
811 __func__, record.bundleName.c_str(), record.abilityName.c_str());
812 sptr<IAbilityConnection> castTempConnection = new FormCastTempConnection(formId,
813 record.bundleName, record.abilityName);
814
815 Want want;
816 want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
817 want.SetElementName(record.bundleName, record.abilityName);
818 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, castTempConnection);
819 if (errorCode != ERR_OK) {
820 HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
821 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
822 }
823 return ERR_OK;
824 }
825 /**
826 * @brief Dump all of form storage infos.
827 * @param formInfos All of form storage infos.
828 * @return Returns ERR_OK on success, others on failure.
829 */
DumpStorageFormInfos(std::string & formInfos) const830 int FormMgrAdapter::DumpStorageFormInfos(std::string &formInfos) const
831 {
832 std::vector<FormDBInfo> formDBInfos;
833 FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
834 if (formDBInfos.empty()) {
835 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
836 }
837 std::sort(formDBInfos.begin(), formDBInfos.end(),
838 [] (const FormDBInfo &formDBInfoA, const FormDBInfo &formDBInfoB) -> bool {
839 return formDBInfoA.formId < formDBInfoB.formId;
840 });
841 FormDumpMgr::GetInstance().DumpStorageFormInfos(formDBInfos, formInfos);
842 return ERR_OK;
843 }
844 /**
845 * @brief Dump all of temporary form infos.
846 * @param formInfos All of temporary form infos.
847 * @return Returns ERR_OK on success, others on failure.
848 */
DumpTemporaryFormInfos(std::string & formInfos) const849 int FormMgrAdapter::DumpTemporaryFormInfos(std::string &formInfos) const
850 {
851 HILOG_INFO("%{public}s called.", __func__);
852 std::vector<FormRecord> formRecordInfos;
853 if (!FormDataMgr::GetInstance().GetTempFormRecord(formRecordInfos)) {
854 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
855 }
856 FormDumpMgr::GetInstance().DumpTemporaryFormInfos(formRecordInfos, formInfos);
857 return ERR_OK;
858 }
859
DumpStaticBundleFormInfos(std::string & formInfos) const860 int FormMgrAdapter::DumpStaticBundleFormInfos(std::string &formInfos) const
861 {
862 HILOG_INFO("call");
863 std::vector<FormInfo> bundleFormInfos;
864 if (FormInfoMgr::GetInstance().GetAllFormsInfo(bundleFormInfos) != ERR_OK) {
865 HILOG_ERROR("GetAllFormsInfo failed.");
866 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
867 }
868 FormDumpMgr::GetInstance().DumpStaticBundleFormInfos(bundleFormInfos, formInfos);
869 return ERR_OK;
870 }
871 /**
872 * @brief Dump form info by a bundle name.
873 * @param bundleName The bundle name of form provider.
874 * @param formInfos Form infos.
875 * @return Returns ERR_OK on success, others on failure.
876 */
DumpFormInfoByBundleName(const std::string & bundleName,std::string & formInfos) const877 int FormMgrAdapter::DumpFormInfoByBundleName(const std::string &bundleName, std::string &formInfos) const
878 {
879 HILOG_INFO("%{public}s called.", __func__);
880 std::vector<FormRecord> formRecordInfos;
881 if (!FormDataMgr::GetInstance().GetFormRecord(bundleName, formRecordInfos)) {
882 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
883 }
884 FormDumpMgr::GetInstance().DumpFormInfos(formRecordInfos, formInfos);
885 return ERR_OK;
886 }
887 /**
888 * @brief Dump form info by a bundle name.
889 * @param formId The id of the form.
890 * @param formInfo Form info.
891 * @return Returns ERR_OK on success, others on failure.
892 */
DumpFormInfoByFormId(const std::int64_t formId,std::string & formInfo) const893 int FormMgrAdapter::DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo) const
894 {
895 HILOG_INFO("%{public}s called.", __func__);
896 int reply = ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
897 FormRecord formRecord;
898 if (FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
899 FormDumpMgr::GetInstance().DumpFormInfo(formRecord, formInfo);
900 reply = ERR_OK;
901 }
902
903 std::vector<FormHostRecord> formHostRecords;
904 FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
905 for (const auto &iter : formHostRecords) {
906 FormDumpMgr::GetInstance().DumpFormHostInfo(iter, formInfo);
907 reply = ERR_OK;
908 }
909
910 return reply;
911 }
912 /**
913 * @brief Dump form timer by form id.
914 * @param formId The id of the form.
915 * @param isTimingService "true" or "false".
916 * @return Returns ERR_OK on success, others on failure.
917 */
DumpFormTimerByFormId(const std::int64_t formId,std::string & isTimingService) const918 int FormMgrAdapter::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) const
919 {
920 HILOG_INFO("%{public}s called.", __func__);
921 FormTimer formTimer;
922 UpdateAtItem updateAtItem;
923 DynamicRefreshItem dynamicItem;
924 bool resultInter = FormTimerMgr::GetInstance().GetIntervalTimer(formId, formTimer);
925 bool resultUpdate = FormTimerMgr::GetInstance().GetUpdateAtTimer(formId, updateAtItem);
926 bool resultDynamic = FormTimerMgr::GetInstance().GetDynamicItem(formId, dynamicItem);
927 HILOG_INFO("%{public}s resultInter:%{public}d,resultUpdate:%{public}d,resultDynamic:%{public}d",
928 __func__, resultInter, resultUpdate, resultDynamic);
929 if (resultInter || resultUpdate || resultDynamic) {
930 isTimingService = "true";
931 } else {
932 isTimingService = "false";
933 }
934 return ERR_OK;
935 }
936 /**
937 * @brief Get form configure info.
938 * @param want The want of the request.
939 * @param formItemInfo Form configure info.
940 * @return Returns ERR_OK on success, others on failure.
941 */
GetFormConfigInfo(const Want & want,FormItemInfo & formConfigInfo)942 ErrCode FormMgrAdapter::GetFormConfigInfo(const Want &want, FormItemInfo &formConfigInfo)
943 {
944 HILOG_DEBUG("GetFormConfigInfo start.");
945 BundleInfo bundleInfo;
946 std::string packageName;
947 ErrCode errCode = GetBundleInfo(want, bundleInfo, packageName);
948 if (errCode != ERR_OK) {
949 HILOG_ERROR("Get bundle info failed");
950 return errCode;
951 }
952
953 FormInfo formInfo;
954 errCode = GetFormInfo(want, formInfo);
955 if (errCode != ERR_OK) {
956 HILOG_ERROR("Get target form info failed");
957 return errCode;
958 }
959 if (!formInfo.IsValid()) {
960 HILOG_ERROR("The form info is invalid");
961 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
962 }
963
964 errCode = GetFormItemInfo(want, bundleInfo, formInfo, formConfigInfo);
965 if (errCode != ERR_OK) {
966 HILOG_ERROR("Get form item info failed.");
967 return errCode;
968 }
969 formConfigInfo.SetPackageName(packageName);
970 formConfigInfo.SetDeviceId(want.GetElement().GetDeviceID());
971
972 if (!formConfigInfo.IsValidItem()) {
973 HILOG_ERROR("fail, input param itemInfo is invalid");
974 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
975 }
976
977 HILOG_DEBUG("GetFormConfigInfo end.");
978 return ERR_OK;
979 }
980 /**
981 * @brief Allocate form by formId.
982 * @param info Form configure info.
983 * @param callerToken Caller ability token.
984 * @param wantParams WantParams of the request.
985 * @param formInfo Form info for form host.
986 * @return Returns ERR_OK on success, others on failure.
987 */
AllotFormById(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)988 ErrCode FormMgrAdapter::AllotFormById(const FormItemInfo &info,
989 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
990 {
991 HILOG_INFO("allot form by id.");
992 int64_t formId = FormDataMgr::GetInstance().PaddingUdidHash(info.GetFormId());
993 FormRecord record;
994 bool hasRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record);
995 if (hasRecord && record.formTempFlag && !FormRenderMgr::GetInstance().IsRerenderForRenderServiceDied(formId)) {
996 HILOG_ERROR("%{public}s, addForm can not acquire temp form when select form id", __func__);
997 return ERR_APPEXECFWK_FORM_COMMON_CODE;
998 }
999
1000 // ark ts form can only exist with one form host
1001 if (info.GetUiSyntax() == FormType::ETS &&
1002 !FormDbCache::GetInstance().IsHostOwner(formId, IPCSkeleton::GetCallingUid())) {
1003 HILOG_ERROR("the specified form id does not exist in caller. formId: %{public}s.",
1004 std::to_string(formId).c_str());
1005 return ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID;
1006 }
1007
1008 int32_t currentUserId = FormUtil::GetCurrentAccountId();
1009 if (hasRecord && (record.providerUserId == currentUserId)) {
1010 if (!info.IsMatch(record)) {
1011 HILOG_ERROR("%{public}s, formId and item info not match:%{public}" PRId64 "", __func__, formId);
1012 return ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID;
1013 }
1014 return AddExistFormRecord(info, callerToken, record, formId, wantParams, formInfo);
1015 }
1016
1017 // find in db but not in cache
1018 FormRecord dbRecord;
1019 ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
1020 if (getDbRet == ERR_OK && (dbRecord.providerUserId == currentUserId)) {
1021 return AddNewFormRecord(info, formId, callerToken, wantParams, formInfo);
1022 }
1023
1024 HILOG_INFO("%{public}s, addForm no such form %{public}" PRId64 "", __func__, formId);
1025
1026 // delete form data in provider
1027 FormRecord delRecord;
1028 delRecord.bundleName = info.GetProviderBundleName();
1029 delRecord.abilityName = info.GetAbilityName();
1030 FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, delRecord);
1031
1032 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1033 }
1034
AddExistFormRecord(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const FormRecord & record,const int64_t formId,const WantParams & wantParams,FormJsInfo & formInfo)1035 ErrCode FormMgrAdapter::AddExistFormRecord(const FormItemInfo &info, const sptr<IRemoteObject> &callerToken,
1036 const FormRecord &record, const int64_t formId, const WantParams &wantParams, FormJsInfo &formInfo)
1037 {
1038 HILOG_INFO("add exist formRecord, formId:%{public}" PRId64 "", formId);
1039 // allot form host record
1040 int callingUid = IPCSkeleton::GetCallingUid();
1041 bool isCreated = FormDataMgr::GetInstance().AllotFormHostRecord(info, callerToken, formId, callingUid);
1042 if (!isCreated) {
1043 HILOG_ERROR("%{public}s fail, AllotFormHostRecord failed when no matched formRecord", __func__);
1044 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1045 }
1046
1047 FormRecord newRecord(record);
1048 std::string cacheData;
1049 std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
1050 bool hasCacheData = FormCacheMgr::GetInstance().GetData(formId, cacheData, imageDataMap);
1051 if (hasCacheData) {
1052 newRecord.formProviderInfo.SetFormDataString(cacheData);
1053 newRecord.formProviderInfo.SetImageDataMap(imageDataMap);
1054 }
1055 FormRenderMgr::GetInstance().RenderForm(newRecord, wantParams, callerToken);
1056 if (newRecord.needRefresh || FormCacheMgr::GetInstance().NeedAcquireProviderData(newRecord.formId)) {
1057 newRecord.isInited = false;
1058 FormDataMgr::GetInstance().SetFormCacheInited(formId, false);
1059
1060 // acquire formInfo from provider
1061 ErrCode errorCode = AcquireProviderFormInfoAsync(formId, info, wantParams);
1062 if (errorCode != ERR_OK) {
1063 HILOG_ERROR("%{public}s fail, AcquireProviderFormInfoAsync failed", __func__);
1064 return errorCode;
1065 }
1066 }
1067
1068 // Add new form user uid.
1069 FormDataMgr::GetInstance().AddFormUserUid(formId, callingUid);
1070 if (std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(), callingUid) ==
1071 newRecord.formUserUids.end()) {
1072 newRecord.formUserUids.emplace_back(callingUid);
1073 }
1074
1075 if (hasCacheData) {
1076 formInfo.formData = cacheData;
1077 formInfo.formProviderData.SetDataString(cacheData);
1078 formInfo.formProviderData.SetImageDataMap(imageDataMap);
1079 }
1080
1081 FormDataMgr::GetInstance().CreateFormJsInfo(formId, record, formInfo);
1082
1083 // start update timer
1084 ErrCode errorCode = AddFormTimer(newRecord);
1085 if (errorCode != ERR_OK) {
1086 return errorCode;
1087 }
1088 if (!newRecord.formTempFlag) {
1089 return FormDbCache::GetInstance().UpdateDBRecord(formId, newRecord);
1090 }
1091 return ERR_OK;
1092 }
1093
AllotFormBySpecificId(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1094 ErrCode FormMgrAdapter::AllotFormBySpecificId(const FormItemInfo &info,
1095 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1096 {
1097 HILOG_DEBUG("start");
1098 int64_t formId = info.GetFormId();
1099 FormRecord record;
1100 bool hasRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record);
1101 // find in db but not in cache
1102 FormRecord dbRecord;
1103 ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
1104 if (getDbRet == ERR_OK || hasRecord) {
1105 HILOG_DEBUG("The specified ID already exists in the cache or db");
1106 return AllotFormByInfo(info, callerToken, wantParams, formInfo);
1107 }
1108 HILOG_DEBUG("Creates the form with the specified ID");
1109 return AddNewFormRecord(info, formId, callerToken, wantParams, formInfo);
1110 }
1111
1112 /**
1113 * @brief Allocate form by form configure info.
1114 * @param info Form configure info.
1115 * @param callerToken Caller ability token.
1116 * @param wantParams WantParams of the request.
1117 * @param formInfo Form info for form host.
1118 * @return Returns ERR_OK on success, others on failure.
1119 */
AllotFormByInfo(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1120 ErrCode FormMgrAdapter::AllotFormByInfo(const FormItemInfo &info,
1121 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1122 {
1123 // generate formId
1124 int64_t newFormId = FormDataMgr::GetInstance().GenerateFormId();
1125 if (newFormId < 0) {
1126 HILOG_ERROR("fail, generateFormId no invalid formId");
1127 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1128 }
1129 HILOG_DEBUG("newFormId:%{public}" PRId64 "", newFormId);
1130 return AddNewFormRecord(info, newFormId, callerToken, wantParams, formInfo);
1131 }
1132
1133 /**
1134 * @brief Add new form record.
1135 * @param info Form configure info.
1136 * @param formId The form id.
1137 * @param callerToken Caller ability token.
1138 * @param wantParams WantParams of the request.
1139 * @param formInfo Form info for form host.
1140 * @return Returns ERR_OK on success, others on failure.
1141 */
AddNewFormRecord(const FormItemInfo & info,const int64_t formId,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1142 ErrCode FormMgrAdapter::AddNewFormRecord(const FormItemInfo &info, const int64_t formId,
1143 const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1144 {
1145 HILOG_INFO("add new formRecord");
1146 FormItemInfo newInfo(info);
1147 newInfo.SetFormId(formId);
1148 // allot form host record
1149 int callingUid = IPCSkeleton::GetCallingUid();
1150 if (!FormDataMgr::GetInstance().AllotFormHostRecord(newInfo, callerToken, formId, callingUid)) {
1151 HILOG_ERROR("fail, AllotFormHostRecord failed when no matched formRecord");
1152 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1153 }
1154
1155 // get current userId
1156 int32_t currentUserId = GetCurrentUserId(callingUid);
1157 // allot form record
1158 FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(newInfo, callingUid, currentUserId);
1159
1160 FormRenderMgr::GetInstance().RenderForm(formRecord, wantParams, callerToken);
1161
1162 // acquire formInfo from provider
1163 ErrCode errorCode = AcquireProviderFormInfoAsync(formId, newInfo, wantParams);
1164 if (errorCode != ERR_OK) {
1165 HILOG_ERROR("fail, AcquireProviderFormInfoAsync failed");
1166 return errorCode;
1167 }
1168
1169 // create form info for js
1170 FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formInfo);
1171
1172 // storage info
1173 if (!newInfo.IsTemporaryForm()) {
1174 errorCode = FormDbCache::GetInstance().UpdateDBRecord(formId, formRecord);
1175 if (errorCode != ERR_OK) {
1176 HILOG_ERROR("fail, UpdateDBRecord failed");
1177 return errorCode;
1178 }
1179 }
1180
1181 // start update timer
1182 if (info.GetProviderBundleName() != info.GetHostBundleName()) {
1183 return AddFormTimer(formRecord);
1184 }
1185 return ERR_OK;
1186 }
1187
1188 /**
1189 * @brief Add form timer.
1190 * @param formRecord Form information.
1191 * @return Returns ERR_OK on success, others on failure.
1192 */
AddFormTimer(const FormRecord & formRecord)1193 ErrCode FormMgrAdapter::AddFormTimer(const FormRecord &formRecord)
1194 {
1195 HILOG_INFO("add form timer start");
1196 if (!formRecord.isEnableUpdate || formRecord.formTempFlag) {
1197 HILOG_INFO("%{public}s isEnableUpdate:%{public}d formTempFlag:%{public}d.",
1198 __func__, formRecord.isEnableUpdate, formRecord.formTempFlag);
1199 return ERR_OK;
1200 }
1201 if (formRecord.updateDuration > 0 && !formRecord.isDataProxy) {
1202 bool ret = FormTimerMgr::GetInstance().AddFormTimer(formRecord.formId,
1203 formRecord.updateDuration, formRecord.providerUserId);
1204 return ret ? ERR_OK : ERR_APPEXECFWK_FORM_COMMON_CODE;
1205 }
1206 if (formRecord.updateAtHour >= 0 && formRecord.updateAtMin >= 0) {
1207 bool ret = FormTimerMgr::GetInstance().AddFormTimer(formRecord.formId,
1208 formRecord.updateAtHour, formRecord.updateAtMin, formRecord.providerUserId);
1209 return ret ? ERR_OK : ERR_APPEXECFWK_FORM_COMMON_CODE;
1210 }
1211 HILOG_INFO("%{public}s no need add form timer.", __func__);
1212 return ERR_OK;
1213 }
1214
1215 /**
1216 * @brief Send event notify to form provider. The event notify type include FORM_VISIBLE and FORM_INVISIBLE.
1217 *
1218 * @param providerKey The provider key string which consists of the provider bundle name and ability name.
1219 * @param formIdsByProvider The vector of form Ids which have the same provider.
1220 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
1221 * @return Returns ERR_OK on success, others on failure.
1222 */
HandleEventNotify(const std::string & providerKey,const std::vector<int64_t> & formIdsByProvider,const int32_t formVisibleType)1223 ErrCode FormMgrAdapter::HandleEventNotify(const std::string &providerKey, const std::vector<int64_t> &formIdsByProvider,
1224 const int32_t formVisibleType)
1225 {
1226 HILOG_INFO("%{public}s called.", __func__);
1227 size_t position = providerKey.find(Constants::NAME_DELIMITER);
1228 std::string bundleName = providerKey.substr(0, position);
1229 std::string abilityName = providerKey.substr(position + strlen(Constants::NAME_DELIMITER));
1230 sptr<IAbilityConnection> formEventNotifyConnection = new (std::nothrow) FormEventNotifyConnection(formIdsByProvider,
1231 formVisibleType, bundleName, abilityName);
1232 if (formEventNotifyConnection == nullptr) {
1233 HILOG_ERROR("failed to create FormEventNotifyConnection.");
1234 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1235 }
1236 Want connectWant;
1237 connectWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1238 connectWant.SetElementName(bundleName, abilityName);
1239 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(connectWant, formEventNotifyConnection);
1240 if (errorCode != ERR_OK) {
1241 HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1242 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1243 }
1244
1245 return ERR_OK;
1246 }
1247
1248 /**
1249 * @brief Acquire form data from form provider.
1250 * @param formId The Id of the form.
1251 * @param info Form configure info.
1252 * @param wantParams WantParams of the request.
1253 * @return Returns ERR_OK on success, others on failure.
1254 */
AcquireProviderFormInfoAsync(const int64_t formId,const FormItemInfo & info,const WantParams & wantParams)1255 ErrCode FormMgrAdapter::AcquireProviderFormInfoAsync(const int64_t formId,
1256 const FormItemInfo &info, const WantParams &wantParams)
1257 {
1258 if (FormRenderMgr::GetInstance().GetIsVerified()) {
1259 HILOG_INFO("The authentication status of the current user is true.");
1260 return InnerAcquireProviderFormInfoAsync(formId, info, wantParams);
1261 }
1262
1263 HILOG_INFO("The current user is not unlocked.");
1264 auto task = [formId, newInfo = info, newWant = wantParams]() {
1265 FormMgrAdapter::GetInstance().InnerAcquireProviderFormInfoAsync(formId, newInfo, newWant);
1266 };
1267 FormRenderMgr::GetInstance().AddAcquireProviderFormInfoTask(task);
1268 return ERR_OK;
1269 }
1270
InnerAcquireProviderFormInfoAsync(const int64_t formId,const FormItemInfo & info,const WantParams & wantParams)1271 ErrCode FormMgrAdapter::InnerAcquireProviderFormInfoAsync(const int64_t formId,
1272 const FormItemInfo &info, const WantParams &wantParams)
1273 {
1274 if (formId <= 0) {
1275 HILOG_ERROR("%{public}s fail, formId should be greater than 0", __func__);
1276 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1277 }
1278
1279 Want newWant;
1280 newWant.SetParams(wantParams);
1281 auto hostToken = newWant.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
1282 sptr<IAbilityConnection> formAcquireConnection = new (std::nothrow) FormAcquireConnection(formId, info, wantParams,
1283 hostToken);
1284 if (formAcquireConnection == nullptr) {
1285 HILOG_ERROR("formAcquireConnection is null.");
1286 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1287 }
1288 Want want;
1289 want.SetElementName(info.GetProviderBundleName(), info.GetAbilityName());
1290 want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1291 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formAcquireConnection);
1292 if (errorCode != ERR_OK) {
1293 HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1294 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1295 }
1296 return ERR_OK;
1297 }
1298
1299 /**
1300 * @brief Get bundle info.
1301 * @param want The want of the request.
1302 * @param bundleInfo Bundle info.
1303 * @param packageName Package name.
1304 * @return Returns ERR_OK on success, others on failure.
1305 */
GetBundleInfo(const AAFwk::Want & want,BundleInfo & bundleInfo,std::string & packageName)1306 ErrCode FormMgrAdapter::GetBundleInfo(const AAFwk::Want &want, BundleInfo &bundleInfo, std::string &packageName)
1307 {
1308 HILOG_DEBUG("GetBundleInfo start.");
1309 std::string bundleName = want.GetElement().GetBundleName();
1310 std::string abilityName = want.GetElement().GetAbilityName();
1311 std::string deviceId = want.GetElement().GetDeviceID();
1312 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1313 if (bundleName.empty() || abilityName.empty() || moduleName.empty()) {
1314 HILOG_ERROR("GetBundleInfo bundleName or abilityName or moduleName is invalid");
1315 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1316 }
1317
1318 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1319 if (iBundleMgr == nullptr) {
1320 HILOG_ERROR("GetBundleMgr, failed to get IBundleMgr.");
1321 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1322 }
1323
1324 if (!IN_PROCESS_CALL(iBundleMgr->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES,
1325 bundleInfo, FormUtil::GetCurrentAccountId()))) {
1326 HILOG_ERROR("GetBundleInfo, failed to get bundle info.");
1327 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1328 }
1329
1330 bool moduleExist = false;
1331 for (const auto &moduleInfo : bundleInfo.moduleNames) {
1332 HILOG_DEBUG("bundleInfo.moduleNames, module name:%{public}s", moduleInfo.c_str());
1333 if (moduleInfo.compare(moduleName) == 0) {
1334 moduleExist = true;
1335 break;
1336 }
1337 }
1338 if (!moduleExist) {
1339 HILOG_ERROR("GetBundleInfo no such module, name:%{public}s", moduleName.c_str());
1340 return ERR_APPEXECFWK_FORM_NO_SUCH_MODULE;
1341 }
1342
1343 packageName = bundleName + moduleName;
1344 HILOG_DEBUG("GetBundleInfo end.");
1345 return ERR_OK;
1346 }
1347 /**
1348 * @brief Get form info.
1349 * @param want The want of the request.
1350 * @param formInfo Form info.
1351 * @return Returns ERR_OK on success, others on failure.
1352 */
GetFormInfo(const AAFwk::Want & want,FormInfo & formInfo)1353 ErrCode FormMgrAdapter::GetFormInfo(const AAFwk::Want &want, FormInfo &formInfo)
1354 {
1355 HILOG_DEBUG("GetFormInfo start.");
1356 std::string bundleName = want.GetElement().GetBundleName();
1357 std::string abilityName = want.GetElement().GetAbilityName();
1358 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1359 if (bundleName.empty() || abilityName.empty() || moduleName.empty()) {
1360 HILOG_ERROR("bundleName or abilityName or moduleName is invalid");
1361 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1362 }
1363
1364 std::vector<FormInfo> formInfos {};
1365 ErrCode errCode = FormInfoMgr::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
1366 if (errCode != ERR_OK) {
1367 HILOG_ERROR("GetFormsInfoByModule, failed to get form config info.");
1368 return errCode;
1369 }
1370
1371 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1372 bool abilityExisting = false;
1373 for (const auto &form : formInfos) {
1374 if (form.abilityName != abilityName) {
1375 continue;
1376 }
1377
1378 abilityExisting = true;
1379 if ((formName.empty() && form.defaultFlag) || form.name == formName) {
1380 formInfo = form;
1381 formInfo.moduleName = moduleName;
1382 HILOG_DEBUG("GetFormInfo end.");
1383 return ERR_OK;
1384 }
1385 }
1386
1387 HILOG_ERROR("failed to get form info failed. ability name is %{public}s, form name is %{public}s",
1388 abilityName.c_str(), formName.c_str());
1389 return abilityExisting ? ERR_APPEXECFWK_FORM_GET_INFO_FAILED : ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
1390 }
1391 /**
1392 * @brief Get form configure info.
1393 * @param want The want of the request.
1394 * @param bundleInfo Bundle info.
1395 * @param formInfo Form info.
1396 * @param formItemInfo Form configure info.
1397 * @return Returns ERR_OK on success, others on failure.
1398 */
GetFormItemInfo(const AAFwk::Want & want,const BundleInfo & bundleInfo,const FormInfo & formInfo,FormItemInfo & formItemInfo)1399 ErrCode FormMgrAdapter::GetFormItemInfo(const AAFwk::Want &want, const BundleInfo &bundleInfo,
1400 const FormInfo &formInfo, FormItemInfo &formItemInfo)
1401 {
1402 HILOG_DEBUG("GetFormItemInfo start.");
1403 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, formInfo.defaultDimension);
1404 if (!IsDimensionValid(formInfo, dimensionId)) {
1405 HILOG_ERROR("GetFormItemInfo failed, dimension is not valid.");
1406 return ERR_APPEXECFWK_FORM_NO_SUCH_DIMENSION;
1407 }
1408
1409 ErrCode ret = CreateFormItemInfo(bundleInfo, formInfo, formItemInfo, want);
1410 if (ret != ERR_OK) {
1411 HILOG_ERROR("GetFormItemInfo failed, CreateFormItemInfo failed.");
1412 return ret;
1413 }
1414 formItemInfo.SetSpecificationId(dimensionId);
1415 formItemInfo.SetTemporaryFlag(want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false));
1416 HILOG_DEBUG("GetFormItemInfo end.");
1417 return ERR_OK;
1418 }
1419 /**
1420 * @brief Dimension valid check.
1421 * @param formInfo Form info.
1422 * @param dimensionId Dimension id.
1423 * @return Returns true on success, false on failure.
1424 */
IsDimensionValid(const FormInfo & formInfo,int dimensionId) const1425 bool FormMgrAdapter::IsDimensionValid(const FormInfo &formInfo, int dimensionId) const
1426 {
1427 if (formInfo.supportDimensions.empty()) {
1428 HILOG_ERROR("Js form, no support dimension.");
1429 return false;
1430 }
1431
1432 for (size_t i = 0; i < formInfo.supportDimensions.size() && i < Constants::MAX_LAYOUT; i++) {
1433 if (formInfo.supportDimensions[i] == dimensionId) {
1434 return true;
1435 }
1436 }
1437
1438 HILOG_ERROR("No matched dimension found for %{public}d.", dimensionId);
1439 return false;
1440 }
1441 /**
1442 * @brief Create form configure info.
1443 * @param bundleInfo Bundle info.
1444 * @param formInfo Form info.
1445 * @param itemInfo Form configure info.
1446 * @return Returns ERR_OK on success, others on failure.
1447 */
CreateFormItemInfo(const BundleInfo & bundleInfo,const FormInfo & formInfo,FormItemInfo & itemInfo,const AAFwk::Want & want)1448 ErrCode FormMgrAdapter::CreateFormItemInfo(const BundleInfo &bundleInfo,
1449 const FormInfo &formInfo, FormItemInfo &itemInfo, const AAFwk::Want &want)
1450 {
1451 itemInfo.SetProviderBundleName(bundleInfo.name);
1452 itemInfo.SetVersionCode(bundleInfo.versionCode);
1453 itemInfo.SetVersionName(bundleInfo.versionName);
1454 itemInfo.SetCompatibleVersion(bundleInfo.compatibleVersion);
1455 itemInfo.SetSystemAppFlag(bundleInfo.applicationInfo.isSystemApp);
1456
1457 std::string hostBundleName;
1458 bool isSaUid = IPCSkeleton::GetCallingUid() == SYSTEM_UID;
1459 ErrCode ret = ERR_APPEXECFWK_FORM_COMMON_CODE;
1460 if (isSaUid) {
1461 hostBundleName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_HOST_BUNDLENAME_KEY);
1462 HILOG_INFO("sa uid call CreateFormItemInfo, hostBundleName is %{public}s", hostBundleName.c_str());
1463 ret = ERR_OK;
1464 } else {
1465 ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
1466 }
1467 if (ret != ERR_OK) {
1468 HILOG_ERROR("GetFormsInfoByModule, failed to get form config info.");
1469 return ret;
1470 }
1471 itemInfo.SetHostBundleName(hostBundleName);
1472 itemInfo.SetAbilityName(formInfo.abilityName);
1473 itemInfo.SetModuleName(formInfo.moduleName); // formInfo.moduleName: bundleMgr do not set
1474 itemInfo.SetFormName(formInfo.name);
1475 itemInfo.SetEnableUpdateFlag(formInfo.updateEnabled);
1476 itemInfo.SetUpdateDuration(formInfo.updateDuration);
1477 itemInfo.SetScheduledUpdateTime(formInfo.scheduledUpdateTime);
1478 itemInfo.SetJsComponentName(formInfo.jsComponentName);
1479 itemInfo.SetFormVisibleNotify(formInfo.formVisibleNotify);
1480 auto formSrc = formInfo.src;
1481 if (formSrc.rfind(POINT_ETS) == formSrc.size() - POINT_ETS.size()) {
1482 formSrc.erase(formSrc.end() - POINT_ETS.size(), formSrc.end());
1483 }
1484 itemInfo.SetFormSrc(formSrc);
1485 itemInfo.SetFormWindow(formInfo.window);
1486 itemInfo.SetType(formInfo.type);
1487 itemInfo.SetUiSyntax(formInfo.uiSyntax);
1488 itemInfo.SetIsDynamic(formInfo.isDynamic);
1489
1490 for (const auto &abilityInfo : bundleInfo.abilityInfos) {
1491 if (abilityInfo.name == formInfo.abilityName) {
1492 itemInfo.SetAbilityModuleName(abilityInfo.moduleName);
1493 if (!abilityInfo.isModuleJson) {
1494 itemInfo.SetFormSrc("");
1495 }
1496 }
1497 auto hapPath = abilityInfo.hapPath;
1498 if (hapPath.find(Constants::ABS_CODE_PATH) != std::string::npos) {
1499 hapPath = std::regex_replace(hapPath, std::regex(Constants::ABS_CODE_PATH), Constants::LOCAL_BUNDLES);
1500 }
1501 itemInfo.AddModuleInfo(abilityInfo.moduleName, hapPath);
1502 HILOG_DEBUG("%{public}s hap path is %{public}s", abilityInfo.moduleName.c_str(), hapPath.c_str());
1503 }
1504
1505 HILOG_INFO("%{public}s moduleInfos size: %{public}zu", __func__, bundleInfo.applicationInfo.moduleInfos.size());
1506 for (const auto &item : bundleInfo.applicationInfo.moduleInfos) {
1507 HILOG_INFO("%{public}s moduleInfos, moduleName: %{public}s, moduleSourceDir: %{public}s", __func__,
1508 item.moduleName.c_str(), item.moduleSourceDir.c_str());
1509 if (formInfo.moduleName == item.moduleName) {
1510 itemInfo.AddHapSourceDirs(item.moduleSourceDir);
1511 }
1512 }
1513 itemInfo.SetDataProxyFlag(formInfo.dataProxyEnabled);
1514 return ERR_OK;
1515 }
1516
1517 /**
1518 * @brief set next refresh time.
1519 * @param formId The id of the form.
1520 * @param nextTime next refresh time.
1521 * @return Returns ERR_OK on success, others on failure.
1522 */
SetNextRefreshTime(const int64_t formId,const int64_t nextTime)1523 int FormMgrAdapter::SetNextRefreshTime(const int64_t formId, const int64_t nextTime)
1524 {
1525 HILOG_INFO("%{public}s begin here, formId:%{public}" PRId64 ",nextTime:%{public}" PRId64 "",
1526 __func__, formId, nextTime);
1527 if (formId <= 0) {
1528 HILOG_ERROR("%{public}s formId is invalid", __func__);
1529 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1530 }
1531
1532 std::string bundleName;
1533 auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(bundleName);
1534 if (ret != ERR_OK) {
1535 HILOG_ERROR("%{public}s failed to get BundleName", __func__);
1536 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1537 }
1538 int32_t callingUid = IPCSkeleton::GetCallingUid();
1539 int32_t userId = GetCurrentUserId(callingUid);
1540 HILOG_INFO("%{public}s, userId:%{public}d, callingUid:%{public}d.", __func__, userId, callingUid);
1541
1542 FormRecord formRecord;
1543 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
1544 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
1545 HILOG_ERROR("%{public}s, not found in form record.", __func__);
1546 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1547 }
1548
1549 if (userId != formRecord.providerUserId) {
1550 HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
1551 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1552 }
1553
1554 // check bundleName
1555 if (bundleName != formRecord.bundleName) {
1556 HILOG_ERROR("%{public}s, not match bundleName:%{public}s", __func__, bundleName.c_str());
1557 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1558 }
1559
1560 if (formRecord.isDataProxy) {
1561 HILOG_ERROR("data proxy form not support set next refresh time.");
1562 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1563 }
1564
1565 return SetNextRefreshTimeLocked(matchedFormId, nextTime, userId);
1566 }
1567
ReleaseRenderer(int64_t formId,const std::string & compId)1568 int FormMgrAdapter::ReleaseRenderer(int64_t formId, const std::string &compId)
1569 {
1570 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1571 if (formId <= 0 || compId.empty()) {
1572 HILOG_ERROR("Release invalid param");
1573 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1574 }
1575
1576 FormRecord record;
1577 FormDataMgr::GetInstance().GetFormRecord(formId, record);
1578 FormRenderMgr::GetInstance().ReleaseRenderer(formId, record, compId);
1579 return ERR_OK;
1580 }
1581
CheckPublishForm(Want & want)1582 ErrCode FormMgrAdapter::CheckPublishForm(Want &want)
1583 {
1584 std::string bundleName;
1585 if (!GetBundleName(bundleName)) {
1586 HILOG_ERROR("failed to get BundleName");
1587 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1588 }
1589 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1590 if (iBundleMgr == nullptr) {
1591 HILOG_ERROR("fail, failed to get IBundleMgr.");
1592 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1593 }
1594
1595 if (!IsValidPublishEvent(iBundleMgr, bundleName, want)) {
1596 HILOG_ERROR("Check valid publish event failed.");
1597 return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1598 }
1599
1600 if (want.GetElement().GetBundleName().empty()) {
1601 HILOG_WARN("The bundleName is empty, set to current calling bundle.");
1602 want.SetBundle(bundleName);
1603 }
1604
1605 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1606 if (moduleName.empty()) {
1607 HILOG_ERROR("error, moduleName is empty.");
1608 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1609 }
1610
1611 bool isTemporary = want.GetBoolParam(AppExecFwk::Constants::PARAM_FORM_TEMPORARY_KEY, false);
1612 if (isTemporary) {
1613 HILOG_WARN("The published form should not be temp.");
1614 want.SetParam(AppExecFwk::Constants::PARAM_FORM_TEMPORARY_KEY, false);
1615 }
1616
1617 std::string abilityName = want.GetElement().GetAbilityName();
1618 std::string formName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_NAME_KEY);
1619 std::vector<FormInfo> formInfos {};
1620 ErrCode errCode = FormInfoMgr::GetInstance()
1621 .GetFormsInfoByModuleWithoutCheck(want.GetElement().GetBundleName(), moduleName, formInfos);
1622 if (errCode != ERR_OK) {
1623 HILOG_ERROR("error, failed to get forms info.");
1624 return errCode;
1625 }
1626 for (auto &formInfo: formInfos) {
1627 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1628 if ((formInfo.abilityName == abilityName) && (formInfo.name == formName) &&
1629 (IsDimensionValid(formInfo, dimensionId))) {
1630 want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, dimensionId);
1631 return ERR_OK;
1632 }
1633 }
1634 HILOG_ERROR("failed to find match form info.");
1635 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1636 }
1637
QueryPublishFormToHost(Want & wantToHost)1638 ErrCode FormMgrAdapter::QueryPublishFormToHost(Want &wantToHost)
1639 {
1640 AppExecFwk::AbilityInfo formAbilityInfo;
1641 AppExecFwk::ExtensionAbilityInfo formExtensionAbilityInfo;
1642
1643 int callingUid = IPCSkeleton::GetCallingUid();
1644 int32_t userId = GetCurrentUserId(callingUid);
1645 // If the host of publishing form is specified, check whether the host exists.
1646 if (!FormBmsHelper::GetInstance().GetAbilityInfo(wantToHost, userId, formAbilityInfo, formExtensionAbilityInfo)) {
1647 HILOG_ERROR("Failed to GetAbilityInfo");
1648 return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1649 }
1650
1651 if (formAbilityInfo.name.empty() && formExtensionAbilityInfo.name.empty()) {
1652 HILOG_ERROR("Query ability failed, no form host ability found.");
1653 return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1654 }
1655
1656 // Query the highest priority ability or extension ability for publishing form
1657 AppExecFwk::AbilityInfo abilityInfo;
1658 AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
1659 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(
1660 Constants::FORM_PUBLISH_ACTION, userId, abilityInfo, extensionAbilityInfo)) {
1661 HILOG_ERROR("Failed to ImplicitQueryInfoByPriority for publishing form");
1662 return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1663 }
1664
1665 if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
1666 HILOG_ERROR("Query highest priority ability failed, no form host ability found.");
1667 return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1668 }
1669
1670 if (!abilityInfo.name.empty()) {
1671 // highest priority ability
1672 HILOG_DEBUG("Query highest priority ability success. bundleName: %{public}s, ability:%{public}s",
1673 abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
1674 wantToHost.SetElementName(abilityInfo.bundleName, abilityInfo.name);
1675 } else {
1676 // highest priority extension ability
1677 HILOG_DEBUG("Query highest priority extension ability success. bundleName: %{public}s, ability:%{public}s",
1678 extensionAbilityInfo.bundleName.c_str(), extensionAbilityInfo.name.c_str());
1679 wantToHost.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
1680 }
1681 return ERR_OK;
1682 }
1683
RequestPublishFormToHost(Want & want)1684 ErrCode FormMgrAdapter::RequestPublishFormToHost(Want &want)
1685 {
1686 Want wantToHost;
1687 ElementName elementName = want.GetElement();
1688 wantToHost.SetParam(Constants::PARAM_BUNDLE_NAME_KEY, elementName.GetBundleName());
1689 wantToHost.SetParam(Constants::PARAM_ABILITY_NAME_KEY, elementName.GetAbilityName());
1690 std::string strFormId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY);
1691 wantToHost.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, strFormId);
1692 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1693 wantToHost.SetParam(Constants::PARAM_FORM_NAME_KEY, formName);
1694 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1695 wantToHost.SetParam(Constants::PARAM_MODULE_NAME_KEY, moduleName);
1696 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1697 wantToHost.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, dimensionId);
1698 bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
1699 wantToHost.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, tempFormFlag);
1700 int32_t userId = want.GetIntParam(Constants::PARAM_FORM_USER_ID, -1);
1701 std::string bundleName = want.GetStringParam(Constants::PARAM_PUBLISH_FORM_HOST_BUNDLE_KEY);
1702 std::string abilityName = want.GetStringParam(Constants::PARAM_PUBLISH_FORM_HOST_ABILITY_KEY);
1703 wantToHost.SetElementName(bundleName, abilityName);
1704 wantToHost.SetAction(Constants::FORM_PUBLISH_ACTION);
1705
1706 ErrCode errCode = QueryPublishFormToHost(wantToHost);
1707 if (errCode == ERR_OK) {
1708 return FormAmsHelper::GetInstance().StartAbility(wantToHost, userId);
1709 }
1710
1711 // Handle by interceptor callback when the system handler is not found.
1712 if (formPublishInterceptor_ == nullptr) {
1713 HILOG_DEBUG("query publish form failed, and have not publish interceptor. errCode:%{public}d.", errCode);
1714 return errCode;
1715 }
1716 int ret = formPublishInterceptor_->ProcessPublishForm(wantToHost);
1717 if (ret == ERR_OK) {
1718 HILOG_DEBUG("success to ProcessPublishForm.");
1719 } else {
1720 HILOG_ERROR("failed to ProcessPublishForm.");
1721 }
1722 return ret;
1723 }
1724
RequestPublishForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId,const std::vector<FormDataProxy> & formDataProxies)1725 ErrCode FormMgrAdapter::RequestPublishForm(Want &want, bool withFormBindingData,
1726 std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId,
1727 const std::vector<FormDataProxy> &formDataProxies)
1728 {
1729 HILOG_INFO("called.");
1730 ErrCode errCode = CheckPublishForm(want);
1731 if (errCode != ERR_OK) {
1732 return errCode;
1733 }
1734
1735 int callingUid = IPCSkeleton::GetCallingUid();
1736 int32_t userId = GetCurrentUserId(callingUid);
1737 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
1738 want.SetAction(Constants::FORM_PUBLISH_ACTION);
1739
1740 // generate formId
1741 formId = FormDataMgr::GetInstance().GenerateFormId();
1742 if (formId < 0) {
1743 HILOG_ERROR("fail, generateFormId no invalid formId");
1744 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1745 }
1746 HILOG_DEBUG("formId:%{public}" PRId64 "", formId);
1747 std::string strFormId = std::to_string(formId);
1748 want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, strFormId);
1749
1750 if (withFormBindingData) {
1751 errCode = FormDataMgr::GetInstance().AddRequestPublishFormInfo(formId, want, formBindingData);
1752 } else {
1753 std::unique_ptr<FormProviderData> noFormBindingData = nullptr;
1754 errCode = FormDataMgr::GetInstance().AddRequestPublishFormInfo(formId, want, noFormBindingData);
1755 }
1756 if (errCode != ERR_OK) {
1757 HILOG_ERROR("fail, add form info error");
1758 return errCode;
1759 }
1760
1761 errCode = RequestPublishFormToHost(want);
1762 if (errCode != ERR_OK) {
1763 FormDataMgr::GetInstance().RemoveRequestPublishFormInfo(formId);
1764 }
1765 if (!formDataProxies.empty()) {
1766 FormDataProxyMgr::GetInstance().ProduceFormDataProxies(formId, formDataProxies);
1767 }
1768 return errCode;
1769 }
1770
CheckAddRequestPublishForm(const Want & want,const Want & formProviderWant)1771 ErrCode FormMgrAdapter::CheckAddRequestPublishForm(const Want &want, const Want &formProviderWant)
1772 {
1773 std::string bundleName = want.GetElement().GetBundleName();
1774 std::string bundleNameProvider = formProviderWant.GetElement().GetBundleName();
1775 if (bundleNameProvider != bundleName) {
1776 HILOG_ERROR("The bundleName is not match.");
1777 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1778 }
1779
1780 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1781 std::string moduleNameProvider = formProviderWant.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1782 if (moduleNameProvider != moduleName) {
1783 HILOG_ERROR("The moduleName is not match.");
1784 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1785 }
1786
1787 std::string abilityName = want.GetElement().GetAbilityName();
1788 std::string abilityNameProvider = formProviderWant.GetElement().GetAbilityName();
1789 if (abilityNameProvider != abilityName) {
1790 HILOG_ERROR("The abilityName is not match.");
1791 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1792 }
1793
1794 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1795 std::string formNameProvider = formProviderWant.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1796 if (formNameProvider != formName) {
1797 HILOG_ERROR("The formName is not match.");
1798 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1799 }
1800
1801 int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1802 int32_t dimensionIdProvider = formProviderWant.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1803 if (dimensionIdProvider != dimensionId) {
1804 HILOG_ERROR("The dimensionId is not match.");
1805 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1806 }
1807
1808 bool isTemporary = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
1809 bool isTemporaryProvider = formProviderWant.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
1810 if (isTemporaryProvider != isTemporary) {
1811 HILOG_ERROR("The temporary is not match.");
1812 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1813 }
1814
1815 int32_t callingUid = IPCSkeleton::GetCallingUid();
1816 ErrCode errCode = ERR_OK;
1817 if (isTemporary) {
1818 errCode = FormDataMgr::GetInstance().CheckTempEnoughForm();
1819 } else {
1820 int32_t currentUserId = GetCurrentUserId(callingUid);
1821 errCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, currentUserId);
1822 }
1823 if (errCode != ERR_OK) {
1824 HILOG_ERROR("fail, too much forms in system");
1825 return errCode;
1826 }
1827 return ERR_OK;
1828 }
1829
AddRequestPublishForm(const FormItemInfo & formItemInfo,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formJsInfo)1830 ErrCode FormMgrAdapter::AddRequestPublishForm(const FormItemInfo &formItemInfo, const Want &want,
1831 const sptr<IRemoteObject> &callerToken, FormJsInfo &formJsInfo)
1832 {
1833 HILOG_INFO("Add request publish form.");
1834 Want formProviderWant;
1835 std::unique_ptr<FormProviderData> formProviderData = nullptr;
1836 auto formId = formItemInfo.GetFormId();
1837 ErrCode errCode = FormDataMgr::GetInstance().GetRequestPublishFormInfo(formId, formProviderWant, formProviderData);
1838 if (errCode != ERR_OK) {
1839 HILOG_ERROR("Failed to get request publish form");
1840 return errCode;
1841 }
1842
1843 errCode = CheckAddRequestPublishForm(want, formProviderWant);
1844 if (errCode != ERR_OK) {
1845 return errCode;
1846 }
1847
1848 int32_t callingUid = IPCSkeleton::GetCallingUid();
1849 if (!FormDataMgr::GetInstance().AllotFormHostRecord(formItemInfo, callerToken, formId, callingUid)) {
1850 HILOG_ERROR("%{public}s fail, AllotFormHostRecord failed when no matched formRecord", __func__);
1851 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1852 }
1853
1854 // get current userId
1855 int32_t currentUserId = GetCurrentUserId(callingUid);
1856 // allot form record
1857 FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(formItemInfo, callingUid, currentUserId);
1858 if (formProviderData != nullptr) {
1859 formRecord.formProviderInfo.SetFormData(*formProviderData);
1860 }
1861 FormRenderMgr::GetInstance().RenderForm(formRecord, want.GetParams()); // render for arkTs form
1862
1863 // create form info for js
1864 FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formJsInfo);
1865 if (formProviderData != nullptr) {
1866 formJsInfo.formData = formProviderData->GetDataString();
1867 formJsInfo.formProviderData = *formProviderData;
1868 if (formProviderData->NeedCache()) {
1869 HILOG_INFO("%{public}s, data is less than 1k, cache data.", __func__);
1870 FormCacheMgr::GetInstance().AddData(formId, formJsInfo.formProviderData);
1871 }
1872 }
1873 // storage info
1874 if (!formItemInfo.IsTemporaryForm()) {
1875 if (ErrCode errorCode = FormDbCache::GetInstance().UpdateDBRecord(formId, formRecord);
1876 errorCode != ERR_OK) {
1877 HILOG_ERROR("%{public}s fail, UpdateDBRecord failed", __func__);
1878 return errorCode;
1879 }
1880 }
1881 std::vector<FormDataProxy> formDataProxies;
1882 if (FormDataProxyMgr::GetInstance().ConsumeFormDataProxies(formId, formDataProxies)) {
1883 FormDataProxyMgr::GetInstance().SubscribeFormData(formId, formDataProxies);
1884 }
1885 // start update timer
1886 return AddFormTimer(formRecord);
1887 }
1888
1889 /**
1890 * @brief get bundleName.
1891 * @param bundleName for output.
1892 * @return Returns true on success, others on failure.
1893 */
GetBundleName(std::string & bundleName)1894 bool FormMgrAdapter::GetBundleName(std::string &bundleName)
1895 {
1896 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1897 if (iBundleMgr == nullptr) {
1898 HILOG_ERROR("%{public}s, failed to get IBundleMgr.", __func__);
1899 return false;
1900 }
1901
1902 int uid = IPCSkeleton::GetCallingUid();
1903 if (!IN_PROCESS_CALL(iBundleMgr->CheckIsSystemAppByUid(uid))) {
1904 HILOG_ERROR("%{public}s fail, form is not system app. uid:%{public}d", __func__, uid);
1905 return false;
1906 }
1907
1908 int32_t result = IN_PROCESS_CALL(iBundleMgr->GetNameForUid(uid, bundleName));
1909 if (result != ERR_OK || bundleName.empty()) {
1910 HILOG_ERROR("%{public}s failed, cannot get bundle name by uid:%{public}d", __func__, uid);
1911 return false;
1912 }
1913 return true;
1914 }
1915
1916 /**
1917 * @brief set next refresh time locked.
1918 * @param formId The form's id.
1919 * @param nextTime next refresh time.
1920 * @param userId User ID.
1921 * @return Returns ERR_OK on success, others on failure.
1922 */
SetNextRefreshTimeLocked(const int64_t formId,const int64_t nextTime,const int32_t userId)1923 int FormMgrAdapter::SetNextRefreshTimeLocked(const int64_t formId, const int64_t nextTime, const int32_t userId)
1924 {
1925 HILOG_ERROR("SetNextRefreshTimeLocked.");
1926 int32_t timerRefreshedCount = FormTimerMgr::GetInstance().GetRefreshCount(formId);
1927 if (timerRefreshedCount >= Constants::LIMIT_COUNT) {
1928 HILOG_ERROR("%{public}s, already refresh times:%{public}d", __func__, timerRefreshedCount);
1929 FormTimerMgr::GetInstance().MarkRemind(formId);
1930 return ERR_APPEXECFWK_FORM_MAX_REFRESH;
1931 }
1932
1933 if (!FormTimerMgr::GetInstance().SetNextRefreshTime(formId, nextTime * Constants::SEC_PER_MIN, userId)) {
1934 HILOG_ERROR("%{public}s failed", __func__);
1935 return ERR_APPEXECFWK_FORM_COMMON_CODE;
1936 }
1937
1938 return ERR_OK;
1939 }
1940
1941 /**
1942 * @brief set next refresh time locked.
1943 * @param formId The form's id.
1944 * @param bundleName Provider ability bundleName.
1945 * @return Returns true or false.
1946 */
IsUpdateValid(const int64_t formId,const std::string & bundleName)1947 bool FormMgrAdapter::IsUpdateValid(const int64_t formId, const std::string &bundleName)
1948 {
1949 if (formId <= 0 || bundleName.empty()) {
1950 return false;
1951 }
1952 return true;
1953 }
1954
1955 /**
1956 * @brief enable update form.
1957 * @param formIDs The id of the forms.
1958 * @param callerToken Caller ability token.
1959 * @return Returns ERR_OK on success, others on failure.
1960 */
EnableUpdateForm(const std::vector<int64_t> formIDs,const sptr<IRemoteObject> & callerToken)1961 int FormMgrAdapter::EnableUpdateForm(const std::vector<int64_t> formIDs, const sptr<IRemoteObject> &callerToken)
1962 {
1963 HILOG_DEBUG("enableUpdateForm");
1964 return HandleUpdateFormFlag(formIDs, callerToken, true, false);
1965 }
1966
1967 /**
1968 * @brief disable update form.
1969 * @param formIDs The id of the forms.
1970 * @param callerToken Caller ability token.
1971 * @return Returns ERR_OK on success, others on failure.
1972 */
DisableUpdateForm(const std::vector<int64_t> formIDs,const sptr<IRemoteObject> & callerToken)1973 int FormMgrAdapter::DisableUpdateForm(const std::vector<int64_t> formIDs, const sptr<IRemoteObject> &callerToken)
1974 {
1975 HILOG_DEBUG("disableUpdateForm");
1976 return HandleUpdateFormFlag(formIDs, callerToken, false, false);
1977 }
1978
1979 /**
1980 * @brief Process js message event.
1981 * @param formId Indicates the unique id of form.
1982 * @param want information passed to supplier.
1983 * @param callerToken Caller ability token.
1984 * @return Returns true if execute success, false otherwise.
1985 */
MessageEvent(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)1986 int FormMgrAdapter::MessageEvent(const int64_t formId, const Want &want, const sptr<IRemoteObject> &callerToken)
1987 {
1988 HILOG_INFO("%{public}s called.", __func__);
1989 if (formId <= 0) {
1990 HILOG_ERROR("%{public}s form formId is invalid", __func__);
1991 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1992 }
1993
1994 if (callerToken == nullptr) {
1995 HILOG_ERROR("%{public}s failed, callerToken can not be NULL", __func__);
1996 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1997 }
1998
1999 if (!want.HasParameter(Constants::PARAM_MESSAGE_KEY)) {
2000 HILOG_ERROR("%{public}s failed, message info is not exist", __func__);
2001 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2002 }
2003
2004 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2005 FormRecord record;
2006 bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2007 if (!bGetRecord) {
2008 HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 "", __func__, matchedFormId);
2009 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2010 }
2011
2012 FormHostRecord formHostRecord;
2013 bool isHostExist = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2014 if (!isHostExist) {
2015 HILOG_ERROR("%{public}s failed, cannot find target client.", __func__);
2016 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2017 }
2018
2019 if (!formHostRecord.Contains(matchedFormId)) {
2020 HILOG_ERROR("%{public}s failed, form is not self-owned.", __func__);
2021 return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
2022 }
2023
2024 auto errCode = FormProviderMgr::GetInstance().MessageEvent(matchedFormId, record, want);
2025 if (errCode != ERR_OK) {
2026 return errCode;
2027 }
2028 HILOG_INFO("%{public}s, find target client.", __func__);
2029
2030 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
2031 if (!FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
2032 int callingUid = IPCSkeleton::GetCallingUid();
2033 int32_t userId = GetCurrentUserId(callingUid);
2034 DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
2035 record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_CLICKED);
2036 DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
2037 }
2038 #endif
2039 return ERR_OK;
2040 }
2041
2042 /**
2043 * @brief Process js router event.
2044 * @param formId Indicates the unique id of form.
2045 * @param want the want of the ability to start.
2046 * @param callerToken Caller ability token.
2047 * @return Returns true if execute success, false otherwise.
2048 */
RouterEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)2049 int FormMgrAdapter::RouterEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
2050 {
2051 HILOG_INFO("called.");
2052 if (formId <= 0) {
2053 HILOG_ERROR("form formId or bundleName is invalid");
2054 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2055 }
2056
2057 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2058 int32_t userId = FormUtil::GetCurrentAccountId();
2059 FormRecord record;
2060 bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2061 if (!bGetRecord) {
2062 HILOG_ERROR("fail, not exist such form:%{public}" PRId64 "", matchedFormId);
2063 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2064 }
2065
2066 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2067 if (iBundleMgr == nullptr) {
2068 HILOG_ERROR("fail, failed to get IBundleMgr.");
2069 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
2070 }
2071
2072 if (record.bundleName != want.GetBundle()) {
2073 if (!record.isSystemApp) {
2074 HILOG_WARN("Only system apps can launch the ability of the other apps.");
2075 want.SetBundle(record.bundleName);
2076 }
2077 }
2078
2079 want.SetParam(Constants::PARAM_FORM_ID, formId);
2080 want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, formId);
2081 int32_t result = FormAmsHelper::GetInstance().GetAbilityManager()->StartAbility(want, callerToken);
2082 if (result != ERR_OK && result != START_ABILITY_WAITING) {
2083 HILOG_ERROR("Failed to StartAbility, result: %{public}d.", result);
2084 return result;
2085 }
2086
2087 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
2088 if (!FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
2089 int32_t callingUid = IPCSkeleton::GetCallingUid();
2090 int32_t userId = GetCurrentUserId(callingUid);
2091 DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
2092 record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_CLICKED);
2093 DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
2094 }
2095 #endif
2096 return ERR_OK;
2097 }
2098
2099 /**
2100 * @brief Process background router event.
2101 * @param formId Indicates the unique id of form.
2102 * @param want the want of the ability to start.
2103 * @param callerToken Caller ability token.
2104 * @return Returns true if execute success, false otherwise.
2105 */
BackgroundEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)2106 int FormMgrAdapter::BackgroundEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
2107 {
2108 HILOG_INFO("called.");
2109 if (formId <= 0) {
2110 HILOG_ERROR("form formId or bundleName is invalid");
2111 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2112 }
2113
2114 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2115 FormRecord record;
2116 bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2117 if (!bGetRecord) {
2118 HILOG_ERROR("fail, not exist such form:%{public}" PRId64 "", matchedFormId);
2119 return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2120 }
2121
2122 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2123 if (iBundleMgr == nullptr) {
2124 HILOG_ERROR("fail, failed to get IBundleMgr.");
2125 return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
2126 }
2127 if (want.GetBundle().empty() || record.bundleName != want.GetBundle()) {
2128 HILOG_DEBUG("The parameter contains the wrong bundleName or the empty bundleName");
2129 want.SetBundle(record.bundleName);
2130 }
2131 if (!CheckKeepBackgroundRunningPermission(iBundleMgr, record.bundleName)) {
2132 HILOG_ERROR("The app does not have permission for keeping background running.");
2133 return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
2134 }
2135
2136 std::string params = want.GetStringParam(Constants::FORM_CALL_EVENT_PARAMS);
2137 nlohmann::json jsonObject = nlohmann::json::parse(params, nullptr, false);
2138 if (jsonObject.is_discarded()) {
2139 HILOG_ERROR("failed to parse jsonDataString: %{public}s.", params.c_str());
2140 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2141 }
2142 if (!jsonObject.contains(Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY) ||
2143 !jsonObject.at(Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY).is_string()) {
2144 HILOG_ERROR("failed to get method from params");
2145 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2146 }
2147 sptr<IAbilityConnection> formBackgroundConnection = new (std::nothrow) FormBackgroundConnection(
2148 formId, want.GetBundle(), want.GetElement().GetAbilityName(),
2149 jsonObject[Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY].get<std::string>(), params);
2150 if (formBackgroundConnection == nullptr) {
2151 HILOG_ERROR("formBackgroundConnection is null.");
2152 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2153 }
2154
2155 want.SetParam(Constants::PARAM_FORM_ID, formId);
2156 want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, formId);
2157 int32_t result = IN_PROCESS_CALL(FormAmsHelper::GetInstance().GetAbilityManager()->StartAbilityByCall(want,
2158 formBackgroundConnection, callerToken));
2159 if (result != ERR_OK) {
2160 HILOG_ERROR("Failed to StartAbilityByCall, result: %{public}d.", result);
2161 return result;
2162 }
2163 return ERR_OK;
2164 }
2165
HandleUpdateFormFlag(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool flag,bool isOnlyEnableUpdate)2166 ErrCode FormMgrAdapter::HandleUpdateFormFlag(const std::vector<int64_t> &formIds,
2167 const sptr<IRemoteObject> &callerToken, bool flag, bool isOnlyEnableUpdate)
2168 {
2169 HILOG_DEBUG("called.");
2170 if (formIds.empty() || callerToken == nullptr) {
2171 HILOG_ERROR("invalid param");
2172 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2173 }
2174 std::vector<int64_t> refreshForms;
2175 int errCode = FormDataMgr::GetInstance().UpdateHostFormFlag(formIds, callerToken,
2176 flag, isOnlyEnableUpdate, refreshForms);
2177 if (errCode == ERR_OK && !refreshForms.empty()) {
2178 int32_t userId = FormUtil::GetCurrentAccountId();
2179 for (const int64_t id : refreshForms) {
2180 HILOG_DEBUG("formRecord need refresh: %{public}" PRId64 "", id);
2181 Want want;
2182 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
2183 FormProviderMgr::GetInstance().RefreshForm(id, want, false);
2184 }
2185 }
2186 return errCode;
2187 }
2188
2189 /**
2190 * @brief check form cached.
2191 * @param record Form information.
2192 * @return Returns true on cached, false on not.
2193 */
IsFormCached(const FormRecord record)2194 bool FormMgrAdapter::IsFormCached(const FormRecord record)
2195 {
2196 if (record.versionUpgrade) {
2197 return false;
2198 }
2199 return true;
2200 }
2201
AcquireProviderFormInfo(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)2202 void FormMgrAdapter::AcquireProviderFormInfo(const int64_t formId, const Want &want,
2203 const sptr<IRemoteObject> &remoteObject)
2204 {
2205 HILOG_INFO("%{public}s called.", __func__);
2206 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
2207 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
2208 if (formProviderProxy == nullptr) {
2209 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2210 HILOG_ERROR("%{public}s fail, Failed to get formProviderProxy", __func__);
2211 return;
2212 }
2213 FormRecord formRecord;
2214 FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
2215 FormJsInfo formJsInfo;
2216 FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formJsInfo);
2217 int error = formProviderProxy->AcquireProviderFormInfo(formJsInfo, want, FormSupplyCallback::GetInstance());
2218 if (error != ERR_OK) {
2219 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2220 HILOG_ERROR("%{public}s fail, Failed to get acquire provider form info", __func__);
2221 }
2222 }
2223
2224 /**
2225 * @brief Notify form provider for delete form.
2226 *
2227 * @param formId The Id of the from.
2228 * @param want The want of the form.
2229 * @param remoteObject Form provider proxy object.
2230 */
NotifyFormDelete(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)2231 void FormMgrAdapter::NotifyFormDelete(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
2232 {
2233 HILOG_INFO("%{public}s called.", __func__);
2234 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
2235 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
2236 if (formProviderProxy == nullptr) {
2237 HILOG_ERROR("%{public}s fail, Failed to get formProviderProxy", __func__);
2238 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2239 return;
2240 }
2241 int error = formProviderProxy->NotifyFormDelete(formId, want, FormSupplyCallback::GetInstance());
2242 if (error != ERR_OK) {
2243 HILOG_ERROR("%{public}s fail, Failed to NotifyFormDelete", __func__);
2244 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2245 }
2246 }
2247
2248 /**
2249 * @brief Create eventMaps for event notify.
2250 *
2251 * @param matchedFormId The Id of the form
2252 * @param formRecord Form storage information
2253 * @param eventMaps eventMaps for event notify
2254 * @return Returns true on success, false on failure.
2255 */
CreateHandleEventMap(const int64_t matchedFormId,const FormRecord & formRecord,std::map<std::string,std::vector<int64_t>> & eventMaps)2256 bool FormMgrAdapter::CreateHandleEventMap(const int64_t matchedFormId, const FormRecord &formRecord,
2257 std::map<std::string, std::vector<int64_t>> &eventMaps)
2258 {
2259 if (!formRecord.formVisibleNotify) {
2260 HILOG_WARN("%{public}s fail, the config 'formVisibleNotify' is false, formId:%{public}" PRId64 ".",
2261 __func__, matchedFormId);
2262 return false;
2263 }
2264
2265 std::string providerKey = formRecord.bundleName + Constants::NAME_DELIMITER + formRecord.abilityName;
2266 auto iter = eventMaps.find(providerKey);
2267 if (iter == eventMaps.end()) {
2268 std::vector<int64_t> formEventsByProvider {matchedFormId};
2269 eventMaps.insert(std::make_pair(providerKey, formEventsByProvider));
2270 } else {
2271 iter->second.emplace_back(matchedFormId);
2272 }
2273 return true;
2274 }
2275 /**
2276 * @brief Update provider info to host
2277 *
2278 * @param matchedFormId The Id of the form
2279 * @param callerToken Caller ability token.
2280 * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
2281 * @param formRecord Form storage information
2282 * @return Returns true on success, false on failure.
2283 */
UpdateProviderInfoToHost(const int64_t & matchedFormId,const int32_t & userId,const sptr<IRemoteObject> & callerToken,const int32_t & formVisibleType,FormRecord & formRecord)2284 bool FormMgrAdapter::UpdateProviderInfoToHost(const int64_t &matchedFormId, const int32_t &userId,
2285 const sptr<IRemoteObject> &callerToken, const int32_t &formVisibleType, FormRecord &formRecord)
2286 {
2287 if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
2288 HILOG_WARN("fail, not exist such form, formId:%{public}" PRId64 ".", matchedFormId);
2289 return false;
2290 }
2291
2292 if (formRecord.providerUserId != userId) {
2293 HILOG_WARN("fail, not self form, formId:%{public}" PRId64 ".", matchedFormId);
2294 return false;
2295 }
2296 FormHostRecord formHostRecord;
2297 bool hasFormHostRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2298 if (!(hasFormHostRecord && formHostRecord.Contains(matchedFormId))) {
2299 HILOG_WARN("fail, form is not belong to self, formId:%{public}" PRId64 ".", matchedFormId);
2300 return false;
2301 }
2302
2303 formRecord.formVisibleNotifyState = formVisibleType;
2304 if (!FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, formRecord)) {
2305 HILOG_WARN("fail, set formVisibleNotifyState error, formId:%{public}" PRId64 ".",
2306 matchedFormId);
2307 return false;
2308 }
2309
2310 HILOG_INFO("formId:%{public}" PRId64 ", needRefresh: %{public}d, formVisibleType: %{public}d,"
2311 "isTimerRefresh: %{public}d.", matchedFormId, formRecord.needRefresh,
2312 static_cast<int32_t>(formVisibleType), formRecord.isTimerRefresh);
2313 // If the form need refresh flag is true and form visibleType is FORM_VISIBLE, refresh the form host.
2314 if (formRecord.needRefresh && formVisibleType == Constants::FORM_VISIBLE) {
2315 if (formRecord.isTimerRefresh) {
2316 Want want;
2317 want.SetParam(Constants::KEY_IS_TIMER, true);
2318 want.SetParam(Constants::KEY_TIMER_REFRESH, true);
2319 want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
2320 FormProviderMgr::GetInstance().RefreshForm(formRecord.formId, want, false);
2321 } else {
2322 std::string cacheData;
2323 std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
2324 // If the form has business cache, refresh the form host.
2325 if (FormCacheMgr::GetInstance().GetData(matchedFormId, cacheData, imageDataMap)) {
2326 formRecord.formProviderInfo.SetFormDataString(cacheData);
2327 formRecord.formProviderInfo.SetImageDataMap(imageDataMap);
2328 formHostRecord.OnUpdate(matchedFormId, formRecord);
2329 }
2330 }
2331 }
2332 return true;
2333 }
2334 /**
2335 * @brief If the form provider is system app and the config item 'formVisibleNotify' is true,
2336 * notify the form provider that the current form is visible.
2337 * @param iBundleMgr BundleManagerProxy
2338 * @param bundleName BundleName
2339 * @param userId UserId
2340 * @return Returns true if the form provider is system app, false if not.
2341 */
CheckIsSystemAppByBundleName(const sptr<IBundleMgr> & iBundleMgr,const int32_t & userId,const std::string & bundleName)2342 bool FormMgrAdapter::CheckIsSystemAppByBundleName(const sptr<IBundleMgr> &iBundleMgr,
2343 const int32_t &userId, const std::string &bundleName)
2344 {
2345 AppExecFwk::ApplicationInfo appInfo;
2346 if (IN_PROCESS_CALL(iBundleMgr->GetApplicationInfoV9(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT,
2347 userId, appInfo)) != ERR_OK) {
2348 HILOG_ERROR("failed to get application info");
2349 return false;
2350 }
2351
2352 HILOG_DEBUG("bundle:%{public}s. isSystemApp=%{public}d", bundleName.c_str(), appInfo.isSystemApp);
2353 return appInfo.isSystemApp;
2354 }
2355
2356 /**
2357 * @brief Check whether the caller for publish form is in the whitelist.
2358 * @param iBundleMgr BundleManagerProxy
2359 * @param bundleName BundleName of caller
2360 * @param want want of target form
2361 * @return Returns ERR_OK if the caller is in the whitelist.
2362 */
IsValidPublishEvent(const sptr<IBundleMgr> & iBundleMgr,const std::string & bundleName,const Want & want)2363 bool FormMgrAdapter::IsValidPublishEvent(const sptr<IBundleMgr> &iBundleMgr,
2364 const std::string &bundleName, const Want &want)
2365 {
2366 int32_t userId = FormUtil::GetCurrentAccountId();
2367 if (!CheckIsSystemAppByBundleName(iBundleMgr, userId, bundleName)) {
2368 HILOG_ERROR("Only system app can request publish form.");
2369 return false;
2370 }
2371 std::vector<Want> wants{want};
2372 return IsErmsSupportPublishForm(bundleName, wants);
2373 }
2374
2375 /**
2376 * @brief if the ability have permission for keeping background running is true,
2377 * @param iBundleMgr BundleManagerProxy
2378 * @param bundleName BundleName
2379 * @return Returns true if the ability have permission for keeping background running, false if not.
2380 */
CheckKeepBackgroundRunningPermission(const sptr<IBundleMgr> & iBundleMgr,const std::string & bundleName)2381 bool FormMgrAdapter::CheckKeepBackgroundRunningPermission(const sptr<IBundleMgr> &iBundleMgr, const std::string &bundleName)
2382 {
2383 BundleInfo bundleInfo;
2384 if (FormBmsHelper::GetInstance().GetBundleInfoWithPermission(bundleName,
2385 FormUtil::GetCurrentAccountId(), bundleInfo)) {
2386 HILOG_DEBUG("%{public}s, get bundleInfo success", __func__);
2387 auto item = find(bundleInfo.reqPermissions.begin(), bundleInfo.reqPermissions.end(), Constants::PERMISSION_KEEP_BACKGROUND_RUNNING);
2388 if (item == bundleInfo.reqPermissions.end()) {
2389 return false;
2390 }
2391 } else {
2392 HILOG_WARN("%{public}s fail, can not get bundleInfo's uid", __func__);
2393 return false;
2394 }
2395
2396 return true;
2397 }
2398 /**
2399 * @brief Get current user ID.
2400 * @param callingUid calling Uid.
2401 * @return Returns user ID.
2402 */
GetCurrentUserId(const int callingUid)2403 int32_t FormMgrAdapter::GetCurrentUserId(const int callingUid)
2404 {
2405 // get current userId
2406 int32_t userId = callingUid / CALLING_UID_TRANSFORM_DIVISOR;
2407 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callingUid, userId);
2408 return userId;
2409 }
2410
2411 /**
2412 * @brief Delete the invalid forms.
2413 * @param formIds Indicates the ID of the valid forms.
2414 * @param callerToken Caller ability token.
2415 * @param numFormsDeleted Returns the number of the deleted forms.
2416 * @return Returns ERR_OK on success, others on failure.
2417 */
DeleteInvalidForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,int32_t & numFormsDeleted)2418 int FormMgrAdapter::DeleteInvalidForms(const std::vector<int64_t> &formIds,
2419 const sptr<IRemoteObject> &callerToken, int32_t &numFormsDeleted)
2420 {
2421 HILOG_INFO("%{public}s called.", __func__);
2422 if (callerToken == nullptr) {
2423 HILOG_ERROR("%{public}s, callerToken is nullptr", __func__);
2424 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2425 }
2426
2427 std::set<int64_t> matchedFormIds {};
2428 for (int64_t formId : formIds) {
2429 int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2430 matchedFormIds.emplace(matchedFormId);
2431 HILOG_DEBUG("valid formId, matchedFormIds: %{public}" PRId64 "", formId);
2432 }
2433 std::map<int64_t, bool> removedFormsMap {};
2434 int32_t callingUid = IPCSkeleton::GetCallingUid();
2435 int32_t userId = FormUtil::GetCurrentAccountId();
2436
2437 // delete invalid DB form record
2438 FormDbCache::GetInstance().DeleteInvalidDBForms(userId, callingUid, matchedFormIds, removedFormsMap);
2439 // delete invalid temp form record
2440 FormDataMgr::GetInstance().DeleteInvalidTempForms(userId, callingUid, matchedFormIds, removedFormsMap);
2441
2442 if (!removedFormsMap.empty()) {
2443 FormDataMgr::GetInstance().ClearHostDataByInvalidForms(callingUid, removedFormsMap);
2444 // delete forms timer
2445 for (const auto &removedForm : removedFormsMap) {
2446 if (removedForm.second) {
2447 FormTimerMgr::GetInstance().RemoveFormTimer(removedForm.first);
2448 }
2449 }
2450 }
2451
2452 std::string bundleName;
2453 if (GetBundleName(bundleName)) {
2454 // delete invalid publish form data
2455 FormDataMgr::GetInstance().DeleteInvalidPublishForms(userId, bundleName, matchedFormIds);
2456 }
2457
2458 numFormsDeleted = static_cast<int32_t>(removedFormsMap.size());
2459 HILOG_INFO("%{public}s done, %{public}d forms deleted.", __func__, numFormsDeleted);
2460 return ERR_OK;
2461 }
2462
2463 /**
2464 * @brief AcquireFormState want check.
2465 * @param bundleName The bundle name of the form.
2466 * @param abilityName The ability name of the form.
2467 * @param want The want of the form.
2468 * @param provider the provider info.
2469 * @return Returns ERR_OK on success, others on failure.
2470 */
AcquireFormStateCheck(const std::string & bundleName,const std::string & abilityName,const Want & want,std::string & provider)2471 ErrCode FormMgrAdapter::AcquireFormStateCheck(const std::string &bundleName,
2472 const std::string &abilityName, const Want &want, std::string &provider)
2473 {
2474 if (bundleName.empty() || abilityName.empty()) {
2475 HILOG_ERROR("%{public}s error, bundleName or abilityName is empty.", __func__);
2476 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2477 }
2478
2479 std::string moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
2480 std::string formName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_NAME_KEY);
2481 int32_t dimensionId = want.GetIntParam(AppExecFwk::Constants::PARAM_FORM_DIMENSION_KEY, 1);
2482
2483 if (moduleName.empty() || formName.empty()) {
2484 HILOG_ERROR("%{public}s error, moduleName or formName is empty.", __func__);
2485 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2486 }
2487
2488 std::vector<FormInfo> formInfos {};
2489 ErrCode errCode = FormInfoMgr::GetInstance()
2490 .GetFormsInfoByModuleWithoutCheck(want.GetElement().GetBundleName(), moduleName, formInfos);
2491 if (errCode != ERR_OK) {
2492 HILOG_ERROR("%{public}s error, failed to get forms info.", __func__);
2493 return errCode;
2494 }
2495
2496 bool found = false;
2497 for (auto &formInfo : formInfos) {
2498 if ((formInfo.abilityName == abilityName) && (formInfo.name == formName) &&
2499 (IsDimensionValid(formInfo, dimensionId))) {
2500 found = true;
2501 HILOG_INFO("%{public}s form info found.", __func__);
2502 break;
2503 }
2504 }
2505 if (!found) {
2506 HILOG_INFO("failed to find match form info.");
2507 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2508 }
2509
2510 int32_t callingUid = IPCSkeleton::GetCallingUid();
2511 const std::string doubleColon = "::";
2512 provider.append(bundleName).append(doubleColon).append(abilityName).append(doubleColon)
2513 .append(moduleName).append(doubleColon).append(formName).append(doubleColon)
2514 .append(std::to_string(dimensionId)).append(doubleColon).append(std::to_string(callingUid));
2515 return ERR_OK;
2516 }
2517
2518 /**
2519 * @brief Acquire form state info by passing a set of parameters (using Want) to the form provider.
2520 * @param want Indicates a set of parameters to be transparently passed to the form provider.
2521 * @param callerToken Caller ability token.
2522 * @param stateInfo Returns the form's state info of the specify.
2523 * @return Returns ERR_OK on success, others on failure.
2524 */
AcquireFormState(const Want & want,const sptr<IRemoteObject> & callerToken,FormStateInfo & stateInfo)2525 int FormMgrAdapter::AcquireFormState(const Want &want, const sptr<IRemoteObject> &callerToken,
2526 FormStateInfo &stateInfo)
2527 {
2528 if (callerToken == nullptr) {
2529 HILOG_ERROR("%{public}s, callerToken is nullptr", __func__);
2530 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2531 }
2532 std::string bundleName = want.GetElement().GetBundleName();
2533 std::string abilityName = want.GetElement().GetAbilityName();
2534
2535 std::string provider;
2536 ErrCode errCode = AcquireFormStateCheck(bundleName, abilityName, want, provider);
2537 if (errCode != ERR_OK) {
2538 return errCode;
2539 }
2540
2541 int32_t callingUid = IPCSkeleton::GetCallingUid();
2542 FormItemInfo info;
2543 FormDataMgr::GetInstance().CreateFormStateRecord(provider, info, callerToken, callingUid);
2544
2545 HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s", bundleName.c_str(), abilityName.c_str());
2546 sptr<IAbilityConnection> connection =
2547 new (std::nothrow) FormAcquireStateConnection(bundleName, abilityName, want, provider);
2548 if (connection == nullptr) {
2549 HILOG_ERROR("failed to create FormAcquireStateConnection.");
2550 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2551 }
2552 Want targetWant;
2553 targetWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
2554 targetWant.SetElementName(bundleName, abilityName);
2555 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(targetWant, connection);
2556 if (errorCode != ERR_OK) {
2557 HILOG_ERROR("%{public}s, ConnectServiceAbility failed.", __func__);
2558 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2559 }
2560 stateInfo.state = FormState::DEFAULT;
2561 return ERR_OK;
2562 }
2563
AcquireFormData(int64_t formId,int64_t requestCode,const sptr<IRemoteObject> & callerToken,AAFwk::WantParams & formData)2564 int FormMgrAdapter::AcquireFormData(int64_t formId, int64_t requestCode, const sptr<IRemoteObject> &callerToken,
2565 AAFwk::WantParams &formData)
2566 {
2567 FormRecord formRecord;
2568 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
2569 if (!isFormRecExist) {
2570 HILOG_ERROR("form info get formRecord failed.");
2571 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
2572 }
2573 std::string bundleName = formRecord.bundleName;
2574 std::string abilityName = formRecord.abilityName;
2575
2576 HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s", bundleName.c_str(), abilityName.c_str());
2577 int32_t callingUid = IPCSkeleton::GetCallingUid();
2578 FormItemInfo info;
2579 FormDataMgr::GetInstance().CreateFormAcquireDataRecord(requestCode, info, callerToken, callingUid);
2580 sptr<IAbilityConnection> connection =
2581 new (std::nothrow) FormAcquireDataConnection(formId, bundleName, abilityName, requestCode);
2582 if (connection == nullptr) {
2583 HILOG_ERROR("failed to create FormAcquireDataConnection.");
2584 return ERR_APPEXECFWK_FORM_COMMON_CODE;
2585 }
2586 Want targetWant;
2587 targetWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
2588 targetWant.SetElementName(bundleName, abilityName);
2589 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(targetWant, connection);
2590 if (errorCode != ERR_OK) {
2591 HILOG_ERROR("ConnectServiceAbility failed.");
2592 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2593 }
2594 return ERR_OK;
2595 }
2596
2597 /**
2598 * @brief Notify the form is visible or not.
2599 * @param formIds Indicates the ID of the forms.
2600 * @param isVisible Visible or not.
2601 * @param callerToken Host client.
2602 * @return Returns ERR_OK on success, others on failure.
2603 */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)2604 int FormMgrAdapter::NotifyFormsVisible(const std::vector<int64_t> &formIds,
2605 bool isVisible, const sptr<IRemoteObject> &callerToken)
2606 {
2607 HILOG_INFO("%{public}s, isVisible: %{public}d.", __func__, isVisible);
2608 return FormDataMgr::GetInstance().NotifyFormsVisible(formIds, isVisible, callerToken);
2609 }
2610
2611 /**
2612 * @brief Notify the form is enable to be updated or not.
2613 * @param formIds Indicates the ID of the forms.
2614 * @param isEnableUpdate enable update or not.
2615 * @param callerToken Host client.
2616 * @return Returns ERR_OK on success, others on failure.
2617 */
NotifyFormsEnableUpdate(const std::vector<int64_t> & formIds,bool isEnableUpdate,const sptr<IRemoteObject> & callerToken)2618 int FormMgrAdapter::NotifyFormsEnableUpdate(const std::vector<int64_t> &formIds,
2619 bool isEnableUpdate, const sptr<IRemoteObject> &callerToken)
2620 {
2621 HILOG_INFO("%{public}s, isEnableUpdate: %{public}d.", __func__, isEnableUpdate);
2622 return HandleUpdateFormFlag(formIds, callerToken, isEnableUpdate, true);
2623 }
2624
2625 /**
2626 * @brief Get All FormsInfo.
2627 * @param formInfos Return the forms' information of all forms provided.
2628 * @return Returns ERR_OK on success, others on failure.
2629 */
GetAllFormsInfo(std::vector<FormInfo> & formInfos)2630 int FormMgrAdapter::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
2631 {
2632 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2633 return FormInfoMgr::GetInstance().GetAllFormsInfo(formInfos);
2634 }
2635
2636 /**
2637 * @brief Get forms info by bundle name .
2638 * @param bundleName Application name.
2639 * @param formInfos Return the forms' information of the specify application name.
2640 * @return Returns ERR_OK on success, others on failure.
2641 */
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos)2642 int FormMgrAdapter::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos)
2643 {
2644 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2645 return FormInfoMgr::GetInstance().GetFormsInfoByBundle(bundleName, formInfos);
2646 }
2647
2648 /**
2649 * @brief Get forms info by bundle name and module name.
2650 * @param bundleName bundle name.
2651 * @param moduleName Module name of hap.
2652 * @param formInfos Return the forms' information of the specify bundle name and module name.
2653 * @return Returns ERR_OK on success, others on failure.
2654 */
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos)2655 int FormMgrAdapter::GetFormsInfoByModule(const std::string &bundleName,
2656 const std::string &moduleName, std::vector<FormInfo> &formInfos)
2657 {
2658 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2659 return FormInfoMgr::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
2660 }
2661
IsRequestPublishFormSupported()2662 bool FormMgrAdapter::IsRequestPublishFormSupported()
2663 {
2664 /* Query the highest priority ability or extension ability for publishing form */
2665 std::string bundleName;
2666 if (!GetBundleName(bundleName)) {
2667 HILOG_ERROR("%{public}s failed to get BundleName", __func__);
2668 return false;
2669 }
2670
2671 std::vector<Want> wants;
2672 bool isSupport = IsErmsSupportPublishForm(bundleName, wants);
2673 if (!isSupport) {
2674 HILOG_ERROR("Erms is not support to publish forms");
2675 return false;
2676 }
2677
2678 if (formPublishInterceptor_ != nullptr) {
2679 HILOG_DEBUG("query publish form has publish interceptor, return true.");
2680 return true;
2681 }
2682
2683 auto action = Constants::FORM_PUBLISH_ACTION;
2684 auto userId = GetCurrentUserId(IPCSkeleton::GetCallingUid());
2685 AppExecFwk::AbilityInfo abilityInfo;
2686 AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
2687 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(action, userId, abilityInfo, extensionAbilityInfo)) {
2688 HILOG_ERROR("Failed to ImplicitQueryInfoByPriority for publishing form");
2689 return false;
2690 }
2691
2692 if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
2693 HILOG_ERROR("Query highest priority ability failed, no form host ability found.");
2694 return false;
2695 }
2696 return true;
2697 }
2698
2699 /**
2700 * @brief check if the form host is system app
2701 * @param formRecord Form storage information
2702 * @return Returns true if the form host is system app, false if not.
2703 */
checkFormHostHasSaUid(const FormRecord & formRecord)2704 bool FormMgrAdapter::checkFormHostHasSaUid(const FormRecord &formRecord)
2705 {
2706 return std::find(formRecord.formUserUids.begin(), formRecord.formUserUids.end(),
2707 SYSTEM_UID) != formRecord.formUserUids.end();
2708 }
2709
RegisterFormAddObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)2710 ErrCode FormMgrAdapter::RegisterFormAddObserverByBundle(const std::string bundleName,
2711 const sptr<IRemoteObject> &callerToken)
2712 {
2713 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2714 return FormObserverRecord::GetInstance().SetFormAddObserver(bundleName, callerToken);
2715 }
2716
RegisterFormRemoveObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)2717 ErrCode FormMgrAdapter::RegisterFormRemoveObserverByBundle(const std::string bundleName,
2718 const sptr<IRemoteObject> &callerToken)
2719 {
2720 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2721 return FormObserverRecord::GetInstance().SetFormRemoveObserver(bundleName, callerToken);
2722 }
2723
GetFormsCount(bool isTempFormFlag,int32_t & formCount)2724 int32_t FormMgrAdapter::GetFormsCount(bool isTempFormFlag, int32_t &formCount)
2725 {
2726 HILOG_DEBUG("%{public}s, isTempFormFlag: %{public}d.", __func__, isTempFormFlag);
2727 if (isTempFormFlag) {
2728 return FormDataMgr::GetInstance().GetTempFormsCount(formCount);
2729 }
2730 return FormDataMgr::GetInstance().GetCastFormsCount(formCount);
2731 }
2732
GetHostFormsCount(std::string & bundleName,int32_t & formCount)2733 int32_t FormMgrAdapter::GetHostFormsCount(std::string &bundleName, int32_t &formCount)
2734 {
2735 HILOG_DEBUG("%{public}s, bundleName: %{public}s.", __func__, bundleName.c_str());
2736 return FormDataMgr::GetInstance().GetHostFormsCount(bundleName, formCount);
2737 }
2738
GetRunningFormInfos(std::vector<RunningFormInfo> & runningFormInfos)2739 ErrCode FormMgrAdapter::GetRunningFormInfos(std::vector<RunningFormInfo> &runningFormInfos)
2740 {
2741 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2742 return FormDataMgr::GetInstance().GetRunningFormInfos(runningFormInfos);
2743 }
2744
GetRunningFormInfosByBundleName(const std::string & bundleName,std::vector<RunningFormInfo> & runningFormInfos)2745 ErrCode FormMgrAdapter::GetRunningFormInfosByBundleName(const std::string &bundleName,
2746 std::vector<RunningFormInfo> &runningFormInfos)
2747 {
2748 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2749 return FormDataMgr::GetInstance().GetRunningFormInfosByBundleName(bundleName, runningFormInfos);
2750 }
2751
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)2752 ErrCode FormMgrAdapter::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
2753 std::vector<FormInstance> &formInstances)
2754 {
2755 return FormDataMgr::GetInstance().GetFormInstancesByFilter(formInstancesFilter, formInstances);
2756 }
2757
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)2758 ErrCode FormMgrAdapter::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
2759 {
2760 return FormDataMgr::GetInstance().GetFormInstanceById(formId, formInstance);
2761 }
2762
GetFormInstanceById(const int64_t formId,bool isIncludeUnused,FormInstance & formInstance)2763 ErrCode FormMgrAdapter::GetFormInstanceById(const int64_t formId, bool isIncludeUnused, FormInstance &formInstance)
2764 {
2765 return FormDataMgr::GetInstance().GetFormInstanceById(formId, isIncludeUnused, formInstance);
2766 }
2767
RegisterAddObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)2768 ErrCode FormMgrAdapter::RegisterAddObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
2769 {
2770 HILOG_DEBUG("called.");
2771 std::lock_guard<std::mutex> lock(formObserversMutex_);
2772 auto formObserver = formObservers_.find(bundleName);
2773 if (formObserver == formObservers_.end()) {
2774 formObservers_.emplace(bundleName, callerToken);
2775 SetDeathRecipient(callerToken, new (std::nothrow) FormMgrAdapter::ClientDeathRecipient());
2776 } else {
2777 HILOG_ERROR("callback is already exist");
2778 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2779 }
2780 HILOG_DEBUG("success.");
2781 return ERR_OK;
2782 }
2783
RegisterRemoveObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)2784 ErrCode FormMgrAdapter::RegisterRemoveObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
2785 {
2786 HILOG_DEBUG("called.");
2787 std::lock_guard<std::mutex> lock(formObserversMutex_);
2788 auto formObserver = formObservers_.find(bundleName);
2789 if (formObserver == formObservers_.end()) {
2790 HILOG_ERROR("bundleName is not exist");
2791 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2792 } else {
2793 if (formObserver->second == callerToken) {
2794 formObservers_.erase(formObserver);
2795 SetDeathRecipient(callerToken, new (std::nothrow) FormMgrAdapter::ClientDeathRecipient());
2796 } else {
2797 HILOG_ERROR("callback is not exist");
2798 return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
2799 }
2800 }
2801 HILOG_DEBUG("success.");
2802 return ERR_OK;
2803 }
2804
SetDeathRecipient(const sptr<IRemoteObject> & callerToken,const sptr<IRemoteObject::DeathRecipient> & deathRecipient)2805 void FormMgrAdapter::SetDeathRecipient(const sptr<IRemoteObject> &callerToken,
2806 const sptr<IRemoteObject::DeathRecipient> &deathRecipient)
2807 {
2808 HILOG_DEBUG("called.");
2809 if (callerToken == nullptr || deathRecipient == nullptr) {
2810 HILOG_ERROR("The callerToken or the deathRecipient is empty");
2811 return;
2812 }
2813 std::lock_guard<std::mutex> lock(deathRecipientsMutex_);
2814 auto iter = deathRecipients_.find(callerToken);
2815 if (iter == deathRecipients_.end()) {
2816 deathRecipients_.emplace(callerToken, deathRecipient);
2817 callerToken->AddDeathRecipient(deathRecipient);
2818 } else {
2819 HILOG_DEBUG("The deathRecipient has been added.");
2820 }
2821 }
2822
CleanResource(const wptr<IRemoteObject> & remote)2823 void FormMgrAdapter::CleanResource(const wptr<IRemoteObject> &remote)
2824 {
2825 HILOG_DEBUG("called.");
2826
2827 // Clean the formObservers_.
2828 auto object = remote.promote();
2829 if (object == nullptr) {
2830 HILOG_ERROR("remote object is nullptr");
2831 return;
2832 }
2833 {
2834 std::lock_guard<std::mutex> lock(formObserversMutex_);
2835 for (auto it = formObservers_.begin(); it != formObservers_.end();) {
2836 auto& observer = it->second;
2837 if (observer == object) {
2838 it = formObservers_.erase(it);
2839 } else {
2840 ++it;
2841 }
2842 }
2843 }
2844 std::lock_guard<std::mutex> deathLock(deathRecipientsMutex_);
2845 auto iter = deathRecipients_.find(object);
2846 if (iter != deathRecipients_.end()) {
2847 auto deathRecipient = iter->second;
2848 deathRecipients_.erase(iter);
2849 object->RemoveDeathRecipient(deathRecipient);
2850 }
2851 }
2852
OnRemoteDied(const wptr<IRemoteObject> & remote)2853 void FormMgrAdapter::ClientDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
2854 {
2855 HILOG_DEBUG("remote died");
2856 FormMgrAdapter::GetInstance().CleanResource(remote);
2857 }
2858
RegisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)2859 int32_t FormMgrAdapter::RegisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
2860 {
2861 HILOG_DEBUG("called.");
2862 if (interceptorCallback == nullptr) {
2863 HILOG_ERROR("interceptorCallback is null.");
2864 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2865 }
2866 auto interceptor = iface_cast<AppExecFwk::IFormPublishInterceptor>(interceptorCallback);
2867 if (interceptor == nullptr) {
2868 HILOG_ERROR("RegisterPublishFormInterceptor failed.");
2869 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2870 }
2871 formPublishInterceptor_ = interceptor;
2872 return ERR_OK;
2873 }
2874
UnregisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)2875 int32_t FormMgrAdapter::UnregisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
2876 {
2877 HILOG_DEBUG("called.");
2878 if (interceptorCallback == nullptr) {
2879 HILOG_ERROR("interceptorCallback is null.");
2880 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2881 }
2882 auto interceptor = iface_cast<AppExecFwk::IFormPublishInterceptor>(interceptorCallback);
2883 if (interceptor == nullptr) {
2884 HILOG_ERROR("UnregisterPublishFormInterceptor failed.");
2885 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2886 }
2887 if (formPublishInterceptor_ == interceptor) {
2888 HILOG_DEBUG("UnregisterPublishFormInterceptor success.");
2889 formPublishInterceptor_ = nullptr;
2890 return ERR_OK;
2891 }
2892 HILOG_ERROR("the param not equal to the current interceptor.");
2893 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2894 }
2895
2896 #ifdef SUPPORT_ERMS
GetCallerType(std::string bundleName)2897 int32_t FormMgrAdapter::GetCallerType(std::string bundleName)
2898 {
2899 sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2900 if (iBundleMgr == nullptr) {
2901 HILOG_ERROR("fail, failed to get IBundleMgr.");
2902 return ErmsCallerInfo::TYPE_INVALID;
2903 }
2904
2905 AppExecFwk::ApplicationInfo callerAppInfo;
2906 auto flag = AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO;
2907 auto userId = GetCurrentUserId(IPCSkeleton::GetCallingUid());
2908 bool getCallerResult = IN_PROCESS_CALL(iBundleMgr->GetApplicationInfo(bundleName, flag, userId, callerAppInfo));
2909 if (!getCallerResult) {
2910 HILOG_ERROR("Get callerAppInfo failed.");
2911 return ErmsCallerInfo::TYPE_INVALID;
2912 }
2913
2914 switch (callerAppInfo.bundleType) {
2915 case AppExecFwk::BundleType::ATOMIC_SERVICE:
2916 return ErmsCallerInfo::TYPE_ATOM_SERVICE;
2917 case AppExecFwk::BundleType::APP:
2918 return ErmsCallerInfo::TYPE_HARMONY_APP;
2919 default:
2920 HILOG_WARN("the caller type is not harmony app or atom service: %{public}d", callerAppInfo.bundleType);
2921 break;
2922 }
2923 return ErmsCallerInfo::TYPE_INVALID;
2924 }
2925 #endif
2926
IsErmsSupportPublishForm(std::string bundleName,std::vector<Want> wants)2927 bool FormMgrAdapter::IsErmsSupportPublishForm(std::string bundleName, std::vector<Want> wants)
2928 {
2929 bool isSupport = true;
2930 #ifdef SUPPORT_ERMS
2931 ErmsCallerInfo callerInfo;
2932 callerInfo.packageName = bundleName;
2933 callerInfo.uid = IPCSkeleton::GetCallingUid();
2934 callerInfo.pid = IPCSkeleton::GetCallingPid();
2935 callerInfo.callerAppType = GetCallerType(bundleName);
2936
2937 auto start = FormUtil::GetCurrentMicrosecond();
2938 int32_t ret = EcologicalRuleMgrServiceClient::GetInstance()->IsSupportPublishForm(wants, callerInfo, isSupport);
2939 auto end = FormUtil::GetCurrentMicrosecond();
2940 HILOG_INFO("[ERMS-DFX] IsSupportPublishForm cost %{public}" PRId64 " micro seconds", (end - start));
2941 if (ret != ERR_OK) {
2942 HILOG_ERROR("call IsSupportPublishForm failed: %{public}d, default is support.", ret);
2943 return true;
2944 }
2945 #endif
2946 return isSupport;
2947 }
2948 } // namespace AppExecFwk
2949 } // namespace OHOS
2950