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