1 /*
2 * Copyright (c) 2021-2024 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 "pending_want.h"
17
18 #include "ability_runtime_error_util.h"
19 #include "hilog_tag_wrapper.h"
20 #include "hitrace_meter.h"
21 #include "want_agent_client.h"
22 #include "want_sender_info.h"
23
24 using namespace OHOS::AppExecFwk;
25 using namespace OHOS::AAFwk;
26 using namespace OHOS::AbilityRuntime;
27 namespace OHOS::AbilityRuntime::WantAgent {
28 namespace {
29 constexpr int32_t NOTEQ = -1;
30 }
31
PendingWant(const sptr<AAFwk::IWantSender> & target)32 PendingWant::PendingWant(const sptr<AAFwk::IWantSender> &target)
33 : target_(target), cancelReceiver_(nullptr), allowListToken_(nullptr)
34 {}
35
PendingWant(const sptr<AAFwk::IWantSender> & target,const sptr<IRemoteObject> allowListToken)36 PendingWant::PendingWant(const sptr<AAFwk::IWantSender> &target, const sptr<IRemoteObject> allowListToken)
37 : target_(target), cancelReceiver_(nullptr), allowListToken_(allowListToken)
38 {}
39
GetType(sptr<AAFwk::IWantSender> target)40 WantAgentConstant::OperationType PendingWant::GetType(sptr<AAFwk::IWantSender> target)
41 {
42 int32_t operationType = 0;
43 WantAgentClient::GetInstance().GetPendingWantType(target, operationType);
44 return static_cast<WantAgentConstant::OperationType>(operationType);
45 }
46
GetAbility(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<Want> & want,unsigned int flags)47 std::shared_ptr<PendingWant> PendingWant::GetAbility(
48 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
49 int requestCode, const std::shared_ptr<Want> &want, unsigned int flags)
50 {
51 std::shared_ptr<PendingWant> pendingWant = nullptr;
52 GetAbility(context, requestCode, want, flags, nullptr, pendingWant);
53 return pendingWant;
54 }
55
GetAbility(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<AAFwk::Want> & want,unsigned int flags,const std::shared_ptr<AAFwk::WantParams> & options,std::shared_ptr<PendingWant> & pendingWant)56 ErrCode PendingWant::GetAbility(
57 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context, int requestCode,
58 const std::shared_ptr<AAFwk::Want> &want, unsigned int flags,
59 const std::shared_ptr<AAFwk::WantParams> &options,
60 std::shared_ptr<PendingWant> &pendingWant)
61 {
62 if (context == nullptr) {
63 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
64 return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
65 }
66
67 WantsInfo wantsInfo;
68 wantsInfo.want = *want;
69 wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
70 if (options != nullptr && !options->IsEmpty()) {
71 wantsInfo.want.SetParams(*options);
72 }
73
74 WantSenderInfo wantSenderInfo;
75 wantSenderInfo.type = static_cast<int32_t>(WantAgentConstant::OperationType::START_ABILITY);
76 wantSenderInfo.allWants.push_back(wantsInfo);
77 wantSenderInfo.bundleName = context->GetBundleName();
78 wantSenderInfo.flags = flags;
79 wantSenderInfo.userId = -1; // -1 : invalid user id
80 wantSenderInfo.requestCode = requestCode;
81 sptr<IWantSender> target = nullptr;
82 ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
83 if (result != ERR_OK) {
84 return result;
85 }
86 pendingWant = std::make_shared<PendingWant>(target);
87 return ERR_OK;
88 }
89
GetAbilities(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,std::vector<std::shared_ptr<Want>> & wants,unsigned int flags)90 std::shared_ptr<PendingWant> PendingWant::GetAbilities(
91 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context, int requestCode,
92 std::vector<std::shared_ptr<Want>> &wants, unsigned int flags)
93 {
94 std::shared_ptr<PendingWant> pendingWant = nullptr;
95 GetAbilities(context, requestCode, wants, flags, nullptr, pendingWant);
96 return pendingWant;
97 }
98
GetAbilities(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,std::vector<std::shared_ptr<Want>> & wants,unsigned int flags,const std::shared_ptr<WantParams> & options,std::shared_ptr<PendingWant> & pendingWant)99 ErrCode PendingWant::GetAbilities(
100 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context, int requestCode,
101 std::vector<std::shared_ptr<Want>> &wants, unsigned int flags, const std::shared_ptr<WantParams> &options,
102 std::shared_ptr<PendingWant> &pendingWant)
103 {
104 if (context == nullptr) {
105 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
106 return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
107 }
108
109 WantSenderInfo wantSenderInfo;
110 wantSenderInfo.type = static_cast<int32_t>(WantAgentConstant::OperationType::START_ABILITIES);
111 wantSenderInfo.bundleName = context->GetBundleName();
112 wantSenderInfo.flags = flags;
113 wantSenderInfo.userId = -1; // -1 : invalid user id
114 wantSenderInfo.requestCode = requestCode;
115 for (auto want : wants) {
116 WantsInfo wantsInfo;
117 if (want != nullptr) {
118 wantsInfo.want = *want;
119 }
120 wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
121 if (options != nullptr && !options->IsEmpty()) {
122 wantsInfo.want.SetParams(*options);
123 }
124 wantSenderInfo.allWants.push_back(wantsInfo);
125 }
126 sptr<IWantSender> target = nullptr;
127 ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
128 if (result != ERR_OK) {
129 return result;
130 }
131 pendingWant = std::make_shared<PendingWant>(target);
132 return ERR_OK;
133 }
134
GetCommonEvent(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<Want> & want,unsigned int flags,std::shared_ptr<PendingWant> & pendingWant)135 ErrCode PendingWant::GetCommonEvent(
136 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
137 int requestCode, const std::shared_ptr<Want> &want, unsigned int flags,
138 std::shared_ptr<PendingWant> &pendingWant)
139 {
140 return GetCommonEventAsUser(context, requestCode, want, flags, 0, pendingWant);
141 }
142
GetCommonEventAsUser(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<Want> & want,unsigned int flags,int uid,std::shared_ptr<PendingWant> & pendingWant)143 ErrCode PendingWant::GetCommonEventAsUser(
144 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
145 int requestCode, const std::shared_ptr<Want> &want, unsigned int flags, int uid,
146 std::shared_ptr<PendingWant> &pendingWant)
147 {
148 if (context == nullptr) {
149 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
150 return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
151 }
152
153 WantsInfo wantsInfo;
154 if (want != nullptr) {
155 wantsInfo.want = *want;
156 }
157 wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
158
159 WantSenderInfo wantSenderInfo;
160 wantSenderInfo.type = static_cast<int32_t>(WantAgentConstant::OperationType::SEND_COMMON_EVENT);
161 wantSenderInfo.allWants.push_back(wantsInfo);
162 wantSenderInfo.bundleName = context->GetBundleName();
163 wantSenderInfo.flags = flags;
164 wantSenderInfo.userId = -1; // -1 : invalid user id
165 wantSenderInfo.requestCode = requestCode;
166 sptr<IWantSender> target = nullptr;
167 ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
168 if (result != ERR_OK) {
169 return result;
170 }
171 pendingWant = std::make_shared<PendingWant>(target);
172 return ERR_OK;
173 }
174
GetService(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<AAFwk::Want> & want,unsigned int flags,std::shared_ptr<PendingWant> & pendingWant)175 ErrCode PendingWant::GetService(
176 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
177 int requestCode, const std::shared_ptr<AAFwk::Want> &want, unsigned int flags,
178 std::shared_ptr<PendingWant> &pendingWant)
179 {
180 return BuildServicePendingWant(context, requestCode, want, flags,
181 WantAgentConstant::OperationType::START_SERVICE, pendingWant);
182 }
183
GetServiceExtension(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<AAFwk::Want> & want,unsigned int flags,std::shared_ptr<PendingWant> & pendingWant)184 ErrCode PendingWant::GetServiceExtension(
185 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
186 int requestCode, const std::shared_ptr<AAFwk::Want> &want, unsigned int flags,
187 std::shared_ptr<PendingWant> &pendingWant)
188 {
189 return BuildServicePendingWant(context, requestCode, want, flags,
190 WantAgentConstant::OperationType::START_SERVICE_EXTENSION, pendingWant);
191 }
192
GetForegroundService(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<Want> & want,unsigned int flags,std::shared_ptr<PendingWant> & pendingWant)193 ErrCode PendingWant::GetForegroundService(
194 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context, int requestCode,
195 const std::shared_ptr<Want> &want, unsigned int flags,
196 std::shared_ptr<PendingWant> &pendingWant)
197 {
198 return BuildServicePendingWant(
199 context, requestCode, want, flags, WantAgentConstant::OperationType::START_FOREGROUND_SERVICE,
200 pendingWant);
201 }
202
BuildServicePendingWant(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,const std::shared_ptr<Want> & want,unsigned int flags,WantAgentConstant::OperationType serviceKind,std::shared_ptr<PendingWant> & pendingWant)203 ErrCode PendingWant::BuildServicePendingWant(
204 const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
205 int requestCode, const std::shared_ptr<Want> &want,
206 unsigned int flags, WantAgentConstant::OperationType serviceKind,
207 std::shared_ptr<PendingWant> &pendingWant)
208 {
209 if (context == nullptr) {
210 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
211 return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
212 }
213
214 WantsInfo wantsInfo;
215 if (want != nullptr) {
216 wantsInfo.want = *want;
217 }
218 wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
219
220 WantSenderInfo wantSenderInfo;
221 wantSenderInfo.type = static_cast<int32_t>(serviceKind);
222 wantSenderInfo.allWants.push_back(wantsInfo);
223 wantSenderInfo.bundleName = context->GetBundleName();
224 wantSenderInfo.flags = flags;
225 wantSenderInfo.userId = -1; // -1 : invalid user id
226 wantSenderInfo.requestCode = requestCode;
227 sptr<IWantSender> target = nullptr;
228 ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
229 if (result != ERR_OK) {
230 return result;
231 }
232 pendingWant = std::make_shared<PendingWant>(target);
233 return ERR_OK;
234 }
235
Cancel(const sptr<AAFwk::IWantSender> & target,uint32_t flags)236 ErrCode PendingWant::Cancel(const sptr<AAFwk::IWantSender> &target, uint32_t flags)
237 {
238 return WantAgentClient::GetInstance().CancelWantSender(target, flags);
239 }
240
Send(const sptr<AAFwk::IWantSender> & target)241 void PendingWant::Send(const sptr<AAFwk::IWantSender> &target)
242 {
243 Send(0, nullptr, nullptr, "", nullptr, nullptr, target);
244 }
245
Send(int resultCode,const sptr<AAFwk::IWantSender> & target)246 void PendingWant::Send(int resultCode, const sptr<AAFwk::IWantSender> &target)
247 {
248 Send(resultCode, nullptr, nullptr, "", nullptr, nullptr, target);
249 }
250
Send(int resultCode,const std::shared_ptr<Want> & want,const sptr<AAFwk::IWantSender> & target)251 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
252 const sptr<AAFwk::IWantSender> &target)
253 {
254 Send(resultCode, want, nullptr, "", nullptr, nullptr, target);
255 }
256
Send(int resultCode,const sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)257 void PendingWant::Send(
258 int resultCode, const sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
259 {
260 Send(resultCode, nullptr, onCompleted, "", nullptr, nullptr, target);
261 }
262
Send(int resultCode,const std::shared_ptr<Want> & want,const sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)263 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
264 const sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
265 {
266 Send(resultCode, want, onCompleted, "", nullptr, nullptr, target);
267 }
268
Send(int resultCode,const std::shared_ptr<Want> & want,const sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const sptr<AAFwk::IWantSender> & target)269 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
270 const sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
271 const sptr<AAFwk::IWantSender> &target)
272 {
273 Send(resultCode, want, onCompleted, requiredPermission, nullptr, nullptr, target);
274 }
275
Send(int resultCode,const std::shared_ptr<Want> & want,const sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const std::shared_ptr<WantParams> & options,const std::shared_ptr<StartOptions> & startOptions,const sptr<AAFwk::IWantSender> & target)276 ErrCode PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
277 const sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
278 const std::shared_ptr<WantParams> &options, const std::shared_ptr<StartOptions> &startOptions,
279 const sptr<AAFwk::IWantSender> &target)
280 {
281 int result =
282 SendAndReturnResult(resultCode, want, onCompleted, requiredPermission, options, startOptions, target);
283 if (result != 0) {
284 return ERR_ABILITY_RUNTIME_EXTERNAL_SERVICE_BUSY;
285 }
286 return result;
287 }
288
SendAndReturnResult(int resultCode,const std::shared_ptr<Want> & want,const sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const std::shared_ptr<WantParams> & options,const std::shared_ptr<StartOptions> & startOptions,const sptr<AAFwk::IWantSender> & target)289 int PendingWant::SendAndReturnResult(int resultCode, const std::shared_ptr<Want> &want,
290 const sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
291 const std::shared_ptr<WantParams> &options, const std::shared_ptr<StartOptions> &startOptions,
292 const sptr<AAFwk::IWantSender> &target)
293 {
294 TAG_LOGD(AAFwkTag::WANTAGENT, "call");
295 SenderInfo senderInfo;
296 senderInfo.resolvedType = want != nullptr ? want->GetType() : "";
297 if (want != nullptr) {
298 senderInfo.want = *want;
299 }
300 if (options != nullptr) {
301 senderInfo.want.SetParams(*options);
302 }
303 if (startOptions != nullptr) {
304 senderInfo.startOptions = new (std::nothrow) StartOptions(*startOptions);
305 }
306 senderInfo.requiredPermission = requiredPermission;
307 senderInfo.code = resultCode;
308 senderInfo.finishedReceiver = onCompleted;
309 return WantAgentClient::GetInstance().SendWantSender(target, senderInfo);
310 }
311
IsEquals(const std::shared_ptr<PendingWant> & targetPendingWant,const std::shared_ptr<PendingWant> & otherPendingWant)312 ErrCode PendingWant::IsEquals(
313 const std::shared_ptr<PendingWant> &targetPendingWant, const std::shared_ptr<PendingWant> &otherPendingWant)
314 {
315 if ((targetPendingWant == nullptr) && (otherPendingWant == nullptr)) {
316 return ERR_OK;
317 }
318 if ((targetPendingWant == nullptr) || (otherPendingWant == nullptr)) {
319 return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
320 }
321 int targetCode = -1;
322 int otherCode = -1;
323 ErrCode targetErrCode = targetPendingWant->GetHashCode(targetPendingWant->GetTarget(), targetCode);
324 ErrCode otherErrCode = otherPendingWant->GetHashCode(otherPendingWant->GetTarget(), otherCode);
325 if (targetErrCode != ERR_OK) {
326 return targetErrCode;
327 }
328 if (otherErrCode != ERR_OK) {
329 return otherErrCode;
330 }
331 return targetCode == otherCode ? ERR_OK : NOTEQ;
332 }
333
GetTarget()334 sptr<IWantSender> PendingWant::GetTarget()
335 {
336 return target_;
337 }
338
SetTarget(const sptr<AAFwk::IWantSender> & target)339 void PendingWant::SetTarget(const sptr<AAFwk::IWantSender> &target)
340 {
341 target_ = target;
342 }
343
CancelReceiver(const std::weak_ptr<PendingWant> & outerInstance)344 PendingWant::CancelReceiver::CancelReceiver(const std::weak_ptr<PendingWant> &outerInstance)
345 : outerInstance_(outerInstance)
346 {}
347
PerformReceive(const AAFwk::Want & want,int resultCode,const std::string & data,const AAFwk::WantParams & extras,bool serialized,bool sticky,int sendingUser)348 void PendingWant::CancelReceiver::PerformReceive(const AAFwk::Want &want, int resultCode, const std::string &data,
349 const AAFwk::WantParams &extras, bool serialized, bool sticky, int sendingUser)
350 {}
351
Send(const int32_t resultCode)352 void PendingWant::CancelReceiver::Send(const int32_t resultCode)
353 {
354 if (outerInstance_.lock() != nullptr) {
355 outerInstance_.lock()->NotifyCancelListeners(resultCode);
356 }
357 }
358
RegisterCancelListener(const std::shared_ptr<CancelListener> & cancelListener,const sptr<AAFwk::IWantSender> & target)359 void PendingWant::RegisterCancelListener(
360 const std::shared_ptr<CancelListener> &cancelListener, const sptr<AAFwk::IWantSender> &target)
361 {
362 if (cancelListener == nullptr) {
363 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
364 return;
365 }
366 std::scoped_lock<std::mutex> lock(lock_object);
367 if (cancelReceiver_ == nullptr) {
368 cancelReceiver_ = new (std::nothrow) CancelReceiver(weak_from_this());
369 }
370 bool isEmpty = cancelListeners_.empty();
371 cancelListeners_.push_back(cancelListener);
372 if (isEmpty) {
373 WantAgentClient::GetInstance().RegisterCancelListener(target, cancelReceiver_);
374 }
375 }
376
NotifyCancelListeners(int32_t resultCode)377 void PendingWant::NotifyCancelListeners(int32_t resultCode)
378 {
379 std::vector<std::shared_ptr<CancelListener>> cancelListeners;
380 {
381 std::scoped_lock<std::mutex> lock(lock_object);
382 cancelListeners = std::vector<std::shared_ptr<CancelListener>>(cancelListeners_);
383 }
384 for (auto cancelListener : cancelListeners) {
385 if (cancelListener != nullptr) {
386 cancelListener->OnCancelled(resultCode);
387 }
388 }
389 }
390
UnregisterCancelListener(const std::shared_ptr<CancelListener> & cancelListener,const sptr<AAFwk::IWantSender> & target)391 void PendingWant::UnregisterCancelListener(
392 const std::shared_ptr<CancelListener> &cancelListener, const sptr<AAFwk::IWantSender> &target)
393 {
394 if (cancelListener == nullptr) {
395 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
396 return;
397 }
398
399 std::scoped_lock<std::mutex> lock(lock_object);
400 bool isEmpty = cancelListeners_.empty();
401 cancelListeners_.erase(remove_if(cancelListeners_.begin(),
402 cancelListeners_.end(),
403 [cancelListener](std::shared_ptr<CancelListener> x) { return x == cancelListener; }),
404 cancelListeners_.end());
405 if (cancelListeners_.empty() && !isEmpty) {
406 WantAgentClient::GetInstance().UnregisterCancelListener(target, cancelReceiver_);
407 }
408 }
409
GetHashCode(const sptr<AAFwk::IWantSender> & target,int & code)410 ErrCode PendingWant::GetHashCode(const sptr<AAFwk::IWantSender> &target, int &code)
411 {
412 return WantAgentClient::GetInstance().GetPendingWantCode(target, code);
413 }
414
GetUid(const sptr<AAFwk::IWantSender> & target,int32_t & uid)415 ErrCode PendingWant::GetUid(const sptr<AAFwk::IWantSender> &target, int32_t &uid)
416 {
417 return WantAgentClient::GetInstance().GetPendingWantUid(target, uid);
418 }
419
GetBundleName(const sptr<AAFwk::IWantSender> & target,std::string & bundleName)420 ErrCode PendingWant::GetBundleName(const sptr<AAFwk::IWantSender> &target, std::string &bundleName)
421 {
422 return WantAgentClient::GetInstance().GetPendingWantBundleName(target, bundleName);
423 }
424
GetWant(const sptr<AAFwk::IWantSender> & target)425 std::shared_ptr<Want> PendingWant::GetWant(const sptr<AAFwk::IWantSender> &target)
426 {
427 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
428 std::shared_ptr<Want> want = std::make_shared<Want>();
429 int ret = WantAgentClient::GetInstance().GetPendingRequestWant(target, want);
430 return ret ? nullptr : want;
431 }
432
Marshalling(Parcel & parcel) const433 bool PendingWant::Marshalling(Parcel &parcel) const
434 {
435 if (target_ == nullptr || !(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(target_->AsObject())) {
436 TAG_LOGE(AAFwkTag::WANTAGENT, "failed");
437 return false;
438 }
439
440 return true;
441 }
442
Unmarshalling(Parcel & parcel)443 PendingWant *PendingWant::Unmarshalling(Parcel &parcel)
444 {
445 PendingWant *pendingWant = new (std::nothrow) PendingWant();
446 if (pendingWant == nullptr) {
447 TAG_LOGE(AAFwkTag::WANTAGENT, "read from parcel failed");
448 return nullptr;
449 }
450 sptr<AAFwk::IWantSender> target =
451 iface_cast<AAFwk::IWantSender>((static_cast<MessageParcel*>(&parcel))->ReadRemoteObject());
452 if (target == nullptr) {
453 delete pendingWant;
454 return nullptr;
455 }
456 pendingWant->SetTarget(target);
457
458 return pendingWant;
459 }
460
GetWantSenderInfo(const sptr<AAFwk::IWantSender> & target)461 std::shared_ptr<WantSenderInfo> PendingWant::GetWantSenderInfo(const sptr<AAFwk::IWantSender> &target)
462 {
463 std::shared_ptr<WantSenderInfo> info = std::make_shared<WantSenderInfo>();
464 int ret = WantAgentClient::GetInstance().GetWantSenderInfo(target, info);
465 return ret ? nullptr : info;
466 }
467
GetType(const sptr<AAFwk::IWantSender> & target,int32_t & operType)468 ErrCode PendingWant::GetType(const sptr<AAFwk::IWantSender> &target, int32_t &operType)
469 {
470 ErrCode result = WantAgentClient::GetInstance().GetPendingWantType(target, operType);
471 return result;
472 }
473
GetWant(const sptr<AAFwk::IWantSender> & target,std::shared_ptr<AAFwk::Want> & want)474 ErrCode PendingWant::GetWant(const sptr<AAFwk::IWantSender> &target, std::shared_ptr<AAFwk::Want> &want)
475 {
476 ErrCode result = WantAgentClient::GetInstance().GetPendingRequestWant(target, want);
477 return result;
478 }
479 } // namespace OHOS::AbilityRuntime::WantAgent
480