1 /*
2 * Copyright (c) 2022 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 #include "form_share_mgr.h"
16 #include "form_ams_helper.h"
17 #include "form_bms_helper.h"
18 #include "form_constants.h"
19 #include "form_data_mgr.h"
20 #include "form_event_handler.h"
21 #include "form_mgr_errors.h"
22 #include "form_host_interface.h"
23 #include "form_provider_interface.h"
24 #include "form_share_connection.h"
25 #include "form_supply_callback.h"
26 #include "form_util.h"
27 #include "in_process_call_wrapper.h"
28 #include "nlohmann/json.hpp"
29 #include "string_wrapper.h"
30
31 namespace OHOS {
32 namespace AppExecFwk {
33 namespace {
34 constexpr int64_t FORM_SHARE_INFO_DELAY_TIMER = 50000;
35 constexpr int64_t FORM_PACKAGE_FREE_INSTALL_TIMER = 40000;
36 constexpr const char* ACTION_SHARE_FORM = "action.form.share";
37 }
38
FormShareMgr()39 FormShareMgr::FormShareMgr()
40 {
41 HILOG_DEBUG("FormShareMgr is created");
42 };
43
~FormShareMgr()44 FormShareMgr::~FormShareMgr()
45 {
46 HILOG_DEBUG("FormShareMgr is destroyed");
47 if (eventHandler_ != nullptr) {
48 eventHandler_->UnregisterEventTimeoutObserver(shared_from_this());
49 }
50 };
51
ShareForm(int64_t formId,const std::string & deviceId,const sptr<IRemoteObject> & callerToken,int64_t requestCode)52 int32_t FormShareMgr::ShareForm(int64_t formId, const std::string &deviceId, const sptr<IRemoteObject> &callerToken,
53 int64_t requestCode)
54 {
55 HILOG_DEBUG("%{public}s called.", __func__);
56 FormRecord formRecord;
57 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
58 if (!isFormRecExist) {
59 HILOG_ERROR("form share info get formRecord failed.");
60 return ERR_APPEXECFWK_FORM_GET_INFO_FAILED;
61 }
62
63 {
64 std::unique_lock<std::shared_mutex> guard(requestMapMutex_);
65 requestMap_.emplace(requestCode, callerToken);
66 }
67
68 sptr<FormShareConnection> formShareConnection = new (std::nothrow) FormShareConnection(
69 formId, formRecord.bundleName, formRecord.abilityName, deviceId, requestCode);
70 if (formShareConnection == nullptr) {
71 HILOG_ERROR("failed to create formShareConnection.");
72 return ERR_APPEXECFWK_FORM_COMMON_CODE;
73 }
74 Want want;
75 want.SetElementName(formRecord.bundleName, formRecord.abilityName);
76 want.AddFlags(Want::FLAG_ABILITY_FORM_ENABLED);
77 ErrCode errorCode = FormAmsHelper::GetInstance().ConnectServiceAbility(want, formShareConnection);
78 if (errorCode != ERR_OK) {
79 HILOG_ERROR("ConnectServiceAbility failed.");
80 std::unique_lock<std::shared_mutex> guard(requestMapMutex_);
81 requestMap_.erase(requestCode);
82 return ERR_APPEXECFWK_FORM_BIND_PROVIDER_FAILED;
83 }
84
85 return ERR_OK;
86 }
87
RecvFormShareInfoFromRemote(const FormShareInfo & info)88 int32_t FormShareMgr::RecvFormShareInfoFromRemote(const FormShareInfo &info)
89 {
90 HILOG_DEBUG("%{public}s called.", __func__);
91
92 if (eventHandler_ == nullptr) {
93 HILOG_ERROR("eventHandler_ is nullptr");
94 return ERR_APPEXECFWK_FORM_COMMON_CODE;
95 }
96
97 auto task = [info]() {
98 DelayedSingleton<FormShareMgr>::GetInstance()->HandleRecvFormShareInfoFromRemoteTask(info);
99 };
100 eventHandler_->PostTask(task);
101
102 return ERR_OK;
103 }
104
HandleRecvFormShareInfoFromRemoteTask(const FormShareInfo & info)105 int32_t FormShareMgr::HandleRecvFormShareInfoFromRemoteTask(const FormShareInfo &info)
106 {
107 HILOG_DEBUG("%{public}s called.", __func__);
108
109 if (!CheckFormShareInfo(info)) {
110 HILOG_ERROR("form share info check failed.");
111 return ERR_APPEXECFWK_FORM_SHARE_INFO_CHECK_FAILED;
112 }
113
114 AbilityInfo abilityInfo;
115 ExtensionAbilityInfo extensionAbilityInfo;
116 int32_t userId = FormUtil::GetCurrentAccountId();
117 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(
118 ACTION_SHARE_FORM, userId, abilityInfo, extensionAbilityInfo)) {
119 HILOG_ERROR("get ability info by action failed.");
120 return ERR_APPEXECFWK_FORM_FORM_USER_NOT_EXIST;
121 }
122 if (abilityInfo.name.empty() && extensionAbilityInfo.name.empty()) {
123 HILOG_ERROR("form user is not exist.");
124 return ERR_APPEXECFWK_FORM_FORM_USER_NOT_EXIST;
125 }
126
127 auto formShareInfoKey = MakeFormShareInfoKey(info);
128 {
129 std::unique_lock<std::shared_mutex> guard(shareInfoMapMutex_);
130 if (shareInfo_.find(formShareInfoKey) != shareInfo_.end()) {
131 HILOG_ERROR("form is sharing.");
132 return ERR_APPEXECFWK_FORM_SHARING;
133 }
134
135 shareInfo_.emplace(formShareInfoKey, info);
136 }
137 {
138 std::unique_lock<std::shared_mutex> guard(eventMapMutex_);
139 auto eventId = FormEventHandler::GetEventId();
140 eventMap_.emplace(eventId, formShareInfoKey);
141 if (eventHandler_ != nullptr) {
142 eventHandler_->SendEvent(MSG::FORM_SHARE_INFO_DELAY_MSG, eventId, FORM_SHARE_INFO_DELAY_TIMER);
143 }
144 }
145 auto ret = CheckFormPackage(info, formShareInfoKey);
146 if (ret == ERR_APPEXECFWK_FORM_FREE_INSTALLATION) {
147 return ERR_OK;
148 }
149 if (ret != ERR_OK) {
150 return ret;
151 }
152 StartFormUser(info);
153 return ERR_OK;
154 }
155
CheckFormPackage(const FormShareInfo & info,const std::string & formShareInfoKey)156 int32_t FormShareMgr::CheckFormPackage(const FormShareInfo &info, const std::string &formShareInfoKey)
157 {
158 if (IsExistFormPackage(info.bundleName, info.moduleName)) {
159 return ERR_OK;
160 }
161
162 if (eventHandler_ == nullptr) {
163 HILOG_ERROR("eventHandler_ is nullptr.");
164 return ERR_APPEXECFWK_FORM_COMMON_CODE;
165 }
166
167 std::shared_ptr<FormFreeInstallOperator> freeInstallOperator =
168 std::make_shared<FormFreeInstallOperator>(formShareInfoKey, eventHandler_);
169 auto eventId = FormEventHandler::GetEventId();
170 HILOG_DEBUG("free install operator send event, eventId:%{public}" PRId64 ", key: %{public}s",
171 eventId, formShareInfoKey.c_str());
172 eventHandler_->SendEvent(
173 MSG::FORM_PACKAGE_FREE_INSTALL_DELAY_MSG, eventId, FORM_PACKAGE_FREE_INSTALL_TIMER);
174
175 {
176 std::unique_lock<std::shared_mutex> guard(freeInstallMapMutex_);
177 freeInstallOperatorMap_.emplace(eventId, freeInstallOperator);
178 }
179
180 auto ret = freeInstallOperator->StartFreeInstall(info.bundleName, info.moduleName, info.abilityName);
181 if (ret != ERR_OK) {
182 HILOG_ERROR("free install failed.");
183 RemoveFormShareInfo(formShareInfoKey);
184 FinishFreeInstallTask(freeInstallOperator);
185 return ERR_APPEXECFWK_FORM_FREE_INSTALL_FAILED;
186 }
187 return ERR_APPEXECFWK_FORM_FREE_INSTALLATION;
188 }
189
CheckFormShareInfo(const FormShareInfo & info)190 bool FormShareMgr::CheckFormShareInfo(const FormShareInfo &info)
191 {
192 return !(info.bundleName.empty() ||
193 info.moduleName.empty() ||
194 info.abilityName.empty() ||
195 info.formName.empty() ||
196 info.deviceId.empty());
197 }
198
MakeFormShareInfoKey(const FormShareInfo & info)199 std::string FormShareMgr::MakeFormShareInfoKey(const FormShareInfo &info)
200 {
201 return (info.bundleName + info.moduleName + info.abilityName + info.formName);
202 }
203
MakeFormShareInfoKey(const Want & want)204 std::string FormShareMgr::MakeFormShareInfoKey(const Want &want)
205 {
206 std::string bundleName = want.GetElement().GetBundleName();
207 std::string abilityName = want.GetElement().GetAbilityName();
208 std::string moduleName = want.GetStringParam(Constants::PARAM_MODULE_NAME_KEY);
209 std::string formName = want.GetStringParam(Constants::PARAM_FORM_NAME_KEY);
210 return (bundleName + moduleName + abilityName + formName);
211 }
212
StartFormUser(const FormShareInfo & info)213 void FormShareMgr::StartFormUser(const FormShareInfo &info)
214 {
215 HILOG_DEBUG("%{public}s called.", __func__);
216 AbilityInfo abilityInfo;
217 ExtensionAbilityInfo extensionAbilityInfo;
218 int32_t userId = FormUtil::GetCurrentAccountId();
219 if (!FormBmsHelper::GetInstance().GetAbilityInfoByAction(
220 ACTION_SHARE_FORM, userId, abilityInfo, extensionAbilityInfo)) {
221 HILOG_ERROR("get ability info by action failed.");
222 return;
223 }
224
225 Want want;
226 if (!abilityInfo.name.empty()) {
227 want.SetElementName(abilityInfo.bundleName, abilityInfo.name);
228 } else if (!extensionAbilityInfo.name.empty()) {
229 want.SetElementName(extensionAbilityInfo.bundleName, extensionAbilityInfo.name);
230 } else {
231 HILOG_ERROR("form user is not exist.");
232 return;
233 }
234
235 want.SetAction(ACTION_SHARE_FORM);
236 want.SetParam(Constants::PARAM_BUNDLE_NAME_KEY, info.bundleName);
237 want.SetParam(Constants::PARAM_MODULE_NAME_KEY, info.moduleName);
238 want.SetParam(Constants::PARAM_ABILITY_NAME_KEY, info.abilityName);
239 want.SetParam(Constants::PARAM_FORM_NAME_KEY, info.formName);
240 want.SetParam(Constants::PARAM_FORM_TEMPORARY_KEY, info.formTempFlag);
241 want.SetParam(Constants::PARAM_FORM_DIMENSION_KEY, info.dimensionId);
242
243 auto errorCode = FormAmsHelper::GetInstance().StartAbility(want, userId);
244 if (errorCode != ERR_OK) {
245 HILOG_ERROR("start ability failed.");
246 RemoveFormShareInfo(MakeFormShareInfoKey(info));
247 }
248 }
249
IsExistFormPackage(const std::string & bundleName,const std::string & moduleName)250 bool FormShareMgr::IsExistFormPackage(const std::string &bundleName, const std::string &moduleName)
251 {
252 HILOG_DEBUG("%{public}s called.", __func__);
253 BundleInfo bundleInfo;
254 auto userId = FormUtil::GetCurrentAccountId();
255 if (!FormBmsHelper::GetInstance().GetBundleInfo(bundleName, userId, bundleInfo)) {
256 HILOG_ERROR("get bundle info failed");
257 return false;
258 }
259
260 for (const auto &moduleInfo : bundleInfo.moduleNames) {
261 if (moduleInfo.compare(moduleName) == 0) {
262 HILOG_DEBUG("module name is exist, moduleName:%{public}s", moduleInfo.c_str());
263 return true;
264 }
265 }
266
267 HILOG_ERROR("module name is not exist, moduleName: %{public}s", moduleName.c_str());
268 return false;
269 }
270
RemoveFormShareInfo(const std::string & formShareInfoKey)271 void FormShareMgr::RemoveFormShareInfo(const std::string &formShareInfoKey)
272 {
273 HILOG_DEBUG("%{public}s called.", __func__);
274 {
275 std::unique_lock<std::shared_mutex> guard(eventMapMutex_);
276 int64_t eventId = 0;
277 for (auto iter = eventMap_.begin(); iter != eventMap_.end(); iter++) {
278 if (iter->second == formShareInfoKey) {
279 eventId = iter->first;
280 break;
281 }
282 }
283
284 if (eventId != 0) {
285 eventMap_.erase(eventId);
286 if (eventHandler_ != nullptr) {
287 eventHandler_->RemoveEvent(MSG::FORM_SHARE_INFO_DELAY_MSG, eventId);
288 }
289 }
290 }
291
292 {
293 std::unique_lock<std::shared_mutex> guard(shareInfoMapMutex_);
294 shareInfo_.erase(formShareInfoKey);
295 }
296 }
297
FinishFreeInstallTask(const std::shared_ptr<FormFreeInstallOperator> & freeInstallOperator)298 void FormShareMgr::FinishFreeInstallTask(const std::shared_ptr<FormFreeInstallOperator> &freeInstallOperator)
299 {
300 HILOG_DEBUG("%{public}s called.", __func__);
301 std::unique_lock<std::shared_mutex> guard(freeInstallMapMutex_);
302
303 int64_t eventId = 0;
304 for (auto iter = freeInstallOperatorMap_.begin(); iter != freeInstallOperatorMap_.end(); iter++) {
305 if (iter->second == freeInstallOperator) {
306 eventId = iter->first;
307 break;
308 }
309 }
310
311 if (eventId != 0) {
312 freeInstallOperatorMap_.erase(eventId);
313 if (eventHandler_ != nullptr) {
314 eventHandler_->RemoveEvent(MSG::FORM_PACKAGE_FREE_INSTALL_DELAY_MSG, eventId);
315 }
316 }
317 }
318
OnInstallFinished(const std::shared_ptr<FormFreeInstallOperator> & freeInstallOperator,int32_t resultCode,const std::string & formShareInfoKey)319 void FormShareMgr::OnInstallFinished(const std::shared_ptr<FormFreeInstallOperator> &freeInstallOperator,
320 int32_t resultCode, const std::string &formShareInfoKey)
321 {
322 HILOG_DEBUG("%{public}s called.", __func__);
323
324 FinishFreeInstallTask(freeInstallOperator);
325
326 if (resultCode != ERR_OK) {
327 HILOG_ERROR("free install failed.");
328 RemoveFormShareInfo(formShareInfoKey);
329 return;
330 }
331
332 FormShareInfo info;
333 {
334 std::shared_lock<std::shared_mutex> guard(shareInfoMapMutex_);
335 auto it = shareInfo_.find(formShareInfoKey);
336 if (it == shareInfo_.end()) {
337 HILOG_ERROR("form share info is not found.");
338 return;
339 }
340
341 it->second.isFreeInstall = true;
342 info = it->second;
343 }
344
345 StartFormUser(info);
346 }
347
HandleFormShareInfoTimeout(int64_t eventId)348 void FormShareMgr::HandleFormShareInfoTimeout(int64_t eventId)
349 {
350 HILOG_DEBUG("%{public}s called, eventId:%{public}" PRId64 "", __func__, eventId);
351
352 std::string formShareInfoKey;
353 {
354 std::unique_lock<std::shared_mutex> guard(eventMapMutex_);
355 auto it = eventMap_.find(eventId);
356 if (it == eventMap_.end()) {
357 HILOG_ERROR("event id is not find.");
358 return;
359 }
360 formShareInfoKey = it->second;
361 eventMap_.erase(eventId);
362 }
363 HILOG_DEBUG("form share info timeout, key: %{public}s", formShareInfoKey.c_str());
364
365 RemoveFormShareInfo(formShareInfoKey);
366 }
367
HandleFreeInstallTimeout(int64_t eventId)368 void FormShareMgr::HandleFreeInstallTimeout(int64_t eventId)
369 {
370 HILOG_DEBUG("%{public}s called, eventId:%{public}" PRId64 "", __func__, eventId);
371 std::unique_lock<std::shared_mutex> guard(freeInstallMapMutex_);
372 freeInstallOperatorMap_.erase(eventId);
373 }
374
AddProviderData(const Want & want,WantParams & wantParams)375 void FormShareMgr::AddProviderData(const Want &want, WantParams &wantParams)
376 {
377 HILOG_DEBUG("%{public}s called.", __func__);
378
379 auto formShareInfoKey = MakeFormShareInfoKey(want);
380 std::string deviceId;
381 std::string bundleName;
382 std::string moduleName;
383 bool isFreeInstall = false;
384 std::map<std::string, sptr<IInterface>> providerWantParams;
385 {
386 std::shared_lock<std::shared_mutex> guard(shareInfoMapMutex_);
387 auto it = shareInfo_.find(formShareInfoKey);
388 if (it == shareInfo_.end()) {
389 HILOG_DEBUG("No shared provider data.");
390 return;
391 }
392
393 providerWantParams = it->second.providerShareData.GetParams();
394 deviceId = it->second.deviceId;
395 bundleName = it->second.bundleName;
396 moduleName = it->second.moduleName;
397 isFreeInstall = it->second.isFreeInstall;
398 }
399
400 if (!wantParams.HasParam(Constants::PARAM_DEVICE_ID_KEY)) {
401 wantParams.SetParam(Constants::PARAM_DEVICE_ID_KEY, AAFwk::String::Box(deviceId));
402 }
403 for (auto iter = providerWantParams.begin(); iter != providerWantParams.end(); iter++) {
404 wantParams.SetParam(iter->first, iter->second);
405 }
406
407 if (isFreeInstall) {
408 FormBmsHelper::GetInstance().NotifyModuleNotRemovable(bundleName, moduleName);
409 HILOG_INFO("notify module not removable, bundleName: %{public}s, moduleName: %{public}s",
410 bundleName.c_str(), moduleName.c_str());
411 }
412
413 RemoveFormShareInfo(formShareInfoKey);
414 }
415
AcquireShareFormData(int64_t formId,const std::string & remoteDeviceId,const Want & want,const sptr<IRemoteObject> & remoteObject)416 void FormShareMgr::AcquireShareFormData(int64_t formId, const std::string &remoteDeviceId,
417 const Want &want, const sptr<IRemoteObject> &remoteObject)
418 {
419 HILOG_DEBUG("%{public}s called.", __func__);
420 int64_t requestCode = static_cast<int64_t>(want.GetLongParam(Constants::FORM_SHARE_REQUEST_CODE, 0));
421 auto connectId = want.GetIntParam(Constants::FORM_CONNECT_ID, 0);
422 sptr<IFormProvider> formProviderProxy = iface_cast<IFormProvider>(remoteObject);
423
424 if (formProviderProxy == nullptr) {
425 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
426 SendResponse(requestCode, ERR_APPEXECFWK_FORM_COMMON_CODE);
427 HILOG_ERROR("failed to get formProviderProxy.");
428 return;
429 }
430
431 int32_t error = formProviderProxy->AcquireShareFormData(formId, remoteDeviceId,
432 FormSupplyCallback::GetInstance(), requestCode);
433 if (error != ERR_OK) {
434 SendResponse(requestCode, error);
435 HILOG_ERROR("failed to get acquire provider form info.");
436 }
437
438 FormSupplyCallback::GetInstance()->RemoveConnection(connectId);
439 }
440
HandleProviderShareData(int64_t formId,const std::string & remoteDeviceId,const AAFwk::WantParams & wantParams,int64_t requestCode,const bool & result)441 void FormShareMgr::HandleProviderShareData(int64_t formId, const std::string &remoteDeviceId,
442 const AAFwk::WantParams &wantParams, int64_t requestCode, const bool &result)
443 {
444 HILOG_DEBUG("%{public}s called.", __func__);
445
446 FormRecord formRecord;
447 bool isFormRecExist = FormDataMgr::GetInstance().GetFormRecord(formId, formRecord);
448 if (!isFormRecExist) {
449 HILOG_ERROR("form share info get formRecord failed.");
450 SendResponse(requestCode, ERR_APPEXECFWK_FORM_GET_INFO_FAILED);
451 return;
452 }
453
454 if (!result) {
455 HILOG_ERROR("Failed to parse shared data.");
456 SendResponse(requestCode, ERR_APPEXECFWK_FORM_COMMON_CODE);
457 return;
458 }
459
460 FormShareInfo formShareInfo;
461 formShareInfo.formId = formRecord.formId;
462 formShareInfo.formName = formRecord.formName;
463 formShareInfo.bundleName = formRecord.bundleName;
464 formShareInfo.moduleName = formRecord.moduleName;
465 formShareInfo.abilityName = formRecord.abilityName;
466 formShareInfo.formTempFlag = formRecord.formTempFlag;
467 formShareInfo.dimensionId = formRecord.specification;
468 formShareInfo.providerShareData = wantParams;
469
470 if (formDmsClient_ == nullptr) {
471 formDmsClient_ = std::make_shared<FormDistributedClient>();
472 }
473 int32_t retval = formDmsClient_->ShareForm(remoteDeviceId, formShareInfo);
474 if (retval != ERR_OK) {
475 HILOG_ERROR("failed to share form from DMS retval = %{public}d.", retval);
476 SendResponse(requestCode, ERR_APPEXECFWK_FORM_DISTRIBUTED_SCHEDULE_FAILED);
477 return;
478 }
479 SendResponse(requestCode, ERR_OK);
480 }
481
SendResponse(int64_t requestCode,int32_t result)482 void FormShareMgr::SendResponse(int64_t requestCode, int32_t result)
483 {
484 HILOG_DEBUG("FormMgrService SendResponse called, requestCode:%{public}" PRId64 " result:%{public}d",
485 requestCode, result);
486 std::unique_lock<std::shared_mutex> guard(requestMapMutex_);
487 auto iter = requestMap_.find(requestCode);
488 if (iter == requestMap_.end()) {
489 HILOG_DEBUG("No form shared request.");
490 return;
491 }
492
493 sptr<IFormHost> remoteFormHost = iface_cast<IFormHost>(iter->second);
494 if (remoteFormHost == nullptr) {
495 HILOG_ERROR("failed to get form host proxy.");
496 return;
497 }
498 remoteFormHost->OnShareFormResponse(requestCode, result);
499 requestMap_.erase(requestCode);
500 }
501
IsShareForm(const Want & want)502 bool FormShareMgr::IsShareForm(const Want &want)
503 {
504 HILOG_DEBUG("%{public}s called.", __func__);
505 auto formShareInfoKey = MakeFormShareInfoKey(want);
506 HILOG_DEBUG("formShareInfoKey: %{public}s", formShareInfoKey.c_str());
507
508 std::shared_lock<std::shared_mutex> guard(shareInfoMapMutex_);
509 auto it = shareInfo_.find(formShareInfoKey);
510 if (it == shareInfo_.end()) {
511 HILOG_DEBUG("This form is not a shared form");
512 return false;
513 }
514 return true;
515 }
516
OnEventTimeoutResponse(int64_t msg,int64_t eventId)517 void FormShareMgr::OnEventTimeoutResponse(int64_t msg, int64_t eventId)
518 {
519 HILOG_DEBUG("%{public}s called.", __func__);
520 switch (msg) {
521 case MSG::FORM_SHARE_INFO_DELAY_MSG: {
522 HandleFormShareInfoTimeout(eventId);
523 break;
524 }
525 case MSG::FORM_PACKAGE_FREE_INSTALL_DELAY_MSG: {
526 HandleFreeInstallTimeout(eventId);
527 break;
528 }
529 default: {
530 break;
531 }
532 }
533 }
534 } // namespace AppExecFwk
535 } // namespace OHOS
536