1 /*
2 * Copyright (c) 2025 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 "local_pending_want.h"
17
18 #include "ability_runtime_error_util.h"
19 #include "hilog_tag_wrapper.h"
20 #include "ipc_skeleton.h"
21 #include "want_agent_client.h"
22 #include "want_sender_info.h"
23
24 namespace OHOS::AbilityRuntime::WantAgent {
LocalPendingWant(const std::string & bundleName,const std::shared_ptr<AAFwk::Want> & want,int32_t operType)25 LocalPendingWant::LocalPendingWant(const std::string &bundleName,
26 const std::shared_ptr<AAFwk::Want> &want, int32_t operType)
27 : bundleName_(bundleName), want_(*want), operType_(operType)
28 {
29 static std::atomic_int id(0);
30 hashCode_ = ++id;
31 uid_ = IPCSkeleton::GetCallingUid();
32 tokenId_ = IPCSkeleton::GetCallingTokenID();
33 }
34
GetBundleName() const35 std::string LocalPendingWant::GetBundleName() const
36 {
37 return bundleName_;
38 }
39
SetBundleName(const std::string & bundleName)40 void LocalPendingWant::SetBundleName(const std::string &bundleName)
41 {
42 bundleName_ = bundleName;
43 }
44
GetUid() const45 int32_t LocalPendingWant::GetUid() const
46 {
47 return uid_;
48 }
49
SetUid(int32_t uid)50 void LocalPendingWant::SetUid(int32_t uid)
51 {
52 uid_ = uid;
53 }
54
GetType() const55 int32_t LocalPendingWant::GetType() const
56 {
57 return operType_;
58 }
59
SetType(int32_t operType)60 void LocalPendingWant::SetType(int32_t operType)
61 {
62 operType_ = operType;
63 }
64
GetWant() const65 std::shared_ptr<AAFwk::Want> LocalPendingWant::GetWant() const
66 {
67 return std::make_shared<AAFwk::Want>(want_);
68 }
69
SetWant(const std::shared_ptr<AAFwk::Want> & want)70 void LocalPendingWant::SetWant(const std::shared_ptr<AAFwk::Want> &want)
71 {
72 if (want != nullptr) {
73 want_ = *want;
74 }
75 }
76
GetHashCode() const77 int32_t LocalPendingWant::GetHashCode() const
78 {
79 return hashCode_;
80 }
81
SetHashCode(int32_t hashCode)82 void LocalPendingWant::SetHashCode(int32_t hashCode)
83 {
84 hashCode_ = hashCode;
85 }
86
GetTokenId() const87 uint32_t LocalPendingWant::GetTokenId() const
88 {
89 return tokenId_;
90 }
91
SetTokenId(uint32_t tokenId)92 void LocalPendingWant::SetTokenId(uint32_t tokenId)
93 {
94 tokenId_ = tokenId;
95 }
96
Send(const sptr<CompletedDispatcher> & callBack,const TriggerInfo & paramsInfo,sptr<IRemoteObject> callerToken)97 ErrCode LocalPendingWant::Send(const sptr<CompletedDispatcher> &callBack, const TriggerInfo ¶msInfo,
98 sptr<IRemoteObject> callerToken)
99 {
100 TAG_LOGD(AAFwkTag::WANTAGENT, "call");
101 AAFwk::SenderInfo senderInfo;
102 senderInfo.resolvedType = want_.GetType();
103 senderInfo.want = want_;
104 const auto options = paramsInfo.GetExtraInfo();
105 if (options != nullptr) {
106 senderInfo.want.SetParams(*options);
107 }
108 const auto startOptions = paramsInfo.GetStartOptions();
109 if (startOptions != nullptr) {
110 senderInfo.startOptions = new (std::nothrow) AAFwk::StartOptions(*startOptions);
111 }
112 senderInfo.requiredPermission = paramsInfo.GetPermission();
113 senderInfo.code = paramsInfo.GetResultCode();
114 senderInfo.finishedReceiver = callBack;
115 senderInfo.operType = operType_;
116 senderInfo.uid = uid_;
117 senderInfo.tokenId = tokenId_;
118 senderInfo.callerToken = callerToken;
119 const auto result = AAFwk::WantAgentClient::GetInstance().SendLocalWantSender(senderInfo);
120 if (result != 0 && result != ERR_ABILITY_RUNTIME_EXTERNAL_NO_ACCESS_PERMISSION) {
121 return ERR_ABILITY_RUNTIME_EXTERNAL_SERVICE_BUSY;
122 }
123 return result;
124 }
125
Marshalling(Parcel & parcel) const126 bool LocalPendingWant::Marshalling(Parcel &parcel) const
127 {
128 if (!parcel.WriteString(bundleName_)) {
129 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write bundleName");
130 return false;
131 }
132 if (!parcel.WriteInt32(uid_)) {
133 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write uid");
134 return false;
135 }
136 if (!parcel.WriteInt32(hashCode_)) {
137 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write hashCode");
138 return false;
139 }
140 if (!parcel.WriteParcelable(&want_)) {
141 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write want");
142 return false;
143 }
144 if (!parcel.WriteInt32(operType_)) {
145 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write operType");
146 return false;
147 }
148 if (!parcel.WriteUint32(tokenId_)) {
149 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to write tokenId");
150 return false;
151 }
152 return true;
153 }
154
Unmarshalling(Parcel & parcel)155 LocalPendingWant *LocalPendingWant::Unmarshalling(Parcel &parcel)
156 {
157 std::string bundleName;
158 if (!parcel.ReadString(bundleName)) {
159 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read bundleName");
160 return nullptr;
161 }
162 int32_t uid = 0;
163 if (!parcel.ReadInt32(uid)) {
164 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read uid");
165 return nullptr;
166 }
167 int32_t hashCode = 0;
168 if (!parcel.ReadInt32(hashCode)) {
169 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read hashCode");
170 return nullptr;
171 }
172 std::shared_ptr<AAFwk::Want> want(parcel.ReadParcelable<AAFwk::Want>());
173 if (!want) {
174 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read want");
175 return nullptr;
176 }
177 int32_t operType = 0;
178 if (!parcel.ReadInt32(operType)) {
179 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read operType");
180 return nullptr;
181 }
182 uint32_t tokenId = 0;
183 if (!parcel.ReadUint32(tokenId)) {
184 TAG_LOGE(AAFwkTag::WANTAGENT, "Failed to read tokenId");
185 return nullptr;
186 }
187 LocalPendingWant *localPendingWant = new (std::nothrow) LocalPendingWant(
188 bundleName, want, operType);
189 if (localPendingWant == nullptr) {
190 TAG_LOGE(AAFwkTag::WANTAGENT, "Read from parcel failed");
191 return nullptr;
192 }
193 localPendingWant->SetHashCode(hashCode);
194 localPendingWant->SetUid(uid);
195 localPendingWant->SetTokenId(tokenId);
196 return localPendingWant;
197 }
198
IsEquals(const std::shared_ptr<LocalPendingWant> & localPendingWant,const std::shared_ptr<LocalPendingWant> & otherLocalPendingWant)199 ErrCode LocalPendingWant::IsEquals(
200 const std::shared_ptr<LocalPendingWant> &localPendingWant,
201 const std::shared_ptr<LocalPendingWant> &otherLocalPendingWant)
202 {
203 if ((localPendingWant == nullptr) && (otherLocalPendingWant == nullptr)) {
204 return ERR_OK;
205 }
206 if ((localPendingWant == nullptr) || (otherLocalPendingWant == nullptr)) {
207 return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
208 }
209 const auto targetCode = localPendingWant->GetHashCode();
210 const auto otherCode = otherLocalPendingWant->GetHashCode();
211 const int32_t NOTEQ = -1;
212 return targetCode == otherCode ? ERR_OK : NOTEQ;
213 }
214 }