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