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(int resultCode,sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)241 void PendingWant::Send(
242 int resultCode, sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
243 {
244 Send(resultCode, nullptr, onCompleted, "", nullptr, nullptr, target, nullptr);
245 }
246
Send(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)247 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
248 sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
249 {
250 Send(resultCode, want, onCompleted, "", nullptr, nullptr, target, nullptr);
251 }
252
Send(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const sptr<AAFwk::IWantSender> & target)253 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
254 sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
255 const sptr<AAFwk::IWantSender> &target)
256 {
257 Send(resultCode, want, onCompleted, requiredPermission, nullptr, nullptr, target, nullptr);
258 }
259
Send(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const std::shared_ptr<WantParams> & options,const std::shared_ptr<StartOptions> & startOptions,const sptr<AAFwk::IWantSender> & target,sptr<IRemoteObject> callerToken)260 ErrCode PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
261 sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
262 const std::shared_ptr<WantParams> &options, const std::shared_ptr<StartOptions> &startOptions,
263 const sptr<AAFwk::IWantSender> &target, sptr<IRemoteObject> callerToken)
264 {
265 int result =
266 SendAndReturnResult(resultCode, want, onCompleted, requiredPermission, options,
267 startOptions, target, callerToken);
268 return result;
269 }
270
SendAndReturnResult(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const std::shared_ptr<WantParams> & options,const std::shared_ptr<StartOptions> & startOptions,const sptr<AAFwk::IWantSender> & target,sptr<IRemoteObject> callerToken)271 int PendingWant::SendAndReturnResult(int resultCode, const std::shared_ptr<Want> &want,
272 sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
273 const std::shared_ptr<WantParams> &options, const std::shared_ptr<StartOptions> &startOptions,
274 const sptr<AAFwk::IWantSender> &target, sptr<IRemoteObject> callerToken)
275 {
276 TAG_LOGD(AAFwkTag::WANTAGENT, "call");
277 SenderInfo senderInfo;
278 senderInfo.resolvedType = want != nullptr ? want->GetType() : "";
279 if (want != nullptr) {
280 senderInfo.want = *want;
281 }
282 if (options != nullptr) {
283 senderInfo.want.SetParams(*options);
284 }
285 if (startOptions != nullptr) {
286 senderInfo.startOptions = new (std::nothrow) StartOptions(*startOptions);
287 }
288 senderInfo.requiredPermission = requiredPermission;
289 senderInfo.code = resultCode;
290 senderInfo.finishedReceiver = onCompleted;
291 senderInfo.callerToken = callerToken;
292 int res = WantAgentClient::GetInstance().SendWantSender(target, senderInfo);
293 if (senderInfo.finishedReceiver == nullptr) {
294 return res;
295 }
296 sptr<IRemoteObject> obj = senderInfo.finishedReceiver->AsObject();
297 if (obj == nullptr) {
298 TAG_LOGE(AAFwkTag::WANTAGENT, "finishedReceiver obj null");
299 return res;
300 }
301 if (onCompleted != nullptr) {
302 onCompleted = iface_cast<CompletedDispatcher>(obj);
303 }
304 return res;
305 }
306
IsEquals(const std::shared_ptr<PendingWant> & targetPendingWant,const std::shared_ptr<PendingWant> & otherPendingWant)307 ErrCode PendingWant::IsEquals(
308 const std::shared_ptr<PendingWant> &targetPendingWant, const std::shared_ptr<PendingWant> &otherPendingWant)
309 {
310 if ((targetPendingWant == nullptr) && (otherPendingWant == nullptr)) {
311 return ERR_OK;
312 }
313 if ((targetPendingWant == nullptr) || (otherPendingWant == nullptr)) {
314 return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
315 }
316 int targetCode = -1;
317 int otherCode = -1;
318 ErrCode targetErrCode = targetPendingWant->GetHashCode(targetPendingWant->GetTarget(), targetCode);
319 ErrCode otherErrCode = otherPendingWant->GetHashCode(otherPendingWant->GetTarget(), otherCode);
320 if (targetErrCode != ERR_OK) {
321 return targetErrCode;
322 }
323 if (otherErrCode != ERR_OK) {
324 return otherErrCode;
325 }
326 return targetCode == otherCode ? ERR_OK : NOTEQ;
327 }
328
GetTarget()329 sptr<IWantSender> PendingWant::GetTarget()
330 {
331 return target_;
332 }
333
SetTarget(const sptr<AAFwk::IWantSender> & target)334 void PendingWant::SetTarget(const sptr<AAFwk::IWantSender> &target)
335 {
336 target_ = target;
337 }
338
CancelReceiver(const std::weak_ptr<PendingWant> & outerInstance)339 PendingWant::CancelReceiver::CancelReceiver(const std::weak_ptr<PendingWant> &outerInstance)
340 : outerInstance_(outerInstance)
341 {}
342
PerformReceive(const AAFwk::Want & want,int resultCode,const std::string & data,const AAFwk::WantParams & extras,bool serialized,bool sticky,int sendingUser)343 void PendingWant::CancelReceiver::PerformReceive(const AAFwk::Want &want, int resultCode, const std::string &data,
344 const AAFwk::WantParams &extras, bool serialized, bool sticky, int sendingUser)
345 {}
346
Send(const int32_t resultCode)347 void PendingWant::CancelReceiver::Send(const int32_t resultCode)
348 {
349 if (outerInstance_.lock() != nullptr) {
350 outerInstance_.lock()->NotifyCancelListeners(resultCode);
351 }
352 }
353
RegisterCancelListener(const std::shared_ptr<CancelListener> & cancelListener,const sptr<AAFwk::IWantSender> & target)354 void PendingWant::RegisterCancelListener(
355 const std::shared_ptr<CancelListener> &cancelListener, const sptr<AAFwk::IWantSender> &target)
356 {
357 if (cancelListener == nullptr) {
358 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
359 return;
360 }
361 std::scoped_lock<std::mutex> lock(lock_object);
362 if (cancelReceiver_ == nullptr) {
363 cancelReceiver_ = new (std::nothrow) CancelReceiver(weak_from_this());
364 }
365 bool isEmpty = cancelListeners_.empty();
366 cancelListeners_.push_back(cancelListener);
367 if (isEmpty) {
368 WantAgentClient::GetInstance().RegisterCancelListener(target, cancelReceiver_);
369 }
370 }
371
NotifyCancelListeners(int32_t resultCode)372 void PendingWant::NotifyCancelListeners(int32_t resultCode)
373 {
374 std::vector<std::shared_ptr<CancelListener>> cancelListeners;
375 {
376 std::scoped_lock<std::mutex> lock(lock_object);
377 cancelListeners = std::vector<std::shared_ptr<CancelListener>>(cancelListeners_);
378 }
379 for (auto cancelListener : cancelListeners) {
380 if (cancelListener != nullptr) {
381 cancelListener->OnCancelled(resultCode);
382 }
383 }
384 }
385
UnregisterCancelListener(const std::shared_ptr<CancelListener> & cancelListener,const sptr<AAFwk::IWantSender> & target)386 void PendingWant::UnregisterCancelListener(
387 const std::shared_ptr<CancelListener> &cancelListener, const sptr<AAFwk::IWantSender> &target)
388 {
389 if (cancelListener == nullptr) {
390 TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
391 return;
392 }
393
394 std::scoped_lock<std::mutex> lock(lock_object);
395 bool isEmpty = cancelListeners_.empty();
396 cancelListeners_.erase(remove_if(cancelListeners_.begin(),
397 cancelListeners_.end(),
398 [cancelListener](std::shared_ptr<CancelListener> x) { return x == cancelListener; }),
399 cancelListeners_.end());
400 if (cancelListeners_.empty() && !isEmpty) {
401 WantAgentClient::GetInstance().UnregisterCancelListener(target, cancelReceiver_);
402 }
403 }
404
GetHashCode(const sptr<AAFwk::IWantSender> & target,int & code)405 ErrCode PendingWant::GetHashCode(const sptr<AAFwk::IWantSender> &target, int &code)
406 {
407 return WantAgentClient::GetInstance().GetPendingWantCode(target, code);
408 }
409
GetUid(const sptr<AAFwk::IWantSender> & target,int32_t & uid)410 ErrCode PendingWant::GetUid(const sptr<AAFwk::IWantSender> &target, int32_t &uid)
411 {
412 return WantAgentClient::GetInstance().GetPendingWantUid(target, uid);
413 }
414
GetBundleName(const sptr<AAFwk::IWantSender> & target,std::string & bundleName)415 ErrCode PendingWant::GetBundleName(const sptr<AAFwk::IWantSender> &target, std::string &bundleName)
416 {
417 return WantAgentClient::GetInstance().GetPendingWantBundleName(target, bundleName);
418 }
419
GetWant(const sptr<AAFwk::IWantSender> & target)420 std::shared_ptr<Want> PendingWant::GetWant(const sptr<AAFwk::IWantSender> &target)
421 {
422 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
423 std::shared_ptr<Want> want = std::make_shared<Want>();
424 int ret = WantAgentClient::GetInstance().GetPendingRequestWant(target, want);
425 return ret ? nullptr : want;
426 }
427
Marshalling(Parcel & parcel) const428 bool PendingWant::Marshalling(Parcel &parcel) const
429 {
430 if (target_ == nullptr || !(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(target_->AsObject())) {
431 TAG_LOGE(AAFwkTag::WANTAGENT, "failed");
432 return false;
433 }
434
435 return true;
436 }
437
Unmarshalling(Parcel & parcel)438 PendingWant *PendingWant::Unmarshalling(Parcel &parcel)
439 {
440 PendingWant *pendingWant = new (std::nothrow) PendingWant();
441 if (pendingWant == nullptr) {
442 TAG_LOGE(AAFwkTag::WANTAGENT, "read from parcel failed");
443 return nullptr;
444 }
445 sptr<AAFwk::IWantSender> target =
446 iface_cast<AAFwk::IWantSender>((static_cast<MessageParcel*>(&parcel))->ReadRemoteObject());
447 if (target == nullptr) {
448 delete pendingWant;
449 return nullptr;
450 }
451 pendingWant->SetTarget(target);
452
453 return pendingWant;
454 }
455
GetWantSenderInfo(const sptr<AAFwk::IWantSender> & target)456 std::shared_ptr<WantSenderInfo> PendingWant::GetWantSenderInfo(const sptr<AAFwk::IWantSender> &target)
457 {
458 std::shared_ptr<WantSenderInfo> info = std::make_shared<WantSenderInfo>();
459 int ret = WantAgentClient::GetInstance().GetWantSenderInfo(target, info);
460 return ret ? nullptr : info;
461 }
462
GetType(const sptr<AAFwk::IWantSender> & target,int32_t & operType)463 ErrCode PendingWant::GetType(const sptr<AAFwk::IWantSender> &target, int32_t &operType)
464 {
465 ErrCode result = WantAgentClient::GetInstance().GetPendingWantType(target, operType);
466 return result;
467 }
468
GetWant(const sptr<AAFwk::IWantSender> & target,std::shared_ptr<AAFwk::Want> & want)469 ErrCode PendingWant::GetWant(const sptr<AAFwk::IWantSender> &target, std::shared_ptr<AAFwk::Want> &want)
470 {
471 ErrCode result = WantAgentClient::GetInstance().GetPendingRequestWant(target, want);
472 return result;
473 }
474 } // namespace OHOS::AbilityRuntime::WantAgent
475