• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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