• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <algorithm>
19 #include <cinttypes>
20 #include <regex>
21 #include <unordered_map>
22 #include <unordered_set>
23 
24 #include "ability_manager_errors.h"
25 #include "form_record.h"
26 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
27 #include "bundle_active_client.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_ecological_rule_param.h"
45 #include "form_ecological_rule_service.h"
46 #include "form_event_notify_connection.h"
47 #include "form_info_mgr.h"
48 #include "form_mgr_errors.h"
49 #include "form_publish_interceptor_interface.h"
50 #include "form_observer_record.h"
51 #include "form_provider_info.h"
52 #include "form_provider_interface.h"
53 #include "form_provider_mgr.h"
54 #include "form_router_proxy_mgr.h"
55 #include "form_render_connection.h"
56 #include "form_render_mgr.h"
57 #include "form_share_mgr.h"
58 #include "form_supply_callback.h"
59 #include "form_timer_mgr.h"
60 #include "form_trust_mgr.h"
61 #include "form_util.h"
62 #include "hitrace_meter.h"
63 #include "if_system_ability_manager.h"
64 #include "in_process_call_wrapper.h"
65 #include "ipc_skeleton.h"
66 #include "iservice_registry.h"
67 #include "js_form_state_observer_interface.h"
68 #include "nlohmann/json.hpp"
69 #include "os_account_manager.h"
70 #include "parameters.h"
71 #include "system_ability_definition.h"
72 #include "form_task_mgr.h"
73 
74 namespace OHOS {
75 namespace AppExecFwk {
76 namespace {
77 constexpr int32_t CALLING_UID_TRANSFORM_DIVISOR = 200000;
78 constexpr int32_t SYSTEM_UID = 1000;
79 constexpr int32_t API_11 = 11;
80 const std::string POINT_ETS = ".ets";
81 constexpr int DATA_FIELD = 1;
82 constexpr int FORM_UPDATE_LEVEL_VALUE_MAX_LENGTH = 3; // update level is 1~336, so max length is 3.
83 const std::string EMPTY_BUNDLE = "";
84 const std::string FORM_CLICK_ROUTER = "router";
85 const std::string FORM_CLICK_MESSAGE = "message";
86 const std::string FORM_CLICK_CALL = "call";
87 const std::string FORM_SUPPORT_ECOLOGICAL_RULEMGRSERVICE = "persist.sys.fms.support.ecologicalrulemgrservice";
88 } // namespace
89 
FormMgrAdapter()90 FormMgrAdapter::FormMgrAdapter()
91 {
92     HILOG_DEBUG("called.");
93 }
~FormMgrAdapter()94 FormMgrAdapter::~FormMgrAdapter()
95 {
96     HILOG_DEBUG("called.");
97 }
98 
99 /**
100  * @brief Init properties like visibleNotifyDelayTime.
101  */
Init()102 void FormMgrAdapter::Init()
103 {
104     FormDataMgr::GetInstance().GetConfigParamFormMap(Constants::VISIBLE_NOTIFY_DELAY, visibleNotifyDelay_);
105     HILOG_INFO("load visibleNotifyDelayTime: %{public}d", visibleNotifyDelay_);
106 }
107 
108 /**
109  * @brief Add form with want, send want to form manager service.
110  * @param formId The Id of the forms to add.
111  * @param want The want of the form to add.
112  * @param callerToken Caller ability token.
113  * @param formInfo Form info.
114  * @return Returns ERR_OK on success, others on failure.
115  */
AddForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo)116 int FormMgrAdapter::AddForm(const int64_t formId, const Want &want,
117     const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo)
118 {
119     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
120     HILOG_DEBUG("called.");
121     if (formId < 0 || callerToken == nullptr) {
122         HILOG_ERROR("fail, callerToken can not be NULL");
123         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
124     }
125 
126     ErrCode ret = CheckFormCountLimit(formId, want);
127     if (ret != ERR_OK) {
128         HILOG_ERROR("CheckFormCountLimit failed");
129         return ret;
130     }
131 
132     // get from config info
133     FormItemInfo formItemInfo;
134     int32_t errCode = GetFormConfigInfo(want, formItemInfo);
135     if (errCode != ERR_OK) {
136         HILOG_ERROR("fail, get form config info failed.");
137         return errCode;
138     }
139     // Check trust list
140     formItemInfo.SetFormId(formId);
141     if (!FormTrustMgr::GetInstance().IsTrust(formItemInfo.GetProviderBundleName())) {
142         HILOG_ERROR("AddForm fail, %{public}s is unTrust",
143             formItemInfo.GetProviderBundleName().c_str());
144         return ERR_APPEXECFWK_FORM_NOT_TRUST;
145     }
146 
147     // publish form
148     if (formId > 0 && FormDataMgr::GetInstance().IsRequestPublishForm(formId)) {
149         ret = AddRequestPublishForm(formItemInfo, want, callerToken, formInfo);
150         if (ret != ERR_OK) {
151             HILOG_ERROR("failed, add request publish form failed.");
152             return ret;
153         }
154         bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
155         if (!tempFormFlag && (ret == ERR_OK)) {
156             HILOG_DEBUG("Checks if there is a listener listening for adding form");
157             HandleFormAddObserver(formInfo.formId);
158         }
159     }
160 
161     ret = AllotForm(formId, want, callerToken, formInfo, formItemInfo);
162     if (ret != ERR_OK) {
163         HILOG_ERROR("failed, allot form failed.");
164     }
165     return ret;
166 }
167 
CheckFormCountLimit(const int64_t formId,const Want & want)168 ErrCode FormMgrAdapter::CheckFormCountLimit(const int64_t formId, const Want &want)
169 {
170     bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
171     int callingUid = IPCSkeleton::GetCallingUid();
172     ErrCode checkCode = 0;
173     if (tempFormFlag && !FormRenderMgr::GetInstance().IsRerenderForRenderServiceDied(formId)) {
174         if (formId > 0) {
175             HILOG_ERROR("fail, temp form id is invalid, formId:%{public}" PRId64 "", formId);
176             return ERR_APPEXECFWK_FORM_INVALID_PARAM;
177         }
178         checkCode = FormDataMgr::GetInstance().CheckTempEnoughForm();
179     } else {
180         if (formId == 0) {
181             // get current userId
182             int32_t currentUserId = GetCurrentUserId(callingUid);
183             checkCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, currentUserId);
184         }
185     }
186     if (checkCode != 0) {
187         HILOG_ERROR("fail, too much forms in system");
188     }
189     return checkCode;
190 }
191 
AllotForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo,const FormItemInfo & formItemInfo)192 ErrCode FormMgrAdapter::AllotForm(const int64_t formId, const Want &want,
193     const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo, const FormItemInfo &formItemInfo)
194 {
195     Want newWant(want);
196     bool directCallInApp = newWant.GetBoolParam(Constants::KEY_DIRECT_CALL_INAPP, false);
197     // in application form
198     if (formItemInfo.GetProviderBundleName() == formItemInfo.GetHostBundleName() && directCallInApp) {
199         HILOG_DEBUG("form in application");
200         newWant.SetParam(Constants::PARAM_FORM_HOST_TOKEN, callerToken);
201     }
202 
203     WantParams wantParams = newWant.GetParams();
204     // share form
205     if (formId == 0 && DelayedSingleton<FormShareMgr>::GetInstance()->IsShareForm(newWant)) {
206         DelayedSingleton<FormShareMgr>::GetInstance()->AddProviderData(newWant, wantParams);
207     }
208     //Specify the form Id
209     bool specificFormFlag = false;
210     if (want.HasParameter(Constants::PARAM_FORM_MIGRATE_FORM_KEY)) {
211         specificFormFlag = want.GetBoolParam(Constants::PARAM_FORM_MIGRATE_FORM_KEY, false);
212         wantParams.Remove(Constants::PARAM_FORM_MIGRATE_FORM_KEY);
213     }
214 
215     if (!formItemInfo.IsTransparencyEnabled()) {
216         wantParams.Remove(Constants::PARAM_FORM_TRANSPARENCY_KEY);
217     }
218 
219     ErrCode ret = 0;
220     if (formId > 0) {
221         if (specificFormFlag) {
222             ret = AllotFormBySpecificId(formItemInfo, callerToken, wantParams, formInfo);
223         } else {
224             ret = AllotFormById(formItemInfo, callerToken, wantParams, formInfo);
225         }
226     } else {
227         ret = AllotFormByInfo(formItemInfo, callerToken, wantParams, formInfo);
228         bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
229         if (!tempFormFlag && (ret == ERR_OK)) {
230             HILOG_DEBUG("Checks if there is a listener listening for adding form");
231             HandleFormAddObserver(formInfo.formId);
232         }
233     }
234     return ret;
235 }
236 
HandleFormAddObserver(const int64_t formId)237 ErrCode FormMgrAdapter::HandleFormAddObserver(const int64_t formId)
238 {
239     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
240     std::string hostBundleName;
241     auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
242     if (ret != ERR_OK) {
243         HILOG_ERROR("failed to get BundleName");
244         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
245     }
246 
247     // Checks if there is a observer on the current host.
248     return FormDataMgr::GetInstance().HandleFormAddObserver(hostBundleName, formId);
249 }
250 
HandleFormRemoveObserver(const RunningFormInfo runningFormInfo)251 ErrCode FormMgrAdapter::HandleFormRemoveObserver(const RunningFormInfo runningFormInfo)
252 {
253     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
254     std::string hostBundleName;
255     auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
256     if (ret != ERR_OK) {
257         HILOG_ERROR("failed to get BundleName");
258         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
259     }
260 
261     // Checks if there is a observer on the current host.
262     return FormDataMgr::GetInstance().HandleFormRemoveObserver(hostBundleName, runningFormInfo);
263 }
264 
265 /**
266  * @brief Delete forms with formIds, send formIds to form manager service.
267  * @param formId The Id of the forms to delete.
268  * @param callerToken Caller ability token.
269  * @return Returns ERR_OK on success, others on failure.
270  */
DeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)271 int FormMgrAdapter::DeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
272 {
273     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
274     HILOG_INFO("formId is %{public}" PRId64, formId);
275     if (formId <= 0 || callerToken == nullptr) {
276         HILOG_ERROR("deleteForm invalid param");
277         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
278     }
279 
280     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
281     // remove connection for in application form
282     FormSupplyCallback::GetInstance()->RemoveConnection(matchedFormId, callerToken);
283     FormDataProxyMgr::GetInstance().UnsubscribeFormData(matchedFormId);
284     if (FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
285         // delete temp form if receive delete form call
286         return HandleDeleteTempForm(matchedFormId, callerToken);
287     }
288     RunningFormInfo runningFormInfo;
289     FormDataMgr::GetInstance().GetRunningFormInfosByFormId(matchedFormId, runningFormInfo);
290     auto ret = HandleDeleteForm(matchedFormId, callerToken);
291     if (ret != ERR_OK) {
292         HILOG_ERROR("delete form failed.");
293         return ret;
294     }
295     HILOG_DEBUG("Checks if there is a listener listening for release form");
296     HandleFormRemoveObserver(runningFormInfo);
297     return ERR_OK;
298 }
299 
300 /**
301  * @brief Stop rendering form.
302  * @param formId The Id of the forms to delete.
303  * @param compId The compId of the forms to delete.
304  * @return Returns ERR_OK on success, others on failure.
305  */
StopRenderingForm(const int64_t formId,const std::string & compId)306 int FormMgrAdapter::StopRenderingForm(const int64_t formId, const std::string &compId)
307 {
308     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
309     if (formId <= 0 || compId.empty()) {
310         HILOG_ERROR("%{public}s, deleteForm invalid param", __func__);
311         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
312     }
313 
314     FormRecord record;
315     FormDataMgr::GetInstance().GetFormRecord(formId, record);
316     FormRenderMgr::GetInstance().StopRenderingForm(formId, record, compId);
317     return ERR_OK;
318 }
319 
320 /**
321  * @brief Release forms with formIds, send formIds to form Mgr service.
322  * @param formId The Id of the forms to release.
323  * @param callerToken Caller ability token.
324  * @param delCache Delete Cache or not.
325  * @return Returns ERR_OK on success, others on failure.
326  */
ReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const bool delCache)327 int FormMgrAdapter::ReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const bool delCache)
328 {
329     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
330     HILOG_INFO("formId is %{public}" PRId64, formId);
331     if (formId <= 0 || callerToken == nullptr) {
332         HILOG_ERROR("%{public}s, releaseForm invalid param", __func__);
333         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
334     }
335     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
336     // remove connection for in application form
337     FormSupplyCallback::GetInstance()->RemoveConnection(matchedFormId, callerToken);
338     if (FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
339         // delete temp form if receive release form call
340         return HandleDeleteTempForm(matchedFormId, callerToken);
341     }
342     FormRecord record;
343     FormDataMgr::GetInstance().GetFormRecord(formId, record);
344     FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
345     FormRecord dbRecord;
346     if (FormDbCache::GetInstance().GetDBRecord(matchedFormId, dbRecord) != ERR_OK) {
347         HILOG_ERROR("%{public}s, not exist such db form:%{public}" PRId64 "", __func__, formId);
348         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
349     }
350     int callingUid = IPCSkeleton::GetCallingUid();
351     bool isSelfDbFormId = (FormUtil::GetCurrentAccountId() == dbRecord.providerUserId) &&
352         ((std::find(dbRecord.formUserUids.begin(), dbRecord.formUserUids.end(), callingUid)
353         != dbRecord.formUserUids.end()) ? true : false);
354     if (!isSelfDbFormId) {
355         HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
356         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
357     }
358     if (delCache) {
359         ErrCode result = HandleReleaseForm(matchedFormId, callerToken);
360         if (result != ERR_OK) {
361             HILOG_ERROR("%{public}s, release form error.", __func__);
362             return result;
363         }
364     }
365 
366     if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, matchedFormId)) {
367         HILOG_ERROR("%{public}s, failed to remove host record", __func__);
368         return ERR_APPEXECFWK_FORM_COMMON_CODE;
369     }
370     if (!FormTimerMgr::GetInstance().RemoveFormTimer(matchedFormId)) {
371         HILOG_ERROR("%{public}s, remove timer error", __func__);
372         return ERR_APPEXECFWK_FORM_COMMON_CODE;
373     }
374     return ERR_OK;
375 }
376 
377 /**
378  * @brief Handle release form.
379  * @param formId The form id.
380  * @param callerToken Caller ability token.
381  * @return Returns ERR_OK on success, others on failure.
382  */
HandleReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)383 ErrCode FormMgrAdapter::HandleReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
384 {
385     HILOG_INFO("formId is %{public}" PRId64, formId);
386     if (!FormDataMgr::GetInstance().ExistFormRecord(formId)) {
387         HILOG_ERROR("%{public}s, not exist such db or temp form:%{public}" PRId64 "", __func__, formId);
388         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
389     }
390 
391     FormHostRecord hostRecord;
392     bool hasRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, hostRecord);
393     bool isSelfId = hasRecord && hostRecord.Contains(formId);
394     if (!isSelfId) {
395         HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
396         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
397     }
398 
399     FormDataMgr::GetInstance().DeleteFormUserUid(formId, IPCSkeleton::GetCallingUid());
400     if (!FormDataMgr::GetInstance().HasFormUserUids(formId)) {
401         FormDataMgr::GetInstance().DeleteFormRecord(formId);
402         if (!FormTimerMgr::GetInstance().RemoveFormTimer(formId)) {
403             HILOG_ERROR("%{public}s, remove timer error", __func__);
404             return ERR_APPEXECFWK_FORM_COMMON_CODE;
405         }
406     }
407     return ERR_OK;
408 }
409 
410 /**
411  * @brief Handle delete form.
412  * @param formId The form id.
413  * @param callerToken Caller ability token.
414  * @return Returns ERR_OK on success, others on failure.
415  */
HandleDeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)416 ErrCode FormMgrAdapter::HandleDeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
417 {
418     HILOG_INFO("formId is %{public}" PRId64, formId);
419     FormRecord dbRecord;
420     if (FormDbCache::GetInstance().GetDBRecord(formId, dbRecord) != ERR_OK) {
421         HILOG_ERROR("%{public}s, not exist such db form:%{public}" PRId64 "", __func__, formId);
422         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
423     }
424     FormRecord record;
425     FormDataMgr::GetInstance().GetFormRecord(formId, record);
426     FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
427 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
428     DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
429         record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_REMOVED);
430 #endif
431     int callingUid = IPCSkeleton::GetCallingUid();
432     int32_t userId = FormUtil::GetCurrentAccountId();
433     bool isSelfDbFormId = (userId == dbRecord.providerUserId) && ((std::find(dbRecord.formUserUids.begin(),
434         dbRecord.formUserUids.end(), callingUid) != dbRecord.formUserUids.end()) ? true : false);
435     if (!isSelfDbFormId) {
436         HILOG_ERROR("not self form:%{public}" PRId64 ", callingUid:%{public}d", formId, callingUid);
437         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
438     }
439 
440     ErrCode result = HandleDeleteFormCache(dbRecord, callingUid, formId);
441     if (result != ERR_OK) {
442         return result;
443     }
444 
445     if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, formId)) {
446         HILOG_ERROR("failed to remove host record");
447         return ERR_APPEXECFWK_FORM_COMMON_CODE;
448     }
449 
450 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
451     DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
452 #endif
453     return ERR_OK;
454 }
455 
456 /**
457  * @brief Handle delete temp form.
458  * @param formId The form id.
459  * @param callerToken Caller ability token.
460  * @return Returns ERR_OK on success, others on failure.
461  */
HandleDeleteTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)462 ErrCode FormMgrAdapter::HandleDeleteTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
463 {
464     HILOG_INFO("formId is %{public}" PRId64, formId);
465     int uid = IPCSkeleton::GetCallingUid();
466     FormRecord record;
467     bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, record);
468     bool isSelfTempFormId = false;
469     if (isFormRecExist && record.formTempFlag) {
470         isSelfTempFormId = (FormUtil::GetCurrentAccountId() == record.providerUserId) &&
471             ((std::find(record.formUserUids.begin(), record.formUserUids.end(), uid) !=
472             record.formUserUids.end()) ? true : false);
473     }
474     if (!isSelfTempFormId) {
475         HILOG_ERROR("not self form:%{public}" PRId64 "", formId);
476         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
477     }
478     FormRenderMgr::GetInstance().StopRenderingForm(formId, record, "", callerToken);
479     FormDataMgr::GetInstance().DeleteFormUserUid(formId, uid);
480     if (!FormDataMgr::GetInstance().HasFormUserUids(formId)) {
481         int result = FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, record);
482         if (result != ERR_OK) {
483             HILOG_ERROR("%{public}s, failed!", __func__);
484             FormDataMgr::GetInstance().AddFormUserUid(formId, uid);
485             return result;
486         }
487         if (!FormDataMgr::GetInstance().DeleteTempForm(formId)) {
488             HILOG_ERROR("%{public}s, form id is not existed.", __func__);
489             return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
490         }
491         FormDataMgr::GetInstance().DeleteFormRecord(formId);
492         if (!FormCacheMgr::GetInstance().DeleteData(formId)) {
493             HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
494             return ERR_APPEXECFWK_FORM_COMMON_CODE;
495         }
496     }
497 
498     if (!FormDataMgr::GetInstance().DeleteHostRecord(callerToken, formId)) {
499         HILOG_ERROR("%{public}s, failed to remove host record", __func__);
500         return ERR_APPEXECFWK_FORM_COMMON_CODE;
501     }
502 
503     HILOG_DEBUG("%{public}s, record.formUserUids size: %{public}zu", __func__, record.formUserUids.size());
504     return ERR_OK;
505 }
506 
507 /**
508  * @brief Handle delete form cache.
509  * @param dbRecord Form storage information.
510  * @param uid calling user id.
511  * @param formId The form id.
512  * @return Returns ERR_OK on success, others on failure.
513  */
HandleDeleteFormCache(FormRecord & dbRecord,const int uid,const int64_t formId)514 ErrCode FormMgrAdapter::HandleDeleteFormCache(FormRecord &dbRecord, const int uid, const int64_t formId)
515 {
516     HILOG_INFO("delete formDBRecords, formId: %{public}" PRId64 "", formId);
517     auto iter = std::find(dbRecord.formUserUids.begin(), dbRecord.formUserUids.end(), uid);
518     if (iter != dbRecord.formUserUids.end()) {
519         dbRecord.formUserUids.erase(iter);
520     }
521 
522     ErrCode result = ERR_OK;
523     int32_t deleteFormError = ERR_OK;
524     if (dbRecord.formUserUids.empty()) {
525         result = FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, dbRecord);
526         if (result != ERR_OK) {
527             HILOG_ERROR("%{public}s, failed to notify provider form delete", __func__);
528             deleteFormError = deleteFormError != ERR_OK ? deleteFormError : result;
529         }
530         if (!FormDataMgr::GetInstance().DeleteFormRecord(formId)) {
531             HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
532             deleteFormError = deleteFormError != ERR_OK ? deleteFormError : ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
533         }
534         if (result = FormDbCache::GetInstance().DeleteFormInfo(formId); result != ERR_OK) {
535             HILOG_ERROR("failed to remove db data");
536             deleteFormError = deleteFormError != ERR_OK ? deleteFormError : result;
537         }
538 
539         int32_t matchCount = FormDbCache::GetInstance().GetMatchCount(dbRecord.bundleName, dbRecord.moduleName);
540         if (matchCount == 0) {
541             FormBmsHelper::GetInstance().NotifyModuleRemovable(dbRecord.bundleName, dbRecord.moduleName);
542         }
543 
544         if (!FormCacheMgr::GetInstance().DeleteData(formId)) {
545             HILOG_ERROR("%{public}s, failed to remove cache data", __func__);
546             deleteFormError = deleteFormError != ERR_OK ? deleteFormError : ERR_APPEXECFWK_FORM_COMMON_CODE;
547         }
548         if (!FormTimerMgr::GetInstance().RemoveFormTimer(formId)) {
549             HILOG_ERROR("%{public}s, remove timer error", __func__);
550             deleteFormError = deleteFormError != ERR_OK ? deleteFormError : ERR_APPEXECFWK_FORM_COMMON_CODE;
551         }
552 
553         return deleteFormError;
554     }
555 
556     if (result = FormDbCache::GetInstance().UpdateDBRecord(formId, dbRecord); result != ERR_OK) {
557         return result;
558     }
559 
560     HILOG_DEBUG("%{public}s, dbRecord.formUserUids size: %{public}zu", __func__, dbRecord.formUserUids.size());
561     FormBmsHelper::GetInstance().NotifyModuleNotRemovable(dbRecord.bundleName, dbRecord.moduleName);
562     FormDataMgr::GetInstance().DeleteFormUserUid(formId, uid);
563     return result;
564 }
565 
UpdateForm(const int64_t formId,const int32_t callingUid,const FormProviderData & formProviderData,const std::vector<FormDataProxy> & formDataProxies)566 int FormMgrAdapter::UpdateForm(const int64_t formId, const int32_t callingUid,
567     const FormProviderData &formProviderData, const std::vector<FormDataProxy> &formDataProxies)
568 {
569     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
570     HILOG_INFO("formId is %{public}" PRId64, formId);
571 
572     // check formId and bundleName
573     if (formId <= 0) {
574         HILOG_ERROR("error, invalid formId");
575         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
576     }
577 
578     // find matched formId
579     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
580 
581     // check exist and get the formRecord
582     FormRecord formRecord;
583     if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
584         HILOG_ERROR("error, not exist such form:%{public}" PRId64 ".", matchedFormId);
585         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
586     }
587 
588     // Checks if the form provider is the currently active user.
589     if (FormUtil::GetCurrentAccountId() != formRecord.providerUserId) {
590         HILOG_ERROR("fail, not under current user.");
591         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
592     }
593 
594     // check bundleName match
595     if (formRecord.uid != callingUid) {
596         HILOG_ERROR("error, not match providerUid: %{public}d and callingUid: %{public}d", formRecord.uid, callingUid);
597         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
598     }
599 
600     int32_t ret = ERR_OK;
601     if (formRecord.uiSyntax == FormType::ETS) {
602         WantParams wantParams;
603         ret = FormRenderMgr::GetInstance().UpdateRenderingForm(formId, formProviderData, wantParams, true);
604     } else {
605         // update Form
606         ret = FormProviderMgr::GetInstance().UpdateForm(matchedFormId, formRecord, formProviderData);
607     }
608 
609     if (!formDataProxies.empty()) {
610         FormDataProxyMgr::GetInstance().UpdateSubscribeFormData(matchedFormId, formDataProxies);
611     }
612     return ret;
613 }
614 
615 /**
616  * @brief Request form with formId and want, send formId and want to form manager service.
617  * @param formId The Id of the form to update.
618  * @param callerToken Caller ability token.
619  * @param want The want of the form to request.
620  * @return Returns ERR_OK on success, others on failure.
621  */
RequestForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const Want & want)622 int FormMgrAdapter::RequestForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const Want &want)
623 {
624     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
625     HILOG_INFO("formId is %{public}" PRId64, formId);
626     if (formId <= 0 || callerToken == nullptr) {
627         HILOG_ERROR("%{public}s fail, invalid formId or callerToken.", __func__);
628         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
629     }
630 
631     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
632     if (!FormDataMgr::GetInstance().ExistFormRecord(matchedFormId)) {
633         HILOG_ERROR("%{public}s fail, not exist such formId:%{public}" PRId64 ".", __func__, matchedFormId);
634         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
635     }
636 
637     FormHostRecord formHostRecord;
638     bool isHostExist = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
639     if (!isHostExist) {
640         HILOG_ERROR("%{public}s fail, cannot find target client.", __func__);
641         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
642     }
643 
644     if (!formHostRecord.Contains(matchedFormId)) {
645         HILOG_ERROR("%{public}s fail, form is not self-owned.", __func__);
646         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
647     }
648 
649     HILOG_INFO("%{public}s, find target client.", __func__);
650     Want reqWant(want);
651     int32_t currentActiveUserId = FormUtil::GetCurrentAccountId();
652     reqWant.SetParam(Constants::PARAM_FORM_USER_ID, currentActiveUserId);
653     return FormProviderMgr::GetInstance().RefreshForm(matchedFormId, reqWant, true);
654 }
655 
656 /**
657  * @brief Form visible/invisible notify, send formIds to form manager service.
658  * @param formIds The vector of form Ids.
659  * @param callerToken Caller ability token.
660  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
661  * @return Returns ERR_OK on success, others on failure.
662  */
NotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,const int32_t formVisibleType)663 ErrCode FormMgrAdapter::NotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
664     const sptr<IRemoteObject> &callerToken, const int32_t formVisibleType)
665 {
666     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
667     HILOG_DEBUG("called.");
668     if (callerToken == nullptr) {
669         HILOG_ERROR("fail, callerToken can not be NULL.");
670         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
671     }
672 
673     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
674     if (iBundleMgr == nullptr) {
675         HILOG_ERROR("fail, failed to get IBundleMgr.");
676         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
677     }
678 
679     int64_t matchedFormId = 0;
680     int32_t userId = FormUtil::GetCurrentAccountId();
681     std::map<std::string, std::vector<int64_t>> eventMaps;
682     std::map<std::string, std::vector<FormInstance>> formInstanceMaps;
683 
684     for (int64_t formId : formIds) {
685         if (formId <= 0) {
686             HILOG_WARN("formId %{public}" PRId64 " is less than 0", formId);
687             continue;
688         }
689         matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
690         FormRecord formRecord;
691 
692         if (!isFormShouldUpdateProviderInfoToHost(matchedFormId, userId, callerToken, formRecord)) {
693             continue;
694         }
695 
696         PaddingNotifyVisibleFormsMap(formVisibleType, formId, formInstanceMaps);
697 
698         // Update info to host and check if the form was created by the system application.
699         if ((!UpdateProviderInfoToHost(matchedFormId, userId, callerToken, formVisibleType, formRecord)) ||
700             (!formRecord.isSystemApp)) {
701             continue;
702         }
703 
704         // Check the value of formVisibleNotify.
705         AppExecFwk::ApplicationInfo info;
706 
707         if (!IN_PROCESS_CALL(iBundleMgr->GetApplicationInfo(formRecord.bundleName,
708             AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO, formRecord.providerUserId, info))) {
709             HILOG_ERROR("failed to get Application info.");
710             return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
711         }
712 
713         if (!info.formVisibleNotify) {
714             HILOG_DEBUG("the value of formVisibleNotify is false.");
715             continue;
716         }
717 
718         // Create eventMaps
719         if (!CreateHandleEventMap(matchedFormId, formRecord, eventMaps)) {
720             continue;
721         }
722     }
723 
724     FormTaskMgr::GetInstance().PostVisibleNotify(formIds, formInstanceMaps, eventMaps, formVisibleType,
725         visibleNotifyDelay_);
726     return ERR_OK;
727 }
728 
729 /**
730  * @brief Padding the formInstances map for visibleNotify.
731  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
732  * @param formId Form Id.
733  * @param formInstanceMaps formInstances for visibleNotify.
734  */
PaddingNotifyVisibleFormsMap(const int32_t formVisibleType,int64_t formId,std::map<std::string,std::vector<FormInstance>> & formInstanceMaps)735 void FormMgrAdapter::PaddingNotifyVisibleFormsMap(const int32_t formVisibleType, int64_t formId,
736     std::map<std::string, std::vector<FormInstance>> &formInstanceMaps)
737 {
738     std::string specialFlag = "#";
739     bool isVisibility = (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE));
740     FormInstance formInstance;
741     // Get the updated card status
742     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
743     FormDataMgr::GetInstance().GetFormInstanceById(matchedFormId, false, formInstance);
744     std::string formHostName = formInstance.formHostName;
745     std::string formAllHostName = EMPTY_BUNDLE;
746     if (formVisibleType == static_cast<int32_t>(formInstance.formVisiblity)) {
747         return;
748     }
749     for (auto formObserver : formObservers_) {
750         if (formObserver.first == formHostName + specialFlag + std::to_string(isVisibility) ||
751             formObserver.first == formAllHostName + specialFlag + std::to_string(isVisibility)) {
752             auto observer = formInstanceMaps.find(formObserver.first);
753             if (observer == formInstanceMaps.end()) {
754                 std::vector<FormInstance> formInstances;
755                 formInstance.formVisiblity = static_cast<FormVisibilityType>(formVisibleType);
756                 formInstances.emplace_back(formInstance);
757                 formInstanceMaps.emplace(formObserver.first, formInstances);
758             } else {
759                 observer->second.emplace_back(formInstance);
760             }
761         }
762     }
763 }
764 
765 /**
766  * @brief Handle forms visible/invisible notify after delay time, notification will be cancelled when
767  * formVisibleState recovered during the delay time.
768  * @param formIds The vector of form Ids.
769  * @param formInstanceMaps formInstances for visibleNotify.
770  * @param eventMaps eventMaps for event notify.
771  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
772  */
HandlerNotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,std::map<std::string,std::vector<FormInstance>> formInstanceMaps,std::map<std::string,std::vector<int64_t>> eventMaps,const int32_t formVisibleType)773 void FormMgrAdapter::HandlerNotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
774     std::map<std::string, std::vector<FormInstance>> formInstanceMaps,
775     std::map<std::string, std::vector<int64_t>> eventMaps, const int32_t formVisibleType)
776 {
777     HILOG_DEBUG("start");
778     FilterDataByVisibleType(formInstanceMaps, eventMaps, formVisibleType);
779     for (auto formObserver : formObservers_) {
780         NotifyWhetherFormsVisible(formObserver.first, formObserver.second, formInstanceMaps, formVisibleType);
781     }
782     for (auto iter = eventMaps.begin(); iter != eventMaps.end(); iter++) {
783         if (HandleEventNotify(iter->first, iter->second, formVisibleType) != ERR_OK) {
784             HILOG_WARN("HandleEventNotify error, key is %{public}s.", iter->first.c_str());
785         }
786     }
787     if (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
788         FormDataProxyMgr::GetInstance().EnableSubscribeFormData(formIds);
789     } else if (formVisibleType == static_cast<int32_t>(FormVisibilityType::INVISIBLE)) {
790         FormDataProxyMgr::GetInstance().DisableSubscribeFormData(formIds);
791     }
792 }
793 
794 /**
795  * @brief Notify forms visible/invisible to remoteCallers.
796  * @param bundleName the caller's bundle name.
797  * @param remoteObjects refs of remoteCallers.
798  * @param formInstanceMaps formInstances for visibleNotify.
799  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
800  */
NotifyWhetherFormsVisible(const std::string & bundleName,std::vector<sptr<IRemoteObject>> & remoteObjects,std::map<std::string,std::vector<FormInstance>> & formInstanceMaps,const int32_t formVisibleType)801 void FormMgrAdapter::NotifyWhetherFormsVisible(const std::string &bundleName,
802     std::vector<sptr<IRemoteObject>> &remoteObjects,
803     std::map<std::string, std::vector<FormInstance>> &formInstanceMaps, const int32_t formVisibleType)
804 {
805     HILOG_DEBUG("bundleName: %{public}s, remoteObjects: %{public}d", bundleName.c_str(), (int)remoteObjects.size());
806     for (auto remoteObject : remoteObjects) {
807         sptr<AbilityRuntime::IJsFormStateObserver> remoteJsFormStateObserver =
808             iface_cast<AbilityRuntime::IJsFormStateObserver>(remoteObject);
809         auto observer = formInstanceMaps.find(bundleName);
810         if (observer != formInstanceMaps.end()) {
811             if (formVisibleType == static_cast<int32_t>(FormVisibilityType::VISIBLE)) {
812                 remoteJsFormStateObserver->NotifyWhetherFormsVisible(FormVisibilityType::VISIBLE,
813                     bundleName, observer->second);
814             } else if (formVisibleType == static_cast<int32_t>(FormVisibilityType::INVISIBLE)) {
815                 remoteJsFormStateObserver->NotifyWhetherFormsVisible(FormVisibilityType::INVISIBLE,
816                     bundleName, observer->second);
817             }
818         }
819     }
820 }
821 
822 /**
823  * @brief Forms formInstanceMaps or eventMaps should remove when visible/invisible status recovered.
824  * @param formInstanceMaps formInstances for visibleNotify.
825  * @param eventMaps eventMaps for event notify.
826  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
827  */
FilterDataByVisibleType(std::map<std::string,std::vector<FormInstance>> & formInstanceMaps,std::map<std::string,std::vector<int64_t>> & eventMaps,const int32_t formVisibleType)828 void FormMgrAdapter::FilterDataByVisibleType(std::map<std::string, std::vector<FormInstance>> &formInstanceMaps,
829     std::map<std::string, std::vector<int64_t>> &eventMaps, const int32_t formVisibleType)
830 {
831     HILOG_DEBUG("start");
832     std::map<int64_t, FormRecord> restoreFormRecords;
833     FilterFormInstanceMapsByVisibleType(formInstanceMaps, formVisibleType, restoreFormRecords);
834     FilterEventMapsByVisibleType(eventMaps, formVisibleType, restoreFormRecords);
835 
836     for (auto formRecordEntry : restoreFormRecords) {
837         FormRecord formRecord = formRecordEntry.second;
838         formRecord.isNeedNotify = false;
839         HILOG_INFO("formRecord no need notify, formId: %{public}" PRId64 ".", formRecord.formId);
840         if (!FormDataMgr::GetInstance().UpdateFormRecord(formRecord.formId, formRecord)) {
841             HILOG_ERROR("update restoreFormRecords failed, formId: %{public}" PRId64 ".", formRecord.formId);
842         }
843     }
844 }
845 
846 /**
847  * @brief Forms formInstanceMaps should remove when visible/invisible status recovered.
848  * @param formInstanceMaps formInstances for visibleNotify.
849  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
850  * @param restoreFormRecords formRecords of forms no need to notify.
851  */
FilterFormInstanceMapsByVisibleType(std::map<std::string,std::vector<FormInstance>> & formInstanceMaps,const int32_t formVisibleType,std::map<int64_t,FormRecord> & restoreFormRecords)852 void FormMgrAdapter::FilterFormInstanceMapsByVisibleType(
853     std::map<std::string, std::vector<FormInstance>> &formInstanceMaps,
854     const int32_t formVisibleType, std::map<int64_t, FormRecord> &restoreFormRecords)
855 {
856     for (auto iter = formInstanceMaps.begin(); iter != formInstanceMaps.end();) {
857         std::vector<FormInstance> formInstances = iter->second;
858         HILOG_DEBUG("bundName: %{public}s, formInstances: %{public}d", iter->first.c_str(), (int)formInstances.size());
859         auto instanceIter = formInstances.begin();
860         while (instanceIter != formInstances.end()) {
861             FormRecord record;
862             if (!FormDataMgr::GetInstance().GetFormRecord(instanceIter->formId, record)) {
863                 HILOG_WARN("get formRecord failed! formId: %{public}" PRId64 ".", instanceIter->formId);
864                 ++instanceIter;
865                 continue;
866             }
867             if (record.formVisibleNotifyState != formVisibleType) {
868                 HILOG_INFO("erase formInstance formId: %{public}" PRId64 ", formVisibleNotifyState: %{public}d",
869                     instanceIter->formId, record.formVisibleNotifyState);
870                 restoreFormRecords[record.formId] = record;
871                 instanceIter = formInstances.erase(instanceIter);
872                 continue;
873             }
874             if (!record.isNeedNotify) {
875                 HILOG_INFO("erase formInstance formId: %{public}" PRId64
876                     ", isNeedNotify: %{public}d, formVisibleNotifyState %{public}d",
877                     instanceIter->formId, record.isNeedNotify, record.formVisibleNotifyState);
878                 instanceIter = formInstances.erase(instanceIter);
879                 continue;
880             }
881             ++instanceIter;
882         }
883         if (formInstances.empty()) {
884             HILOG_INFO("formInstanceMaps remove bundName: %{public}s", iter->first.c_str());
885             iter = formInstanceMaps.erase(iter);
886             continue;
887         }
888         ++iter;
889     }
890 }
891 
892 /**
893  * @brief Forms eventMaps should remove when visible/invisible status recovered.
894  * @param eventMaps eventMaps for event notify.
895  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
896  * @param restoreFormRecords formRecords of forms no need to notify.
897  */
FilterEventMapsByVisibleType(std::map<std::string,std::vector<int64_t>> & eventMaps,const int32_t formVisibleType,std::map<int64_t,FormRecord> & restoreFormRecords)898 void FormMgrAdapter::FilterEventMapsByVisibleType(std::map<std::string, std::vector<int64_t>> &eventMaps,
899     const int32_t formVisibleType, std::map<int64_t, FormRecord> &restoreFormRecords)
900 {
901     for (auto iter = eventMaps.begin(); iter != eventMaps.end();) {
902         std::vector<int64_t> formIds = iter->second;
903         HILOG_DEBUG("bundName: %{public}s, eventMaps: %{public}d", iter->first.c_str(), (int)formIds.size());
904         auto formItr = formIds.begin();
905         while (formItr != formIds.end()) {
906             FormRecord record;
907             if (!FormDataMgr::GetInstance().GetFormRecord(*formItr, record)) {
908                 HILOG_WARN("get formRecord failed! formId: %{public}" PRId64 ".", *formItr);
909                 ++formItr;
910                 continue;
911             }
912             if (record.formVisibleNotifyState != formVisibleType) {
913                 HILOG_INFO("erase notifyEvent formId: %{public}" PRId64 ", formVisibleNotifyState: %{public}d",
914                     *formItr, record.formVisibleNotifyState);
915                 restoreFormRecords[record.formId] = record;
916                 formItr = formIds.erase(formItr);
917                 continue;
918             }
919             if (!record.isNeedNotify) {
920                 HILOG_INFO("erase notifyEvent formId: %{public}" PRId64
921                     ", isNeedNotify: %{public}d, formVisibleNotifyState %{public}d",
922                     *formItr, record.isNeedNotify, record.formVisibleNotifyState);
923                 formItr = formIds.erase(formItr);
924                 continue;
925             }
926             ++formItr;
927         }
928         if (formIds.empty()) {
929             HILOG_INFO("eventMaps remove bundName: %{public}s", iter->first.c_str());
930             iter = eventMaps.erase(iter);
931             continue;
932         }
933         ++iter;
934     }
935 }
936 
937 /**
938  * @brief Temp form to normal form.
939  * @param formId The Id of the form.
940  * @param callerToken Caller ability token.
941  * @return Returns ERR_OK on success, others on failure.
942  */
CastTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)943 int FormMgrAdapter::CastTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
944 {
945     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
946     if (formId <= 0 || callerToken == nullptr) {
947         HILOG_ERROR("%{public}s, invalid formId or callerToken", __func__);
948         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
949     }
950 
951     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
952     if (!FormDataMgr::GetInstance().ExistFormRecord(matchedFormId) ||
953         !FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
954         HILOG_ERROR("%{public}s, not exist such temp form:%{public}" PRId64 "", __func__, matchedFormId);
955         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
956     }
957 
958     FormHostRecord record;
959     bool hasRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, record);
960     if (!hasRecord || !record.Contains(matchedFormId)) {
961         HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, matchedFormId);
962         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
963     }
964 
965     int callingUid = IPCSkeleton::GetCallingUid();
966     int32_t userId = GetCurrentUserId(callingUid);
967     int checkCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, userId);
968     if (checkCode != 0) {
969         HILOG_ERROR("%{public}s, %{public}" PRId64 " failed,because if too mush forms", __func__, matchedFormId);
970         return checkCode;
971     }
972 
973     FormRecord formRecord;
974     if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
975         HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 ".", __func__, matchedFormId);
976         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
977     }
978     int bindSupplierCheckCode = HandleCastTempForm(matchedFormId, formRecord);
979     if (bindSupplierCheckCode != 0) {
980         HILOG_ERROR("%{public}s, cast temp form bindSupplier failed", __func__);
981         return bindSupplierCheckCode;
982     }
983 
984     if (!FormDataMgr::GetInstance().DeleteTempForm(matchedFormId)) {
985         HILOG_ERROR("%{public}s fail, delete temp form error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
986         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
987     }
988     if (!FormDataMgr::GetInstance().ModifyFormTempFlag(matchedFormId, false)) {
989         HILOG_ERROR("%{public}s fail, modify form temp flag error, formId:%{public}" PRId64 ".",
990             __func__, matchedFormId);
991         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
992     }
993     if (!FormDataMgr::GetInstance().AddFormUserUid(matchedFormId, callingUid)) {
994         HILOG_ERROR("%{public}s fail, add form user uid error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
995         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
996     }
997 
998     if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
999         HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 ".", __func__, matchedFormId);
1000         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1001     }
1002 
1003     ErrCode errorCode = FormDbCache::GetInstance().UpdateDBRecord(matchedFormId, formRecord);
1004     if (errorCode != ERR_OK) {
1005         HILOG_ERROR("%{public}s fail, update db record error, formId:%{public}" PRId64 ".", __func__, matchedFormId);
1006         return errorCode;
1007     }
1008 
1009     // start timer
1010     return AddFormTimer(formRecord);
1011 }
1012 /**
1013  * @brief Handle cast temp form.
1014  * @param formId The form id.
1015  * @param record Form information.
1016  * @return Returns ERR_OK on success, others on failure.
1017  */
HandleCastTempForm(const int64_t formId,const FormRecord & record)1018 ErrCode FormMgrAdapter::HandleCastTempForm(const int64_t formId, const FormRecord &record)
1019 {
1020     HILOG_DEBUG("%{public}s, cast temp form to normal form, notify supplier, package:%{public}s, class:%{public}s",
1021         __func__, record.bundleName.c_str(), record.abilityName.c_str());
1022     sptr<IAbilityConnection> castTempConnection = new FormCastTempConnection(formId,
1023         record.bundleName, record.abilityName);
1024 
1025     Want want;
1026     want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1027     want.SetElementName(record.bundleName, record.abilityName);
1028     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, castTempConnection);
1029     if (errorCode != ERR_OK) {
1030         HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1031         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1032     }
1033     return ERR_OK;
1034 }
1035 /**
1036  * @brief Dump all of form storage infos.
1037  * @param formInfos All of form storage infos.
1038  * @return Returns ERR_OK on success, others on failure.
1039  */
DumpStorageFormInfos(std::string & formInfos) const1040 int FormMgrAdapter::DumpStorageFormInfos(std::string &formInfos) const
1041 {
1042     std::vector<FormDBInfo> formDBInfos;
1043     FormDbCache::GetInstance().GetAllFormInfo(formDBInfos);
1044     if (formDBInfos.empty()) {
1045         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1046     }
1047     std::sort(formDBInfos.begin(), formDBInfos.end(),
1048         [] (const FormDBInfo &formDBInfoA, const FormDBInfo &formDBInfoB) -> bool {
1049         return formDBInfoA.formId < formDBInfoB.formId;
1050     });
1051     FormDumpMgr::GetInstance().DumpStorageFormInfos(formDBInfos, formInfos);
1052     return ERR_OK;
1053 }
1054 /**
1055  * @brief Dump all of temporary form infos.
1056  * @param formInfos All of temporary form infos.
1057  * @return Returns ERR_OK on success, others on failure.
1058  */
DumpTemporaryFormInfos(std::string & formInfos) const1059 int FormMgrAdapter::DumpTemporaryFormInfos(std::string &formInfos) const
1060 {
1061     HILOG_INFO("%{public}s called.", __func__);
1062     std::vector<FormRecord> formRecordInfos;
1063     if (!FormDataMgr::GetInstance().GetTempFormRecord(formRecordInfos)) {
1064         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1065     }
1066     FormDumpMgr::GetInstance().DumpTemporaryFormInfos(formRecordInfos, formInfos);
1067     return ERR_OK;
1068 }
1069 
DumpStaticBundleFormInfos(std::string & formInfos) const1070 int FormMgrAdapter::DumpStaticBundleFormInfos(std::string &formInfos) const
1071 {
1072     HILOG_INFO("call");
1073     std::vector<FormInfo> bundleFormInfos;
1074     if (FormInfoMgr::GetInstance().GetAllFormsInfo(bundleFormInfos) != ERR_OK) {
1075         HILOG_ERROR("GetAllFormsInfo failed.");
1076         return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
1077     }
1078     FormDumpMgr::GetInstance().DumpStaticBundleFormInfos(bundleFormInfos, formInfos);
1079     return ERR_OK;
1080 }
1081 /**
1082  * @brief Dump form info by a bundle name.
1083  * @param bundleName The bundle name of form provider.
1084  * @param formInfos Form infos.
1085  * @return Returns ERR_OK on success, others on failure.
1086  */
DumpFormInfoByBundleName(const std::string & bundleName,std::string & formInfos) const1087 int FormMgrAdapter::DumpFormInfoByBundleName(const std::string &bundleName, std::string &formInfos) const
1088 {
1089     HILOG_INFO("%{public}s called.", __func__);
1090     std::vector<FormRecord> formRecordInfos;
1091     if (!FormDataMgr::GetInstance().GetFormRecord(bundleName, formRecordInfos)) {
1092         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1093     }
1094 
1095     /**
1096      * The updateDuration stored in FormRecord is the config.json configuration.
1097      * The app gallery may modify the updateDuration.
1098      * The real updateDuration value needs to be obtained from FormTimerMgr.
1099      */
1100     for (auto &formRecord : formRecordInfos) {
1101         FormTimer formTimer;
1102         if (formRecord.isEnableUpdate && formRecord.updateDuration > 0 &&
1103             FormTimerMgr::GetInstance().GetIntervalTimer(formRecord.formId, formTimer)) {
1104             formRecord.updateDuration = formTimer.period;
1105         }
1106     }
1107     FormDumpMgr::GetInstance().DumpFormInfos(formRecordInfos, formInfos);
1108     return ERR_OK;
1109 }
1110 /**
1111  * @brief Dump form info by a bundle name.
1112  * @param formId The id of the form.
1113  * @param formInfo Form info.
1114  * @return Returns ERR_OK on success, others on failure.
1115  */
DumpFormInfoByFormId(const std::int64_t formId,std::string & formInfo) const1116 int FormMgrAdapter::DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo) const
1117 {
1118     HILOG_INFO("%{public}s called.", __func__);
1119     int reply = ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1120     FormRecord formRecord;
1121     if (FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
1122         /**
1123          * The updateDuration stored in FormRecord is the config.json configuration.
1124          * The app gallery may modify the updateDuration.
1125          * The real updateDuration value needs to be obtained from FormTimerMgr.
1126          */
1127         FormTimer formTimer;
1128         if (formRecord.isEnableUpdate && formRecord.updateDuration > 0 &&
1129             FormTimerMgr::GetInstance().GetIntervalTimer(formRecord.formId, formTimer)) {
1130             formRecord.updateDuration = formTimer.period;
1131         }
1132         FormDumpMgr::GetInstance().DumpFormInfo(formRecord, formInfo);
1133         reply = ERR_OK;
1134     }
1135 
1136     std::vector<std::string> subscribedKeys;
1137     int32_t count = 0;
1138     if (reply == ERR_OK) {
1139         FormDataProxyMgr::GetInstance().GetFormSubscribeInfo(formId, subscribedKeys, count);
1140         FormDumpMgr::GetInstance().DumpFormSubscribeInfo(subscribedKeys, count, formInfo);
1141     }
1142 
1143     std::vector<FormHostRecord> formHostRecords;
1144     FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
1145     for (const auto &iter : formHostRecords) {
1146         FormDumpMgr::GetInstance().DumpFormHostInfo(iter, formInfo);
1147         reply = ERR_OK;
1148     }
1149 
1150     return reply;
1151 }
1152 /**
1153  * @brief Dump form timer by form id.
1154  * @param formId The id of the form.
1155  * @param isTimingService "true" or "false".
1156  * @return Returns ERR_OK on success, others on failure.
1157  */
DumpFormTimerByFormId(const std::int64_t formId,std::string & isTimingService) const1158 int FormMgrAdapter::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService) const
1159 {
1160     HILOG_INFO("%{public}s called.", __func__);
1161     FormTimer formTimer;
1162     UpdateAtItem updateAtItem;
1163     DynamicRefreshItem dynamicItem;
1164     bool resultInter = FormTimerMgr::GetInstance().GetIntervalTimer(formId, formTimer);
1165     bool resultUpdate = FormTimerMgr::GetInstance().GetUpdateAtTimer(formId, updateAtItem);
1166     bool resultDynamic = FormTimerMgr::GetInstance().GetDynamicItem(formId, dynamicItem);
1167     HILOG_INFO("%{public}s resultInter:%{public}d,resultUpdate:%{public}d,resultDynamic:%{public}d",
1168         __func__, resultInter, resultUpdate, resultDynamic);
1169     if (resultInter || resultUpdate || resultDynamic) {
1170         isTimingService = "true";
1171     } else {
1172         isTimingService = "false";
1173     }
1174     return ERR_OK;
1175 }
1176 /**
1177  * @brief Get form configure info.
1178  * @param want The want of the request.
1179  * @param formItemInfo Form configure info.
1180  * @return Returns ERR_OK on success, others on failure.
1181  */
GetFormConfigInfo(const Want & want,FormItemInfo & formConfigInfo)1182 ErrCode FormMgrAdapter::GetFormConfigInfo(const Want &want, FormItemInfo &formConfigInfo)
1183 {
1184     HILOG_DEBUG("GetFormConfigInfo start.");
1185     BundleInfo bundleInfo;
1186     std::string packageName;
1187     ErrCode errCode = GetBundleInfo(want, bundleInfo, packageName);
1188     if (errCode != ERR_OK) {
1189         HILOG_ERROR("Get bundle info failed");
1190         return errCode;
1191     }
1192 
1193     FormInfo formInfo;
1194     errCode = GetFormInfo(want, formInfo);
1195     if (errCode != ERR_OK) {
1196         HILOG_ERROR("Get target form info failed");
1197         return errCode;
1198     }
1199     if (!formInfo.IsValid()) {
1200         HILOG_ERROR("The form info is invalid");
1201         return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
1202     }
1203 
1204     errCode = GetFormItemInfo(want, bundleInfo, formInfo, formConfigInfo);
1205     if (errCode != ERR_OK) {
1206         HILOG_ERROR("Get form item info failed.");
1207         return errCode;
1208     }
1209     formConfigInfo.SetPackageName(packageName);
1210     formConfigInfo.SetDeviceId(want.GetElement().GetDeviceID());
1211 
1212     if (!formConfigInfo.IsValidItem()) {
1213         HILOG_ERROR("fail, input param itemInfo is invalid");
1214         return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
1215     }
1216 
1217     HILOG_DEBUG("GetFormConfigInfo end.");
1218     return ERR_OK;
1219 }
1220 /**
1221  * @brief Allocate form by formId.
1222  * @param info Form configure info.
1223  * @param callerToken Caller ability token.
1224  * @param wantParams WantParams of the request.
1225  * @param formInfo Form info for form host.
1226  * @return Returns ERR_OK on success, others on failure.
1227  */
AllotFormById(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1228 ErrCode FormMgrAdapter::AllotFormById(const FormItemInfo &info,
1229     const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1230 {
1231     HILOG_INFO("allot form by id.");
1232     int64_t formId = FormDataMgr::GetInstance().PaddingUdidHash(info.GetFormId());
1233     FormRecord record;
1234     bool hasRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record);
1235     if (hasRecord && record.formTempFlag && !FormRenderMgr::GetInstance().IsRerenderForRenderServiceDied(formId)) {
1236         HILOG_ERROR("%{public}s, addForm can not acquire temp form when select form id", __func__);
1237         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1238     }
1239 
1240     // ark ts form can only exist with one form host
1241     if (info.GetUiSyntax() == FormType::ETS &&
1242         !FormDbCache::GetInstance().IsHostOwner(formId, IPCSkeleton::GetCallingUid())) {
1243         HILOG_ERROR("the specified form id does not exist in caller. formId: %{public}s.",
1244             std::to_string(formId).c_str());
1245         return ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID;
1246     }
1247 
1248     int32_t currentUserId = FormUtil::GetCurrentAccountId();
1249     if (hasRecord && (record.providerUserId == currentUserId)) {
1250         if (!info.IsMatch(record)) {
1251             HILOG_ERROR("%{public}s, formId and item info not match:%{public}" PRId64 "", __func__, formId);
1252             return ERR_APPEXECFWK_FORM_CFG_NOT_MATCH_ID;
1253         }
1254         return AddExistFormRecord(info, callerToken, record, formId, wantParams, formInfo);
1255     }
1256 
1257     // find in db but not in cache
1258     FormRecord dbRecord;
1259     ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
1260     if (getDbRet == ERR_OK && (dbRecord.providerUserId == currentUserId)) {
1261         return AddNewFormRecord(info, formId, callerToken, wantParams, formInfo);
1262     }
1263 
1264     HILOG_INFO("%{public}s, addForm no such form %{public}" PRId64 "", __func__, formId);
1265 
1266     // delete form data in provider
1267     FormRecord delRecord;
1268     delRecord.bundleName = info.GetProviderBundleName();
1269     delRecord.abilityName = info.GetAbilityName();
1270     FormProviderMgr::GetInstance().NotifyProviderFormDelete(formId, delRecord);
1271 
1272     return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1273 }
1274 
AddExistFormRecord(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const FormRecord & record,const int64_t formId,const WantParams & wantParams,FormJsInfo & formInfo)1275 ErrCode FormMgrAdapter::AddExistFormRecord(const FormItemInfo &info, const sptr<IRemoteObject> &callerToken,
1276     const FormRecord &record, const int64_t formId, const WantParams &wantParams, FormJsInfo &formInfo)
1277 {
1278     HILOG_INFO("add exist formRecord, formId:%{public}" PRId64 "", formId);
1279     // allot form host record
1280     int callingUid = IPCSkeleton::GetCallingUid();
1281     bool isCreated = FormDataMgr::GetInstance().AllotFormHostRecord(info, callerToken, formId, callingUid);
1282     if (!isCreated) {
1283         HILOG_ERROR("%{public}s fail, AllotFormHostRecord failed when no matched formRecord", __func__);
1284         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1285     }
1286 
1287     FormRecord newRecord(record);
1288     std::string cacheData;
1289     std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
1290     bool hasCacheData = FormCacheMgr::GetInstance().GetData(formId, cacheData, imageDataMap);
1291     if (hasCacheData) {
1292         newRecord.formProviderInfo.SetFormDataString(cacheData);
1293         newRecord.formProviderInfo.SetImageDataMap(imageDataMap);
1294     }
1295     FormRenderMgr::GetInstance().RenderForm(newRecord, wantParams, callerToken);
1296     if (newRecord.needRefresh || FormCacheMgr::GetInstance().NeedAcquireProviderData(newRecord.formId)) {
1297         newRecord.isInited = false;
1298         FormDataMgr::GetInstance().SetFormCacheInited(formId, false);
1299 
1300         // acquire formInfo from provider
1301         ErrCode errorCode = AcquireProviderFormInfoAsync(formId, info, wantParams);
1302         if (errorCode != ERR_OK) {
1303             HILOG_ERROR("%{public}s fail, AcquireProviderFormInfoAsync failed", __func__);
1304             return errorCode;
1305         }
1306     }
1307 
1308     // Add new form user uid.
1309     FormDataMgr::GetInstance().AddFormUserUid(formId, callingUid);
1310     if (std::find(newRecord.formUserUids.begin(), newRecord.formUserUids.end(), callingUid) ==
1311         newRecord.formUserUids.end()) {
1312         newRecord.formUserUids.emplace_back(callingUid);
1313     }
1314 
1315     if (hasCacheData) {
1316         HILOG_INFO("use cache data, formId:%{public}" PRId64 "", formId);
1317         formInfo.formData = cacheData;
1318         formInfo.formProviderData.SetDataString(cacheData);
1319         formInfo.formProviderData.SetImageDataMap(imageDataMap);
1320     }
1321 
1322     FormDataMgr::GetInstance().CreateFormJsInfo(formId, record, formInfo);
1323 
1324     // start update timer
1325     ErrCode errorCode = AddFormTimer(newRecord);
1326     if (errorCode != ERR_OK) {
1327         return errorCode;
1328     }
1329     if (!newRecord.formTempFlag) {
1330         return FormDbCache::GetInstance().UpdateDBRecord(formId, newRecord);
1331     }
1332     return ERR_OK;
1333 }
1334 
AllotFormBySpecificId(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1335 ErrCode FormMgrAdapter::AllotFormBySpecificId(const FormItemInfo &info,
1336     const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1337 {
1338     HILOG_DEBUG("start");
1339     int64_t formId = info.GetFormId();
1340     FormRecord record;
1341     bool hasRecord = FormDataMgr::GetInstance().GetFormRecord(formId, record);
1342     // find in db but not in cache
1343     FormRecord dbRecord;
1344     ErrCode getDbRet = FormDbCache::GetInstance().GetDBRecord(formId, dbRecord);
1345     if (getDbRet == ERR_OK || hasRecord) {
1346         HILOG_DEBUG("The specified ID already exists in the cache or db");
1347         return AllotFormByInfo(info, callerToken, wantParams, formInfo);
1348     }
1349     HILOG_DEBUG("Creates the form with the specified ID");
1350     return AddNewFormRecord(info, formId, callerToken, wantParams, formInfo);
1351 }
1352 
1353 /**
1354  * @brief Allocate form by form configure info.
1355  * @param info Form configure info.
1356  * @param callerToken Caller ability token.
1357  * @param wantParams WantParams of the request.
1358  * @param formInfo Form info for form host.
1359  * @return Returns ERR_OK on success, others on failure.
1360  */
AllotFormByInfo(const FormItemInfo & info,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1361 ErrCode FormMgrAdapter::AllotFormByInfo(const FormItemInfo &info,
1362     const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1363 {
1364     // generate formId
1365     int64_t newFormId = FormDataMgr::GetInstance().GenerateFormId();
1366     if (newFormId < 0) {
1367         HILOG_ERROR("fail, generateFormId no invalid formId");
1368         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1369     }
1370     HILOG_DEBUG("newFormId:%{public}" PRId64 "", newFormId);
1371     return AddNewFormRecord(info, newFormId, callerToken, wantParams, formInfo);
1372 }
1373 
1374 /**
1375  * @brief Add new form record.
1376  * @param info Form configure info.
1377  * @param formId The form id.
1378  * @param callerToken Caller ability token.
1379  * @param wantParams WantParams of the request.
1380  * @param formInfo Form info for form host.
1381  * @return Returns ERR_OK on success, others on failure.
1382  */
AddNewFormRecord(const FormItemInfo & info,const int64_t formId,const sptr<IRemoteObject> & callerToken,const WantParams & wantParams,FormJsInfo & formInfo)1383 ErrCode FormMgrAdapter::AddNewFormRecord(const FormItemInfo &info, const int64_t formId,
1384     const sptr<IRemoteObject> &callerToken, const WantParams &wantParams, FormJsInfo &formInfo)
1385 {
1386     HILOG_INFO("add new formRecord");
1387     FormItemInfo newInfo(info);
1388     newInfo.SetFormId(formId);
1389     // allot form host record
1390     int callingUid = IPCSkeleton::GetCallingUid();
1391     if (!FormDataMgr::GetInstance().AllotFormHostRecord(newInfo, callerToken, formId, callingUid)) {
1392         HILOG_ERROR("fail, AllotFormHostRecord failed when no matched formRecord");
1393         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1394     }
1395 
1396     // get current userId
1397     int32_t currentUserId = GetCurrentUserId(callingUid);
1398     // allot form record
1399     FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(newInfo, callingUid, currentUserId);
1400 
1401     FormRenderMgr::GetInstance().RenderForm(formRecord, wantParams, callerToken);
1402 
1403     // acquire formInfo from provider
1404     ErrCode errorCode = AcquireProviderFormInfoAsync(formId, newInfo, wantParams);
1405     if (errorCode != ERR_OK) {
1406         HILOG_ERROR("fail, AcquireProviderFormInfoAsync failed");
1407         return errorCode;
1408     }
1409 
1410     // create form info for js
1411     FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formInfo);
1412 
1413     // storage info
1414     if (!newInfo.IsTemporaryForm()) {
1415         errorCode = FormDbCache::GetInstance().UpdateDBRecord(formId, formRecord);
1416         if (errorCode != ERR_OK) {
1417             HILOG_ERROR("fail, UpdateDBRecord failed");
1418             return errorCode;
1419         }
1420     }
1421 
1422     // start update timer
1423     if (info.GetProviderBundleName() != info.GetHostBundleName()) {
1424         return AddFormTimer(formRecord);
1425     }
1426     return ERR_OK;
1427 }
1428 
1429 /**
1430  * @brief Add form timer.
1431  * @param formRecord Form information.
1432  * @return Returns ERR_OK on success, others on failure.
1433  */
AddFormTimer(const FormRecord & formRecord)1434 ErrCode FormMgrAdapter::AddFormTimer(const FormRecord &formRecord)
1435 {
1436     HILOG_INFO("add form timer start");
1437     if (!formRecord.isEnableUpdate || formRecord.formTempFlag) {
1438         HILOG_INFO("%{public}s isEnableUpdate:%{public}d formTempFlag:%{public}d.",
1439             __func__, formRecord.isEnableUpdate, formRecord.formTempFlag);
1440         return ERR_OK;
1441     }
1442     if (formRecord.updateDuration > 0 && !formRecord.isDataProxy) {
1443         if (!FormDataMgr::GetInstance().HasFormCloudUpdateDuration(formRecord.bundleName)) {
1444             UpdateFormCloudUpdateDuration(formRecord.bundleName);
1445         }
1446         int64_t updateDuration = formRecord.updateDuration;
1447         HILOG_INFO("Get form update duration start.");
1448         if (!GetValidFormUpdateDuration(formRecord.formId, updateDuration)) {
1449             HILOG_WARN("Get updateDuration failed, uses local configuration.");
1450         }
1451         HILOG_INFO("Get form update duration end.");
1452         bool ret = FormTimerMgr::GetInstance().AddFormTimer(formRecord.formId,
1453             updateDuration, formRecord.providerUserId);
1454         return ret ? ERR_OK : ERR_APPEXECFWK_FORM_COMMON_CODE;
1455     }
1456     if (formRecord.updateAtHour >= 0 && formRecord.updateAtMin >= 0) {
1457         bool ret = FormTimerMgr::GetInstance().AddFormTimer(formRecord.formId,
1458             formRecord.updateAtHour, formRecord.updateAtMin, formRecord.providerUserId);
1459         return ret ? ERR_OK : ERR_APPEXECFWK_FORM_COMMON_CODE;
1460     }
1461     HILOG_INFO("%{public}s no need add form timer.", __func__);
1462     return ERR_OK;
1463 }
1464 
1465 /**
1466  * @brief Send event notify to form provider. The event notify type include FORM_VISIBLE and FORM_INVISIBLE.
1467  *
1468  * @param providerKey The provider key string which consists of the provider bundle name and ability name.
1469  * @param formIdsByProvider The vector of form Ids which have the same provider.
1470  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
1471  * @return Returns ERR_OK on success, others on failure.
1472  */
HandleEventNotify(const std::string & providerKey,const std::vector<int64_t> & formIdsByProvider,const int32_t formVisibleType)1473 ErrCode FormMgrAdapter::HandleEventNotify(const std::string &providerKey, const std::vector<int64_t> &formIdsByProvider,
1474     const int32_t formVisibleType)
1475 {
1476     HILOG_INFO("%{public}s called.", __func__);
1477     size_t position = providerKey.find(Constants::NAME_DELIMITER);
1478     std::string bundleName = providerKey.substr(0, position);
1479     std::string abilityName = providerKey.substr(position + strlen(Constants::NAME_DELIMITER));
1480     sptr<IAbilityConnection> formEventNotifyConnection = new (std::nothrow) FormEventNotifyConnection(formIdsByProvider,
1481         formVisibleType, bundleName, abilityName);
1482     if (formEventNotifyConnection == nullptr) {
1483         HILOG_ERROR("failed to create FormEventNotifyConnection.");
1484         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1485     }
1486     Want connectWant;
1487     connectWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1488     connectWant.SetElementName(bundleName, abilityName);
1489     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(connectWant, formEventNotifyConnection);
1490     if (errorCode != ERR_OK) {
1491         HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1492         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1493     }
1494 
1495     return ERR_OK;
1496 }
1497 
1498 /**
1499  * @brief Acquire form data from form provider.
1500  * @param formId The Id of the form.
1501  * @param info Form configure info.
1502  * @param wantParams WantParams of the request.
1503  * @return Returns ERR_OK on success, others on failure.
1504  */
AcquireProviderFormInfoAsync(const int64_t formId,const FormItemInfo & info,const WantParams & wantParams)1505 ErrCode FormMgrAdapter::AcquireProviderFormInfoAsync(const int64_t formId,
1506     const FormItemInfo &info, const WantParams &wantParams)
1507 {
1508     if (FormRenderMgr::GetInstance().GetIsVerified()) {
1509         HILOG_INFO("The authentication status of the current user is true.");
1510         return InnerAcquireProviderFormInfoAsync(formId, info, wantParams);
1511     }
1512 
1513     HILOG_INFO("The current user is not unlocked.");
1514     auto task = [formId, newInfo = info, newWant = wantParams]() {
1515         FormMgrAdapter::GetInstance().InnerAcquireProviderFormInfoAsync(formId, newInfo, newWant);
1516     };
1517     FormRenderMgr::GetInstance().AddAcquireProviderFormInfoTask(task);
1518     return ERR_OK;
1519 }
1520 
InnerAcquireProviderFormInfoAsync(const int64_t formId,const FormItemInfo & info,const WantParams & wantParams)1521 ErrCode FormMgrAdapter::InnerAcquireProviderFormInfoAsync(const int64_t formId,
1522     const FormItemInfo &info, const WantParams &wantParams)
1523 {
1524     if (formId <= 0) {
1525         HILOG_ERROR("%{public}s fail, formId should be greater than 0", __func__);
1526         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1527     }
1528 
1529     Want newWant;
1530     newWant.SetParams(wantParams);
1531     auto hostToken = newWant.GetRemoteObject(Constants::PARAM_FORM_HOST_TOKEN);
1532     sptr<IAbilityConnection> formAcquireConnection = new (std::nothrow) FormAcquireConnection(formId, info, wantParams,
1533         hostToken);
1534     if (formAcquireConnection == nullptr) {
1535         HILOG_ERROR("formAcquireConnection is null.");
1536         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1537     }
1538     Want want;
1539     want.SetElementName(info.GetProviderBundleName(), info.GetAbilityName());
1540     want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
1541     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formAcquireConnection);
1542     if (errorCode != ERR_OK) {
1543         HILOG_ERROR("%{public}s fail, ConnectServiceAbility failed.", __func__);
1544         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
1545     }
1546     return ERR_OK;
1547 }
1548 
1549 /**
1550  * @brief Get bundle info.
1551  * @param want The want of the request.
1552  * @param bundleInfo Bundle info.
1553  * @param packageName Package name.
1554  * @return Returns ERR_OK on success, others on failure.
1555  */
GetBundleInfo(const AAFwk::Want & want,BundleInfo & bundleInfo,std::string & packageName)1556 ErrCode FormMgrAdapter::GetBundleInfo(const AAFwk::Want &want, BundleInfo &bundleInfo, std::string &packageName)
1557 {
1558     HILOG_DEBUG("GetBundleInfo start.");
1559     std::string bundleName = want.GetElement().GetBundleName();
1560     std::string abilityName = want.GetElement().GetAbilityName();
1561     std::string deviceId = want.GetElement().GetDeviceID();
1562     std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1563     if (bundleName.empty() || abilityName.empty() || moduleName.empty()) {
1564         HILOG_ERROR("GetBundleInfo bundleName or abilityName or moduleName is invalid");
1565         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1566     }
1567 
1568     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1569     if (iBundleMgr == nullptr) {
1570         HILOG_ERROR("GetBundleMgr, failed to get IBundleMgr.");
1571         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1572     }
1573 
1574     if (!IN_PROCESS_CALL(iBundleMgr->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES,
1575         bundleInfo, FormUtil::GetCurrentAccountId()))) {
1576         HILOG_ERROR("GetBundleInfo, failed to get bundle info.");
1577         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1578     }
1579 
1580     bool moduleExist = false;
1581     for (const auto &moduleInfo : bundleInfo.moduleNames) {
1582         HILOG_DEBUG("bundleInfo.moduleNames, module name:%{public}s", moduleInfo.c_str());
1583         if (moduleInfo.compare(moduleName) == 0) {
1584             moduleExist = true;
1585             break;
1586         }
1587     }
1588     if (!moduleExist) {
1589         HILOG_ERROR("GetBundleInfo no such module, name:%{public}s", moduleName.c_str());
1590         return ERR_APPEXECFWK_FORM_NO_SUCH_MODULE;
1591     }
1592 
1593     packageName = bundleName + moduleName;
1594     HILOG_DEBUG("GetBundleInfo end.");
1595     return ERR_OK;
1596 }
1597 /**
1598  * @brief Get form info.
1599  * @param want The want of the request.
1600  * @param formInfo Form info.
1601  * @return Returns ERR_OK on success, others on failure.
1602  */
GetFormInfo(const AAFwk::Want & want,FormInfo & formInfo)1603 ErrCode FormMgrAdapter::GetFormInfo(const AAFwk::Want &want, FormInfo &formInfo)
1604 {
1605     HILOG_DEBUG("GetFormInfo start.");
1606     std::string bundleName = want.GetElement().GetBundleName();
1607     std::string abilityName = want.GetElement().GetAbilityName();
1608     std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1609     if (bundleName.empty() || abilityName.empty() || moduleName.empty()) {
1610         HILOG_ERROR("bundleName or abilityName or moduleName is invalid");
1611         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1612     }
1613 
1614     std::vector<FormInfo> formInfos {};
1615     ErrCode errCode = FormInfoMgr::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
1616     if (errCode != ERR_OK) {
1617         HILOG_ERROR("GetFormsInfoByModule, failed to get form config info.");
1618         return errCode;
1619     }
1620 
1621     std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1622     bool abilityExisting = false;
1623     for (const auto &form : formInfos) {
1624         if (form.abilityName != abilityName) {
1625             continue;
1626         }
1627 
1628         abilityExisting = true;
1629         if ((formName.empty() && form.defaultFlag) || form.name == formName) {
1630             formInfo = form;
1631             formInfo.moduleName = moduleName;
1632             HILOG_DEBUG("GetFormInfo end.");
1633             return ERR_OK;
1634         }
1635     }
1636 
1637     HILOG_ERROR("failed to get form info failed. ability name is %{public}s, form name is %{public}s",
1638         abilityName.c_str(), formName.c_str());
1639     return abilityExisting ? ERR_APPEXECFWK_FORM_GET_INFO_FAILED : ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
1640 }
1641 /**
1642  * @brief Get form configure info.
1643  * @param want The want of the request.
1644  * @param bundleInfo Bundle info.
1645  * @param formInfo Form info.
1646  * @param formItemInfo Form configure info.
1647  * @return Returns ERR_OK on success, others on failure.
1648  */
GetFormItemInfo(const AAFwk::Want & want,const BundleInfo & bundleInfo,const FormInfo & formInfo,FormItemInfo & formItemInfo)1649 ErrCode FormMgrAdapter::GetFormItemInfo(const AAFwk::Want &want, const BundleInfo &bundleInfo,
1650     const FormInfo &formInfo, FormItemInfo &formItemInfo)
1651 {
1652     HILOG_DEBUG("GetFormItemInfo start.");
1653     int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, formInfo.defaultDimension);
1654     if (!IsDimensionValid(formInfo, dimensionId)) {
1655         HILOG_ERROR("GetFormItemInfo failed, dimension is not valid.");
1656         return ERR_APPEXECFWK_FORM_NO_SUCH_DIMENSION;
1657     }
1658 
1659     ErrCode ret = CreateFormItemInfo(bundleInfo, formInfo, formItemInfo, want);
1660     if (ret != ERR_OK) {
1661         HILOG_ERROR("GetFormItemInfo failed, CreateFormItemInfo failed.");
1662         return ret;
1663     }
1664     formItemInfo.SetSpecificationId(dimensionId);
1665     formItemInfo.SetTemporaryFlag(want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false));
1666     HILOG_DEBUG("GetFormItemInfo end.");
1667     return ERR_OK;
1668 }
1669 /**
1670  * @brief Dimension valid check.
1671  * @param formInfo Form info.
1672  * @param dimensionId Dimension id.
1673  * @return Returns true on success, false on failure.
1674  */
IsDimensionValid(const FormInfo & formInfo,int dimensionId) const1675 bool FormMgrAdapter::IsDimensionValid(const FormInfo &formInfo, int dimensionId) const
1676 {
1677     if (formInfo.supportDimensions.empty()) {
1678         HILOG_ERROR("Js form, no support dimension.");
1679         return false;
1680     }
1681 
1682     for (size_t i = 0; i < formInfo.supportDimensions.size() && i < Constants::MAX_LAYOUT; i++) {
1683         if (formInfo.supportDimensions[i] == dimensionId) {
1684             return true;
1685         }
1686     }
1687 
1688     HILOG_ERROR("No matched dimension found for %{public}d.", dimensionId);
1689     return false;
1690 }
1691 /**
1692  * @brief Create form configure info.
1693  * @param bundleInfo Bundle info.
1694  * @param formInfo Form info.
1695  * @param itemInfo Form configure info.
1696  * @return Returns ERR_OK on success, others on failure.
1697  */
CreateFormItemInfo(const BundleInfo & bundleInfo,const FormInfo & formInfo,FormItemInfo & itemInfo,const AAFwk::Want & want)1698 ErrCode FormMgrAdapter::CreateFormItemInfo(const BundleInfo &bundleInfo,
1699     const FormInfo &formInfo, FormItemInfo &itemInfo, const AAFwk::Want &want)
1700 {
1701     itemInfo.SetProviderBundleName(bundleInfo.name);
1702     itemInfo.SetVersionCode(bundleInfo.versionCode);
1703     itemInfo.SetVersionName(bundleInfo.versionName);
1704     itemInfo.SetCompatibleVersion(bundleInfo.compatibleVersion);
1705     itemInfo.SetSystemAppFlag(bundleInfo.applicationInfo.isSystemApp);
1706     itemInfo.SetProviderUid(bundleInfo.applicationInfo.uid);
1707     itemInfo.SetDescription(formInfo.description);
1708 
1709     std::string hostBundleName;
1710     bool isSaUid = IPCSkeleton::GetCallingUid() == SYSTEM_UID;
1711     ErrCode ret = ERR_APPEXECFWK_FORM_COMMON_CODE;
1712     if (isSaUid) {
1713         hostBundleName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_HOST_BUNDLENAME_KEY);
1714         HILOG_INFO("sa uid call CreateFormItemInfo, hostBundleName is %{public}s", hostBundleName.c_str());
1715         ret = ERR_OK;
1716     } else {
1717         ret = FormBmsHelper::GetInstance().GetCallerBundleName(hostBundleName);
1718     }
1719     if (ret != ERR_OK) {
1720         HILOG_ERROR("GetFormsInfoByModule, failed to get form config info.");
1721         return ret;
1722     }
1723     itemInfo.SetHostBundleName(hostBundleName);
1724     itemInfo.SetAbilityName(formInfo.abilityName);
1725     itemInfo.SetModuleName(formInfo.moduleName); // formInfo.moduleName: bundleMgr do not set
1726     itemInfo.SetFormName(formInfo.name);
1727     itemInfo.SetEnableUpdateFlag(formInfo.updateEnabled);
1728     itemInfo.SetUpdateDuration(formInfo.updateDuration);
1729     itemInfo.SetScheduledUpdateTime(formInfo.scheduledUpdateTime);
1730     itemInfo.SetJsComponentName(formInfo.jsComponentName);
1731     itemInfo.SetFormVisibleNotify(formInfo.formVisibleNotify);
1732     auto formSrc = formInfo.src;
1733     if (formSrc.rfind(POINT_ETS) == formSrc.size() - POINT_ETS.size()) {
1734         formSrc.erase(formSrc.end() - POINT_ETS.size(), formSrc.end());
1735     }
1736     itemInfo.SetFormSrc(formSrc);
1737     itemInfo.SetFormWindow(formInfo.window);
1738     itemInfo.SetType(formInfo.type);
1739     itemInfo.SetUiSyntax(formInfo.uiSyntax);
1740     itemInfo.SetIsDynamic(formInfo.isDynamic);
1741     itemInfo.SetTransparencyEnabled(formInfo.transparencyEnabled);
1742     itemInfo.SetPrivacyLevel(formInfo.privacyLevel);
1743 
1744     for (const auto &abilityInfo : bundleInfo.abilityInfos) {
1745         if (abilityInfo.name == formInfo.abilityName) {
1746             itemInfo.SetAbilityModuleName(abilityInfo.moduleName);
1747             if (!abilityInfo.isModuleJson) {
1748                 itemInfo.SetFormSrc("");
1749             }
1750         }
1751         auto hapPath = abilityInfo.hapPath;
1752         if (hapPath.find(Constants::ABS_CODE_PATH) != std::string::npos) {
1753             hapPath = std::regex_replace(hapPath, std::regex(Constants::ABS_CODE_PATH), Constants::LOCAL_BUNDLES);
1754         }
1755         itemInfo.AddModuleInfo(abilityInfo.moduleName, hapPath);
1756         HILOG_DEBUG("%{public}s hap path is %{public}s", abilityInfo.moduleName.c_str(), hapPath.c_str());
1757     }
1758 
1759     HILOG_INFO("%{public}s moduleInfos size: %{public}zu", __func__, bundleInfo.applicationInfo.moduleInfos.size());
1760     for (const auto &item : bundleInfo.applicationInfo.moduleInfos) {
1761         HILOG_INFO("%{public}s moduleInfos,  moduleName: %{public}s, moduleSourceDir: %{public}s", __func__,
1762             item.moduleName.c_str(), item.moduleSourceDir.c_str());
1763         if (formInfo.moduleName == item.moduleName) {
1764             itemInfo.AddHapSourceDirs(item.moduleSourceDir);
1765         }
1766     }
1767     itemInfo.SetDataProxyFlag(formInfo.dataProxyEnabled);
1768     return ERR_OK;
1769 }
1770 
1771 /**
1772  * @brief set next refresh time.
1773  * @param formId The id of the form.
1774  * @param nextTime next refresh time.
1775  * @return Returns ERR_OK on success, others on failure.
1776  */
SetNextRefreshTime(const int64_t formId,const int64_t nextTime)1777 int FormMgrAdapter::SetNextRefreshTime(const int64_t formId, const int64_t nextTime)
1778 {
1779     HILOG_INFO("%{public}s begin here, formId:%{public}" PRId64 ",nextTime:%{public}" PRId64 "",
1780         __func__, formId, nextTime);
1781     if (formId <= 0) {
1782         HILOG_ERROR("%{public}s formId is invalid", __func__);
1783         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1784     }
1785 
1786     std::string bundleName;
1787     auto ret = FormBmsHelper::GetInstance().GetCallerBundleName(bundleName);
1788     if (ret != ERR_OK) {
1789         HILOG_ERROR("%{public}s failed to get BundleName", __func__);
1790         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1791     }
1792     int32_t callingUid = IPCSkeleton::GetCallingUid();
1793     int32_t userId = GetCurrentUserId(callingUid);
1794     HILOG_INFO("%{public}s, userId:%{public}d, callingUid:%{public}d.", __func__, userId, callingUid);
1795 
1796     FormRecord formRecord;
1797     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
1798     if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
1799         HILOG_ERROR("%{public}s, not found in form record.", __func__);
1800         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
1801     }
1802 
1803     if (userId != formRecord.providerUserId) {
1804         HILOG_ERROR("%{public}s, not self form:%{public}" PRId64 "", __func__, formId);
1805         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1806     }
1807 
1808     // check bundleName
1809     if (bundleName != formRecord.bundleName) {
1810         HILOG_ERROR("%{public}s, not match bundleName:%{public}s", __func__, bundleName.c_str());
1811         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1812     }
1813 
1814     if (formRecord.isDataProxy) {
1815         HILOG_ERROR("data proxy form not support set next refresh time.");
1816         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1817     }
1818 
1819     return SetNextRefreshTimeLocked(matchedFormId, nextTime, userId);
1820 }
1821 
ReleaseRenderer(int64_t formId,const std::string & compId)1822 int FormMgrAdapter::ReleaseRenderer(int64_t formId, const std::string &compId)
1823 {
1824     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
1825     if (formId <= 0 || compId.empty()) {
1826         HILOG_ERROR("Release invalid param");
1827         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1828     }
1829 
1830     FormRecord record;
1831     if (!FormDataMgr::GetInstance().GetFormRecord(formId, record)) {
1832         HILOG_ERROR("no matched form record");
1833         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1834     }
1835     FormRenderMgr::GetInstance().ReleaseRenderer(formId, record, compId);
1836     return ERR_OK;
1837 }
1838 
CheckPublishForm(Want & want)1839 ErrCode FormMgrAdapter::CheckPublishForm(Want &want)
1840 {
1841     std::string bundleName;
1842     if (!GetBundleName(bundleName)) {
1843         HILOG_ERROR("failed to get BundleName");
1844         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
1845     }
1846     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1847     if (iBundleMgr == nullptr) {
1848         HILOG_ERROR("fail, failed to get IBundleMgr.");
1849         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1850     }
1851 
1852     if (!IsValidPublishEvent(iBundleMgr, bundleName, want)) {
1853         HILOG_ERROR("Check valid publish event failed.");
1854         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1855     }
1856 
1857     if (want.GetElement().GetBundleName().empty()) {
1858         HILOG_WARN("The bundleName is empty, set to current calling bundle.");
1859         want.SetBundle(bundleName);
1860     }
1861 
1862     std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1863     if (moduleName.empty()) {
1864         HILOG_ERROR("error, moduleName is empty.");
1865         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1866     }
1867 
1868     bool isTemporary = want.GetBoolParam(AppExecFwk::Constants::PARAM_FORM_TEMPORARY_KEY, false);
1869     if (isTemporary) {
1870         HILOG_WARN("The published form should not be temp.");
1871         want.SetParam(AppExecFwk::Constants::PARAM_FORM_TEMPORARY_KEY, false);
1872     }
1873 
1874     std::string abilityName = want.GetElement().GetAbilityName();
1875     std::string formName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_NAME_KEY);
1876     std::vector<FormInfo> formInfos {};
1877     ErrCode errCode = FormInfoMgr::GetInstance()
1878         .GetFormsInfoByModuleWithoutCheck(want.GetElement().GetBundleName(), moduleName, formInfos);
1879     if (errCode != ERR_OK) {
1880         HILOG_ERROR("error, failed to get forms info.");
1881         return errCode;
1882     }
1883     for (auto &formInfo: formInfos) {
1884         int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1885         if ((formInfo.abilityName == abilityName) && (formInfo.name == formName) &&
1886             (IsDimensionValid(formInfo, dimensionId))) {
1887             want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, dimensionId);
1888             return ERR_OK;
1889         }
1890     }
1891     HILOG_ERROR("failed to find match form info.");
1892     return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1893 }
1894 
QueryPublishFormToHost(Want & wantToHost)1895 ErrCode FormMgrAdapter::QueryPublishFormToHost(Want &wantToHost)
1896 {
1897     AppExecFwk::AbilityInfo formAbilityInfo;
1898     AppExecFwk::ExtensionAbilityInfo formExtensionAbilityInfo;
1899 
1900     int callingUid = IPCSkeleton::GetCallingUid();
1901     int32_t userId = GetCurrentUserId(callingUid);
1902 
1903     // Query the highest priority ability or extension ability for publishing form
1904     AppExecFwk::AbilityInfo abilityInfo;
1905     AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
1906     if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(
1907         Constants::FORM_PUBLISH_ACTION, userId, abilityInfo, extensionAbilityInfo)) {
1908         HILOG_ERROR("Failed to ImplicitQueryInfoByPriority for publishing form");
1909         return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1910     }
1911 
1912     if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
1913         HILOG_ERROR("Query highest priority ability failed, no form host ability found.");
1914         return ERR_APPEXECFWK_FORM_GET_HOST_FAILED;
1915     }
1916 
1917     if (!abilityInfo.name.empty()) {
1918         // highest priority ability
1919         HILOG_DEBUG("Query highest priority ability success. bundleName: %{public}s, ability:%{public}s",
1920             abilityInfo.bundleName.c_str(), abilityInfo.name.c_str());
1921         wantToHost.SetElementName(abilityInfo.bundleName, abilityInfo.name);
1922     } else {
1923         // highest priority extension ability
1924         HILOG_DEBUG("Query highest priority extension ability success. bundleName: %{public}s, ability:%{public}s",
1925             extensionAbilityInfo.bundleName.c_str(), extensionAbilityInfo.name.c_str());
1926         wantToHost.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
1927     }
1928     return ERR_OK;
1929 }
1930 
RequestPublishFormToHost(Want & want)1931 ErrCode FormMgrAdapter::RequestPublishFormToHost(Want &want)
1932 {
1933     Want wantToHost;
1934     ElementName elementName = want.GetElement();
1935     wantToHost.SetParam(Constants::PARAM_BUNDLE_NAME_KEY, elementName.GetBundleName());
1936     wantToHost.SetParam(Constants::PARAM_ABILITY_NAME_KEY, elementName.GetAbilityName());
1937     std::string strFormId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY);
1938     wantToHost.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, strFormId);
1939     std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
1940     wantToHost.SetParam(Constants::PARAM_FORM_NAME_KEY, formName);
1941     std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
1942     wantToHost.SetParam(Constants::PARAM_MODULE_NAME_KEY, moduleName);
1943     int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
1944     wantToHost.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, dimensionId);
1945     bool tempFormFlag = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
1946     wantToHost.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, tempFormFlag);
1947     std::string callerBundleName = want.GetStringParam(Constants::PARAM_CALLER_BUNDLE_NAME_KEY);
1948     wantToHost.SetParam(Constants::PARAM_CALLER_BUNDLE_NAME_KEY, callerBundleName);
1949     int32_t userId = want.GetIntParam(Constants::PARAM_FORM_USER_ID, -1);
1950     std::string bundleName = want.GetStringParam(Constants::PARAM_PUBLISH_FORM_HOST_BUNDLE_KEY);
1951     std::string abilityName = want.GetStringParam(Constants::PARAM_PUBLISH_FORM_HOST_ABILITY_KEY);
1952     wantToHost.SetElementName(bundleName, abilityName);
1953     wantToHost.SetAction(Constants::FORM_PUBLISH_ACTION);
1954 
1955     ErrCode errCode = QueryPublishFormToHost(wantToHost);
1956     if (errCode == ERR_OK) {
1957         return FormAmsHelper::GetInstance().StartAbility(wantToHost, userId);
1958     }
1959 
1960     // Handle by interceptor callback when the system handler is not found.
1961     if (formPublishInterceptor_ == nullptr) {
1962         HILOG_DEBUG("query publish form failed, and have not publish interceptor. errCode:%{public}d.", errCode);
1963         return errCode;
1964     }
1965     int ret = formPublishInterceptor_->ProcessPublishForm(wantToHost);
1966     if (ret == ERR_OK) {
1967         HILOG_DEBUG("success to ProcessPublishForm.");
1968     } else {
1969         HILOG_ERROR("failed to ProcessPublishForm.");
1970     }
1971     return ret;
1972 }
1973 
RequestPublishForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId,const std::vector<FormDataProxy> & formDataProxies)1974 ErrCode FormMgrAdapter::RequestPublishForm(Want &want, bool withFormBindingData,
1975     std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId,
1976     const std::vector<FormDataProxy> &formDataProxies)
1977 {
1978     HILOG_DEBUG("called.");
1979     ErrCode errCode = CheckPublishForm(want);
1980     if (errCode != ERR_OK) {
1981         return errCode;
1982     }
1983 
1984     int callingUid = IPCSkeleton::GetCallingUid();
1985     int32_t userId = GetCurrentUserId(callingUid);
1986     want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
1987     want.SetAction(Constants::FORM_PUBLISH_ACTION);
1988 
1989     // generate formId
1990     formId = FormDataMgr::GetInstance().GenerateFormId();
1991     if (formId < 0) {
1992         HILOG_ERROR("fail, generateFormId no invalid formId");
1993         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1994     }
1995     HILOG_DEBUG("formId:%{public}" PRId64 "", formId);
1996     std::string strFormId = std::to_string(formId);
1997     want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, strFormId);
1998 
1999     if (withFormBindingData) {
2000         errCode = FormDataMgr::GetInstance().AddRequestPublishFormInfo(formId, want, formBindingData);
2001     } else {
2002         std::unique_ptr<FormProviderData> noFormBindingData = nullptr;
2003         errCode = FormDataMgr::GetInstance().AddRequestPublishFormInfo(formId, want, noFormBindingData);
2004     }
2005     if (errCode != ERR_OK) {
2006         HILOG_ERROR("fail, add form info error");
2007         return errCode;
2008     }
2009 
2010     errCode = RequestPublishFormToHost(want);
2011     if (errCode != ERR_OK) {
2012         FormDataMgr::GetInstance().RemoveRequestPublishFormInfo(formId);
2013     }
2014     if (!formDataProxies.empty()) {
2015         FormDataProxyMgr::GetInstance().ProduceFormDataProxies(formId, formDataProxies);
2016     }
2017     return errCode;
2018 }
2019 
CheckAddRequestPublishForm(const Want & want,const Want & formProviderWant)2020 ErrCode FormMgrAdapter::CheckAddRequestPublishForm(const Want &want, const Want &formProviderWant)
2021 {
2022     std::string bundleName = want.GetElement().GetBundleName();
2023     std::string bundleNameProvider = formProviderWant.GetElement().GetBundleName();
2024     if (bundleNameProvider != bundleName) {
2025         HILOG_ERROR("The bundleName is not match.");
2026         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2027     }
2028 
2029     std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
2030     std::string moduleNameProvider = formProviderWant.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
2031     if (moduleNameProvider != moduleName) {
2032         HILOG_ERROR("The moduleName is not match.");
2033         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2034     }
2035 
2036     std::string abilityName = want.GetElement().GetAbilityName();
2037     std::string abilityNameProvider = formProviderWant.GetElement().GetAbilityName();
2038     if (abilityNameProvider != abilityName) {
2039         HILOG_ERROR("The abilityName is not match.");
2040         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2041     }
2042 
2043     std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
2044     std::string formNameProvider = formProviderWant.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
2045     if (formNameProvider != formName) {
2046         HILOG_ERROR("The formName is not match.");
2047         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2048     }
2049 
2050     int32_t dimensionId = want.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
2051     int32_t dimensionIdProvider = formProviderWant.GetIntParam(Constants::PARAM_FORM_DIMENSION_KEY, 0);
2052     if (dimensionIdProvider != dimensionId) {
2053         HILOG_ERROR("The dimensionId is not match.");
2054         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2055     }
2056 
2057     bool isTemporary = want.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
2058     bool isTemporaryProvider = formProviderWant.GetBoolParam(Constants::PARAM_FORM_TEMPORARY_KEY, false);
2059     if (isTemporaryProvider != isTemporary) {
2060         HILOG_ERROR("The temporary is not match.");
2061         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2062     }
2063 
2064     int32_t callingUid = IPCSkeleton::GetCallingUid();
2065     ErrCode errCode = ERR_OK;
2066     if (isTemporary) {
2067         errCode = FormDataMgr::GetInstance().CheckTempEnoughForm();
2068     } else {
2069         int32_t currentUserId = GetCurrentUserId(callingUid);
2070         errCode = FormDataMgr::GetInstance().CheckEnoughForm(callingUid, currentUserId);
2071     }
2072     if (errCode != ERR_OK) {
2073         HILOG_ERROR("fail, too much forms in system");
2074     }
2075     return errCode;
2076 }
2077 
AddRequestPublishForm(const FormItemInfo & formItemInfo,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formJsInfo)2078 ErrCode FormMgrAdapter::AddRequestPublishForm(const FormItemInfo &formItemInfo, const Want &want,
2079     const sptr<IRemoteObject> &callerToken, FormJsInfo &formJsInfo)
2080 {
2081     HILOG_INFO("Add request publish form.");
2082     Want formProviderWant;
2083     std::unique_ptr<FormProviderData> formProviderData = nullptr;
2084     auto formId = formItemInfo.GetFormId();
2085     ErrCode errCode = FormDataMgr::GetInstance().GetRequestPublishFormInfo(formId, formProviderWant, formProviderData);
2086     if (errCode != ERR_OK) {
2087         HILOG_ERROR("Failed to get request publish form");
2088         return errCode;
2089     }
2090 
2091     errCode = CheckAddRequestPublishForm(want, formProviderWant);
2092     if (errCode != ERR_OK) {
2093         return errCode;
2094     }
2095 
2096     int32_t callingUid = IPCSkeleton::GetCallingUid();
2097     if (!FormDataMgr::GetInstance().AllotFormHostRecord(formItemInfo, callerToken, formId, callingUid)) {
2098         HILOG_ERROR("%{public}s fail, AllotFormHostRecord failed when no matched formRecord", __func__);
2099         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2100     }
2101 
2102     // get current userId
2103     int32_t currentUserId = GetCurrentUserId(callingUid);
2104     // allot form record
2105     FormRecord formRecord = FormDataMgr::GetInstance().AllotFormRecord(formItemInfo, callingUid, currentUserId);
2106     if (formProviderData != nullptr) {
2107         formRecord.formProviderInfo.SetFormData(*formProviderData);
2108     }
2109     FormRenderMgr::GetInstance().RenderForm(formRecord, want.GetParams()); // render for arkTs form
2110 
2111     // create form info for js
2112     FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formJsInfo);
2113     if (formProviderData != nullptr) {
2114         formJsInfo.formData = formProviderData->GetDataString();
2115         formJsInfo.formProviderData = *formProviderData;
2116         if (formProviderData->NeedCache()) {
2117             HILOG_INFO("%{public}s, data is less than 1k, cache data.", __func__);
2118             FormCacheMgr::GetInstance().AddData(formId, formJsInfo.formProviderData);
2119         }
2120     }
2121     // storage info
2122     if (!formItemInfo.IsTemporaryForm()) {
2123         if (ErrCode errorCode = FormDbCache::GetInstance().UpdateDBRecord(formId, formRecord);
2124             errorCode != ERR_OK) {
2125             HILOG_ERROR("%{public}s fail, UpdateDBRecord failed", __func__);
2126             return errorCode;
2127         }
2128     }
2129     std::vector<FormDataProxy> formDataProxies;
2130     if (FormDataProxyMgr::GetInstance().ConsumeFormDataProxies(formId, formDataProxies)) {
2131         FormDataProxyMgr::GetInstance().SubscribeFormData(formId, formDataProxies);
2132     }
2133     // start update timer
2134     return AddFormTimer(formRecord);
2135 }
2136 
2137 /**
2138  * @brief get bundleName.
2139  * @param bundleName for output.
2140  * @return Returns true on success, others on failure.
2141  */
GetBundleName(std::string & bundleName)2142 bool FormMgrAdapter::GetBundleName(std::string &bundleName)
2143 {
2144     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2145     if (iBundleMgr == nullptr) {
2146         HILOG_ERROR("%{public}s, failed to get IBundleMgr.", __func__);
2147         return false;
2148     }
2149 
2150     int uid = IPCSkeleton::GetCallingUid();
2151     if (!IN_PROCESS_CALL(iBundleMgr->CheckIsSystemAppByUid(uid))) {
2152         HILOG_ERROR("%{public}s fail, form is not system app. uid:%{public}d", __func__, uid);
2153         return false;
2154     }
2155 
2156     int32_t result = IN_PROCESS_CALL(iBundleMgr->GetNameForUid(uid, bundleName));
2157     if (result != ERR_OK || bundleName.empty()) {
2158         HILOG_ERROR("%{public}s failed, cannot get bundle name by uid:%{public}d", __func__, uid);
2159         return false;
2160     }
2161     return true;
2162 }
2163 
2164 /**
2165  * @brief set next refresh time locked.
2166  * @param formId The form's id.
2167  * @param nextTime next refresh time.
2168  * @param userId User ID.
2169  * @return Returns ERR_OK on success, others on failure.
2170  */
SetNextRefreshTimeLocked(const int64_t formId,const int64_t nextTime,const int32_t userId)2171 int FormMgrAdapter::SetNextRefreshTimeLocked(const int64_t formId, const int64_t nextTime, const int32_t userId)
2172 {
2173     HILOG_ERROR("SetNextRefreshTimeLocked.");
2174     int32_t timerRefreshedCount = FormTimerMgr::GetInstance().GetRefreshCount(formId);
2175     if (timerRefreshedCount >= Constants::LIMIT_COUNT) {
2176         HILOG_ERROR("%{public}s, already refresh times:%{public}d", __func__, timerRefreshedCount);
2177         FormTimerMgr::GetInstance().MarkRemind(formId);
2178         return ERR_APPEXECFWK_FORM_MAX_REFRESH;
2179     }
2180 
2181     if (!FormTimerMgr::GetInstance().SetNextRefreshTime(formId, nextTime * Constants::SEC_PER_MIN, userId)) {
2182         HILOG_ERROR("%{public}s failed", __func__);
2183         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2184     }
2185 
2186     return ERR_OK;
2187 }
2188 
2189 /**
2190  * @brief set next refresh time locked.
2191  * @param formId The form's id.
2192  * @param bundleName Provider ability bundleName.
2193  * @return Returns true or false.
2194  */
IsUpdateValid(const int64_t formId,const std::string & bundleName)2195 bool FormMgrAdapter::IsUpdateValid(const int64_t formId, const std::string &bundleName)
2196 {
2197     if (formId <= 0 || bundleName.empty()) {
2198         return false;
2199     }
2200     return true;
2201 }
2202 
2203 /**
2204  * @brief enable update form.
2205  * @param formIDs The id of the forms.
2206  * @param callerToken Caller ability token.
2207  * @return Returns ERR_OK on success, others on failure.
2208  */
EnableUpdateForm(const std::vector<int64_t> formIDs,const sptr<IRemoteObject> & callerToken)2209 int FormMgrAdapter::EnableUpdateForm(const std::vector<int64_t> formIDs, const sptr<IRemoteObject> &callerToken)
2210 {
2211     HILOG_DEBUG("enableUpdateForm");
2212     return HandleUpdateFormFlag(formIDs, callerToken, true, false);
2213 }
2214 
2215 /**
2216  * @brief disable update form.
2217  * @param formIDs The id of the forms.
2218  * @param callerToken Caller ability token.
2219  * @return Returns ERR_OK on success, others on failure.
2220  */
DisableUpdateForm(const std::vector<int64_t> formIDs,const sptr<IRemoteObject> & callerToken)2221 int FormMgrAdapter::DisableUpdateForm(const std::vector<int64_t> formIDs, const sptr<IRemoteObject> &callerToken)
2222 {
2223     HILOG_DEBUG("disableUpdateForm");
2224     return HandleUpdateFormFlag(formIDs, callerToken, false, false);
2225 }
2226 
2227 /**
2228  * @brief Process js message event.
2229  * @param formId Indicates the unique id of form.
2230  * @param want information passed to supplier.
2231  * @param callerToken Caller ability token.
2232  * @return Returns true if execute success, false otherwise.
2233  */
MessageEvent(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)2234 int FormMgrAdapter::MessageEvent(const int64_t formId, const Want &want, const sptr<IRemoteObject> &callerToken)
2235 {
2236     HILOG_INFO("%{public}s called.", __func__);
2237     if (formId <= 0) {
2238         HILOG_ERROR("%{public}s form formId is invalid", __func__);
2239         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2240     }
2241 
2242     if (callerToken == nullptr) {
2243         HILOG_ERROR("%{public}s failed, callerToken can not be NULL", __func__);
2244         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2245     }
2246 
2247     if (!want.HasParameter(Constants::PARAM_MESSAGE_KEY)) {
2248         HILOG_ERROR("%{public}s failed, message info is not exist", __func__);
2249         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2250     }
2251 
2252     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2253     FormRecord record;
2254     bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2255     if (!bGetRecord) {
2256         HILOG_ERROR("%{public}s fail, not exist such form:%{public}" PRId64 "", __func__, matchedFormId);
2257         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2258     }
2259 
2260     FormHostRecord formHostRecord;
2261     bool isHostExist = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2262     if (!isHostExist) {
2263         HILOG_ERROR("%{public}s failed, cannot find target client.", __func__);
2264         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2265     }
2266 
2267     if (!formHostRecord.Contains(matchedFormId)) {
2268         HILOG_ERROR("%{public}s failed, form is not self-owned.", __func__);
2269         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
2270     }
2271 
2272     auto errCode = FormProviderMgr::GetInstance().MessageEvent(matchedFormId, record, want);
2273     if (errCode != ERR_OK) {
2274         return errCode;
2275     }
2276     HILOG_INFO("%{public}s, find target client.", __func__);
2277 
2278     NotifyFormClickEvent(formId, FORM_CLICK_MESSAGE);
2279 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
2280     if (!FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
2281         int callingUid = IPCSkeleton::GetCallingUid();
2282         int32_t userId = GetCurrentUserId(callingUid);
2283         DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
2284             record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_CLICKED);
2285         DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
2286     }
2287 #endif
2288     return ERR_OK;
2289 }
2290 
2291 /**
2292  * @brief Process js router event.
2293  * @param formId Indicates the unique id of form.
2294  * @param want the want of the ability to start.
2295  * @param callerToken Caller ability token.
2296  * @return Returns true if execute success, false otherwise.
2297  */
RouterEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)2298 int FormMgrAdapter::RouterEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
2299 {
2300     HILOG_DEBUG("called.");
2301     if (formId <= 0) {
2302         HILOG_ERROR("form formId or bundleName is invalid");
2303         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2304     }
2305 
2306     want.SetParam(Constants::PARAM_FORM_ID, formId);
2307     want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, formId);
2308     if (!want.GetUriString().empty()) {
2309         HILOG_INFO("Router by uri");
2310         if (FormRouterProxyMgr::GetInstance().HasRouterProxy(formId)) {
2311             HILOG_INFO("Router proxy was setted sucessful");
2312             FormRouterProxyMgr::GetInstance().OnFormRouterEvent(formId, want);
2313             return ERR_OK;
2314         }
2315         int32_t result = FormAmsHelper::GetInstance().GetAbilityManager()->StartAbility(want, callerToken);
2316         if (result != ERR_OK && result != START_ABILITY_WAITING) {
2317             HILOG_ERROR("Failed to StartAbility, result: %{public}d.", result);
2318             return result;
2319         }
2320         NotifyFormClickEvent(formId, FORM_CLICK_ROUTER);
2321         return ERR_OK;
2322     }
2323 
2324     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2325     FormRecord record;
2326     bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2327     if (!bGetRecord) {
2328         HILOG_ERROR("error, not exist such form:%{public}" PRId64 "", matchedFormId);
2329         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2330     }
2331 
2332     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2333     if (iBundleMgr == nullptr) {
2334         HILOG_ERROR("error, failed to get IBundleMgr.");
2335         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
2336     }
2337 
2338     if (record.bundleName != want.GetBundle()) {
2339         if (!record.isSystemApp) {
2340             HILOG_WARN("Only system apps can launch the ability of the other apps.");
2341             want.SetBundle(record.bundleName);
2342         }
2343     }
2344     if (FormRouterProxyMgr::GetInstance().HasRouterProxy(formId)) {
2345         HILOG_INFO("Router proxy was setted sucessful");
2346         FormRouterProxyMgr::GetInstance().OnFormRouterEvent(formId, want);
2347         return ERR_OK;
2348     }
2349     int32_t result = FormAmsHelper::GetInstance().GetAbilityManager()->StartAbility(want, callerToken);
2350     if (result != ERR_OK && result != START_ABILITY_WAITING) {
2351         HILOG_ERROR("Failed to StartAbility, result: %{public}d.", result);
2352         return result;
2353     }
2354 
2355     NotifyFormClickEvent(formId, FORM_CLICK_ROUTER);
2356 #ifdef DEVICE_USAGE_STATISTICS_ENABLE
2357     if (!FormDataMgr::GetInstance().ExistTempForm(matchedFormId)) {
2358         int32_t callingUid = IPCSkeleton::GetCallingUid();
2359         int32_t userId = GetCurrentUserId(callingUid);
2360         DeviceUsageStats::BundleActiveEvent event(record.bundleName, record.moduleName, record.formName,
2361             record.specification, record.formId, DeviceUsageStats::BundleActiveEvent::FORM_IS_CLICKED);
2362         DeviceUsageStats::BundleActiveClient::GetInstance().ReportEvent(event, userId);
2363     }
2364 #endif
2365     return ERR_OK;
2366 }
2367 
2368 /**
2369  * @brief Process background router event.
2370  * @param formId Indicates the unique id of form.
2371  * @param want the want of the ability to start.
2372  * @param callerToken Caller ability token.
2373  * @return Returns true if execute success, false otherwise.
2374  */
BackgroundEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)2375 int FormMgrAdapter::BackgroundEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
2376 {
2377     HILOG_DEBUG("called.");
2378     if (formId <= 0) {
2379         HILOG_ERROR("form formId or bundleName is invalid");
2380         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2381     }
2382 
2383     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2384     FormRecord record;
2385     bool bGetRecord = FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record);
2386     if (!bGetRecord) {
2387         HILOG_ERROR("fail, not exist such form:%{public}" PRId64 "", matchedFormId);
2388         return ERR_APPEXECFWK_FORM_NOT_EXIST_ID;
2389     }
2390 
2391     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
2392     if (iBundleMgr == nullptr) {
2393         HILOG_ERROR("fail, failed to get IBundleMgr.");
2394         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
2395     }
2396     if (want.GetBundle().empty() || record.bundleName != want.GetBundle()) {
2397         HILOG_DEBUG("The parameter contains the wrong bundleName or the empty bundleName");
2398         want.SetBundle(record.bundleName);
2399     }
2400     if (!CheckKeepBackgroundRunningPermission(iBundleMgr, record.bundleName)) {
2401         HILOG_ERROR("The app does not have permission for keeping background running.");
2402         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
2403     }
2404 
2405     std::string params = want.GetStringParam(Constants::FORM_CALL_EVENT_PARAMS);
2406     nlohmann::json jsonObject = nlohmann::json::parse(params, nullptr, false);
2407     if (jsonObject.is_discarded()) {
2408         HILOG_ERROR("failed to parse jsonDataString: %{public}s.", params.c_str());
2409         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2410     }
2411     if (!jsonObject.contains(Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY) ||
2412         !jsonObject.at(Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY).is_string()) {
2413         HILOG_ERROR("failed to get method from params");
2414         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2415     }
2416     sptr<IAbilityConnection> formBackgroundConnection = new (std::nothrow) FormBackgroundConnection(
2417         formId, want.GetBundle(), want.GetElement().GetAbilityName(),
2418         jsonObject[Constants::PARAM_FORM_CALL_EVENT_METHOD_KEY].get<std::string>(), params);
2419     if (formBackgroundConnection == nullptr) {
2420         HILOG_ERROR("formBackgroundConnection is null.");
2421         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2422     }
2423 
2424     want.SetParam(Constants::PARAM_FORM_ID, formId);
2425     want.SetParam(Constants::PARAM_FORM_IDENTITY_KEY, formId);
2426     int32_t result = IN_PROCESS_CALL(FormAmsHelper::GetInstance().GetAbilityManager()->StartAbilityByCall(want,
2427         formBackgroundConnection, callerToken));
2428     if (result != ERR_OK) {
2429         HILOG_ERROR("Failed to StartAbilityByCall, result: %{public}d.", result);
2430         return result;
2431     }
2432     NotifyFormClickEvent(formId, FORM_CLICK_CALL);
2433     return ERR_OK;
2434 }
2435 
HandleUpdateFormFlag(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool flag,bool isOnlyEnableUpdate)2436 ErrCode FormMgrAdapter::HandleUpdateFormFlag(const std::vector<int64_t> &formIds,
2437     const sptr<IRemoteObject> &callerToken, bool flag, bool isOnlyEnableUpdate)
2438 {
2439     HILOG_DEBUG("called.");
2440     if (formIds.empty() || callerToken == nullptr) {
2441         HILOG_ERROR("invalid param");
2442         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2443     }
2444     std::vector<int64_t> refreshForms;
2445     int errCode = FormDataMgr::GetInstance().UpdateHostFormFlag(formIds, callerToken,
2446         flag, isOnlyEnableUpdate, refreshForms);
2447     if (errCode == ERR_OK && !refreshForms.empty()) {
2448         int32_t userId = FormUtil::GetCurrentAccountId();
2449         for (const int64_t id : refreshForms) {
2450             HILOG_DEBUG("formRecord need refresh: %{public}" PRId64 "", id);
2451             Want want;
2452             want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
2453             FormProviderMgr::GetInstance().RefreshForm(id, want, false);
2454         }
2455     }
2456     return errCode;
2457 }
2458 
2459 /**
2460  * @brief check form cached.
2461  * @param record Form information.
2462  * @return Returns true on cached, false on not.
2463  */
IsFormCached(const FormRecord record)2464 bool FormMgrAdapter::IsFormCached(const FormRecord record)
2465 {
2466     if (record.versionUpgrade) {
2467         return false;
2468     }
2469     return true;
2470 }
2471 
AcquireProviderFormInfo(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)2472 void FormMgrAdapter::AcquireProviderFormInfo(const int64_t formId, const Want &want,
2473     const sptr<IRemoteObject> &remoteObject)
2474 {
2475     HILOG_INFO("%{public}s called.", __func__);
2476     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
2477     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
2478     if (formProviderProxy == nullptr) {
2479         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2480         HILOG_ERROR("%{public}s fail, Failed to get formProviderProxy", __func__);
2481         return;
2482     }
2483     FormRecord formRecord;
2484     FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
2485     FormJsInfo formJsInfo;
2486     FormDataMgr::GetInstance().CreateFormJsInfo(formId, formRecord, formJsInfo);
2487     int error = formProviderProxy->AcquireProviderFormInfo(formJsInfo, want, FormSupplyCallback::GetInstance());
2488     if (error != ERR_OK) {
2489         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2490         HILOG_ERROR("%{public}s fail, Failed to get acquire provider form info", __func__);
2491     }
2492 }
2493 
2494 /**
2495  * @brief Notify form provider for delete form.
2496  *
2497  * @param formId The Id of the from.
2498  * @param want The want of the form.
2499  * @param remoteObject Form provider proxy object.
2500  */
NotifyFormDelete(const int64_t formId,const Want & want,const sptr<IRemoteObject> & remoteObject)2501 void FormMgrAdapter::NotifyFormDelete(const int64_t formId, const Want &want, const sptr<IRemoteObject> &remoteObject)
2502 {
2503     HILOG_INFO("%{public}s called.", __func__);
2504     auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
2505     sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
2506     if (formProviderProxy == nullptr) {
2507         HILOG_ERROR("%{public}s fail, Failed to get formProviderProxy", __func__);
2508         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2509         return;
2510     }
2511     int error = formProviderProxy->NotifyFormDelete(formId, want, FormSupplyCallback::GetInstance());
2512     if (error != ERR_OK) {
2513         HILOG_ERROR("%{public}s fail, Failed to NotifyFormDelete", __func__);
2514         FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
2515     }
2516 }
2517 
2518 /**
2519  * @brief Create eventMaps for event notify.
2520  *
2521  * @param matchedFormId The Id of the form
2522  * @param formRecord Form storage information
2523  * @param eventMaps eventMaps for event notify
2524  * @return Returns true on success, false on failure.
2525  */
CreateHandleEventMap(const int64_t matchedFormId,const FormRecord & formRecord,std::map<std::string,std::vector<int64_t>> & eventMaps)2526 bool FormMgrAdapter::CreateHandleEventMap(const int64_t matchedFormId, const FormRecord &formRecord,
2527     std::map<std::string, std::vector<int64_t>> &eventMaps)
2528 {
2529     if (!formRecord.formVisibleNotify) {
2530         HILOG_WARN("%{public}s fail, the config 'formVisibleNotify' is false, formId:%{public}" PRId64 ".",
2531             __func__, matchedFormId);
2532         return false;
2533     }
2534 
2535     std::string providerKey = formRecord.bundleName + Constants::NAME_DELIMITER + formRecord.abilityName;
2536     auto iter = eventMaps.find(providerKey);
2537     if (iter == eventMaps.end()) {
2538         std::vector<int64_t> formEventsByProvider {matchedFormId};
2539         eventMaps.insert(std::make_pair(providerKey, formEventsByProvider));
2540     } else {
2541         iter->second.emplace_back(matchedFormId);
2542     }
2543     return true;
2544 }
2545 
2546 /**
2547  * @brief Check if the form should update information to the host.
2548  *
2549  * @param matchedFormId The Id of the form
2550  * @param userId User ID.
2551  * @param callerToken Caller ability token.
2552  * @param formRecord Form storage information
2553  * @return Returns true on success, false on failure.
2554  */
isFormShouldUpdateProviderInfoToHost(const int64_t & matchedFormId,const int32_t & userId,const sptr<IRemoteObject> & callerToken,FormRecord & formRecord)2555 bool FormMgrAdapter::isFormShouldUpdateProviderInfoToHost(const int64_t &matchedFormId, const int32_t &userId,
2556     const sptr<IRemoteObject> &callerToken, FormRecord &formRecord)
2557 {
2558     if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, formRecord)) {
2559         HILOG_WARN("fail, not exist such form, formId:%{public}" PRId64 ".", matchedFormId);
2560         return false;
2561     }
2562 
2563     if (formRecord.providerUserId != userId) {
2564         HILOG_WARN("fail, not self form, formId:%{public}" PRId64 ".", matchedFormId);
2565         return false;
2566     }
2567     FormHostRecord formHostRecord;
2568     bool hasFormHostRecord = FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2569     if (!(hasFormHostRecord && formHostRecord.Contains(matchedFormId))) {
2570         HILOG_WARN("fail, form is not belong to self, formId:%{public}" PRId64 ".", matchedFormId);
2571         return false;
2572     }
2573     return true;
2574 }
2575 
2576 /**
2577  * @brief Update provider info to host
2578  *
2579  * @param matchedFormId The Id of the form
2580  * @param userId User ID.
2581  * @param callerToken Caller ability token.
2582  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
2583  * @param formRecord Form storage information
2584  * @return Returns true on success, false on failure.
2585  */
UpdateProviderInfoToHost(const int64_t & matchedFormId,const int32_t & userId,const sptr<IRemoteObject> & callerToken,const int32_t & formVisibleType,FormRecord & formRecord)2586 bool FormMgrAdapter::UpdateProviderInfoToHost(const int64_t &matchedFormId, const int32_t &userId,
2587     const sptr<IRemoteObject> &callerToken, const int32_t &formVisibleType, FormRecord &formRecord)
2588 {
2589     formRecord.formVisibleNotifyState = formVisibleType;
2590     formRecord.isNeedNotify = true;
2591     if (!FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, formRecord)) {
2592         HILOG_WARN("fail, set formVisibleNotifyState error, formId:%{public}" PRId64 ".",
2593             matchedFormId);
2594         return false;
2595     }
2596 
2597     HILOG_INFO("formId:%{public}" PRId64 ", needRefresh: %{public}d, formVisibleType: %{public}d,"
2598         "isTimerRefresh: %{public}d.", matchedFormId, formRecord.needRefresh,
2599         static_cast<int32_t>(formVisibleType), formRecord.isTimerRefresh);
2600     // If the form need refresh flag is true and form visibleType is FORM_VISIBLE, refresh the form host.
2601     if (formRecord.needRefresh && formVisibleType == Constants::FORM_VISIBLE) {
2602         if (formRecord.isTimerRefresh) {
2603             Want want;
2604             want.SetParam(Constants::KEY_IS_TIMER, true);
2605             want.SetParam(Constants::KEY_TIMER_REFRESH, true);
2606             want.SetParam(Constants::PARAM_FORM_USER_ID, userId);
2607             FormProviderMgr::GetInstance().RefreshForm(formRecord.formId, want, false);
2608         } else {
2609             std::string cacheData;
2610             std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
2611             FormHostRecord formHostRecord;
2612             (void)FormDataMgr::GetInstance().GetMatchedHostClient(callerToken, formHostRecord);
2613             // If the form has business cache, refresh the form host.
2614             if (FormCacheMgr::GetInstance().GetData(matchedFormId, cacheData, imageDataMap)) {
2615                 formRecord.formProviderInfo.SetFormDataString(cacheData);
2616                 formRecord.formProviderInfo.SetImageDataMap(imageDataMap);
2617                 formHostRecord.OnUpdate(matchedFormId, formRecord);
2618             }
2619         }
2620     }
2621     return true;
2622 }
2623 /**
2624  * @brief If the form provider is system app and the config item 'formVisibleNotify' is true,
2625  *        notify the form provider that the current form is visible.
2626  * @param iBundleMgr BundleManagerProxy
2627  * @param bundleName BundleName
2628  * @param userId UserId
2629  * @return Returns true if the form provider is system app, false if not.
2630  */
CheckIsSystemAppByBundleName(const sptr<IBundleMgr> & iBundleMgr,const int32_t & userId,const std::string & bundleName)2631 bool FormMgrAdapter::CheckIsSystemAppByBundleName(const sptr<IBundleMgr> &iBundleMgr,
2632     const int32_t &userId, const std::string &bundleName)
2633 {
2634     AppExecFwk::ApplicationInfo appInfo;
2635     if (IN_PROCESS_CALL(iBundleMgr->GetApplicationInfoV9(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT,
2636         userId, appInfo)) != ERR_OK) {
2637         HILOG_ERROR("failed to get application info");
2638         return false;
2639     }
2640 
2641     HILOG_DEBUG("bundle:%{public}s. isSystemApp=%{public}d", bundleName.c_str(), appInfo.isSystemApp);
2642     return appInfo.isSystemApp;
2643 }
2644 
2645 /**
2646  * @brief Check whether the caller for publish form is in the whitelist.
2647  * @param iBundleMgr BundleManagerProxy
2648  * @param bundleName BundleName of caller
2649  * @param want want of target form
2650  * @return Returns ERR_OK if the caller is in the whitelist.
2651  */
IsValidPublishEvent(const sptr<IBundleMgr> & iBundleMgr,const std::string & bundleName,const Want & want)2652 bool FormMgrAdapter::IsValidPublishEvent(const sptr<IBundleMgr> &iBundleMgr,
2653     const std::string &bundleName, const Want &want)
2654 {
2655     int32_t userId = FormUtil::GetCurrentAccountId();
2656     if (!CheckIsSystemAppByBundleName(iBundleMgr, userId, bundleName)) {
2657         HILOG_ERROR("Only system app can request publish form.");
2658         return false;
2659     }
2660     std::vector<Want> wants{want};
2661     return IsErmsSupportPublishForm(bundleName, wants);
2662 }
2663 
2664 /**
2665  * @brief if the ability have permission for keeping background running is true,
2666  * @param iBundleMgr BundleManagerProxy
2667  * @param bundleName BundleName
2668  * @return Returns true if the ability have permission for keeping background running, false if not.
2669  */
CheckKeepBackgroundRunningPermission(const sptr<IBundleMgr> & iBundleMgr,const std::string & bundleName)2670 bool FormMgrAdapter::CheckKeepBackgroundRunningPermission(const sptr<IBundleMgr> &iBundleMgr,
2671     const std::string &bundleName)
2672 {
2673     BundleInfo bundleInfo;
2674     if (FormBmsHelper::GetInstance().GetBundleInfoWithPermission(bundleName,
2675         FormUtil::GetCurrentAccountId(), bundleInfo)) {
2676         HILOG_DEBUG("%{public}s, get bundleInfo success", __func__);
2677         auto item = find(bundleInfo.reqPermissions.begin(), bundleInfo.reqPermissions.end(),
2678             Constants::PERMISSION_KEEP_BACKGROUND_RUNNING);
2679         if (item == bundleInfo.reqPermissions.end()) {
2680             return false;
2681         }
2682     } else {
2683         HILOG_WARN("%{public}s fail, can not get bundleInfo's uid", __func__);
2684         return false;
2685     }
2686 
2687     return true;
2688 }
2689 /**
2690  * @brief Get current user ID.
2691  * @param callingUid calling Uid.
2692  * @return Returns user ID.
2693  */
GetCurrentUserId(const int callingUid)2694 int32_t FormMgrAdapter::GetCurrentUserId(const int callingUid)
2695 {
2696     // get current userId
2697     int32_t userId = callingUid / CALLING_UID_TRANSFORM_DIVISOR;
2698     AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(callingUid, userId);
2699     return userId;
2700 }
2701 
2702 /**
2703  * @brief Delete the invalid forms.
2704  * @param formIds Indicates the ID of the valid forms.
2705  * @param callerToken Caller ability token.
2706  * @param numFormsDeleted Returns the number of the deleted forms.
2707  * @return Returns ERR_OK on success, others on failure.
2708  */
DeleteInvalidForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,int32_t & numFormsDeleted)2709 int FormMgrAdapter::DeleteInvalidForms(const std::vector<int64_t> &formIds,
2710     const sptr<IRemoteObject> &callerToken, int32_t &numFormsDeleted)
2711 {
2712     HILOG_INFO("%{public}s called.", __func__);
2713     if (callerToken == nullptr) {
2714         HILOG_ERROR("%{public}s, callerToken is nullptr", __func__);
2715         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2716     }
2717 
2718     std::set<int64_t> matchedFormIds {};
2719     for (int64_t formId : formIds) {
2720         int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
2721         matchedFormIds.emplace(matchedFormId);
2722         HILOG_INFO("valid formId, matchedFormIds: %{public}" PRId64 "", formId);
2723     }
2724     std::map<int64_t, bool> removedFormsMap {};
2725     int32_t callingUid = IPCSkeleton::GetCallingUid();
2726     int32_t userId = FormUtil::GetCurrentAccountId();
2727 
2728     // delete invalid DB form record
2729     FormDbCache::GetInstance().DeleteInvalidDBForms(userId, callingUid, matchedFormIds, removedFormsMap);
2730     // delete invalid temp form record
2731     FormDataMgr::GetInstance().DeleteInvalidTempForms(userId, callingUid, matchedFormIds, removedFormsMap);
2732 
2733     if (!removedFormsMap.empty()) {
2734         FormDataMgr::GetInstance().ClearHostDataByInvalidForms(callingUid, removedFormsMap);
2735         // delete forms timer
2736         for (const auto &removedForm : removedFormsMap) {
2737             if (removedForm.second) {
2738                 FormTimerMgr::GetInstance().RemoveFormTimer(removedForm.first);
2739             }
2740         }
2741     }
2742 
2743     std::string bundleName;
2744     if (GetBundleName(bundleName)) {
2745         // delete invalid publish form data
2746         FormDataMgr::GetInstance().DeleteInvalidPublishForms(userId, bundleName, matchedFormIds);
2747     }
2748 
2749     numFormsDeleted = static_cast<int32_t>(removedFormsMap.size());
2750     HILOG_INFO("%{public}s done, %{public}d forms deleted.", __func__, numFormsDeleted);
2751     return ERR_OK;
2752 }
2753 
2754 /**
2755  * @brief AcquireFormState want check.
2756  * @param bundleName The bundle name of the form.
2757  * @param abilityName The ability name of the form.
2758  * @param want The want of the form.
2759  * @param provider the provider info.
2760  * @return Returns ERR_OK on success, others on failure.
2761  */
AcquireFormStateCheck(const std::string & bundleName,const std::string & abilityName,const Want & want,std::string & provider)2762 ErrCode FormMgrAdapter::AcquireFormStateCheck(const std::string &bundleName,
2763     const std::string &abilityName, const Want &want, std::string &provider)
2764 {
2765     if (bundleName.empty() || abilityName.empty()) {
2766         HILOG_ERROR("%{public}s error, bundleName or abilityName is empty.", __func__);
2767         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2768     }
2769 
2770     std::string moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
2771     std::string formName = want.GetStringParam(AppExecFwk::Constants::PARAM_FORM_NAME_KEY);
2772     int32_t dimensionId = want.GetIntParam(AppExecFwk::Constants::PARAM_FORM_DIMENSION_KEY, 1);
2773 
2774     if (moduleName.empty() || formName.empty()) {
2775         HILOG_ERROR("%{public}s error, moduleName or formName is empty.", __func__);
2776         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2777     }
2778 
2779     std::vector<FormInfo> formInfos {};
2780     ErrCode errCode = FormInfoMgr::GetInstance()
2781         .GetFormsInfoByModuleWithoutCheck(want.GetElement().GetBundleName(), moduleName, formInfos);
2782     if (errCode != ERR_OK) {
2783         HILOG_ERROR("%{public}s error, failed to get forms info.", __func__);
2784         return errCode;
2785     }
2786 
2787     bool found = false;
2788     for (auto &formInfo : formInfos) {
2789         if ((formInfo.abilityName == abilityName) && (formInfo.name == formName) &&
2790             (IsDimensionValid(formInfo, dimensionId))) {
2791             found = true;
2792             HILOG_INFO("%{public}s form info found.", __func__);
2793             break;
2794         }
2795     }
2796     if (!found) {
2797         HILOG_INFO("failed to find match form info.");
2798         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2799     }
2800 
2801     int32_t callingUid = IPCSkeleton::GetCallingUid();
2802     const std::string doubleColon = "::";
2803     provider.append(bundleName).append(doubleColon).append(abilityName).append(doubleColon)
2804         .append(moduleName).append(doubleColon).append(formName).append(doubleColon)
2805         .append(std::to_string(dimensionId)).append(doubleColon).append(std::to_string(callingUid));
2806     return ERR_OK;
2807 }
2808 
2809 /**
2810  * @brief Acquire form state info by passing a set of parameters (using Want) to the form provider.
2811  * @param want Indicates a set of parameters to be transparently passed to the form provider.
2812  * @param callerToken Caller ability token.
2813  * @param stateInfo Returns the form's state info of the specify.
2814  * @return Returns ERR_OK on success, others on failure.
2815  */
AcquireFormState(const Want & want,const sptr<IRemoteObject> & callerToken,FormStateInfo & stateInfo)2816 int FormMgrAdapter::AcquireFormState(const Want &want, const sptr<IRemoteObject> &callerToken,
2817     FormStateInfo &stateInfo)
2818 {
2819     if (callerToken == nullptr) {
2820         HILOG_ERROR("%{public}s, callerToken is nullptr", __func__);
2821         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
2822     }
2823     std::string bundleName = want.GetElement().GetBundleName();
2824     std::string abilityName = want.GetElement().GetAbilityName();
2825 
2826     std::string provider;
2827     ErrCode errCode = AcquireFormStateCheck(bundleName, abilityName, want, provider);
2828     if (errCode != ERR_OK) {
2829         return errCode;
2830     }
2831 
2832     int32_t callingUid = IPCSkeleton::GetCallingUid();
2833     FormItemInfo info;
2834     FormDataMgr::GetInstance().CreateFormStateRecord(provider, info, callerToken, callingUid);
2835 
2836     HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s", bundleName.c_str(), abilityName.c_str());
2837     sptr<IAbilityConnection> connection =
2838         new (std::nothrow) FormAcquireStateConnection(bundleName, abilityName, want, provider);
2839     if (connection == nullptr) {
2840         HILOG_ERROR("failed to create FormAcquireStateConnection.");
2841         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2842     }
2843     Want targetWant;
2844     targetWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
2845     targetWant.SetElementName(bundleName, abilityName);
2846     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(targetWant, connection);
2847     if (errorCode != ERR_OK) {
2848         HILOG_ERROR("%{public}s, ConnectServiceAbility failed.", __func__);
2849         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2850     }
2851     stateInfo.state = FormState::DEFAULT;
2852     return ERR_OK;
2853 }
2854 
AcquireFormData(int64_t formId,int64_t requestCode,const sptr<IRemoteObject> & callerToken,AAFwk::WantParams & formData)2855 int FormMgrAdapter::AcquireFormData(int64_t formId, int64_t requestCode, const sptr<IRemoteObject> &callerToken,
2856     AAFwk::WantParams &formData)
2857 {
2858     FormRecord formRecord;
2859     bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
2860     if (!isFormRecExist) {
2861         HILOG_ERROR("form info get formRecord failed.");
2862         return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
2863     }
2864     std::string bundleName = formRecord.bundleName;
2865     std::string abilityName = formRecord.abilityName;
2866 
2867     HILOG_DEBUG("bundleName:%{public}s, abilityName:%{public}s", bundleName.c_str(), abilityName.c_str());
2868     int32_t callingUid = IPCSkeleton::GetCallingUid();
2869     FormItemInfo info;
2870     FormDataMgr::GetInstance().CreateFormAcquireDataRecord(requestCode, info, callerToken, callingUid);
2871     sptr<IAbilityConnection> connection =
2872         new (std::nothrow) FormAcquireDataConnection(formId, bundleName, abilityName, requestCode);
2873     if (connection == nullptr) {
2874         HILOG_ERROR("failed to create FormAcquireDataConnection.");
2875         return ERR_APPEXECFWK_FORM_COMMON_CODE;
2876     }
2877     Want targetWant;
2878     targetWant.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
2879     targetWant.SetElementName(bundleName, abilityName);
2880     ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(targetWant, connection);
2881     if (errorCode != ERR_OK) {
2882         HILOG_ERROR("ConnectServiceAbility failed.");
2883         return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
2884     }
2885     return ERR_OK;
2886 }
2887 
2888 /**
2889  * @brief Notify the form is visible or not.
2890  * @param formIds Indicates the ID of the forms.
2891  * @param isVisible Visible or not.
2892  * @param callerToken Host client.
2893  * @return Returns ERR_OK on success, others on failure.
2894  */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)2895 int FormMgrAdapter::NotifyFormsVisible(const std::vector<int64_t> &formIds,
2896     bool isVisible, const sptr<IRemoteObject> &callerToken)
2897 {
2898     HILOG_INFO("%{public}s, isVisible: %{public}d.", __func__, isVisible);
2899     return FormDataMgr::GetInstance().NotifyFormsVisible(formIds, isVisible, callerToken);
2900 }
2901 
2902 /**
2903  * @brief Notify the form is enable to be updated or not.
2904  * @param formIds Indicates the ID of the forms.
2905  * @param isEnableUpdate enable update or not.
2906  * @param callerToken Host client.
2907  * @return Returns ERR_OK on success, others on failure.
2908  */
NotifyFormsEnableUpdate(const std::vector<int64_t> & formIds,bool isEnableUpdate,const sptr<IRemoteObject> & callerToken)2909 int FormMgrAdapter::NotifyFormsEnableUpdate(const std::vector<int64_t> &formIds,
2910     bool isEnableUpdate, const sptr<IRemoteObject> &callerToken)
2911 {
2912     HILOG_INFO("%{public}s, isEnableUpdate: %{public}d.", __func__, isEnableUpdate);
2913     return HandleUpdateFormFlag(formIds, callerToken, isEnableUpdate, true);
2914 }
2915 
2916 /**
2917  * @brief Get All FormsInfo.
2918  * @param formInfos Return the forms' information of all forms provided.
2919  * @return Returns ERR_OK on success, others on failure.
2920  */
GetAllFormsInfo(std::vector<FormInfo> & formInfos)2921 int FormMgrAdapter::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
2922 {
2923     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2924     return FormInfoMgr::GetInstance().GetAllFormsInfo(formInfos);
2925 }
2926 
2927 /**
2928  * @brief Get forms info by bundle name .
2929  * @param bundleName Application name.
2930  * @param formInfos Return the forms' information of the specify application name.
2931  * @return Returns ERR_OK on success, others on failure.
2932  */
GetFormsInfoByApp(const std::string & bundleName,std::vector<FormInfo> & formInfos)2933 int FormMgrAdapter::GetFormsInfoByApp(const std::string &bundleName, std::vector<FormInfo> &formInfos)
2934 {
2935     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2936     return FormInfoMgr::GetInstance().GetFormsInfoByBundle(bundleName, formInfos);
2937 }
2938 
2939 /**
2940  * @brief Get forms info by bundle name and module name.
2941  * @param bundleName bundle name.
2942  * @param moduleName Module name of hap.
2943  * @param formInfos Return the forms' information of the specify bundle name and module name.
2944  * @return Returns ERR_OK on success, others on failure.
2945  */
GetFormsInfoByModule(const std::string & bundleName,const std::string & moduleName,std::vector<FormInfo> & formInfos)2946 int FormMgrAdapter::GetFormsInfoByModule(const std::string &bundleName,
2947     const std::string &moduleName, std::vector<FormInfo> &formInfos)
2948 {
2949     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
2950     return FormInfoMgr::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
2951 }
2952 
IsRequestPublishFormSupported()2953 bool FormMgrAdapter::IsRequestPublishFormSupported()
2954 {
2955     /* Query the highest priority ability or extension ability for publishing form */
2956     std::string bundleName;
2957     if (!GetBundleName(bundleName)) {
2958         HILOG_ERROR("%{public}s failed to get BundleName", __func__);
2959         return false;
2960     }
2961 
2962     std::vector<Want> wants;
2963     bool isSupport = IsErmsSupportPublishForm(bundleName, wants);
2964     if (!isSupport) {
2965         HILOG_ERROR("Erms is not support to publish forms");
2966         return false;
2967     }
2968 
2969     if (formPublishInterceptor_ != nullptr) {
2970         HILOG_DEBUG("query publish form has publish interceptor, return true.");
2971         return true;
2972     }
2973 
2974     auto action = Constants::FORM_PUBLISH_ACTION;
2975     auto userId = GetCurrentUserId(IPCSkeleton::GetCallingUid());
2976     AppExecFwk::AbilityInfo abilityInfo;
2977     AppExecFwk::ExtensionAbilityInfo extensionAbilityInfo;
2978     if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(action, userId, abilityInfo, extensionAbilityInfo)) {
2979         HILOG_ERROR("Failed to ImplicitQueryInfoByPriority for publishing form");
2980         return false;
2981     }
2982 
2983     if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
2984         HILOG_ERROR("Query highest priority ability failed, no form host ability found.");
2985         return false;
2986     }
2987     return true;
2988 }
2989 
2990 /**
2991  * @brief check if the form host is system app
2992  * @param formRecord Form storage information
2993  * @return Returns true if the form host is system app, false if not.
2994  */
checkFormHostHasSaUid(const FormRecord & formRecord)2995 bool FormMgrAdapter::checkFormHostHasSaUid(const FormRecord &formRecord)
2996 {
2997     return std::find(formRecord.formUserUids.begin(), formRecord.formUserUids.end(),
2998         SYSTEM_UID) != formRecord.formUserUids.end();
2999 }
3000 
RegisterFormAddObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)3001 ErrCode FormMgrAdapter::RegisterFormAddObserverByBundle(const std::string bundleName,
3002     const sptr<IRemoteObject> &callerToken)
3003 {
3004     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3005     return FormObserverRecord::GetInstance().SetFormAddObserver(bundleName, callerToken);
3006 }
3007 
RegisterFormRemoveObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)3008 ErrCode FormMgrAdapter::RegisterFormRemoveObserverByBundle(const std::string bundleName,
3009     const sptr<IRemoteObject> &callerToken)
3010 {
3011     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3012     return FormObserverRecord::GetInstance().SetFormRemoveObserver(bundleName, callerToken);
3013 }
3014 
GetFormsCount(bool isTempFormFlag,int32_t & formCount)3015 int32_t FormMgrAdapter::GetFormsCount(bool isTempFormFlag, int32_t &formCount)
3016 {
3017     HILOG_DEBUG("%{public}s, isTempFormFlag: %{public}d.", __func__, isTempFormFlag);
3018     if (isTempFormFlag) {
3019         return FormDataMgr::GetInstance().GetTempFormsCount(formCount);
3020     }
3021     return FormDataMgr::GetInstance().GetCastFormsCount(formCount);
3022 }
3023 
GetHostFormsCount(std::string & bundleName,int32_t & formCount)3024 int32_t FormMgrAdapter::GetHostFormsCount(std::string &bundleName, int32_t &formCount)
3025 {
3026     HILOG_DEBUG("%{public}s, bundleName: %{public}s.", __func__, bundleName.c_str());
3027     return FormDataMgr::GetInstance().GetHostFormsCount(bundleName, formCount);
3028 }
3029 
GetRunningFormInfos(bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)3030 ErrCode FormMgrAdapter::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
3031 {
3032     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3033     return FormDataMgr::GetInstance().GetRunningFormInfos(isUnusedIncluded, runningFormInfos);
3034 }
3035 
GetRunningFormInfosByBundleName(const std::string & bundleName,bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)3036 ErrCode FormMgrAdapter::GetRunningFormInfosByBundleName(
3037     const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
3038 {
3039     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
3040     return FormDataMgr::GetInstance().GetRunningFormInfosByBundleName(bundleName, isUnusedIncluded, runningFormInfos);
3041 }
3042 
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)3043 ErrCode FormMgrAdapter::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
3044     std::vector<FormInstance> &formInstances)
3045 {
3046     return FormDataMgr::GetInstance().GetFormInstancesByFilter(formInstancesFilter, formInstances);
3047 }
3048 
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)3049 ErrCode FormMgrAdapter::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
3050 {
3051     return FormDataMgr::GetInstance().GetFormInstanceById(formId, formInstance);
3052 }
3053 
GetFormInstanceById(const int64_t formId,bool isUnusedIncluded,FormInstance & formInstance)3054 ErrCode FormMgrAdapter::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
3055 {
3056     return FormDataMgr::GetInstance().GetFormInstanceById(formId, isUnusedIncluded, formInstance);
3057 }
3058 
RegisterAddObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)3059 ErrCode FormMgrAdapter::RegisterAddObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
3060 {
3061     HILOG_DEBUG("called.");
3062     std::lock_guard<std::mutex> lock(formObserversMutex_);
3063     auto formObserver = formObservers_.find(bundleName);
3064     if (formObserver == formObservers_.end()) {
3065         HILOG_DEBUG("%{public}s start register.", bundleName.c_str());
3066         std::vector<sptr<IRemoteObject>> remoteObjects;
3067         remoteObjects.emplace_back(callerToken);
3068         formObservers_.emplace(bundleName, remoteObjects);
3069     } else {
3070         auto &remoteObjects = formObserver->second;
3071         auto itr = std::find(remoteObjects.begin(), remoteObjects.end(), callerToken);
3072         if (itr != remoteObjects.end()) {
3073             HILOG_ERROR("callback is already exist");
3074             return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
3075         }
3076         HILOG_DEBUG("%{public}s add register.", bundleName.c_str());
3077         remoteObjects.emplace_back(callerToken);
3078     }
3079     SetDeathRecipient(callerToken, new (std::nothrow) FormMgrAdapter::ClientDeathRecipient());
3080     HILOG_DEBUG("success.");
3081     return ERR_OK;
3082 }
3083 
RegisterRemoveObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)3084 ErrCode FormMgrAdapter::RegisterRemoveObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
3085 {
3086     HILOG_DEBUG("%{public}s called.", __func__);
3087     std::lock_guard<std::mutex> lock(formObserversMutex_);
3088     auto formObserver = formObservers_.find(bundleName);
3089     if (formObserver == formObservers_.end()) {
3090         HILOG_ERROR("bundleName is not exist");
3091         return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
3092     } else {
3093         auto &remoteObjects = formObserver->second;
3094         for (auto itr = remoteObjects.begin(); itr != remoteObjects.end();) {
3095             if (*itr == callerToken) {
3096                 remoteObjects.erase(itr);
3097                 SetDeathRecipient(callerToken, new (std::nothrow) FormMgrAdapter::ClientDeathRecipient());
3098                 HILOG_DEBUG("success.");
3099                 return ERR_OK;
3100             }
3101             ++itr;
3102         }
3103     }
3104     HILOG_ERROR("callback is not exist");
3105     return ERR_APPEXECFWK_FORM_GET_BUNDLE_FAILED;
3106 }
3107 
RegisterFormRouterProxy(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken)3108 ErrCode FormMgrAdapter::RegisterFormRouterProxy(
3109     const std::vector<int64_t>& formIds, const sptr<IRemoteObject>& callerToken)
3110 {
3111     HILOG_DEBUG("Called.");
3112     if (callerToken == nullptr) {
3113         HILOG_ERROR("CallerToken is nullptr.");
3114         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3115     }
3116 
3117     std::vector<int64_t> matchedFormIds {};
3118     std::vector<int64_t> hostOwnFormIds {};
3119     auto uid = IPCSkeleton::GetCallingUid();
3120     FormRecord record;
3121     for (int64_t formId : formIds) {
3122         if (formId <= 0) {
3123             HILOG_WARN("FormId %{public}" PRId64 " is less than 0", formId);
3124             continue;
3125         }
3126         auto matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3127         if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3128             HILOG_ERROR("No matching formRecord was found for the formId: %{public}" PRId64 "", formId);
3129             continue;
3130         }
3131         matchedFormIds.push_back(formId);
3132 
3133         if (record.providerUserId != FormUtil::GetCurrentAccountId()) {
3134             // Checks for cross-user operations.
3135             HILOG_ERROR("The formId: %{public}" PRId64
3136                         " corresponds to a card that is not for the currently active user.",
3137                 formId);
3138             continue;
3139         } else if (std::find(record.formUserUids.begin(),
3140             record.formUserUids.end(), uid) == record.formUserUids.end()) {
3141             // Checks for cross-host operations
3142             HILOG_ERROR("The formId:%{public}" PRId64 " owned by other formHost", formId);
3143             continue;
3144         } else {
3145             HILOG_DEBUG("The setup was sucessful, matchedFormIds: %{public}" PRId64 "", formId);
3146             hostOwnFormIds.push_back(formId);
3147         }
3148     }
3149     if (matchedFormIds.empty()) {
3150         HILOG_ERROR("All formIds is Invalid!");
3151         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3152     }
3153 
3154     if (hostOwnFormIds.empty()) {
3155         HILOG_ERROR("All formIds was not setted by self!");
3156         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
3157     }
3158 
3159     return FormRouterProxyMgr::GetInstance().SetFormRouterProxy(hostOwnFormIds, callerToken);
3160 }
3161 
UnregisterFormRouterProxy(const std::vector<int64_t> & formIds)3162 ErrCode FormMgrAdapter::UnregisterFormRouterProxy(const std::vector<int64_t>& formIds)
3163 {
3164     HILOG_DEBUG("Called.");
3165     std::vector<int64_t> matchedFormIds {};
3166     std::vector<int64_t> hostOwnFormIds {};
3167     auto uid = IPCSkeleton::GetCallingUid();
3168     FormRecord record;
3169     for (int64_t formId : formIds) {
3170         if (formId <= 0) {
3171             HILOG_WARN("FormId %{public}" PRId64 " is less than 0", formId);
3172             continue;
3173         }
3174         auto matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3175         if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3176             HILOG_ERROR("No matching formRecord was found for the formId: %{public}" PRId64 "", formId);
3177             continue;
3178         }
3179         matchedFormIds.push_back(formId);
3180 
3181         if (record.providerUserId != FormUtil::GetCurrentAccountId()) {
3182             // Checks for cross-user operations.
3183             HILOG_ERROR("The formId: %{public}" PRId64
3184                         " corresponds to a card that is not for the currently active user.",
3185                 formId);
3186             continue;
3187         } else if (std::find(record.formUserUids.begin(),
3188             record.formUserUids.end(), uid) == record.formUserUids.end()) {
3189             // Checks for cross-host operations
3190             HILOG_ERROR("The formId:%{public}" PRId64 " owned by other formHost", formId);
3191             continue;
3192         } else {
3193             HILOG_DEBUG("The setup was sucessful, matchedFormIds: %{public}" PRId64 "", formId);
3194             hostOwnFormIds.push_back(formId);
3195         }
3196     }
3197     if (matchedFormIds.empty()) {
3198         HILOG_ERROR("All formIds is Invalid!");
3199         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3200     }
3201 
3202     if (hostOwnFormIds.empty()) {
3203         HILOG_ERROR("All formIds was not setted by self!");
3204         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
3205     }
3206 
3207     return FormRouterProxyMgr::GetInstance().RemoveFormRouterProxy(hostOwnFormIds);
3208 }
3209 
SetDeathRecipient(const sptr<IRemoteObject> & callerToken,const sptr<IRemoteObject::DeathRecipient> & deathRecipient)3210 void FormMgrAdapter::SetDeathRecipient(const sptr<IRemoteObject> &callerToken,
3211     const sptr<IRemoteObject::DeathRecipient> &deathRecipient)
3212 {
3213     HILOG_DEBUG("called.");
3214     if (callerToken == nullptr || deathRecipient == nullptr) {
3215         HILOG_ERROR("The callerToken or the deathRecipient is empty");
3216         return;
3217     }
3218     std::lock_guard<std::mutex> lock(deathRecipientsMutex_);
3219     auto iter = deathRecipients_.find(callerToken);
3220     if (iter == deathRecipients_.end()) {
3221         deathRecipients_.emplace(callerToken, deathRecipient);
3222         callerToken->AddDeathRecipient(deathRecipient);
3223     } else {
3224         HILOG_DEBUG("The deathRecipient has been added.");
3225     }
3226 }
3227 
CleanResource(const wptr<IRemoteObject> & remote)3228 void FormMgrAdapter::CleanResource(const wptr<IRemoteObject> &remote)
3229 {
3230     HILOG_DEBUG("called.");
3231 
3232     // Clean the formObservers_.
3233     auto object = remote.promote();
3234     if (object == nullptr) {
3235         HILOG_ERROR("remote object is nullptr");
3236         return;
3237     }
3238     {
3239         std::lock_guard<std::mutex> lock(formObserversMutex_);
3240         for (auto it = formObservers_.begin(); it != formObservers_.end();) {
3241             auto &remoteObjects = it->second;
3242             for (auto iter = remoteObjects.begin(); iter != remoteObjects.end();) {
3243                 if (*iter == object) {
3244                     iter = remoteObjects.erase(iter);
3245                     continue;
3246                 }
3247                 ++iter;
3248             }
3249             if (remoteObjects.empty()) {
3250                 it = formObservers_.erase(it);
3251                 continue;
3252             }
3253             ++it;
3254         }
3255     }
3256     std::lock_guard<std::mutex> deathLock(deathRecipientsMutex_);
3257     auto iter = deathRecipients_.find(object);
3258     if (iter != deathRecipients_.end()) {
3259         auto deathRecipient = iter->second;
3260         deathRecipients_.erase(iter);
3261         object->RemoveDeathRecipient(deathRecipient);
3262     }
3263 }
3264 
OnRemoteDied(const wptr<IRemoteObject> & remote)3265 void FormMgrAdapter::ClientDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
3266 {
3267     HILOG_DEBUG("remote died");
3268     FormMgrAdapter::GetInstance().CleanResource(remote);
3269 }
3270 
RegisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)3271 int32_t FormMgrAdapter::RegisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
3272 {
3273     HILOG_DEBUG("called.");
3274     if (interceptorCallback == nullptr) {
3275         HILOG_ERROR("interceptorCallback is null.");
3276         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3277     }
3278     auto interceptor = iface_cast<AppExecFwk::IFormPublishInterceptor>(interceptorCallback);
3279     if (interceptor == nullptr) {
3280         HILOG_ERROR("RegisterPublishFormInterceptor failed.");
3281         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3282     }
3283     formPublishInterceptor_ = interceptor;
3284     return ERR_OK;
3285 }
3286 
UnregisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)3287 int32_t FormMgrAdapter::UnregisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
3288 {
3289     HILOG_DEBUG("called.");
3290     if (interceptorCallback == nullptr) {
3291         HILOG_ERROR("interceptorCallback is null.");
3292         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3293     }
3294     auto interceptor = iface_cast<AppExecFwk::IFormPublishInterceptor>(interceptorCallback);
3295     if (interceptor == nullptr) {
3296         HILOG_ERROR("UnregisterPublishFormInterceptor failed.");
3297         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3298     }
3299     if (formPublishInterceptor_ == interceptor) {
3300         HILOG_DEBUG("UnregisterPublishFormInterceptor success.");
3301         formPublishInterceptor_ = nullptr;
3302         return ERR_OK;
3303     }
3304     HILOG_ERROR("the param not equal to the current interceptor.");
3305     return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3306 }
3307 
RegisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)3308 ErrCode FormMgrAdapter::RegisterClickEventObserver(
3309     const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
3310 {
3311     HILOG_DEBUG("Called.");
3312     if (observer == nullptr) {
3313         HILOG_ERROR("Caller token is null.");
3314         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3315     }
3316     return FormObserverRecord::GetInstance().SetFormEventObserver(bundleName, formEventType, observer);
3317 }
3318 
UnregisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)3319 ErrCode FormMgrAdapter::UnregisterClickEventObserver(
3320     const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
3321 {
3322     HILOG_DEBUG("Called.");
3323     if (observer == nullptr) {
3324         HILOG_ERROR("Caller token is null.");
3325         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3326     }
3327     return FormObserverRecord::GetInstance().RemoveFormEventObserver(bundleName, formEventType, observer);
3328 }
3329 
NotifyFormClickEvent(int64_t formId,const std::string & formClickType)3330 void FormMgrAdapter::NotifyFormClickEvent(int64_t formId, const std::string &formClickType)
3331 {
3332     HILOG_DEBUG("Called.");
3333     int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3334 
3335     RunningFormInfo runningFormInfo;
3336     auto ref = FormDataMgr::GetInstance().GetRunningFormInfosByFormId(matchedFormId, runningFormInfo);
3337     if (ref != ERR_OK) {
3338         HILOG_ERROR("Get Running info error.");
3339         return;
3340     }
3341 
3342     FormObserverRecord::GetInstance().HandleFormEvent(runningFormInfo.hostBundleName, formClickType, runningFormInfo);
3343     // The application layer can pass in an empty Bundlename,
3344     // Which represents listening to a certain event of all applications
3345     FormObserverRecord::GetInstance().HandleFormEvent(EMPTY_BUNDLE, formClickType, runningFormInfo);
3346 }
3347 
GetValidFormUpdateDuration(const int64_t formId,int64_t & updateDuration) const3348 bool FormMgrAdapter::GetValidFormUpdateDuration(const int64_t formId, int64_t &updateDuration) const
3349 {
3350     HILOG_DEBUG("Called.");
3351     FormRecord formRecord;
3352     if (!FormDataMgr::GetInstance().GetFormRecord(formId, formRecord)) {
3353         HILOG_ERROR("Error, not exist such form:%{public}" PRId64 ".", formId);
3354         return false;
3355     }
3356 
3357     ApplicationInfo appInfo;
3358     if (FormBmsHelper::GetInstance().GetApplicationInfo(formRecord.bundleName, FormUtil::GetCurrentAccountId(),
3359         appInfo) != ERR_OK) {
3360         HILOG_ERROR("Get app info failed.");
3361         return false;
3362     }
3363 
3364     if (appInfo.apiTargetVersion < API_11) {
3365         HILOG_INFO("API version is lower than 11, uses local configuration.");
3366         updateDuration = formRecord.updateDuration;
3367         return true;
3368     }
3369     HILOG_INFO("Get form cloud update duration from cache.");
3370     int duration = FormDataMgr::GetInstance().GetFormCloudUpdateDuration(formRecord.bundleName);
3371     if (duration == 0) {
3372         HILOG_INFO("No valid cloud update duration, uses local configuration.");
3373         updateDuration = formRecord.updateDuration;
3374         return true;
3375     }
3376     int64_t cloudsDuration = duration * Constants::TIME_CONVERSION;
3377     updateDuration = std::max(formRecord.updateDuration, cloudsDuration);
3378     return true;
3379 }
3380 
UpdateFormCloudUpdateDuration(const std::string & bundleName)3381 void FormMgrAdapter::UpdateFormCloudUpdateDuration(const std::string &bundleName)
3382 {
3383     HILOG_DEBUG("Called.");
3384     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
3385     if (iBundleMgr == nullptr) {
3386         HILOG_ERROR("Failed to get IBundleMgr.");
3387         FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3388         return;
3389     }
3390 
3391     std::string additionalInfo;
3392     if (IN_PROCESS_CALL(iBundleMgr->GetAdditionalInfo(bundleName, additionalInfo)) != ERR_OK) {
3393         HILOG_ERROR("Failed to get additionalInfo.");
3394         FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3395         return;
3396     }
3397 
3398     if (additionalInfo.empty()) {
3399         HILOG_INFO("AdditionalInfo is empty.");
3400         FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3401         return;
3402     }
3403 
3404     std::regex regex(R"(formUpdateLevel:(\d+))");
3405     std::smatch searchResult;
3406     std::string::const_iterator iterStart = additionalInfo.begin();
3407     std::string::const_iterator iterEnd = additionalInfo.end();
3408     std::vector<int> durationArray;
3409     while (std::regex_search(iterStart, iterEnd, searchResult, regex)) {
3410         iterStart = searchResult[0].second;
3411         if (searchResult[DATA_FIELD].str().length() > FORM_UPDATE_LEVEL_VALUE_MAX_LENGTH) {
3412             continue;
3413         }
3414         int val = std::stoi(searchResult[DATA_FIELD].str());
3415         if (val >= Constants::MIN_CONFIG_DURATION && val <= Constants::MAX_CONFIG_DURATION) {
3416             durationArray.emplace_back(val);
3417         }
3418     }
3419 
3420     if (durationArray.empty()) {
3421         HILOG_INFO("No valid formUpdateLevel in additionalInfo.");
3422         FormDataMgr::GetInstance().RemoveFormCloudUpdateDuration(bundleName);
3423         return;
3424     }
3425 
3426     FormDataMgr::GetInstance().UpdateFormCloudUpdateDuration(bundleName, durationArray.back());
3427 }
3428 
GetCallerType(std::string bundleName)3429 int32_t FormMgrAdapter::GetCallerType(std::string bundleName)
3430 {
3431     sptr<IBundleMgr> iBundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
3432     if (iBundleMgr == nullptr) {
3433         HILOG_ERROR("fail, failed to get IBundleMgr.");
3434         return FormErmsCallerInfo::TYPE_INVALID;
3435     }
3436 
3437     AppExecFwk::ApplicationInfo callerAppInfo;
3438     auto flag = AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO;
3439     auto userId = GetCurrentUserId(IPCSkeleton::GetCallingUid());
3440     bool getCallerResult = IN_PROCESS_CALL(iBundleMgr->GetApplicationInfo(bundleName, flag, userId, callerAppInfo));
3441     if (!getCallerResult) {
3442         HILOG_ERROR("Get callerAppInfo failed.");
3443         return FormErmsCallerInfo::TYPE_INVALID;
3444     }
3445 
3446     switch (callerAppInfo.bundleType) {
3447         case AppExecFwk::BundleType::ATOMIC_SERVICE:
3448             return FormErmsCallerInfo::TYPE_ATOM_SERVICE;
3449         case AppExecFwk::BundleType::APP:
3450             return FormErmsCallerInfo::TYPE_HARMONY_APP;
3451         default:
3452             HILOG_WARN("the caller type is not harmony app or atom service: %{public}d", callerAppInfo.bundleType);
3453             break;
3454     }
3455     return FormErmsCallerInfo::TYPE_INVALID;
3456 }
3457 
IsErmsSupportPublishForm(std::string bundleName,std::vector<Want> wants)3458 bool FormMgrAdapter::IsErmsSupportPublishForm(std::string bundleName, std::vector<Want> wants)
3459 {
3460     bool isSupport = true;
3461     std::string supportErms = OHOS::system::GetParameter(FORM_SUPPORT_ECOLOGICAL_RULEMGRSERVICE, "true");
3462     if (supportErms == "false") {
3463         HILOG_ERROR("fms not support Erms between applications.");
3464         return true;
3465     }
3466     FormErmsCallerInfo callerInfo;
3467     callerInfo.packageName = bundleName;
3468     callerInfo.uid = IPCSkeleton::GetCallingUid();
3469     callerInfo.pid = IPCSkeleton::GetCallingPid();
3470     callerInfo.callerAppType = GetCallerType(bundleName);
3471 
3472     auto start = FormUtil::GetCurrentMicrosecond();
3473     int32_t ret = FormEcologicalRuleClient::GetInstance().IsSupportPublishForm(wants, callerInfo, isSupport);
3474     auto end = FormUtil::GetCurrentMicrosecond();
3475     HILOG_INFO("[ERMS-DFX] IsSupportPublishForm cost %{public}" PRId64 " micro seconds", (end - start));
3476     if (ret != ERR_OK) {
3477         HILOG_ERROR("call IsSupportPublishForm failed: %{public}d, default is support.", ret);
3478         return true;
3479     }
3480     return isSupport;
3481 }
3482 
SetFormsRecyclable(const std::vector<int64_t> & formIds)3483 int32_t FormMgrAdapter::SetFormsRecyclable(const std::vector<int64_t> &formIds)
3484 {
3485     HILOG_DEBUG("called");
3486     FormRecord record;
3487     std::vector<int64_t> validFormIds;
3488     int callingUid = IPCSkeleton::GetCallingUid();
3489     for (int64_t formId : formIds) {
3490         if (formId <= 0) {
3491             HILOG_ERROR("form id is negative");
3492             continue;
3493         }
3494 
3495         int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3496         if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3497             HILOG_WARN("form %{public}" PRId64 " not exist", formId);
3498             continue;
3499         }
3500         if (record.formTempFlag) {
3501             HILOG_WARN("form %{public}" PRId64 " is temp form", formId);
3502             continue;
3503         }
3504         if (!record.isDynamic) {
3505             HILOG_WARN("form %{public}" PRId64 " is static form", formId);
3506             continue;
3507         }
3508         if (record.uiSyntax != FormType::ETS) {
3509             HILOG_WARN("form %{public}" PRId64 " is not ETS form", formId);
3510             continue;
3511         }
3512         if (record.recycleStatus != RecycleStatus::NON_RECYCLABLE) {
3513             HILOG_WARN("form %{public}" PRId64 " is already RECYCLABLE or RECYCLED", formId);
3514             continue;
3515         }
3516         if (std::find(record.formUserUids.begin(), record.formUserUids.end(), callingUid)
3517             == record.formUserUids.end()) {
3518             HILOG_WARN("form %{public}" PRId64 " is not owned by %{public}d", formId, callingUid);
3519             continue;
3520         }
3521 
3522         record.recycleStatus = RecycleStatus::RECYCLABLE;
3523         FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3524         validFormIds.emplace_back(matchedFormId);
3525         HILOG_INFO("set %{public}" PRId64 " recyclable", formId);
3526     }
3527 
3528     if (validFormIds.empty()) {
3529         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3530     }
3531 
3532     return ERR_OK;
3533 }
3534 
RecycleForms(const std::vector<int64_t> & formIds,const Want & want)3535 int32_t FormMgrAdapter::RecycleForms(const std::vector<int64_t> &formIds, const Want &want)
3536 {
3537     HILOG_DEBUG("called");
3538     FormRecord record;
3539     std::vector<int64_t> validFormIds;
3540     int callingUid = IPCSkeleton::GetCallingUid();
3541     for (int64_t formId : formIds) {
3542         if (formId <= 0) {
3543             HILOG_ERROR("form id is negative");
3544             continue;
3545         }
3546 
3547         int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3548         if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3549             HILOG_WARN("form %{public}" PRId64 " not exist", formId);
3550             continue;
3551         }
3552         if (record.formTempFlag) {
3553             HILOG_WARN("form %{public}" PRId64 " is temp form", formId);
3554             continue;
3555         }
3556         if (!record.isDynamic) {
3557             HILOG_WARN("form %{public}" PRId64 " is static form", formId);
3558             continue;
3559         }
3560         if (record.uiSyntax != FormType::ETS) {
3561             HILOG_WARN("form %{public}" PRId64 " is not ETS form", formId);
3562             continue;
3563         }
3564         if (record.recycleStatus == RecycleStatus::RECYCLED) {
3565             HILOG_WARN("form %{public}" PRId64 " is already RECYCLED", formId);
3566             continue;
3567         }
3568         if (std::find(record.formUserUids.begin(), record.formUserUids.end(), callingUid)
3569             == record.formUserUids.end()) {
3570             HILOG_WARN("form %{public}" PRId64 " is not owned by %{public}d", formId, callingUid);
3571             continue;
3572         }
3573 
3574         record.recycleStatus = RecycleStatus::RECYCLABLE;
3575         FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3576         validFormIds.emplace_back(matchedFormId);
3577         HILOG_INFO("set %{public}" PRId64 " recyclable", formId);
3578     }
3579 
3580     if (validFormIds.empty()) {
3581         HILOG_WARN("validFormIds is empty");
3582         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3583     }
3584 
3585     FormDataMgr::GetInstance().RecycleForms(validFormIds, callingUid, want);
3586     return ERR_OK;
3587 }
3588 
RecoverForms(const std::vector<int64_t> & formIds,const Want & want)3589 int32_t FormMgrAdapter::RecoverForms(const std::vector<int64_t> &formIds, const Want &want)
3590 {
3591     HILOG_DEBUG("called.");
3592     FormRecord record;
3593     std::vector<int64_t> validFormIds;
3594     int callingUid = IPCSkeleton::GetCallingUid();
3595     std::string bundleName;
3596     for (int64_t formId : formIds) {
3597         if (formId <= 0) {
3598             HILOG_ERROR("form id is negative");
3599             continue;
3600         }
3601 
3602         int64_t matchedFormId = FormDataMgr::GetInstance().FindMatchedFormId(formId);
3603         if (!FormDataMgr::GetInstance().GetFormRecord(matchedFormId, record)) {
3604             HILOG_WARN("form %{public}" PRId64 " not exist", formId);
3605             continue;
3606         }
3607         if (record.recycleStatus == RecycleStatus::RECYCLABLE) {
3608             HILOG_WARN("form %{public}" PRId64 " is RECYCLABLE, set it to NON_RECYCLABLE", formId);
3609             FormTaskMgr::GetInstance().CancelDelayTask(std::make_pair((int64_t)TaskType::RECYCLE_FORM, formId));
3610             record.recycleStatus = RecycleStatus::NON_RECYCLABLE;
3611             FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3612             continue;
3613         }
3614         if (record.recycleStatus != RecycleStatus::RECYCLED) {
3615             HILOG_WARN("form %{public}" PRId64 " is not RECYCLED", formId);
3616             continue;
3617         }
3618         if (std::find(record.formUserUids.begin(), record.formUserUids.end(), callingUid)
3619             == record.formUserUids.end()) {
3620             HILOG_WARN("form %{public}" PRId64 " is not owned by %{public}d", formId, callingUid);
3621             continue;
3622         }
3623 
3624         bundleName = record.bundleName;
3625         record.recycleStatus = RecycleStatus::NON_RECYCLABLE;
3626         FormDataMgr::GetInstance().UpdateFormRecord(matchedFormId, record);
3627         validFormIds.emplace_back(matchedFormId);
3628         HILOG_INFO("set %{public}" PRId64 " recyclable", formId);
3629     }
3630 
3631     if (validFormIds.empty()) {
3632         HILOG_WARN("validFormIds is empty");
3633         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
3634     }
3635 
3636     FormRenderMgr::GetInstance().RecoverForms(validFormIds, bundleName, want.GetParams());
3637     return ERR_OK;
3638 }
3639 } // namespace AppExecFwk
3640 } // namespace OHOS
3641