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
16 #include "form_provider_caller.h"
17
18 #include <cinttypes>
19
20 #include "fms_log_wrapper.h"
21 #include "form_constants.h"
22 #include "form_host_interface.h"
23 #include "form_mgr_errors.h"
24
25 namespace OHOS {
26 namespace AppExecFwk {
OnRemoteDied(const wptr<IRemoteObject> & remote)27 void FormProviderCallerRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
28 {
29 HILOG_DEBUG("On remote died");
30 if (handler_) {
31 handler_(remote);
32 }
33 }
34
IsSameToken(const sptr<IRemoteObject> & callerToken) const35 bool FormProviderCaller::IsSameToken(const sptr<IRemoteObject> &callerToken) const
36 {
37 return (callerToken == callerToken_);
38 }
39
AddForm(const FormJsInfo & formJsInfo)40 void FormProviderCaller::AddForm(const FormJsInfo &formJsInfo)
41 {
42 std::lock_guard<std::mutex> lock(formJsInfoMutex_);
43 formJsInfoMap_[formJsInfo.formId] = formJsInfo;
44 }
45
DeleteForm(int64_t formId)46 void FormProviderCaller::DeleteForm(int64_t formId)
47 {
48 std::lock_guard<std::mutex> lock(formJsInfoMutex_);
49 formJsInfoMap_.erase(formId);
50 }
51
GetFormJsInfo(int64_t formId,FormJsInfo & formJsInfo)52 bool FormProviderCaller::GetFormJsInfo(int64_t formId, FormJsInfo &formJsInfo)
53 {
54 std::lock_guard<std::mutex> lock(formJsInfoMutex_);
55 if (formJsInfoMap_.find(formId) != formJsInfoMap_.end()) {
56 formJsInfo = formJsInfoMap_[formId];
57 return true;
58 }
59 HILOG_ERROR("get form js info failed");
60 return false;
61 }
62
HasForm(int64_t formId)63 bool FormProviderCaller::HasForm(int64_t formId)
64 {
65 std::lock_guard<std::mutex> lock(formJsInfoMutex_);
66 return (formJsInfoMap_.find(formId) != formJsInfoMap_.end());
67 }
68
IsFormEmpty()69 bool FormProviderCaller::IsFormEmpty()
70 {
71 std::lock_guard<std::mutex> lock(formJsInfoMutex_);
72 return formJsInfoMap_.empty();
73 }
74
OnAcquire(const FormProviderInfo & formProviderInfo,const AAFwk::Want & want,const sptr<IRemoteObject> & token)75 int32_t FormProviderCaller::OnAcquire(const FormProviderInfo &formProviderInfo, const AAFwk::Want &want,
76 const sptr<IRemoteObject> &token)
77 {
78 std::string strFormId = want.GetStringParam(Constants::PARAM_FORM_IDENTITY_KEY);
79 if (strFormId.empty()) {
80 HILOG_ERROR("empty formId");
81 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
82 }
83 int64_t formId = std::stoll(strFormId);
84 int type = want.GetIntParam(Constants::ACQUIRE_TYPE, 0);
85 HILOG_DEBUG("formId is %{public}" PRId64 ", type is %{public}d", formId, type);
86
87 auto formProviderData = formProviderInfo.GetFormData();
88 if (!formProviderData.ConvertRawImageData()) {
89 HILOG_ERROR("convert raw image data failed");
90 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
91 }
92 FormJsInfo formJsInfo;
93 GetFormJsInfo(formId, formJsInfo);
94 formJsInfo.formData = formProviderData.GetDataString();
95 formJsInfo.formProviderData = formProviderData;
96 if (type == Constants::ACQUIRE_TYPE_CREATE_FORM) {
97 return OnAcquire(formJsInfo, token);
98 }
99 return ERR_APPEXECFWK_FORM_INVALID_PARAM;
100 }
101
OnAcquire(const FormJsInfo & formJsInfo,const sptr<IRemoteObject> & token)102 int32_t FormProviderCaller::OnAcquire(const FormJsInfo &formJsInfo, const sptr<IRemoteObject> &token)
103 {
104 HILOG_DEBUG("call");
105 sptr<IFormHost> callerToken = iface_cast<IFormHost>(callerToken_);
106 if (callerToken == nullptr) {
107 HILOG_ERROR("null callerToken");
108 return ERR_APPEXECFWK_FORM_COMMON_CODE;
109 }
110 callerToken->OnAcquired(formJsInfo, token);
111 return ERR_OK;
112 }
113
UpdateForm(int64_t formId,const FormProviderData & formProviderData)114 void FormProviderCaller::UpdateForm(int64_t formId, const FormProviderData &formProviderData)
115 {
116 HILOG_DEBUG("formId is %{public}" PRId64, formId);
117 FormJsInfo formJsInfo;
118 if (!GetFormJsInfo(formId, formJsInfo)) {
119 HILOG_ERROR("get form js info failed, formId is %{public}" PRId64, formId);
120 return;
121 }
122 formJsInfo.formData = formProviderData.GetDataString();
123 formJsInfo.formProviderData = formProviderData;
124 if (!formJsInfo.formProviderData.ConvertRawImageData()) {
125 HILOG_ERROR("convert raw image data failed");
126 return;
127 }
128
129 UpdateForm(formJsInfo);
130 }
131
UpdateForm(const FormJsInfo & formJsInfo)132 void FormProviderCaller::UpdateForm(const FormJsInfo &formJsInfo)
133 {
134 HILOG_DEBUG("call");
135 sptr<IFormHost> callerToken = iface_cast<IFormHost>(callerToken_);
136 if (callerToken == nullptr) {
137 HILOG_ERROR("null callerToken");
138 return;
139 }
140 callerToken->OnUpdate(formJsInfo);
141 }
142
AddDeathRecipient(sptr<IRemoteObject::DeathRecipient> deathRecipient)143 void FormProviderCaller::AddDeathRecipient(sptr<IRemoteObject::DeathRecipient> deathRecipient)
144 {
145 HILOG_DEBUG("call");
146 callerToken_->AddDeathRecipient(deathRecipient);
147 }
148 } // namespace AppExecFwk
149 } // namespace OHOS
150