1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "form_render_connection.h"
17
18 #include <cinttypes>
19
20 #include "fms_log_wrapper.h"
21 #include "form_bms_helper.h"
22 #include "form_cache_mgr.h"
23 #include "form_constants.h"
24 #include "form_mgr_errors.h"
25 #include "form_supply_callback.h"
26 #include "form_render_mgr.h"
27 #include "form_task_mgr.h"
28 #include "form_util.h"
29 #include "ipc_skeleton.h"
30 #include "want.h"
31
32 namespace OHOS {
33 namespace AppExecFwk {
FormRenderConnection(const FormRecord & formRecord,const WantParams & wantParams)34 FormRenderConnection::FormRenderConnection(
35 const FormRecord &formRecord, const WantParams &wantParams) : formRecord_(formRecord), wantParams_(wantParams)
36 {
37 SetFormId(formRecord.formId);
38 SetProviderKey(formRecord.bundleName, formRecord.abilityName);
39 }
40
OnAbilityConnectDone(const AppExecFwk::ElementName & element,const sptr<IRemoteObject> & remoteObject,int resultCode)41 void FormRenderConnection::OnAbilityConnectDone(const AppExecFwk::ElementName &element,
42 const sptr<IRemoteObject> &remoteObject, int resultCode)
43 {
44 HILOG_INFO("ConnectDone");
45 if (resultCode != ERR_OK) {
46 HILOG_ERROR("%{public}s, abilityName:%{public}s, formId:%{public}" PRId64 ", resultCode:%{public}d",
47 __func__, element.GetAbilityName().c_str(), GetFormId(), resultCode);
48 return;
49 }
50
51 connectState_ = ConnectState::CONNECTED;
52 int32_t compileMode = 0;
53 if (!FormBmsHelper::GetInstance().GetCompileMode(formRecord_.bundleName, formRecord_.moduleName,
54 FormUtil::GetCurrentAccountId(), compileMode)) {
55 HILOG_ERROR("get compile mode failed.");
56 return;
57 }
58
59 int32_t compatibleVersionCode = 0;
60 if (!FormBmsHelper::GetInstance().GetCompatibleVersionCode(
61 formRecord_.bundleName, FormUtil::GetCurrentAccountId(), compatibleVersionCode)) {
62 HILOG_ERROR("get compatible version code failed.");
63 return;
64 }
65
66 FormRecord newRecord(formRecord_);
67 std::string cacheData;
68 std::map<std::string, std::pair<sptr<FormAshmem>, int32_t>> imageDataMap;
69 if (FormCacheMgr::GetInstance().GetData(formRecord_.formId, cacheData, imageDataMap)) {
70 newRecord.formProviderInfo.SetFormDataString(cacheData);
71 newRecord.formProviderInfo.SetImageDataMap(imageDataMap);
72 }
73
74 sptr<FormRenderConnection> connection(this);
75 FormRenderMgr::GetInstance().AddConnection(GetFormId(), connection);
76 FormRenderMgr::GetInstance().AddRenderDeathRecipient(remoteObject);
77 Want want;
78 want.SetParams(wantParams_);
79 want.SetParam(Constants::FORM_CONNECT_ID, this->GetConnectId());
80 want.SetParam(Constants::FORM_COMPILE_MODE_KEY, compileMode);
81 want.SetParam(Constants::FORM_COMPATIBLE_VERSION_CODE_KEY, compatibleVersionCode);
82 FormTaskMgr::GetInstance().PostRenderForm(newRecord, std::move(want), remoteObject);
83 }
84
OnAbilityDisconnectDone(const AppExecFwk::ElementName & element,int resultCode)85 void FormRenderConnection::OnAbilityDisconnectDone(const AppExecFwk::ElementName &element, int resultCode)
86 {
87 HILOG_DEBUG("element:%{public}s, resultCode:%{public}d, connectState: %{public}d",
88 element.GetURI().c_str(), resultCode, connectState_);
89 // If connectState_ is CONNECTING, it means connect failed, need to notify host
90 if (resultCode && connectState_ == ConnectState::CONNECTING) {
91 FormRenderMgr::GetInstance().RemoveConnection(GetFormId());
92 FormRenderMgr::GetInstance().HandleConnectFailed(
93 formRecord_.formId, ERR_APPEXECFWK_FORM_CONNECT_FORM_RENDER_FAILED);
94 }
95 connectState_ = ConnectState::DISCONNECTED;
96 }
97
SetStateConnecting()98 void FormRenderConnection::SetStateConnecting()
99 {
100 connectState_ = ConnectState::CONNECTING;
101 }
102
SetStateDisconnected()103 void FormRenderConnection::SetStateDisconnected()
104 {
105 connectState_ = ConnectState::DISCONNECTED;
106 }
107
UpdateWantParams(const WantParams & wantParams)108 void FormRenderConnection::UpdateWantParams(const WantParams &wantParams)
109 {
110 wantParams_ = wantParams;
111 }
112 } // namespace AppExecFwk
113 } // namespace OHOS
114