• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "form_mgr_service.h"
17 
18 #include <chrono>
19 #include <ctime>
20 #include <iomanip>
21 #include <sstream>
22 
23 #include "accesstoken_kit.h"
24 #include "bundle_common_event.h"
25 #include "common_event_manager.h"
26 #include "common_event_support.h"
27 #include "fms_log_wrapper.h"
28 #include "form_ams_helper.h"
29 #include "form_bms_helper.h"
30 #include "form_bundle_forbid_mgr.h"
31 #include "form_cache_mgr.h"
32 #include "form_constants.h"
33 #include "form_data_mgr.h"
34 #include "form_data_proxy_mgr.h"
35 #include "form_db_cache.h"
36 #include "form_event_handler.h"
37 #include "form_event_report.h"
38 #include "form_info_mgr.h"
39 #include "form_mgr_adapter.h"
40 #include "form_mgr_errors.h"
41 #include "form_serial_queue.h"
42 #include "form_share_mgr.h"
43 #include "form_task_mgr.h"
44 #include "form_timer_mgr.h"
45 #include "form_trust_mgr.h"
46 #include "form_util.h"
47 #include "form_xml_parser.h"
48 #include "running_form_info.h"
49 #include "in_process_call_wrapper.h"
50 #include "ipc_skeleton.h"
51 #include "iservice_registry.h"
52 #include "mem_status_listener.h"
53 #include "os_account_manager.h"
54 #include "permission_constants.h"
55 #include "permission_verification.h"
56 #include "system_ability_definition.h"
57 #include "tokenid_kit.h"
58 #include "hisysevent.h"
59 #include "xcollie/watchdog.h"
60 #include "xcollie/xcollie.h"
61 #include "xcollie/xcollie_define.h"
62 #include "net_conn_callback_stub.h"
63 #include "net_conn_client.h"
64 #include "net_handle.h"
65 #include "form_bundle_lock_mgr.h"
66 #include "form_exempt_lock_mgr.h"
67 #include "string_wrapper.h"
68 #include "int_wrapper.h"
69 #include "want_params_wrapper.h"
70 #ifdef MEM_MGR_ENABLE
71 #include "mem_mgr_client.h"
72 #endif
73 #include "form_report.h"
74 
75 #ifdef RES_SCHEDULE_ENABLE
76 #include "form_systemload_listener.h"
77 #include "res_sched_client.h"
78 #include "res_type.h"
79 #endif // RES_SCHEDULE_ENABLE
80 
81 namespace OHOS {
82 namespace AppExecFwk {
83 namespace {
84 const int32_t MAIN_USER_ID = 100;
85 constexpr int MILLISECOND_WIDTH = 3;
86 constexpr char MILLISECOND_FILLCHAR = '0';
87 const int32_t API_TIME_OUT = 5;
88 const int32_t API_TIME_OUT_30S = 30;
89 const int32_t CONDITION_NETWORK = 1;
90 const long FORM_DISCON_NETWORK_CHECK_TIME = 600000; // ms
91 #ifdef RES_SCHEDULE_ENABLE
92 constexpr int32_t SYSTEMLOADLEVEL_TIMERSTOP_THRESHOLD =
93     static_cast<int32_t>(ResourceSchedule::ResType::SystemloadLevel::OVERHEATED);
94 #endif // RES_SCHEDULE_ENABLE
95 }
96 using namespace std::chrono;
97 using namespace OHOS::NetManagerStandard;
98 
99 const bool REGISTER_RESULT =
100     SystemAbility::MakeAndRegisterAbility(DelayedSingleton<FormMgrService>::GetInstance().get());
101 
102 const std::string NAME_FORM_MGR_SERVICE = "FormMgrService";
103 
104 const std::string FORM_MGR_SERVICE_QUEUE = "FormMgrServiceQueue";
105 
106 constexpr int32_t FORM_DUMP_ARGC_MAX = 2;
107 
108 constexpr int32_t FORM_CON_NET_MAX = 100;
109 
110 const std::string FORM_DUMP_HELP = "options list:\n"
111     "  -h, --help                           list available commands\n"
112     "  -b, --bundle-form-info               query all form infos from bundle, Un-added form info will also be dumped\n"
113     "  -v, --visible                        query form visible infos from args like bundleName_userId_instIndex\n"
114     "  -s, --storage                        query form storage info\n"
115     "  -t, --temp                           query temporary form info\n"
116     "  -n  <bundle-name>                    query form info by a bundle name\n"
117     "  -i  <form-id>                        query form info by a form ID\n"
118     "  -r  --running                        query running form info\n"
119     "  -a  --apps-blocked                   query blocked app name list\n";
120 
121 const std::map<std::string, FormMgrService::DumpKey> FormMgrService::dumpKeyMap_ = {
122     {"-h", FormMgrService::DumpKey::KEY_DUMP_HELP},
123     {"--help", FormMgrService::DumpKey::KEY_DUMP_HELP},
124     {"-b", FormMgrService::DumpKey::KEY_DUMP_STATIC},   // *****
125     {"--bundle-form-info", FormMgrService::DumpKey::KEY_DUMP_STATIC},
126     {"-v", FormMgrService::DumpKey::KEY_DUMP_VISIBLE},
127     {"--visible", FormMgrService::DumpKey::KEY_DUMP_VISIBLE},
128     {"-s", FormMgrService::DumpKey::KEY_DUMP_STORAGE},
129     {"--storage", FormMgrService::DumpKey::KEY_DUMP_STORAGE},
130     {"-t", FormMgrService::DumpKey::KEY_DUMP_TEMPORARY},
131     {"--temp", FormMgrService::DumpKey::KEY_DUMP_TEMPORARY},
132     {"-n", FormMgrService::DumpKey::KEY_DUMP_BY_BUNDLE_NAME},
133     {"-i", FormMgrService::DumpKey::KEY_DUMP_BY_FORM_ID},
134     {"-r", FormMgrService::DumpKey::KEY_DUMP_RUNNING},
135     {"--running", FormMgrService::DumpKey::KEY_DUMP_RUNNING},
136     {"-a", FormMgrService::DumpKey::KEY_DUMP_BLOCKED_APPS},
137     {"--apps-blocked", FormMgrService::DumpKey::KEY_DUMP_BLOCKED_APPS},
138 };
139 
FormMgrService()140 FormMgrService::FormMgrService()
141     : SystemAbility(FORM_MGR_SERVICE_ID, true),
142       state_(ServiceRunningState::STATE_NOT_START),
143       serialQueue_(nullptr)
144 {
145     HILOG_INFO("call");
146 }
147 
~FormMgrService()148 FormMgrService::~FormMgrService()
149 {
150     HILOG_INFO("call");
151     if (formSysEventReceiver_ != nullptr) {
152         EventFwk::CommonEventManager::UnSubscribeCommonEvent(formSysEventReceiver_);
153         formSysEventReceiver_ = nullptr;
154         FormBmsHelper::GetInstance().UnregisterBundleEventCallback();
155     }
156 #ifdef MEM_MGR_ENABLE
157     if (memStatusListener_ != nullptr) {
158         Memory::MemMgrClient::GetInstance().UnsubscribeAppState(*memStatusListener_);
159     }
160 #endif
161 }
162 
163 /**
164 * @brief Check form manager service ready.
165 * @return Return true if form manager service Ready; return false otherwise.
166 */
167 
CheckFMSReady()168 bool FormMgrService::CheckFMSReady()
169 {
170     if (state_ != ServiceRunningState::STATE_RUNNING) {
171         return false;
172     }
173 
174     int32_t userId = FormUtil::GetCurrentAccountId();
175     if (userId == Constants::ANY_USERID) {
176         HILOG_ERROR("empty account");
177         return false;
178     }
179     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_CheckFMSReady",
180         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
181     bool result = FormInfoMgr::GetInstance().HasReloadedFormInfos();
182     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
183     return result;
184 }
185 
IsSystemAppForm(const std::string & bundleName)186 bool FormMgrService::IsSystemAppForm(const std::string &bundleName)
187 {
188     HILOG_DEBUG("check %{public}s is system form.", bundleName.c_str());
189 
190     std::vector<FormRecord> formRecords;
191     FormDataMgr::GetInstance().GetFormRecord(bundleName, formRecords);
192     if (formRecords.empty()) {
193         return false;
194     }
195     return formRecords.front().isSystemApp;
196 }
197 
198 /**
199  * @brief Add form with want, send want to form manager service.
200  * @param formId The Id of the forms to add.
201  * @param want The want of the form to add.
202  * @param callerToken Caller ability token.
203  * @param formInfo Form info.
204  * @return Returns ERR_OK on success, others on failure.
205  */
AddForm(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken,FormJsInfo & formInfo)206 int FormMgrService::AddForm(const int64_t formId, const Want &want,
207     const sptr<IRemoteObject> &callerToken, FormJsInfo &formInfo)
208 {
209     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
210         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
211         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
212 
213     ErrCode ret = CheckFormPermission();
214     if (ret != ERR_OK) {
215         HILOG_ERROR("add form permission denied");
216         return ret;
217     }
218     ReportAddFormEvent(formId, want);
219     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_AddForm",
220         API_TIME_OUT_30S, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
221     ret = FormMgrAdapter::GetInstance().AddForm(formId, want, callerToken, formInfo);
222     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
223     return ret;
224 }
225 
226 /**
227  * @brief Add form with want, send want to form manager service.
228  * @param want The want of the form to add.
229  * @param runningFormInfo Running form info.
230  * @return Returns ERR_OK on success, others on failure.
231  */
CreateForm(const Want & want,RunningFormInfo & runningFormInfo)232 int FormMgrService::CreateForm(const Want &want, RunningFormInfo &runningFormInfo)
233 {
234     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
235         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
236         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
237 
238     ErrCode ret = CheckFormPermission();
239     if (ret != ERR_OK) {
240         HILOG_ERROR("create form permission denied");
241         return ret;
242     }
243     ReportAddFormEvent(0, want);
244     return FormMgrAdapter::GetInstance().CreateForm(want, runningFormInfo);
245 }
246 
ReportAddFormEvent(const int64_t formId,const Want & want)247 void FormMgrService::ReportAddFormEvent(const int64_t formId, const Want &want)
248 {
249     FormEventInfo eventInfo;
250     eventInfo.formId = formId;
251     eventInfo.bundleName = want.GetElement().GetBundleName();
252     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
253     eventInfo.abilityName = want.GetElement().GetAbilityName();
254     int ret = FormBmsHelper::GetInstance().GetCallerBundleName(eventInfo.hostBundleName);
255     if (ret != ERR_OK || eventInfo.hostBundleName.empty()) {
256         HILOG_ERROR("cannot get host bundle name by uid");
257     }
258     FormEventReport::SendFormEvent(FormEventName::ADD_FORM, HiSysEventType::BEHAVIOR, eventInfo);
259 }
260 
261 /**
262  * @brief Delete forms with formIds, send formIds to form manager service.
263  * @param formId The Id of the forms to delete.
264  * @param callerToken Caller ability token.
265  * @return Returns ERR_OK on success, others on failure.
266  */
DeleteForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)267 int FormMgrService::DeleteForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
268 {
269     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
270         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
271         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
272 
273     ErrCode ret = CheckFormPermission();
274     if (ret != ERR_OK) {
275         HILOG_ERROR("delete form permission denied");
276         return ret;
277     }
278     FormEventInfo eventInfo;
279     eventInfo.formId = formId;
280     std::vector<FormHostRecord> formHostRecords;
281     FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
282     if (formHostRecords.size() != 0) {
283         eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
284     }
285     FormEventReport::SendSecondFormEvent(FormEventName::DELETE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
286     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_DeleteForm",
287         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
288     ret = FormMgrAdapter::GetInstance().DeleteForm(formId, callerToken);
289     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
290     return ret;
291 }
292 
293 /**
294  * @brief Stop rendering form.
295  * @param formId The Id of the forms to delete.
296  * @param compId The compId of the forms to delete.
297  * @return Returns ERR_OK on success, others on failure.
298  */
StopRenderingForm(const int64_t formId,const std::string & compId)299 int FormMgrService::StopRenderingForm(const int64_t formId, const std::string &compId)
300 {
301     ErrCode ret = CheckFormPermission();
302     if (ret != ERR_OK) {
303         HILOG_ERROR("delete form permission denied");
304         return ret;
305     }
306 
307     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
308     if (ret != ERR_OK) {
309         HILOG_ERROR("invalid formId or not under currentActiveUser");
310         return ret;
311     }
312     return FormMgrAdapter::GetInstance().StopRenderingForm(formId, compId);
313 }
314 
315 /**
316  * @brief Release forms with formIds, send formIds to form manager service.
317  * @param formId The Id of the forms to release.
318  * @param callerToken Caller ability token.
319  * @param delCache Delete Cache or not.
320  * @return Returns ERR_OK on success, others on failure.
321  */
ReleaseForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const bool delCache)322 int FormMgrService::ReleaseForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const bool delCache)
323 {
324     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
325         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
326         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
327 
328     ErrCode ret = CheckFormPermission();
329     if (ret != ERR_OK) {
330         HILOG_ERROR("release form permission denied");
331         return ret;
332     }
333     FormEventInfo eventInfo;
334     eventInfo.formId = formId;
335     FormEventReport::SendSecondFormEvent(FormEventName::RELEASE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
336 
337     return FormMgrAdapter::GetInstance().ReleaseForm(formId, callerToken, delCache);
338 }
339 
340 /**
341  * @brief Update form with formId, send formId to form manager service.
342  * @param formId The Id of the form to update.
343  * @param formBindingData Form binding data.
344  * @return Returns ERR_OK on success, others on failure.
345  */
UpdateForm(const int64_t formId,const FormProviderData & formBindingData)346 int FormMgrService::UpdateForm(const int64_t formId, const FormProviderData &formBindingData)
347 {
348     HILOG_DEBUG("call");
349     auto callingUid = IPCSkeleton::GetCallingUid();
350     return FormMgrAdapter::GetInstance().UpdateForm(formId, callingUid, formBindingData);
351 }
352 
353 /**
354  * @brief Request form with formId and want, send formId and want to form manager service.
355  * @param formId The Id of the form to update.
356  * @param callerToken Caller ability token.
357  * @param want The want of the form to add.
358  * @return Returns ERR_OK on success, others on failure.
359  */
RequestForm(const int64_t formId,const sptr<IRemoteObject> & callerToken,const Want & want)360 int FormMgrService::RequestForm(const int64_t formId, const sptr<IRemoteObject> &callerToken, const Want &want)
361 {
362     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
363         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
364         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
365     ErrCode ret = CheckFormPermission();
366     if (ret != ERR_OK) {
367         HILOG_ERROR("request form permission denied");
368         return ret;
369     }
370     FormEventInfo eventInfo;
371     eventInfo.formId = formId;
372     eventInfo.bundleName = want.GetElement().GetBundleName();
373     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
374     eventInfo.abilityName = want.GetElement().GetAbilityName();
375     FormEventReport::SendSecondFormEvent(FormEventName::REQUEST_FORM, HiSysEventType::BEHAVIOR, eventInfo);
376 
377     return FormMgrAdapter::GetInstance().RequestForm(formId, callerToken, want);
378 }
379 
380 /**
381  * @brief set next refresh time.
382  * @param formId The id of the form.
383  * @param nextTime next refresh time.
384  * @return Returns ERR_OK on success, others on failure.
385  */
SetNextRefreshTime(const int64_t formId,const int64_t nextTime)386 int FormMgrService::SetNextRefreshTime(const int64_t formId, const int64_t nextTime)
387 {
388     HILOG_DEBUG("call");
389     FormEventInfo eventInfo;
390     eventInfo.formId = formId;
391     FormEventReport::SendSecondFormEvent(
392         FormEventName::SET_NEXT_REFRESH_TIME_FORM, HiSysEventType::BEHAVIOR, eventInfo);
393 
394     return FormMgrAdapter::GetInstance().SetNextRefreshTime(formId, nextTime);
395 }
396 
ReleaseRenderer(int64_t formId,const std::string & compId)397 int FormMgrService::ReleaseRenderer(int64_t formId, const std::string &compId)
398 {
399     HILOG_DEBUG("call");
400     ErrCode ret = CheckFormPermission();
401     if (ret != ERR_OK) {
402         HILOG_ERROR("request form permission denied");
403         return ret;
404     }
405     return FormMgrAdapter::GetInstance().ReleaseRenderer(formId, compId);
406 }
407 
RequestPublishForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId)408 ErrCode FormMgrService::RequestPublishForm(Want &want, bool withFormBindingData,
409     std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId)
410 {
411     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
412         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
413         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
414     bool isFormAgent = want.GetBoolParam(Constants::IS_FORM_AGENT, false);
415     HILOG_INFO("isFormAgent:%{public}d", isFormAgent);
416     if (isFormAgent) {
417         ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_AGENT_REQUIRE_FORM);
418         if (ret != ERR_OK) {
419             HILOG_ERROR("request form permission denied");
420             return ret;
421         }
422     } else {
423         if (!CheckCallerIsSystemApp()) {
424             return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
425         }
426 
427         if (!CheckAcrossLocalAccountsPermission()) {
428             HILOG_ERROR("Across local accounts permission failed");
429             return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
430         }
431     }
432     return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData, formId);
433 }
434 
SetPublishFormResult(const int64_t formId,Constants::PublishFormResult & errorCodeInfo)435 ErrCode FormMgrService::SetPublishFormResult(const int64_t formId, Constants::PublishFormResult &errorCodeInfo)
436 {
437     HILOG_INFO("call");
438     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_REQUIRE_FORM);
439     if (ret != ERR_OK) {
440         HILOG_ERROR("request form permission denied");
441         return ret;
442     }
443     return FormMgrAdapter::GetInstance().SetPublishFormResult(formId, errorCodeInfo);
444 }
445 
AcquireAddFormResult(const int64_t formId)446 ErrCode FormMgrService::AcquireAddFormResult(const int64_t formId)
447 {
448     HILOG_INFO("call");
449     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_AGENT_REQUIRE_FORM);
450     if (ret != ERR_OK) {
451         HILOG_ERROR("request form permission denied");
452         return ret;
453     }
454     return FormMgrAdapter::GetInstance().AcquireAddFormResult(formId);
455 }
456 
457 /**
458  * @brief Form visible/invisible notify, send formIds to form manager service.
459  * @param formIds The Id list of the forms to notify.
460  * @param callerToken Caller ability token.
461  * @param formVisibleType The form visible type, including FORM_VISIBLE and FORM_INVISIBLE.
462  * @return Returns ERR_OK on success, others on failure.
463  */
NotifyWhetherVisibleForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,const int32_t formVisibleType)464 int FormMgrService::NotifyWhetherVisibleForms(const std::vector<int64_t> &formIds,
465     const sptr<IRemoteObject> &callerToken, const int32_t formVisibleType)
466 {
467     HILOG_DEBUG("call");
468 
469     ErrCode ret = CheckFormPermission();
470     if (ret != ERR_OK) {
471         HILOG_ERROR("event notify visible permission denied");
472         return ret;
473     }
474     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_NotifyWhetherVisibleForms",
475         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
476     ret = FormMgrAdapter::GetInstance().NotifyWhetherVisibleForms(formIds, callerToken, formVisibleType);
477     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
478     return ret;
479 }
480 
481 /**
482  * @brief Query whether has visible form by tokenId.
483  * @param tokenId Unique identification of application.
484  * @return Returns true if has visible form, false otherwise.
485  */
HasFormVisible(const uint32_t tokenId)486 bool FormMgrService::HasFormVisible(const uint32_t tokenId)
487 {
488     HILOG_DEBUG("call");
489 
490     if (!FormUtil::IsSACall()) {
491         HILOG_ERROR("query form visible with tokenid not a SACall");
492         return false;
493     }
494     return FormMgrAdapter::GetInstance().HasFormVisible(tokenId);
495 }
496 
497 /**
498  * @brief temp form to normal form.
499  * @param formId The Id of the form.
500  * @param callerToken Caller ability token.
501  * @return Returns ERR_OK on success, others on failure.
502  */
CastTempForm(const int64_t formId,const sptr<IRemoteObject> & callerToken)503 int FormMgrService::CastTempForm(const int64_t formId, const sptr<IRemoteObject> &callerToken)
504 {
505     HILOG_DEBUG("call");
506 
507     ErrCode ret = CheckFormPermission();
508     if (ret != ERR_OK) {
509         HILOG_ERROR("cast temp form permission denied");
510         return ret;
511     }
512     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
513     if (ret != ERR_OK) {
514         HILOG_ERROR("invalid formId or not under currentActiveUser");
515         return ret;
516     }
517     FormEventInfo eventInfo;
518     eventInfo.formId = formId;
519     FormEventReport::SendSecondFormEvent(FormEventName::CASTTEMP_FORM, HiSysEventType::BEHAVIOR, eventInfo);
520 
521     return FormMgrAdapter::GetInstance().CastTempForm(formId, callerToken);
522 }
523 
524 /**
525  * @brief lifecycle update.
526  * @param formIds formIds of host client.
527  * @param callerToken Caller ability token.
528  * @param updateType update type,enable or disable.
529  * @return Returns true on success, false on failure.
530  */
LifecycleUpdate(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,bool updateType)531 int FormMgrService::LifecycleUpdate(const std::vector<int64_t> &formIds,
532     const sptr<IRemoteObject> &callerToken, bool updateType)
533 {
534     HILOG_INFO("updateType:%{public}d", updateType);
535 
536     ErrCode ret = CheckFormPermission();
537     if (ret != ERR_OK) {
538         HILOG_ERROR("delete form permission denied");
539         return ret;
540     }
541 
542     if (updateType) {
543         return FormMgrAdapter::GetInstance().EnableUpdateForm(formIds, callerToken);
544     } else {
545         return FormMgrAdapter::GetInstance().DisableUpdateForm(formIds, callerToken);
546     }
547 }
548 /**
549  * @brief Dump all of form storage infos.
550  * @param formInfos All of form storage infos.
551  * @return Returns ERR_OK on success, others on failure.
552  */
DumpStorageFormInfos(std::string & formInfos)553 int FormMgrService::DumpStorageFormInfos(std::string &formInfos)
554 {
555     if (!CheckCallerIsSystemApp()) {
556         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
557     }
558     return FormMgrAdapter::GetInstance().DumpStorageFormInfos(formInfos);
559 }
560 /**
561  * @brief Dump form info by a bundle name.
562  * @param bundleName The bundle name of form provider.
563  * @param formInfos Form infos.
564  * @return Returns ERR_OK on success, others on failure.
565  */
DumpFormInfoByBundleName(const std::string & bundleName,std::string & formInfos)566 int FormMgrService::DumpFormInfoByBundleName(const std::string &bundleName, std::string &formInfos)
567 {
568     if (!CheckCallerIsSystemApp()) {
569         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
570     }
571     return FormMgrAdapter::GetInstance().DumpFormInfoByBundleName(bundleName, formInfos);
572 }
573 /**
574  * @brief Dump form info by a bundle name.
575  * @param formId The id of the form.
576  * @param formInfo Form info.
577  * @return Returns ERR_OK on success, others on failure.
578  */
DumpFormInfoByFormId(const std::int64_t formId,std::string & formInfo)579 int FormMgrService::DumpFormInfoByFormId(const std::int64_t formId, std::string &formInfo)
580 {
581     if (!CheckCallerIsSystemApp()) {
582         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
583     }
584     return FormMgrAdapter::GetInstance().DumpFormInfoByFormId(formId, formInfo);
585 }
586 /**
587  * @brief Dump form timer by form id.
588  * @param formId The id of the form.
589  * @param formInfo Form info.
590  * @return Returns ERR_OK on success, others on failure.
591  */
DumpFormTimerByFormId(const std::int64_t formId,std::string & isTimingService)592 int FormMgrService::DumpFormTimerByFormId(const std::int64_t formId, std::string &isTimingService)
593 {
594     if (!CheckCallerIsSystemApp()) {
595         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
596     }
597     return FormMgrAdapter::GetInstance().DumpFormTimerByFormId(formId, isTimingService);
598 }
599 
600 /**
601  * @brief Process js message event.
602  * @param formId Indicates the unique id of form.
603  * @param want information passed to supplier.
604  * @param callerToken Caller ability token.
605  * @return Returns true if execute success, false otherwise.
606  */
MessageEvent(const int64_t formId,const Want & want,const sptr<IRemoteObject> & callerToken)607 int FormMgrService::MessageEvent(const int64_t formId, const Want &want, const sptr<IRemoteObject> &callerToken)
608 {
609     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
610         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
611         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
612     ErrCode ret = CheckFormPermission();
613     if (ret != ERR_OK) {
614         HILOG_ERROR("request form permission denied");
615         return ret;
616     }
617     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
618     if (ret != ERR_OK) {
619         HILOG_ERROR("invalid formId or not under currentActiveUser");
620         return ret;
621     }
622     FormEventInfo eventInfo;
623     eventInfo.bundleName = want.GetElement().GetBundleName();
624     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
625     eventInfo.abilityName = want.GetElement().GetAbilityName();
626     std::vector<FormHostRecord> formHostRecords;
627     FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
628     if (formHostRecords.size() != 0) {
629         eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
630     }
631     FormReport::GetInstance().SetDurationStartTime(formId, FormUtil::GetCurrentSteadyClockMillseconds());
632     FormEventReport::SendFormEvent(FormEventName::MESSAGE_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
633     return FormMgrAdapter::GetInstance().MessageEvent(formId, want, callerToken);
634 }
635 
636 /**
637  * @brief Process js router event.
638  * @param formId Indicates the unique id of form.
639  * @param want the want of the ability to start.
640  * @param callerToken Caller ability token.
641  * @return Returns true if execute success, false otherwise.
642  */
RouterEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)643 int FormMgrService::RouterEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
644 {
645     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
646         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
647         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
648     ErrCode ret = CheckFormPermission();
649     if (ret != ERR_OK) {
650         HILOG_ERROR("request form permission denied");
651         return ret;
652     }
653     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
654     if (ret != ERR_OK) {
655         HILOG_ERROR("invalid formId or not under currentActiveUser");
656         return ret;
657     }
658     FormEventInfo eventInfo;
659     eventInfo.formId = formId;
660     eventInfo.bundleName = want.GetElement().GetBundleName();
661     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
662     eventInfo.abilityName = want.GetElement().GetAbilityName();
663     std::vector<FormHostRecord> formHostRecords;
664     FormDataMgr::GetInstance().GetFormHostRecord(formId, formHostRecords);
665     if (formHostRecords.size() != 0) {
666         eventInfo.hostBundleName = formHostRecords.begin()->GetHostBundleName();
667     }
668     FormEventReport::SendFormEvent(FormEventName::ROUTE_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
669     return FormMgrAdapter::GetInstance().RouterEvent(formId, want, callerToken);
670 }
671 
672 /**
673  * @brief Process Background event.
674  * @param formId Indicates the unique id of form.
675  * @param want the want of the ability to start.
676  * @param callerToken Caller ability token.
677  * @return Returns true if execute success, false otherwise.
678  */
BackgroundEvent(const int64_t formId,Want & want,const sptr<IRemoteObject> & callerToken)679 int FormMgrService::BackgroundEvent(const int64_t formId, Want &want, const sptr<IRemoteObject> &callerToken)
680 {
681     HILOG_INFO("begin:%{public}s,publish:%{public}s,end:%{public}s, onKvDataServiceAddTime:%{public}s",
682         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
683         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
684     ErrCode ret = CheckFormPermission();
685     if (ret != ERR_OK) {
686         HILOG_ERROR("request form permission denied");
687         return ret;
688     }
689     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
690     if (ret != ERR_OK) {
691         HILOG_ERROR("the formId is not under currentActiveUser or invalid");
692         return ret;
693     }
694     FormEventInfo eventInfo;
695     eventInfo.formId = formId;
696     eventInfo.bundleName = want.GetElement().GetBundleName();
697     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
698     eventInfo.abilityName = want.GetElement().GetAbilityName();
699     FormEventReport::SendSecondFormEvent(FormEventName::BACKGROUND_EVENT_FORM, HiSysEventType::BEHAVIOR, eventInfo);
700     return FormMgrAdapter::GetInstance().BackgroundEvent(formId, want, callerToken);
701 }
702 
703 /**
704  * @brief Start event for the form manager service.
705  */
OnStart()706 void FormMgrService::OnStart()
707 {
708     if (state_ == ServiceRunningState::STATE_RUNNING) {
709         HILOG_WARN("start service failed since it's running");
710         return;
711     }
712 
713     onStartBeginTime_ = GetCurrentDateTime();
714     HILOG_INFO("start,time:%{public}s", onStartBeginTime_.c_str());
715     ErrCode errCode = Init();
716     if (errCode != ERR_OK) {
717         HILOG_ERROR("init failed,errCode:%{public}08x", errCode);
718         return;
719     }
720 
721     state_ = ServiceRunningState::STATE_RUNNING;
722     // listener for FormDataProxyMgr
723     AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
724 
725 #ifdef MEM_MGR_ENABLE
726     AddSystemAbilityListener(MEMORY_MANAGER_SA_ID);
727 #endif // MEM_MGR_ENABLE
728 
729 #ifdef RES_SCHEDULE_ENABLE
730     AddSystemAbilityListener(RES_SCHED_SYS_ABILITY_ID);
731 #endif // RES_SCHEDULE_ENABLE
732     onStartEndTime_ = GetCurrentDateTime();
733     HILOG_INFO("success,time:%{public}s,onKvDataServiceAddTime:%{public}s",
734         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
735 }
736 /**
737  * @brief Stop event for the form manager service.
738  */
OnStop()739 void FormMgrService::OnStop()
740 {
741     HILOG_INFO("stop");
742 
743     state_ = ServiceRunningState::STATE_NOT_START;
744 
745     if (serialQueue_) {
746         serialQueue_.reset();
747     }
748 
749     if (handler_) {
750         handler_.reset();
751     }
752     FormAmsHelper::GetInstance().UnRegisterConfigurationObserver();
753 }
754 
ReadFormConfigXML()755 ErrCode FormMgrService::ReadFormConfigXML()
756 {
757     FormXMLParser parser;
758     int32_t ret = parser.Parse();
759     if (ret != ERR_OK) {
760         HILOG_WARN("parse form config failed, use the default vaule");
761         return ret;
762     }
763     const std::map<std::string, int32_t> &configMap = parser.GetConfigMap();
764     FormDataMgr::GetInstance().SetConfigMap(configMap);
765     return ERR_OK;
766 }
767 
768 
SubscribeSysEventReceiver()769 void FormMgrService::SubscribeSysEventReceiver()
770 {
771     if (formSysEventReceiver_ == nullptr) {
772         EventFwk::MatchingSkills matchingSkills;
773         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_ABILITY_UPDATED);
774         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_DATA_CLEARED);
775         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_REMOVED);
776         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_UNLOCKED);
777         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SECOND_MOUNTED);
778         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED);
779         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_USER_SWITCHED);
780         matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_SCREEN_ON);
781         // init TimerReceiver
782         EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
783         subscribeInfo.SetThreadMode(EventFwk::CommonEventSubscribeInfo::COMMON);
784         formSysEventReceiver_ = std::make_shared<FormSysEventReceiver>(subscribeInfo);
785         formSysEventReceiver_->SetSerialQueue(serialQueue_);
786         EventFwk::CommonEventManager::SubscribeCommonEvent(formSysEventReceiver_);
787     }
788 }
789 
790 class NetConnCallbackObserver : public NetManagerStandard::NetConnCallbackStub {
791 public:
792     explicit NetConnCallbackObserver(FormMgrService &fmservice);
793     ~NetConnCallbackObserver() override = default;
794     int32_t NetAvailable(sptr<NetManagerStandard::NetHandle> &netHandle) override;
795     int32_t NetCapabilitiesChange(sptr<NetManagerStandard::NetHandle> &netHandle,
796         const sptr<NetManagerStandard::NetAllCapabilities> &netAllCap) override;
797     int32_t NetConnectionPropertiesChange(sptr<NetManagerStandard::NetHandle> &netHandle,
798         const sptr<NetManagerStandard::NetLinkInfo> &info) override;
799     int32_t NetLost(sptr<NetManagerStandard::NetHandle> &netHandle) override;
800     int32_t NetUnavailable() override;
801     int32_t NetBlockStatusChange(sptr<NetManagerStandard::NetHandle> &netHandle, bool blocked) override;
802 
803 private:
804     FormMgrService &fmservice_;
805 };
806 
NetConnCallbackObserver(FormMgrService & fmservice)807 NetConnCallbackObserver::NetConnCallbackObserver(FormMgrService &fmservice):fmservice_(fmservice)
808 {
809 }
810 
NetAvailable(sptr<NetManagerStandard::NetHandle> & netHandle)811 int32_t NetConnCallbackObserver::NetAvailable(sptr<NetManagerStandard::NetHandle> &netHandle)
812 {
813     HILOG_INFO("OnNetworkAvailable");
814     this->fmservice_.SetNetConnect();
815     return ERR_OK;
816 }
817 
NetUnavailable()818 int32_t NetConnCallbackObserver::NetUnavailable()
819 {
820     HILOG_DEBUG("OnNetworkUnavailable");
821     return ERR_OK;
822 }
823 
NetCapabilitiesChange(sptr<NetHandle> & netHandle,const sptr<NetAllCapabilities> & netAllCap)824 int32_t NetConnCallbackObserver::NetCapabilitiesChange(sptr<NetHandle> &netHandle,
825     const sptr<NetAllCapabilities> &netAllCap)
826 {
827     HILOG_DEBUG("OnNetCapabilitiesChange");
828 
829     return ERR_OK;
830 }
831 
NetConnectionPropertiesChange(sptr<NetHandle> & netHandle,const sptr<NetLinkInfo> & info)832 int32_t NetConnCallbackObserver::NetConnectionPropertiesChange(sptr<NetHandle> &netHandle,
833     const sptr<NetLinkInfo> &info)
834 {
835     HILOG_DEBUG("OnNetConnectionPropertiesChange");
836     return ERR_OK;
837 }
838 
NetLost(sptr<NetHandle> & netHandle)839 int32_t NetConnCallbackObserver::NetLost(sptr<NetHandle> &netHandle)
840 {
841     HILOG_INFO("OnNetLost");
842     this->fmservice_.SetDisConnectTypeTime();
843     return ERR_OK;
844 }
845 
NetBlockStatusChange(sptr<NetHandle> & netHandle,bool blocked)846 int32_t NetConnCallbackObserver::NetBlockStatusChange(sptr<NetHandle> &netHandle, bool blocked)
847 {
848     HILOG_DEBUG("OnNetBlockStatusChange");
849     return ERR_OK;
850 }
851 
852 
SubscribeNetConn()853 void FormMgrService::SubscribeNetConn()
854 {
855     HILOG_INFO("Register SubscribeNetConn begin");
856     sptr<NetConnCallbackObserver> defaultNetworkCallback_ = new (std::nothrow) NetConnCallbackObserver(*this);
857     if (defaultNetworkCallback_ == nullptr) {
858         HILOG_ERROR("new operator error.observer is nullptr");
859         return ;
860     }
861     int result = NetConnClient::GetInstance().RegisterNetConnCallback(defaultNetworkCallback_);
862     if (result == ERR_OK) {
863         HILOG_INFO("Register defaultNetworkCallback_ successful");
864         std::list<sptr<NetHandle>> netList;
865         NetConnClient::GetInstance().GetAllNets(netList);
866         if (netList.size() > 0) {
867             SetNetConnect();
868         }
869     } else {
870         HILOG_ERROR("Register defaultNetworkCallback_ failed, netConTime:%{public}d", netConTime);
871         netConTime++;
872         if (netConTime > FORM_CON_NET_MAX) {
873             HILOG_ERROR("Register defaultNetworkCallback_ failed 10 time");
874             return;
875         }
876         FormTaskMgr::GetInstance().PostConnectNetWork();
877     }
878 }
879 
880 /**
881  * @brief initialization of form manager service.
882  */
Init()883 ErrCode FormMgrService::Init()
884 {
885     HILOG_INFO("call");
886     serialQueue_ = std::make_shared<FormSerialQueue>(FORM_MGR_SERVICE_QUEUE.c_str());
887     if (serialQueue_ == nullptr) {
888         HILOG_ERROR("Init failed,null serialQueue_");
889         return ERR_INVALID_OPERATION;
890     }
891 
892     handler_ = std::make_shared<FormEventHandler>(serialQueue_);
893     if (handler_ == nullptr) {
894         HILOG_ERROR("init failed.null handler_");
895         return ERR_INVALID_OPERATION;
896     }
897     FormTaskMgr::GetInstance().SetSerialQueue(serialQueue_);
898     FormAmsHelper::GetInstance().SetSerialQueue(serialQueue_);
899     /* Publish service maybe failed, so we need call this function at the last,
900      * so it can't affect the TDD test program */
901     if (!Publish(DelayedSingleton<FormMgrService>::GetInstance().get())) {
902         FormEventReport::SendFormFailedEvent(FormEventName::INIT_FMS_FAILED, HiSysEventType::FAULT,
903             static_cast<int64_t>(InitFmsFiledErrorType::PUBLISH_SER_FAILED));
904         HILOG_ERROR("FormMgrService::Init Publish failed");
905         return ERR_INVALID_OPERATION;
906     }
907     onStartPublishTime_ = GetCurrentDateTime();
908     HILOG_INFO("FMS onStart publish done, time:%{public}s", onStartPublishTime_.c_str());
909 
910     SubscribeSysEventReceiver();
911 #ifdef MEM_MGR_ENABLE
912     memStatusListener_ = std::make_shared<MemStatusListener>();
913     Memory::MemMgrClient::GetInstance().SubscribeAppState(*memStatusListener_);
914 #endif
915 
916     FormInfoMgr::GetInstance().Start();
917     FormDbCache::GetInstance().Start();
918     FormTimerMgr::GetInstance(); // Init FormTimerMgr
919     FormCacheMgr::GetInstance().Start();
920 
921     formSysEventReceiver_->InitFormInfosAndRegister();
922 
923     // read param form form_config.xml.
924     if (ReadFormConfigXML() != ERR_OK) {
925         HILOG_WARN("parse form config failed, use the default vaule");
926     }
927     FormMgrAdapter::GetInstance().Init();
928     FormAmsHelper::GetInstance().RegisterConfigurationObserver();
929     SubscribeNetConn();
930     return ERR_OK;
931 }
932 
CheckFormPermission(const std::string & permission)933 ErrCode FormMgrService::CheckFormPermission(const std::string &permission)
934 {
935     HILOG_DEBUG("call");
936 
937     if (FormUtil::IsSACall()) {
938         return ERR_OK;
939     }
940 
941     // check if system app
942     if (!CheckCallerIsSystemApp()) {
943         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
944     }
945 
946     auto isCallingPerm = FormUtil::VerifyCallingPermission(permission);
947     if (!isCallingPerm) {
948         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
949     }
950 
951     // checks whether the current user is inactive
952     if (!CheckAcrossLocalAccountsPermission()) {
953         HILOG_ERROR("Across local accounts permission failed");
954         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
955     }
956 
957     HILOG_DEBUG("Permission verification ok");
958     return ERR_OK;
959 }
960 
961 /**
962  * @brief Delete the invalid forms.
963  * @param formIds Indicates the ID of the valid forms.
964  * @param callerToken Caller ability token.
965  * @param numFormsDeleted Returns the number of the deleted forms.
966  * @return Returns ERR_OK on success, others on failure.
967  */
DeleteInvalidForms(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken,int32_t & numFormsDeleted)968 int FormMgrService::DeleteInvalidForms(const std::vector<int64_t> &formIds,
969     const sptr<IRemoteObject> &callerToken, int32_t &numFormsDeleted)
970 {
971     HILOG_DEBUG("call");
972     ErrCode ret = CheckFormPermission();
973     if (ret != ERR_OK) {
974         HILOG_ERROR("delete form permission denied");
975         return ret;
976     }
977     FormEventInfo eventInfo;
978     FormEventReport::SendFormEvent(FormEventName::DELETE_INVALID_FORM, HiSysEventType::BEHAVIOR, eventInfo);
979     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_DeleteInvalidForms",
980         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
981     ret = FormMgrAdapter::GetInstance().DeleteInvalidForms(formIds, callerToken, numFormsDeleted);
982     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
983     return ret;
984 }
985 
986 /**
987   * @brief Acquire form state info by passing a set of parameters (using Want) to the form provider.
988   * @param want Indicates a set of parameters to be transparently passed to the form provider.
989   * @param callerToken Caller ability token.
990   * @param stateInfo Returns the form's state info of the specify.
991   * @return Returns ERR_OK on success, others on failure.
992   */
AcquireFormState(const Want & want,const sptr<IRemoteObject> & callerToken,FormStateInfo & stateInfo)993 int FormMgrService::AcquireFormState(const Want &want,
994     const sptr<IRemoteObject> &callerToken, FormStateInfo &stateInfo)
995 {
996     HILOG_DEBUG("call");
997     ErrCode ret = CheckFormPermission();
998     if (ret != ERR_OK) {
999         HILOG_ERROR("acquire form state permission denied");
1000         return ret;
1001     }
1002     FormEventInfo eventInfo;
1003     eventInfo.bundleName = want.GetElement().GetBundleName();
1004     eventInfo.moduleName = want.GetStringParam(AppExecFwk::Constants::PARAM_MODULE_NAME_KEY);
1005     eventInfo.abilityName = want.GetElement().GetAbilityName();
1006     FormEventReport::SendFormEvent(FormEventName::ACQUIREFORMSTATE_FORM, HiSysEventType::BEHAVIOR, eventInfo);
1007     return FormMgrAdapter::GetInstance().AcquireFormState(want, callerToken, stateInfo);
1008 }
1009 
1010 /**
1011  * @brief Register form router event proxy.
1012  * @param formIds Indicates the ID of the forms.
1013  * @param callerToken Host client.
1014  * @return Returns ERR_OK on success, others on failure.
1015  */
RegisterFormRouterProxy(const std::vector<int64_t> & formIds,const sptr<IRemoteObject> & callerToken)1016 int FormMgrService::RegisterFormRouterProxy(const std::vector<int64_t> &formIds,
1017     const sptr<IRemoteObject> &callerToken)
1018 {
1019     HILOG_DEBUG("call");
1020     ErrCode ret = CheckFormPermission();
1021     if (ret != ERR_OK) {
1022         HILOG_ERROR("register form router proxy permission denied");
1023         return ret;
1024     }
1025     return FormMgrAdapter::GetInstance().RegisterFormRouterProxy(formIds, callerToken);
1026 }
1027 
1028 /**
1029 * @brief Unregister form router event proxy.
1030 * @param formIds Indicates the ID of the forms.
1031 * @return Returns ERR_OK on success, others on failure.
1032 */
UnregisterFormRouterProxy(const std::vector<int64_t> & formIds)1033 int FormMgrService::UnregisterFormRouterProxy(const std::vector<int64_t> &formIds)
1034 {
1035     HILOG_DEBUG("call");
1036     ErrCode ret = CheckFormPermission();
1037     if (ret != ERR_OK) {
1038         HILOG_ERROR("unregister form router proxy permission denied");
1039         return ret;
1040     }
1041     return FormMgrAdapter::GetInstance().UnregisterFormRouterProxy(formIds);
1042 }
1043 
1044 /**
1045  * @brief Notify the form is visible or not.
1046  * @param formIds Indicates the ID of the forms.
1047  * @param isVisible Visible or not.
1048  * @param callerToken Host client.
1049  * @return Returns ERR_OK on success, others on failure.
1050  */
NotifyFormsVisible(const std::vector<int64_t> & formIds,bool isVisible,const sptr<IRemoteObject> & callerToken)1051 int FormMgrService::NotifyFormsVisible(const std::vector<int64_t> &formIds,
1052     bool isVisible, const sptr<IRemoteObject> &callerToken)
1053 {
1054     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1055         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1056         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1057     ErrCode ret = CheckFormPermission();
1058     if (ret != ERR_OK) {
1059         HILOG_ERROR("notify form visible permission denied");
1060         return ret;
1061     }
1062     return FormMgrAdapter::GetInstance().NotifyFormsVisible(formIds, isVisible, callerToken);
1063 }
1064 
NotifyFormsPrivacyProtected(const std::vector<int64_t> & formIds,bool isProtected,const sptr<IRemoteObject> & callerToken)1065 int FormMgrService::NotifyFormsPrivacyProtected(const std::vector<int64_t> &formIds, bool isProtected,
1066     const sptr<IRemoteObject> &callerToken)
1067 {
1068     HILOG_DEBUG("call");
1069     ErrCode ret = CheckFormPermission();
1070     if (ret != ERR_OK) {
1071         HILOG_ERROR("notify form is privacy protected permission denied");
1072         return ret;
1073     }
1074     return ERR_APPEXECFWK_FORM_COMMON_CODE;
1075 }
1076 
1077 /**
1078  * @brief Notify the form is enable to be updated or not.
1079  * @param formIds Indicates the ID of the forms.
1080  * @param isEnableUpdate enable update or not.
1081  * @param callerToken Host client.
1082  * @return Returns ERR_OK on success, others on failure.
1083  */
NotifyFormsEnableUpdate(const std::vector<int64_t> & formIds,bool isEnableUpdate,const sptr<IRemoteObject> & callerToken)1084 int FormMgrService::NotifyFormsEnableUpdate(const std::vector<int64_t> &formIds,
1085     bool isEnableUpdate, const sptr<IRemoteObject> &callerToken)
1086 {
1087     HILOG_DEBUG("call");
1088     ErrCode ret = CheckFormPermission();
1089     if (ret != ERR_OK) {
1090         HILOG_ERROR("notify form enable update permission denied");
1091         return ret;
1092     }
1093     return FormMgrAdapter::GetInstance().NotifyFormsEnableUpdate(formIds, isEnableUpdate, callerToken);
1094 }
1095 
1096 /**
1097  * @brief Get All FormsInfo.
1098  * @param formInfos Return the form information of all forms provided.
1099  * @return Returns ERR_OK on success, others on failure.
1100  */
GetAllFormsInfo(std::vector<FormInfo> & formInfos)1101 int FormMgrService::GetAllFormsInfo(std::vector<FormInfo> &formInfos)
1102 {
1103     HILOG_DEBUG("call");
1104     if (!CheckCallerIsSystemApp()) {
1105         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1106     }
1107     if (!CheckAcrossLocalAccountsPermission()) {
1108         HILOG_ERROR("Across local accounts permission failed");
1109         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1110     }
1111     return FormMgrAdapter::GetInstance().GetAllFormsInfo(formInfos);
1112 }
1113 
1114 /**
1115  * @brief Get forms info by bundle name.
1116  * @param bundleName Application name.
1117  * @param formInfos Return the form information of the specify application name.
1118  * @return Returns ERR_OK on success, others on failure.
1119  */
GetFormsInfoByApp(std::string & bundleName,std::vector<FormInfo> & formInfos)1120 int FormMgrService::GetFormsInfoByApp(std::string &bundleName, std::vector<FormInfo> &formInfos)
1121 {
1122     HILOG_DEBUG("call");
1123     if (!CheckCallerIsSystemApp()) {
1124         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1125     }
1126     if (!CheckAcrossLocalAccountsPermission()) {
1127         HILOG_ERROR("Across local accounts permission failed");
1128         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1129     }
1130     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_GetFormsInfoByApp",
1131         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1132     ErrCode ret = FormMgrAdapter::GetInstance().GetFormsInfoByApp(bundleName, formInfos);
1133     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1134     return ret;
1135 }
1136 
1137 /**
1138  * @brief Get forms info by bundle name and module name.
1139  * @param bundleName bundle name.
1140  * @param moduleName Module name of hap.
1141  * @param formInfos Return the forms information of the specify bundle name and module name.
1142  * @return Returns ERR_OK on success, others on failure.
1143  */
GetFormsInfoByModule(std::string & bundleName,std::string & moduleName,std::vector<FormInfo> & formInfos)1144 int FormMgrService::GetFormsInfoByModule(std::string &bundleName, std::string &moduleName,
1145                                          std::vector<FormInfo> &formInfos)
1146 {
1147     HILOG_DEBUG("call");
1148     if (!CheckCallerIsSystemApp()) {
1149         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1150     }
1151     if (!CheckAcrossLocalAccountsPermission()) {
1152         HILOG_ERROR("Across local accounts permission failed");
1153         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1154     }
1155     return FormMgrAdapter::GetInstance().GetFormsInfoByModule(bundleName, moduleName, formInfos);
1156 }
1157 
GetFormsInfoByFilter(const FormInfoFilter & filter,std::vector<FormInfo> & formInfos)1158 int FormMgrService::GetFormsInfoByFilter(const FormInfoFilter &filter, std::vector<FormInfo> &formInfos)
1159 {
1160     HILOG_DEBUG("call");
1161     if (!CheckCallerIsSystemApp()) {
1162         HILOG_ERROR("Need system authority");
1163         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1164     }
1165     if (!CheckAcrossLocalAccountsPermission()) {
1166         HILOG_ERROR("Across local accounts permission failed");
1167         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1168     }
1169     return FormMgrAdapter::GetInstance().GetFormsInfoByFilter(filter, formInfos);
1170 }
1171 
GetFormsInfo(const FormInfoFilter & filter,std::vector<FormInfo> & formInfos)1172 int32_t FormMgrService::GetFormsInfo(const FormInfoFilter &filter, std::vector<FormInfo> &formInfos)
1173 {
1174     HILOG_DEBUG("call");
1175     std::string callerBundleName;
1176     ErrCode ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName);
1177     if (ret != ERR_OK) {
1178         HILOG_ERROR("get host bundle name failed");
1179         return ret;
1180     }
1181     // retrieve moduleName from filter.
1182     std::string moduleName = filter.moduleName;
1183     if (moduleName.empty()) {
1184         // fulfill formInfos, the process should be the same as GetFormsInfoByApp.
1185         HILOG_INFO("flows to GetFormsInfoByAPP");
1186         return FormMgrAdapter::GetInstance().GetFormsInfoByApp(callerBundleName, formInfos);
1187     }
1188     HILOG_INFO("flows to GetFormsInfoByModule");
1189     return FormMgrAdapter::GetInstance().GetFormsInfoByModule(callerBundleName, moduleName, formInfos);
1190 }
1191 
GetPublishedFormInfoById(const int64_t formId,RunningFormInfo & formInfo)1192 int32_t FormMgrService::GetPublishedFormInfoById(const int64_t formId, RunningFormInfo &formInfo)
1193 {
1194     HILOG_DEBUG("call");
1195     std::string callerBundleName;
1196     ErrCode ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName);
1197     if (ret != ERR_OK) {
1198         HILOG_ERROR("get host bundle name failed");
1199         return ret;
1200     }
1201     HILOG_INFO("flows to GetPublishedFormInfoById");
1202     return FormDataMgr::GetInstance().GetPublishedFormInfoById(callerBundleName, formInfo, formId);
1203 }
1204 
GetPublishedFormInfos(std::vector<RunningFormInfo> & formInfos)1205 int32_t FormMgrService::GetPublishedFormInfos(std::vector<RunningFormInfo> &formInfos)
1206 {
1207     HILOG_DEBUG("call");
1208     std::string callerBundleName;
1209     ErrCode ret = FormBmsHelper::GetInstance().GetCallerBundleName(callerBundleName);
1210     if (ret != ERR_OK) {
1211         HILOG_ERROR("get host bundle name failed");
1212         return ret;
1213     }
1214     HILOG_INFO("flows to GetPublishedFormInfos");
1215     return FormDataMgr::GetInstance().GetPublishedFormInfos(callerBundleName, formInfos);
1216 }
1217 
AcquireFormData(int64_t formId,int64_t requestCode,const sptr<IRemoteObject> & callerToken,AAFwk::WantParams & formData)1218 int32_t FormMgrService::AcquireFormData(int64_t formId, int64_t requestCode, const sptr<IRemoteObject> &callerToken,
1219     AAFwk::WantParams &formData)
1220 {
1221     HILOG_DEBUG("call");
1222     if (formId <= 0) {
1223         HILOG_ERROR("invalid formId");
1224         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1225     }
1226 
1227     if (callerToken == nullptr) {
1228         HILOG_ERROR("null callerToken");
1229         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1230     }
1231 
1232     if (requestCode <= 0) {
1233         HILOG_ERROR("invalid requestCode");
1234         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1235     }
1236 
1237     ErrCode ret = CheckFormPermission();
1238     if (ret != ERR_OK) {
1239         HILOG_ERROR("request form permission denied");
1240         return ret;
1241     }
1242     return FormMgrAdapter::GetInstance().AcquireFormData(formId, requestCode, callerToken, formData);
1243 }
1244 
IsRequestPublishFormSupported()1245 bool FormMgrService::IsRequestPublishFormSupported()
1246 {
1247     HILOG_DEBUG("call");
1248     if (!CheckCallerIsSystemApp()) {
1249         return false;
1250     }
1251     return FormMgrAdapter::GetInstance().IsRequestPublishFormSupported();
1252 }
1253 
StartAbility(const Want & want,const sptr<IRemoteObject> & callerToken)1254 int32_t FormMgrService::StartAbility(const Want &want, const sptr<IRemoteObject> &callerToken)
1255 {
1256     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1257         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1258         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1259     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_START_ABILITIES_FROM_BACKGROUND);
1260     if (ret != ERR_OK) {
1261         HILOG_ERROR("start ability check permission denied");
1262         return ret;
1263     }
1264     // check abilityName and uri to void implicit want.
1265     if (want.GetElement().GetAbilityName().empty() && want.GetUriString().empty()) {
1266         HILOG_ERROR("empty AbilityName and uri");
1267         return ERR_APPEXECFWK_FORM_NO_SUCH_ABILITY;
1268     }
1269     sptr<AAFwk::IAbilityManager> ams = FormAmsHelper::GetInstance().GetAbilityManager();
1270     if (ams == nullptr) {
1271         HILOG_ERROR("fail get abilityMgr");
1272         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1273     }
1274     return ams->StartAbility(want, callerToken, -1, -1);
1275 }
1276 
StartAbilityByFms(const Want & want)1277 int32_t FormMgrService::StartAbilityByFms(const Want &want)
1278 {
1279     HILOG_INFO("call");
1280     return FormMgrAdapter::GetInstance().StartAbilityByFms(want);
1281 }
1282 
InitFormShareMgrSerialQueue()1283 void FormMgrService::InitFormShareMgrSerialQueue()
1284 {
1285     DelayedSingleton<FormShareMgr>::GetInstance()->SetSerialQueue(serialQueue_);
1286     DelayedSingleton<FormShareMgr>::GetInstance()->SetEventHandler(handler_);
1287 }
1288 
ShareForm(int64_t formId,const std::string & deviceId,const sptr<IRemoteObject> & callerToken,int64_t requestCode)1289 int32_t FormMgrService::ShareForm(int64_t formId, const std::string &deviceId, const sptr<IRemoteObject> &callerToken,
1290     int64_t requestCode)
1291 {
1292     HILOG_DEBUG("FormMgrService ShareForm call deviceId :%{public}s, formId:%{public}" PRId64 "",
1293         deviceId.c_str(), formId);
1294     if (formId <= 0) {
1295         HILOG_ERROR("invalid formId");
1296         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1297     }
1298 
1299     if (deviceId.empty()) {
1300         HILOG_ERROR("empty deviceId");
1301         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1302     }
1303 
1304     if (callerToken == nullptr) {
1305         HILOG_ERROR("null callerToken");
1306         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1307     }
1308 
1309     if (requestCode <= 0) {
1310         HILOG_ERROR("invalid requestCode");
1311         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1312     }
1313 
1314     auto ret = CheckFormPermission();
1315     if (ret != ERR_OK) {
1316         HILOG_ERROR("share form permission denied");
1317         return ret;
1318     }
1319 
1320     ret = FormDataMgr::GetInstance().CheckInvalidForm(formId);
1321     if (ret != ERR_OK) {
1322         HILOG_ERROR("invalid formId or not under currentActiveUser");
1323         return ret;
1324     }
1325 
1326     InitFormShareMgrSerialQueue();
1327 
1328     return DelayedSingleton<FormShareMgr>::GetInstance()->ShareForm(formId, deviceId, callerToken, requestCode);
1329 }
1330 
RecvFormShareInfoFromRemote(const FormShareInfo & info)1331 int32_t FormMgrService::RecvFormShareInfoFromRemote(const FormShareInfo &info)
1332 {
1333     HILOG_DEBUG("call");
1334     if (!FormUtil::IsSACall()) {
1335         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1336     }
1337 
1338     InitFormShareMgrSerialQueue();
1339 
1340     return DelayedSingleton<FormShareMgr>::GetInstance()->RecvFormShareInfoFromRemote(info);
1341 }
1342 
Dump(int fd,const std::vector<std::u16string> & args)1343 int FormMgrService::Dump(int fd, const std::vector<std::u16string> &args)
1344 {
1345     if (!CheckFMSReady()) {
1346         HILOG_ERROR("fms not ready");
1347         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1348     }
1349 
1350     std::string result;
1351     Dump(args, result);
1352     int ret = dprintf(fd, "%s\n", result.c_str());
1353     if (ret < 0) {
1354         HILOG_ERROR("format dprintf error");
1355         return ERR_APPEXECFWK_FORM_COMMON_CODE;
1356     }
1357     return ERR_OK;
1358 }
1359 
Dump(const std::vector<std::u16string> & args,std::string & result)1360 void FormMgrService::Dump(const std::vector<std::u16string> &args, std::string &result)
1361 {
1362     DumpKey key;
1363     std::string value;
1364     if (!ParseOption(args, key, value, result)) {
1365         result.append('\n' + FORM_DUMP_HELP);
1366         return;
1367     }
1368 
1369     switch (key) {
1370         case DumpKey::KEY_DUMP_HELP:
1371             return HiDumpHelp(value, result);
1372         case DumpKey::KEY_DUMP_STATIC:
1373             return HiDumpStaticBundleFormInfos(value, result);
1374         case DumpKey::KEY_DUMP_STORAGE:
1375             return HiDumpStorageFormInfos(value, result);
1376         case DumpKey::KEY_DUMP_VISIBLE:
1377             return HiDumpHasFormVisible(value, result);
1378         case DumpKey::KEY_DUMP_TEMPORARY:
1379             return HiDumpTemporaryFormInfos(value, result);
1380         case DumpKey::KEY_DUMP_BY_BUNDLE_NAME:
1381             return HiDumpFormInfoByBundleName(value, result);
1382         case DumpKey::KEY_DUMP_BY_FORM_ID:
1383             return HiDumpFormInfoByFormId(value, result);
1384         case DumpKey::KEY_DUMP_RUNNING:
1385             return HiDumpFormRunningFormInfos(value, result);
1386         case DumpKey::KEY_DUMP_BLOCKED_APPS:
1387             return HiDumpFormBlockedApps(value, result);
1388         default:
1389             result = "error: unknow function.";
1390             return;
1391     }
1392 }
1393 
RegisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)1394 int32_t FormMgrService::RegisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
1395 {
1396     HILOG_DEBUG("call");
1397     sptr<IBundleMgr> bundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1398     if (bundleMgr == nullptr) {
1399         HILOG_ERROR("error to get bundleMgr");
1400         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1401     }
1402     // check if system app
1403     auto callingUid = IPCSkeleton::GetCallingUid();
1404     auto isSystemApp = bundleMgr->CheckIsSystemAppByUid(callingUid);
1405     if (!isSystemApp) {
1406         HILOG_ERROR("no permission");
1407         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1408     }
1409     return FormMgrAdapter::GetInstance().RegisterPublishFormInterceptor(interceptorCallback);
1410 }
1411 
UnregisterPublishFormInterceptor(const sptr<IRemoteObject> & interceptorCallback)1412 int32_t FormMgrService::UnregisterPublishFormInterceptor(const sptr<IRemoteObject> &interceptorCallback)
1413 {
1414     HILOG_DEBUG("call");
1415     sptr<IBundleMgr> bundleMgr = FormBmsHelper::GetInstance().GetBundleMgr();
1416     if (bundleMgr == nullptr) {
1417         HILOG_ERROR("fail get bundleMgr");
1418         return ERR_APPEXECFWK_FORM_GET_BMS_FAILED;
1419     }
1420     // check if system app
1421     auto callingUid = IPCSkeleton::GetCallingUid();
1422     auto isSystemApp = bundleMgr->CheckIsSystemAppByUid(callingUid);
1423     if (!isSystemApp) {
1424         HILOG_ERROR("permission denied");
1425         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1426     }
1427     return FormMgrAdapter::GetInstance().UnregisterPublishFormInterceptor(interceptorCallback);
1428 }
1429 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)1430 void FormMgrService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
1431 {
1432 #ifdef RES_SCHEDULE_ENABLE
1433     if (systemAbilityId == RES_SCHED_SYS_ABILITY_ID) {
1434         auto formSystemloadLevelCb = [this](int32_t level) { this->OnSystemloadLevel(level); };
1435         sptr<FormSystemloadListener> formSystemloadListener
1436             = new (std::nothrow) FormSystemloadListener(formSystemloadLevelCb);
1437         ResourceSchedule::ResSchedClient::GetInstance().RegisterSystemloadNotifier(formSystemloadListener);
1438         HILOG_INFO("RegisterSystemloadNotifier for Systemloadlevel change");
1439         return;
1440     }
1441 #endif // RES_SCHEDULE_ENABLE
1442 
1443 #ifdef MEM_MGR_ENABLE
1444     if (systemAbilityId == MEMORY_MANAGER_SA_ID) {
1445         HILOG_INFO("MEMORY_MANAGER_SA start,SubscribeAppState");
1446         Memory::MemMgrClient::GetInstance().SubscribeAppState(*memStatusListener_);
1447         return;
1448     }
1449 #endif // MEM_MGR_ENABLE
1450 
1451     if (systemAbilityId != DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID) {
1452         return;
1453     }
1454     onKvDataServiceAddTime_ = GetCurrentDateTime();
1455     FormDataProxyMgr::GetInstance().RetryFailureSubscribes();
1456     HILOG_INFO("FMS KV data service add time:%{public}s", onKvDataServiceAddTime_.c_str());
1457 }
1458 
ParseOption(const std::vector<std::u16string> & args,DumpKey & key,std::string & value,std::string & result)1459 bool FormMgrService::ParseOption(const std::vector<std::u16string> &args, DumpKey &key, std::string &value,
1460     std::string &result)
1461 {
1462     auto size = args.size();
1463     if (size == 0) {
1464         result = "error: must contain arguments.";
1465         return false;
1466     }
1467 
1468     if (size > FORM_DUMP_ARGC_MAX) {
1469         result = "error: arguments numer out of limit.";
1470         return false;
1471     }
1472 
1473     std::string optionKey = Str16ToStr8(args[0]);
1474     auto iter = dumpKeyMap_.find(optionKey);
1475     if (iter == dumpKeyMap_.end()) {
1476         result = "error: unknown option.";
1477         return false;
1478     }
1479 
1480     key = iter->second;
1481 
1482     if (args.size() == FORM_DUMP_ARGC_MAX) {
1483         value = Str16ToStr8(args[1]);
1484     }
1485 
1486     return true;
1487 }
1488 
HiDumpFormRunningFormInfos(const std::string & args,std::string & result)1489 void FormMgrService::HiDumpFormRunningFormInfos([[maybe_unused]]const std::string &args, std::string &result)
1490 {
1491     HILOG_DEBUG("call");
1492     if (!CheckCallerIsSystemApp()) {
1493         return;
1494     }
1495     FormMgrAdapter::GetInstance().DumpFormRunningFormInfos(result);
1496 }
1497 
HiDumpHelp(const std::string & args,std::string & result)1498 void FormMgrService::HiDumpHelp([[maybe_unused]] const std::string &args, std::string &result)
1499 {
1500     result = FORM_DUMP_HELP;
1501 }
1502 
HiDumpStorageFormInfos(const std::string & args,std::string & result)1503 void FormMgrService::HiDumpStorageFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1504 {
1505     DumpStorageFormInfos(result);
1506 }
1507 
HiDumpTemporaryFormInfos(const std::string & args,std::string & result)1508 void FormMgrService::HiDumpTemporaryFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1509 {
1510     if (!CheckCallerIsSystemApp()) {
1511         return;
1512     }
1513     FormMgrAdapter::GetInstance().DumpTemporaryFormInfos(result);
1514 }
1515 
HiDumpStaticBundleFormInfos(const std::string & args,std::string & result)1516 void FormMgrService::HiDumpStaticBundleFormInfos([[maybe_unused]] const std::string &args, std::string &result)
1517 {
1518     if (!CheckCallerIsSystemApp()) {
1519         return;
1520     }
1521     FormMgrAdapter::GetInstance().DumpStaticBundleFormInfos(result);
1522 }
1523 
HiDumpFormInfoByBundleName(const std::string & args,std::string & result)1524 void FormMgrService::HiDumpFormInfoByBundleName(const std::string &args, std::string &result)
1525 {
1526     if (args.empty()) {
1527         result = "error: request a bundle name.";
1528         return;
1529     }
1530     DumpFormInfoByBundleName(args, result);
1531 }
1532 
HiDumpHasFormVisible(const std::string & args,std::string & result)1533 void FormMgrService::HiDumpHasFormVisible(const std::string &args, std::string &result)
1534 {
1535     if (args.empty()) {
1536         result = "error:request bundle info like bundleName_userId_instIndex.";
1537     }
1538     FormMgrAdapter::GetInstance().DumpHasFormVisible(args, result);
1539 }
1540 
HiDumpFormBlockedApps(const std::string & args,std::string & result)1541 void FormMgrService::HiDumpFormBlockedApps([[maybe_unused]] const std::string &args, std::string &result)
1542 {
1543     if (!CheckCallerIsSystemApp()) {
1544         return;
1545     }
1546     FormTrustMgr::GetInstance().GetUntrustAppNameList(result);
1547 }
1548 
HiDumpFormInfoByFormId(const std::string & args,std::string & result)1549 void FormMgrService::HiDumpFormInfoByFormId(const std::string &args, std::string &result)
1550 {
1551     if (args.empty()) {
1552         result = "error: request a form ID.";
1553         return;
1554     }
1555     int64_t formId = atoll(args.c_str());
1556     if (formId == 0) {
1557         result = "error: form ID is invalid.";
1558         return;
1559     }
1560     DumpFormInfoByFormId(formId, result);
1561 }
1562 
CheckCallerIsSystemApp() const1563 bool FormMgrService::CheckCallerIsSystemApp() const
1564 {
1565     auto callerTokenID = IPCSkeleton::GetCallingFullTokenID();
1566     if (!FormUtil::IsSACall() && !Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(callerTokenID)) {
1567         HILOG_ERROR("The caller not system-app,can't use system-api");
1568         return false;
1569     }
1570     return true;
1571 }
1572 
GetCurrentDateTime()1573 std::string FormMgrService::GetCurrentDateTime()
1574 {
1575     auto cTimeNow = std::chrono::system_clock::now();
1576     auto microPart = std::chrono::duration_cast<std::chrono::milliseconds>(
1577         cTimeNow.time_since_epoch()).count() % 1000;
1578     std::time_t t1 = std::chrono::system_clock::to_time_t(cTimeNow);
1579     char buf[32];
1580     std::tm t2;
1581     localtime_r(&t1, &t2);
1582     (void)strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S.", &t2);
1583     std::stringstream ss;
1584     ss << buf << std::setw(MILLISECOND_WIDTH) << std::setfill(MILLISECOND_FILLCHAR) << microPart;
1585     return ss.str();
1586 }
1587 
CheckAcrossLocalAccountsPermission() const1588 bool FormMgrService::CheckAcrossLocalAccountsPermission() const
1589 {
1590     // checks whether the current user is inactive
1591     int callingUid = IPCSkeleton::GetCallingUid();
1592     int32_t userId = callingUid / Constants::CALLING_UID_TRANSFORM_DIVISOR;
1593     int32_t currentActiveUserId = FormUtil::GetCurrentAccountId();
1594     if (userId != currentActiveUserId) {
1595         HILOG_INFO("currentActiveUserId:%{public}d, userId:%{public}d", currentActiveUserId, userId);
1596         bool isCallingPermAccount =
1597             FormUtil::VerifyCallingPermission(AppExecFwk::Constants::PERMISSION_INTERACT_ACROSS_LOCAL_ACCOUNTS);
1598         if (!isCallingPermAccount) {
1599             HILOG_ERROR("Across local accounts permission failed");
1600             return false;
1601         }
1602     }
1603     return true;
1604 }
1605 
RegisterFormAddObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)1606 ErrCode FormMgrService::RegisterFormAddObserverByBundle(const std::string bundleName,
1607     const sptr<IRemoteObject> &callerToken)
1608 {
1609     HILOG_DEBUG("call");
1610     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1611     if (ret != ERR_OK) {
1612         HILOG_ERROR("register form add observer permission denied");
1613         return ret;
1614     }
1615     return FormMgrAdapter::GetInstance().RegisterFormAddObserverByBundle(bundleName, callerToken);
1616 }
1617 
RegisterFormRemoveObserverByBundle(const std::string bundleName,const sptr<IRemoteObject> & callerToken)1618 ErrCode FormMgrService::RegisterFormRemoveObserverByBundle(const std::string bundleName,
1619     const sptr<IRemoteObject> &callerToken)
1620 {
1621     HILOG_DEBUG("call");
1622     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1623     if (ret != ERR_OK) {
1624         HILOG_ERROR("register form remove observer permission denied");
1625         return ret;
1626     }
1627     return FormMgrAdapter::GetInstance().RegisterFormRemoveObserverByBundle(bundleName, callerToken);
1628 }
1629 
GetFormsCount(bool isTempFormFlag,int32_t & formCount)1630 int32_t FormMgrService::GetFormsCount(bool isTempFormFlag, int32_t &formCount)
1631 {
1632     HILOG_DEBUG("call");
1633     return FormMgrAdapter::GetInstance().GetFormsCount(isTempFormFlag, formCount);
1634 }
1635 
GetHostFormsCount(std::string & bundleName,int32_t & formCount)1636 int32_t FormMgrService::GetHostFormsCount(std::string &bundleName, int32_t &formCount)
1637 {
1638     HILOG_DEBUG("call");
1639     return FormMgrAdapter::GetInstance().GetHostFormsCount(bundleName, formCount);
1640 }
1641 
GetRunningFormInfos(bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)1642 ErrCode FormMgrService::GetRunningFormInfos(bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
1643 {
1644     HILOG_DEBUG("call");
1645     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1646     if (ret != ERR_OK) {
1647         HILOG_ERROR("get running form infos permission denied");
1648         return ret;
1649     }
1650     return FormMgrAdapter::GetInstance().GetRunningFormInfos(isUnusedIncluded, runningFormInfos);
1651 }
1652 
GetRunningFormInfosByBundleName(const std::string & bundleName,bool isUnusedIncluded,std::vector<RunningFormInfo> & runningFormInfos)1653 ErrCode FormMgrService::GetRunningFormInfosByBundleName(
1654     const std::string &bundleName, bool isUnusedIncluded, std::vector<RunningFormInfo> &runningFormInfos)
1655 {
1656     HILOG_DEBUG("call");
1657     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1658     if (ret != ERR_OK) {
1659         HILOG_ERROR("get running form infos by bundle name permission denied");
1660         return ret;
1661     }
1662     return FormMgrAdapter::GetInstance().GetRunningFormInfosByBundleName(
1663         bundleName, isUnusedIncluded, runningFormInfos);
1664 }
1665 
GetFormInstancesByFilter(const FormInstancesFilter & formInstancesFilter,std::vector<FormInstance> & formInstances)1666 ErrCode FormMgrService::GetFormInstancesByFilter(const FormInstancesFilter &formInstancesFilter,
1667     std::vector<FormInstance> &formInstances)
1668 {
1669     HILOG_DEBUG("call");
1670     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1671     if (ret != ERR_OK) {
1672         HILOG_ERROR("get form instances by filter permission denied");
1673         return ret;
1674     }
1675     return FormMgrAdapter::GetInstance().GetFormInstancesByFilter(formInstancesFilter, formInstances);
1676 }
1677 
GetFormInstanceById(const int64_t formId,FormInstance & formInstance)1678 ErrCode FormMgrService::GetFormInstanceById(const int64_t formId, FormInstance &formInstance)
1679 {
1680     HILOG_DEBUG("call");
1681     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1682     if (ret != ERR_OK) {
1683         HILOG_ERROR("get form instance by id permission denied");
1684         return ret;
1685     }
1686     return FormMgrAdapter::GetInstance().GetFormInstanceById(formId, formInstance);
1687 }
1688 
GetFormInstanceById(const int64_t formId,bool isUnusedIncluded,FormInstance & formInstance)1689 ErrCode FormMgrService::GetFormInstanceById(const int64_t formId, bool isUnusedIncluded, FormInstance &formInstance)
1690 {
1691     HILOG_DEBUG("call");
1692     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1693     if (ret != ERR_OK) {
1694         HILOG_ERROR("get form instance by id permission denied");
1695         return ret;
1696     }
1697     return FormMgrAdapter::GetInstance().GetFormInstanceById(formId, isUnusedIncluded, formInstance);
1698 }
1699 
RegisterAddObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)1700 ErrCode FormMgrService::RegisterAddObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
1701 {
1702     HILOG_DEBUG("call");
1703     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1704     if (ret != ERR_OK) {
1705         HILOG_ERROR("register notifyVisible or notifyInVisible observer permission denied");
1706         return ret;
1707     }
1708     return FormMgrAdapter::GetInstance().RegisterAddObserver(bundleName, callerToken);
1709 }
1710 
RegisterRemoveObserver(const std::string & bundleName,const sptr<IRemoteObject> & callerToken)1711 ErrCode FormMgrService::RegisterRemoveObserver(const std::string &bundleName, const sptr<IRemoteObject> &callerToken)
1712 {
1713     HILOG_DEBUG("call");
1714     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1715     if (ret != ERR_OK) {
1716         HILOG_ERROR("unregister notifyVisible or notifyInVisible observer permission denied");
1717         return ret;
1718     }
1719     return FormMgrAdapter::GetInstance().RegisterRemoveObserver(bundleName, callerToken);
1720 }
1721 
UpdateProxyForm(int64_t formId,const FormProviderData & formBindingData,const std::vector<FormDataProxy> & formDataProxies)1722 ErrCode FormMgrService::UpdateProxyForm(int64_t formId, const FormProviderData &formBindingData,
1723     const std::vector<FormDataProxy> &formDataProxies)
1724 {
1725     HILOG_DEBUG("call");
1726     auto callingUid = IPCSkeleton::GetCallingUid();
1727     return FormMgrAdapter::GetInstance().UpdateForm(formId, callingUid, formBindingData, formDataProxies);
1728 }
1729 
RequestPublishProxyForm(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId,const std::vector<FormDataProxy> & formDataProxies)1730 ErrCode FormMgrService::RequestPublishProxyForm(Want &want, bool withFormBindingData,
1731     std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId,
1732     const std::vector<FormDataProxy> &formDataProxies)
1733 {
1734     HILOG_DEBUG("call");
1735     if (!CheckCallerIsSystemApp()) {
1736         return ERR_APPEXECFWK_FORM_PERMISSION_DENY_SYS;
1737     }
1738 
1739     if (!CheckAcrossLocalAccountsPermission()) {
1740         HILOG_ERROR("Across local accounts permission failed");
1741         return ERR_APPEXECFWK_FORM_PERMISSION_DENY;
1742     }
1743     return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData, formId,
1744         formDataProxies);
1745 }
1746 
RegisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)1747 ErrCode FormMgrService::RegisterClickEventObserver(
1748     const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
1749 {
1750     HILOG_DEBUG("call");
1751     if (observer == nullptr) {
1752         HILOG_ERROR("empty callerTokenParameter");
1753         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1754     }
1755     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1756     if (ret != ERR_OK) {
1757         HILOG_ERROR("register form add observer permission denied");
1758         return ret;
1759     }
1760     return FormMgrAdapter::GetInstance().RegisterClickEventObserver(bundleName, formEventType, observer);
1761 }
1762 
UnregisterClickEventObserver(const std::string & bundleName,const std::string & formEventType,const sptr<IRemoteObject> & observer)1763 ErrCode FormMgrService::UnregisterClickEventObserver(
1764     const std::string &bundleName, const std::string &formEventType, const sptr<IRemoteObject> &observer)
1765 {
1766     HILOG_DEBUG("call");
1767     if (observer == nullptr) {
1768         HILOG_ERROR("empty callerTokenParameter");
1769         return ERR_APPEXECFWK_FORM_INVALID_PARAM;
1770     }
1771     ErrCode ret = CheckFormPermission(AppExecFwk::Constants::PERMISSION_OBSERVE_FORM_RUNNING);
1772     if (ret != ERR_OK) {
1773         HILOG_ERROR("register form add observer permission denied");
1774         return ret;
1775     }
1776     return FormMgrAdapter::GetInstance().UnregisterClickEventObserver(bundleName, formEventType, observer);
1777 }
1778 
SetFormsRecyclable(const std::vector<int64_t> & formIds)1779 int32_t FormMgrService::SetFormsRecyclable(const std::vector<int64_t> &formIds)
1780 {
1781     HILOG_DEBUG("call");
1782     ErrCode ret = CheckFormPermission();
1783     if (ret != ERR_OK) {
1784         HILOG_ERROR("set forms recyclable permission denied");
1785         return ret;
1786     }
1787     return FormMgrAdapter::GetInstance().SetFormsRecyclable(formIds);
1788 }
1789 
RecycleForms(const std::vector<int64_t> & formIds,const Want & want)1790 int32_t FormMgrService::RecycleForms(const std::vector<int64_t> &formIds, const Want &want)
1791 {
1792     HILOG_DEBUG("call");
1793     ErrCode ret = CheckFormPermission();
1794     if (ret != ERR_OK) {
1795         HILOG_ERROR("recycle forms permission denied");
1796         return ret;
1797     }
1798     return FormMgrAdapter::GetInstance().RecycleForms(formIds, want);
1799 }
1800 
RecoverForms(const std::vector<int64_t> & formIds,const Want & want)1801 int32_t FormMgrService::RecoverForms(const std::vector<int64_t> &formIds, const Want &want)
1802 {
1803     HILOG_DEBUG("call");
1804     ErrCode ret = CheckFormPermission();
1805     if (ret != ERR_OK) {
1806         HILOG_ERROR("recover forms permission denied");
1807         return ret;
1808     }
1809     return FormMgrAdapter::GetInstance().RecoverForms(formIds, want);
1810 }
1811 
UpdateFormLocation(const int64_t & formId,const int32_t & formLocation)1812 ErrCode FormMgrService::UpdateFormLocation(const int64_t &formId, const int32_t &formLocation)
1813 {
1814     HILOG_DEBUG("call");
1815     ErrCode ret = CheckFormPermission();
1816     if (ret != ERR_OK) {
1817         HILOG_ERROR("update formLocation form infos permission denied");
1818         return ret;
1819     }
1820     return FormMgrAdapter::GetInstance().UpdateFormLocation(formId, formLocation);
1821 }
1822 
BatchRefreshForms(const int32_t formRefreshType)1823 ErrCode FormMgrService::BatchRefreshForms(const int32_t formRefreshType)
1824 {
1825     HILOG_DEBUG("call");
1826     ErrCode ret = CheckFormPermission();
1827     if (ret != ERR_OK) {
1828         HILOG_ERROR("batch update forms permission denied");
1829         return ret;
1830     }
1831     return FormMgrAdapter::GetInstance().BatchRefreshForms(formRefreshType);
1832 }
1833 
RequestPublishFormWithSnapshot(Want & want,bool withFormBindingData,std::unique_ptr<FormProviderData> & formBindingData,int64_t & formId)1834 ErrCode FormMgrService::RequestPublishFormWithSnapshot(Want &want, bool withFormBindingData,
1835     std::unique_ptr<FormProviderData> &formBindingData, int64_t &formId)
1836 {
1837     HILOG_INFO("begin:%{public}s, publish:%{public}s, end:%{public}s, onKvDataServiceAddTime:%{public}s",
1838         onStartBeginTime_.c_str(), onStartPublishTime_.c_str(),
1839         onStartEndTime_.c_str(), onKvDataServiceAddTime_.c_str());
1840     if (!CheckCallerIsSystemApp()) {
1841         want.SetAction(Constants::FORM_PAGE_ACTION);
1842         want.SetParam(Constants::PARAM_PAGE_ROUTER_SERVICE_CODE,
1843                       Constants::PAGE_ROUTER_SERVICE_CODE_FORM_MANAGE);
1844         const std::string key = Constants::PARMA_REQUEST_METHOD;
1845         const std::string value = Constants::OPEN_FORM_MANAGE_VIEW;
1846         want.SetParam(key, value);
1847         return FormMgrAdapter::GetInstance().StartAbilityByFms(want);
1848     }
1849     return FormMgrAdapter::GetInstance().RequestPublishForm(want, withFormBindingData, formBindingData,
1850                                                             formId, {}, false);
1851 }
1852 
1853 #ifdef RES_SCHEDULE_ENABLE
OnSystemloadLevel(int32_t level)1854 void FormMgrService::OnSystemloadLevel(int32_t level)
1855 {
1856     if (level >= SYSTEMLOADLEVEL_TIMERSTOP_THRESHOLD) {
1857         FormMgrAdapter::GetInstance().SetTimerTaskNeeded(false);
1858     } else {
1859         FormMgrAdapter::GetInstance().SetTimerTaskNeeded(true);
1860     }
1861 }
1862 #endif // RES_SCHEDULE_ENABLE
1863 
EnableForms(const std::string bundleName,const bool enable)1864 int32_t FormMgrService::EnableForms(const std::string bundleName, const bool enable)
1865 {
1866     ErrCode ret = CheckFormPermission();
1867     if (ret != ERR_OK) {
1868         HILOG_ERROR("disable forms permission denied");
1869         return ret;
1870     }
1871     return FormMgrAdapter::GetInstance().EnableForms(bundleName, enable);
1872 }
1873 
IsFormBundleForbidden(const std::string & bundleName)1874 bool FormMgrService::IsFormBundleForbidden(const std::string &bundleName)
1875 {
1876     HILOG_DEBUG("call");
1877     if (!CheckCallerIsSystemApp()) {
1878         return true;
1879     }
1880     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_IsFormBundleForbidden",
1881         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1882     bool result = FormBundleForbidMgr::GetInstance().IsBundleForbidden(bundleName);
1883     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1884     return result;
1885 }
1886 
LockForms(const std::vector<FormLockInfo> & formLockInfos,LockChangeType type)1887 int32_t FormMgrService::LockForms(const std::vector<FormLockInfo> &formLockInfos, LockChangeType type)
1888 {
1889     ErrCode ret = CheckFormPermission();
1890     if (ret != ERR_OK) {
1891         HILOG_ERROR("lock forms permission denied");
1892         return ret;
1893     }
1894 
1895     int32_t retErrCode = ERR_OK;
1896     for (const auto &info : formLockInfos) {
1897         if (type == LockChangeType::SWITCH_CHANGE) {
1898             ret = FormMgrAdapter::GetInstance().SwitchLockForms(info.bundleName, info.userId, info.lock);
1899             if (ret != ERR_OK) {
1900                 HILOG_ERROR("SwitchLockForms failed, bundleName: %{public}s, userId: %{public}d, "
1901                     "lock: %{public}d, ret: %{public}d", info.bundleName.c_str(), info.userId, info.lock, ret);
1902                 retErrCode = ret;
1903             }
1904         } else {
1905             ret = FormMgrAdapter::GetInstance().ProtectLockForms(info.bundleName, info.userId, info.lock);
1906             if (ret != ERR_OK) {
1907                 HILOG_ERROR("ProtectLockForms failed, bundleName: %{public}s, userId: %{public}d, "
1908                     "protect: %{public}d, ret: %{public}d", info.bundleName.c_str(), info.userId, info.lock, ret);
1909                 retErrCode = ret;
1910             }
1911         }
1912     }
1913     return retErrCode;
1914 }
1915 
IsFormBundleProtected(const std::string & bundleName,int64_t formId)1916 bool FormMgrService::IsFormBundleProtected(const std::string &bundleName, int64_t formId)
1917 {
1918     HILOG_DEBUG("call");
1919     if (!CheckCallerIsSystemApp()) {
1920         return true;
1921     }
1922     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_IsFormBundleProtected",
1923         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1924     bool result = FormBundleLockMgr::GetInstance().IsBundleProtect(bundleName, formId);
1925     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1926     return result;
1927 }
1928 
IsFormBundleExempt(int64_t formId)1929 bool FormMgrService::IsFormBundleExempt(int64_t formId)
1930 {
1931     HILOG_DEBUG("call");
1932     if (!CheckCallerIsSystemApp()) {
1933         return true;
1934     }
1935     int timerId = HiviewDFX::XCollie::GetInstance().SetTimer("FMS_IsFormBundleExempt",
1936         API_TIME_OUT, nullptr, nullptr, HiviewDFX::XCOLLIE_FLAG_LOG);
1937     bool result = FormExemptLockMgr::GetInstance().IsExemptLock(formId);
1938     HiviewDFX::XCollie::GetInstance().CancelTimer(timerId);
1939     return result;
1940 }
1941 
NotifyFormLocked(const int64_t & formId,bool isLocked)1942 int32_t FormMgrService::NotifyFormLocked(const int64_t &formId, bool isLocked)
1943 {
1944     HILOG_DEBUG("call");
1945     ErrCode ret = CheckFormPermission();
1946     if (ret != ERR_OK) {
1947         HILOG_ERROR("disable forms permission denied");
1948         return ret;
1949     }
1950     return FormMgrAdapter::GetInstance().NotifyFormLocked(formId, isLocked);
1951 }
1952 
UpdateFormSize(const int64_t & formId,float width,float height,float borderWidth)1953 ErrCode FormMgrService::UpdateFormSize(const int64_t &formId, float width, float height, float borderWidth)
1954 {
1955     HILOG_DEBUG("call");
1956     ErrCode ret = CheckFormPermission();
1957     if (ret != ERR_OK) {
1958         HILOG_ERROR("update formSize permission denied");
1959         return ret;
1960     }
1961     return FormMgrAdapter::GetInstance().UpdateFormSize(formId, width, height, borderWidth);
1962 }
1963 
SetNetConnect()1964 void FormMgrService::SetNetConnect()
1965 {
1966     int64_t currentTime = FormUtil::GetCurrentMillisecond();
1967     if ((currentTime - lastNetLostTime_) >= FORM_DISCON_NETWORK_CHECK_TIME) {
1968         FormMgrAdapter::GetInstance().UpdateFormByCondition(CONDITION_NETWORK);
1969     }
1970 }
1971 
SetDisConnectTypeTime()1972 void FormMgrService::SetDisConnectTypeTime()
1973 {
1974     lastNetLostTime_ = FormUtil::GetCurrentMillisecond();
1975 }
1976 
OpenFormEditAbility(const std::string & abilityName,const int64_t & formId,bool isMainPage)1977 ErrCode FormMgrService::OpenFormEditAbility(const std::string &abilityName, const int64_t &formId, bool isMainPage)
1978 {
1979     int uid = IPCSkeleton::GetCallingUid();
1980     std::string callerName;
1981     ErrCode ret = FormBmsHelper::GetInstance().GetBundleNameByUid(uid, callerName);
1982     if (ret != ERR_OK) {
1983         HILOG_ERROR("Get bundleName by uid failed");
1984         return ret;
1985     }
1986 
1987     RunningFormInfo runningFormInfo;
1988     ret = FormDataMgr::GetInstance().GetRunningFormInfosByFormId(formId, runningFormInfo);
1989     if (ret != ERR_OK) {
1990         HILOG_ERROR("Get running form info by id failed");
1991         return ret;
1992     }
1993 
1994     if (runningFormInfo.bundleName != callerName) {
1995         HILOG_ERROR("check bundleName fialed");
1996         return ERR_APPEXECFWK_FORM_OPERATION_NOT_SELF;
1997     }
1998 
1999     if (runningFormInfo.formVisiblity != FormVisibilityType::VISIBLE) {
2000         HILOG_ERROR("check form visibility fialed");
2001         return ERR_APPEXECFWK_FORM_NOT_TRUST;
2002     }
2003 
2004     WantParams wantarams;
2005     if (isMainPage) {
2006         WantParams formInfoParam;
2007         formInfoParam.SetParam("bundleName", String::Box(runningFormInfo.bundleName));
2008         formInfoParam.SetParam("abilityName", String::Box(runningFormInfo.abilityName));
2009         formInfoParam.SetParam("moduleName", String::Box(runningFormInfo.moduleName));
2010         formInfoParam.SetParam("cardDimension", Integer::Box(runningFormInfo.dimension));
2011         formInfoParam.SetParam("cardName", String::Box(runningFormInfo.formName));
2012         formInfoParam.SetParam("cardId", String::Box(std::to_string(formId)));
2013         formInfoParam.SetParam("formConfigAbility", String::Box(abilityName));
2014         wantarams.SetParam("formInfo", WantParamWrapper::Box(formInfoParam));
2015         wantarams.SetParam(Constants::PARMA_REQUEST_METHOD, String::Box(Constants::PARMA_OPEN_FORM_EDIT_VIEW));
2016     } else {
2017         wantarams.SetParam(Constants::PARMA_REQUEST_METHOD, String::Box(Constants::PARMA_OPEN_FORM_EDIT_SEC_PAGE_VIEW));
2018         wantarams.SetParam(Constants::PARAM_SEC_PAGE_ABILITY_NAME, String::Box(abilityName));
2019     }
2020     wantarams.SetParam(Constants::PARAM_PAGE_ROUTER_SERVICE_CODE,
2021         Integer::Box(Constants::PAGE_ROUTER_SERVICE_CODE_FORM_EDIT));
2022 
2023     Want want;
2024     want.SetAction(Constants::FORM_PAGE_ACTION);
2025     want.SetElementName(callerName, abilityName);
2026     want.SetParams(wantarams);
2027     return FormMgrAdapter::GetInstance().StartAbilityByFms(want);
2028 }
2029 }  // namespace AppExecFwk
2030 }  // namespace OHOS
2031