• 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 "pending_want_record.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(const sptr<AAFwk::IWantSender> & target)41 WantAgentConstant::OperationType PendingWant::GetType(const sptr<AAFwk::IWantSender> &target)
42 {
43     int32_t operationType = 0;
44     WantAgentClient::GetInstance().GetPendingWantType(target, operationType);
45     return (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     WANT_AGENT_LOGI("PendingWant::GetAbility begin.");
64     if (context == nullptr) {
65         WANT_AGENT_LOGE("PendingWant::GetAbility invalid input param.");
66         return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
67     }
68 
69     WantsInfo wantsInfo;
70     wantsInfo.want = *want;
71     wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
72     if (options != nullptr && !options->IsEmpty()) {
73         wantsInfo.want.SetParams(*options);
74     }
75 
76     WantSenderInfo wantSenderInfo;
77     wantSenderInfo.type = static_cast<int32_t>(WantAgentConstant::OperationType::START_ABILITY);
78     wantSenderInfo.allWants.push_back(wantsInfo);
79     wantSenderInfo.bundleName = context->GetBundleName();
80     wantSenderInfo.flags = flags;
81     wantSenderInfo.userId = -1; // -1 : invalid user id
82     wantSenderInfo.requestCode = requestCode;
83     sptr<IWantSender> target = nullptr;
84     ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
85     if (result != ERR_OK) {
86         WANT_AGENT_LOGI("PendingWant::GetWantSender failed.");
87         return result;
88     }
89     WANT_AGENT_LOGI("PendingWant::GetAbility end.");
90     pendingWant = std::make_shared<PendingWant>(target);
91     return ERR_OK;
92 }
93 
GetAbilities(const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> & context,int requestCode,std::vector<std::shared_ptr<Want>> & wants,unsigned int flags)94 std::shared_ptr<PendingWant> PendingWant::GetAbilities(
95     const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context, int requestCode,
96     std::vector<std::shared_ptr<Want>> &wants, unsigned int flags)
97 {
98     std::shared_ptr<PendingWant> pendingWant = nullptr;
99     GetAbilities(context, requestCode, wants, flags, nullptr, pendingWant);
100     return pendingWant;
101 }
102 
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)103 ErrCode PendingWant::GetAbilities(
104     const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context, int requestCode,
105     std::vector<std::shared_ptr<Want>> &wants, unsigned int flags, const std::shared_ptr<WantParams> &options,
106     std::shared_ptr<PendingWant> &pendingWant)
107 {
108     WANT_AGENT_LOGI("PendingWant::GetAbilitys begin.");
109     if (context == nullptr) {
110         WANT_AGENT_LOGE("PendingWant::GetAbilities invalid input param.");
111         return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
112     }
113 
114     WantSenderInfo wantSenderInfo;
115     wantSenderInfo.type = static_cast<int32_t>(WantAgentConstant::OperationType::START_ABILITIES);
116     wantSenderInfo.bundleName = context->GetBundleName();
117     wantSenderInfo.flags = flags;
118     wantSenderInfo.userId = -1; // -1 : invalid user id
119     wantSenderInfo.requestCode = requestCode;
120     for (auto want : wants) {
121         WantsInfo wantsInfo;
122         if (want != nullptr) {
123             wantsInfo.want = *want;
124         }
125         wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
126         if (options != nullptr && !options->IsEmpty()) {
127             wantsInfo.want.SetParams(*options);
128         }
129         wantSenderInfo.allWants.push_back(wantsInfo);
130     }
131     sptr<IWantSender> target = nullptr;
132     ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
133     if (result != ERR_OK) {
134         WANT_AGENT_LOGI("PendingWant::GetWantSender failed.");
135         return result;
136     }
137     pendingWant = std::make_shared<PendingWant>(target);
138     return ERR_OK;
139 }
140 
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)141 ErrCode PendingWant::GetCommonEvent(
142     const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
143     int requestCode, const std::shared_ptr<Want> &want, unsigned int flags,
144     std::shared_ptr<PendingWant> &pendingWant)
145 {
146     return GetCommonEventAsUser(context, requestCode, want, flags, 0, pendingWant);
147 }
148 
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)149 ErrCode PendingWant::GetCommonEventAsUser(
150     const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
151     int requestCode, const std::shared_ptr<Want> &want, unsigned int flags, int uid,
152     std::shared_ptr<PendingWant> &pendingWant)
153 {
154     if (context == nullptr) {
155         WANT_AGENT_LOGE("PendingWant::GetCommonEventAsUser invalid input param.");
156         return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
157     }
158 
159     WantsInfo wantsInfo;
160     if (want != nullptr) {
161         wantsInfo.want = *want;
162     }
163     wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
164 
165     WantSenderInfo wantSenderInfo;
166     wantSenderInfo.type = static_cast<int32_t>(WantAgentConstant::OperationType::SEND_COMMON_EVENT);
167     wantSenderInfo.allWants.push_back(wantsInfo);
168     wantSenderInfo.bundleName = context->GetBundleName();
169     wantSenderInfo.flags = flags;
170     wantSenderInfo.userId = -1; // -1 : invalid user id
171     wantSenderInfo.requestCode = requestCode;
172     sptr<IWantSender> target = nullptr;
173     ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
174     if (result != ERR_OK) {
175         WANT_AGENT_LOGI("PendingWant::GetWantSender failed.");
176         return result;
177     }
178     pendingWant = std::make_shared<PendingWant>(target);
179     return ERR_OK;
180 }
181 
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)182 ErrCode PendingWant::GetService(
183     const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
184     int requestCode, const std::shared_ptr<AAFwk::Want> &want, unsigned int flags,
185     std::shared_ptr<PendingWant> &pendingWant)
186 {
187     return BuildServicePendingWant(context, requestCode, want, flags,
188         WantAgentConstant::OperationType::START_SERVICE, pendingWant);
189 }
190 
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)191 ErrCode PendingWant::GetForegroundService(
192     const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context, int requestCode,
193     const std::shared_ptr<Want> &want, unsigned int flags,
194     std::shared_ptr<PendingWant> &pendingWant)
195 {
196     return BuildServicePendingWant(
197         context, requestCode, want, flags, WantAgentConstant::OperationType::START_FOREGROUND_SERVICE,
198         pendingWant);
199 }
200 
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)201 ErrCode PendingWant::BuildServicePendingWant(
202     const std::shared_ptr<OHOS::AbilityRuntime::ApplicationContext> &context,
203     int requestCode, const std::shared_ptr<Want> &want,
204     unsigned int flags, WantAgentConstant::OperationType serviceKind,
205     std::shared_ptr<PendingWant> &pendingWant)
206 {
207     if (context == nullptr) {
208         WANT_AGENT_LOGE("PendingWant::BuildServicePendingWant invalid input param.");
209         return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
210     }
211 
212     WantsInfo wantsInfo;
213     if (want != nullptr) {
214         wantsInfo.want = *want;
215     }
216     wantsInfo.resolvedTypes = want != nullptr ? want->GetType() : "";
217 
218     WantSenderInfo wantSenderInfo;
219     wantSenderInfo.type = static_cast<int32_t>(serviceKind);
220     wantSenderInfo.allWants.push_back(wantsInfo);
221     wantSenderInfo.bundleName = context->GetBundleName();
222     wantSenderInfo.flags = flags;
223     wantSenderInfo.userId = -1; // -1 : invalid user id
224     wantSenderInfo.requestCode = requestCode;
225     sptr<IWantSender> target = nullptr;
226     ErrCode result = WantAgentClient::GetInstance().GetWantSender(wantSenderInfo, nullptr, target);
227     if (result != ERR_OK) {
228         return result;
229     }
230     pendingWant = std::make_shared<PendingWant>(target);
231     return ERR_OK;
232 }
233 
Cancel(const sptr<AAFwk::IWantSender> & target)234 ErrCode PendingWant::Cancel(const sptr<AAFwk::IWantSender> &target)
235 {
236     return WantAgentClient::GetInstance().CancelWantSender(target);
237 }
238 
Send(const sptr<AAFwk::IWantSender> & target)239 void PendingWant::Send(const sptr<AAFwk::IWantSender> &target)
240 {
241     Send(0, nullptr, nullptr, "", nullptr, target);
242 }
243 
Send(int resultCode,const sptr<AAFwk::IWantSender> & target)244 void PendingWant::Send(int resultCode, const sptr<AAFwk::IWantSender> &target)
245 {
246     Send(resultCode, nullptr, nullptr, "", nullptr, target);
247 }
248 
Send(int resultCode,const std::shared_ptr<Want> & want,const sptr<AAFwk::IWantSender> & target)249 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
250     const sptr<AAFwk::IWantSender> &target)
251 {
252     Send(resultCode, want, nullptr, "", nullptr, target);
253 }
254 
Send(int resultCode,const sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)255 void PendingWant::Send(
256     int resultCode, const sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
257 {
258     Send(resultCode, nullptr, onCompleted, "", nullptr, target);
259 }
260 
Send(int resultCode,const std::shared_ptr<Want> & want,const sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)261 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
262     const sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
263 {
264     Send(resultCode, want, onCompleted, "", nullptr, target);
265 }
266 
Send(int resultCode,const std::shared_ptr<Want> & want,const sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const sptr<AAFwk::IWantSender> & target)267 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
268     const sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
269     const sptr<AAFwk::IWantSender> &target)
270 {
271     Send(resultCode, want, onCompleted, requiredPermission, nullptr, target);
272 }
273 
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)274 ErrCode PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
275     const sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
276     const std::shared_ptr<WantParams> &options, const sptr<AAFwk::IWantSender> &target)
277 {
278     HILOG_INFO("%{public}s:begin.", __func__);
279     int result = SendAndReturnResult(resultCode, want, onCompleted, requiredPermission, options, target);
280     if (result != 0) {
281         WANT_AGENT_LOGE("PendingWant::SendAndReturnResult failed.");
282         return ERR_ABILITY_RUNTIME_EXTERNAL_SERVICE_BUSY;
283     }
284     return result;
285 }
286 
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)287 int PendingWant::SendAndReturnResult(int resultCode, const std::shared_ptr<Want> &want,
288     const sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
289     const std::shared_ptr<WantParams> &options, const sptr<AAFwk::IWantSender> &target)
290 {
291     HILOG_INFO("%{public}s:begin.", __func__);
292     SenderInfo senderInfo;
293     senderInfo.resolvedType = want != nullptr ? want->GetType() : "";
294     if (want != nullptr) {
295         senderInfo.want = *want;
296     }
297     if (options != nullptr) {
298         senderInfo.want.SetParams(*options);
299     }
300     senderInfo.requiredPermission = requiredPermission;
301     senderInfo.code = resultCode;
302     senderInfo.finishedReceiver = onCompleted;
303     return WantAgentClient::GetInstance().SendWantSender(target, senderInfo);
304 }
305 
IsEquals(const std::shared_ptr<PendingWant> & targetPendingWant,const std::shared_ptr<PendingWant> & otherPendingWant)306 ErrCode PendingWant::IsEquals(
307     const std::shared_ptr<PendingWant> &targetPendingWant, const std::shared_ptr<PendingWant> &otherPendingWant)
308 {
309     if ((targetPendingWant == nullptr) && (otherPendingWant == nullptr)) {
310         return ERR_OK;
311     }
312     if ((targetPendingWant == nullptr) || (otherPendingWant == nullptr)) {
313         return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
314     }
315     int targetCode = -1;
316     int otherCode = -1;
317     ErrCode targetErrCode = targetPendingWant->GetHashCode(targetPendingWant->GetTarget(), targetCode);
318     ErrCode otherErrCode = otherPendingWant->GetHashCode(otherPendingWant->GetTarget(), otherCode);
319     if (targetErrCode != ERR_OK) {
320         return targetErrCode;
321     }
322     if (otherErrCode != ERR_OK) {
323         return otherErrCode;
324     }
325     return targetCode == otherCode ? ERR_OK : NOTEQ;
326 }
327 
GetTarget()328 sptr<IWantSender> PendingWant::GetTarget()
329 {
330     return target_;
331 }
332 
SetTarget(const sptr<AAFwk::IWantSender> & target)333 void PendingWant::SetTarget(const sptr<AAFwk::IWantSender> &target)
334 {
335     target_ = target;
336 }
337 
CancelReceiver(const std::weak_ptr<PendingWant> & outerInstance)338 PendingWant::CancelReceiver::CancelReceiver(const std::weak_ptr<PendingWant> &outerInstance)
339     : outerInstance_(outerInstance)
340 {}
341 
PerformReceive(const AAFwk::Want & want,int resultCode,const std::string & data,const AAFwk::WantParams & extras,bool serialized,bool sticky,int sendingUser)342 void PendingWant::CancelReceiver::PerformReceive(const AAFwk::Want &want, int resultCode, const std::string &data,
343     const AAFwk::WantParams &extras, bool serialized, bool sticky, int sendingUser)
344 {}
345 
Send(const int32_t resultCode)346 void PendingWant::CancelReceiver::Send(const int32_t resultCode)
347 {
348     HILOG_INFO("%{public}s:begin.", __func__);
349 
350     if (outerInstance_.lock() != nullptr) {
351         outerInstance_.lock()->NotifyCancelListeners(resultCode);
352     }
353 }
354 
RegisterCancelListener(const std::shared_ptr<CancelListener> & cancelListener,const sptr<AAFwk::IWantSender> & target)355 void PendingWant::RegisterCancelListener(
356     const std::shared_ptr<CancelListener> &cancelListener, const sptr<AAFwk::IWantSender> &target)
357 {
358     HILOG_INFO("%{public}s:begin.", __func__);
359 
360     if (cancelListener == nullptr) {
361         WANT_AGENT_LOGE("PendingWant::RegisterCancelListener invalid input param.");
362         return;
363     }
364     std::scoped_lock<std::mutex> lock(lock_object);
365     if (cancelReceiver_ == nullptr) {
366         cancelReceiver_ = new (std::nothrow) CancelReceiver(weak_from_this());
367     }
368     bool isEmpty = cancelListeners_.empty();
369     cancelListeners_.push_back(cancelListener);
370     if (isEmpty) {
371         WantAgentClient::GetInstance().RegisterCancelListener(target, cancelReceiver_);
372     }
373 }
374 
NotifyCancelListeners(int32_t resultCode)375 void PendingWant::NotifyCancelListeners(int32_t resultCode)
376 {
377     HILOG_INFO("%{public}s:begin.", __func__);
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     HILOG_INFO("%{public}s:begin.", __func__);
395 
396     if (cancelListener == nullptr) {
397         WANT_AGENT_LOGE("PendingWant::UnregisterCancelListener invalid input param.");
398         return;
399     }
400 
401     std::scoped_lock<std::mutex> lock(lock_object);
402     bool isEmpty = cancelListeners_.empty();
403     cancelListeners_.erase(remove_if(cancelListeners_.begin(),
404         cancelListeners_.end(),
405         [cancelListener](std::shared_ptr<CancelListener> x) { return x == cancelListener; }),
406         cancelListeners_.end());
407     if (cancelListeners_.empty() && !isEmpty) {
408         WantAgentClient::GetInstance().UnregisterCancelListener(target, cancelReceiver_);
409     }
410 }
411 
GetHashCode(const sptr<AAFwk::IWantSender> & target,int & code)412 ErrCode PendingWant::GetHashCode(const sptr<AAFwk::IWantSender> &target, int &code)
413 {
414     return WantAgentClient::GetInstance().GetPendingWantCode(target, code);
415 }
416 
GetUid(const sptr<AAFwk::IWantSender> & target,int32_t & uid)417 ErrCode PendingWant::GetUid(const sptr<AAFwk::IWantSender> &target, int32_t &uid)
418 {
419     return WantAgentClient::GetInstance().GetPendingWantUid(target, uid);
420 }
421 
GetBundleName(const sptr<AAFwk::IWantSender> & target,std::string & bundleName)422 ErrCode PendingWant::GetBundleName(const sptr<AAFwk::IWantSender> &target, std::string &bundleName)
423 {
424     return WantAgentClient::GetInstance().GetPendingWantBundleName(target, bundleName);
425 }
426 
GetWant(const sptr<AAFwk::IWantSender> & target)427 std::shared_ptr<Want> PendingWant::GetWant(const sptr<AAFwk::IWantSender> &target)
428 {
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         WANT_AGENT_LOGE("parcel WriteString 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         WANT_AGENT_LOGE("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