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