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