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