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