• 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(int resultCode,sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)241 void PendingWant::Send(
242     int resultCode, sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
243 {
244     Send(resultCode, nullptr, onCompleted, "", nullptr, nullptr, target, nullptr);
245 }
246 
Send(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const sptr<AAFwk::IWantSender> & target)247 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
248     sptr<CompletedDispatcher> &onCompleted, const sptr<AAFwk::IWantSender> &target)
249 {
250     Send(resultCode, want, onCompleted, "", nullptr, nullptr, target, nullptr);
251 }
252 
Send(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const sptr<AAFwk::IWantSender> & target)253 void PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
254     sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
255     const sptr<AAFwk::IWantSender> &target)
256 {
257     Send(resultCode, want, onCompleted, requiredPermission, nullptr, nullptr, target, nullptr);
258 }
259 
Send(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const std::shared_ptr<WantParams> & options,const std::shared_ptr<StartOptions> & startOptions,const sptr<AAFwk::IWantSender> & target,sptr<IRemoteObject> callerToken)260 ErrCode PendingWant::Send(int resultCode, const std::shared_ptr<Want> &want,
261     sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
262     const std::shared_ptr<WantParams> &options, const std::shared_ptr<StartOptions> &startOptions,
263     const sptr<AAFwk::IWantSender> &target, sptr<IRemoteObject> callerToken)
264 {
265     int result =
266         SendAndReturnResult(resultCode, want, onCompleted, requiredPermission, options,
267             startOptions, target, callerToken);
268     return result;
269 }
270 
SendAndReturnResult(int resultCode,const std::shared_ptr<Want> & want,sptr<CompletedDispatcher> & onCompleted,const std::string & requiredPermission,const std::shared_ptr<WantParams> & options,const std::shared_ptr<StartOptions> & startOptions,const sptr<AAFwk::IWantSender> & target,sptr<IRemoteObject> callerToken)271 int PendingWant::SendAndReturnResult(int resultCode, const std::shared_ptr<Want> &want,
272     sptr<CompletedDispatcher> &onCompleted, const std::string &requiredPermission,
273     const std::shared_ptr<WantParams> &options, const std::shared_ptr<StartOptions> &startOptions,
274     const sptr<AAFwk::IWantSender> &target, sptr<IRemoteObject> callerToken)
275 {
276     TAG_LOGD(AAFwkTag::WANTAGENT, "call");
277     SenderInfo senderInfo;
278     senderInfo.resolvedType = want != nullptr ? want->GetType() : "";
279     if (want != nullptr) {
280         senderInfo.want = *want;
281     }
282     if (options != nullptr) {
283         senderInfo.want.SetParams(*options);
284     }
285     if (startOptions != nullptr) {
286         senderInfo.startOptions = new (std::nothrow) StartOptions(*startOptions);
287     }
288     senderInfo.requiredPermission = requiredPermission;
289     senderInfo.code = resultCode;
290     senderInfo.finishedReceiver = onCompleted;
291     senderInfo.callerToken = callerToken;
292     int res = WantAgentClient::GetInstance().SendWantSender(target, senderInfo);
293     if (senderInfo.finishedReceiver == nullptr) {
294         return res;
295     }
296     sptr<IRemoteObject> obj = senderInfo.finishedReceiver->AsObject();
297     if (obj == nullptr) {
298         TAG_LOGE(AAFwkTag::WANTAGENT, "finishedReceiver obj null");
299         return res;
300     }
301     if (onCompleted != nullptr) {
302         onCompleted = iface_cast<CompletedDispatcher>(obj);
303     }
304     return res;
305 }
306 
IsEquals(const std::shared_ptr<PendingWant> & targetPendingWant,const std::shared_ptr<PendingWant> & otherPendingWant)307 ErrCode PendingWant::IsEquals(
308     const std::shared_ptr<PendingWant> &targetPendingWant, const std::shared_ptr<PendingWant> &otherPendingWant)
309 {
310     if ((targetPendingWant == nullptr) && (otherPendingWant == nullptr)) {
311         return ERR_OK;
312     }
313     if ((targetPendingWant == nullptr) || (otherPendingWant == nullptr)) {
314         return ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER;
315     }
316     int targetCode = -1;
317     int otherCode = -1;
318     ErrCode targetErrCode = targetPendingWant->GetHashCode(targetPendingWant->GetTarget(), targetCode);
319     ErrCode otherErrCode = otherPendingWant->GetHashCode(otherPendingWant->GetTarget(), otherCode);
320     if (targetErrCode != ERR_OK) {
321         return targetErrCode;
322     }
323     if (otherErrCode != ERR_OK) {
324         return otherErrCode;
325     }
326     return targetCode == otherCode ? ERR_OK : NOTEQ;
327 }
328 
GetTarget()329 sptr<IWantSender> PendingWant::GetTarget()
330 {
331     return target_;
332 }
333 
SetTarget(const sptr<AAFwk::IWantSender> & target)334 void PendingWant::SetTarget(const sptr<AAFwk::IWantSender> &target)
335 {
336     target_ = target;
337 }
338 
CancelReceiver(const std::weak_ptr<PendingWant> & outerInstance)339 PendingWant::CancelReceiver::CancelReceiver(const std::weak_ptr<PendingWant> &outerInstance)
340     : outerInstance_(outerInstance)
341 {}
342 
PerformReceive(const AAFwk::Want & want,int resultCode,const std::string & data,const AAFwk::WantParams & extras,bool serialized,bool sticky,int sendingUser)343 void PendingWant::CancelReceiver::PerformReceive(const AAFwk::Want &want, int resultCode, const std::string &data,
344     const AAFwk::WantParams &extras, bool serialized, bool sticky, int sendingUser)
345 {}
346 
Send(const int32_t resultCode)347 void PendingWant::CancelReceiver::Send(const int32_t resultCode)
348 {
349     if (outerInstance_.lock() != nullptr) {
350         outerInstance_.lock()->NotifyCancelListeners(resultCode);
351     }
352 }
353 
RegisterCancelListener(const std::shared_ptr<CancelListener> & cancelListener,const sptr<AAFwk::IWantSender> & target)354 void PendingWant::RegisterCancelListener(
355     const std::shared_ptr<CancelListener> &cancelListener, const sptr<AAFwk::IWantSender> &target)
356 {
357     if (cancelListener == nullptr) {
358         TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
359         return;
360     }
361     std::scoped_lock<std::mutex> lock(lock_object);
362     if (cancelReceiver_ == nullptr) {
363         cancelReceiver_ = new (std::nothrow) CancelReceiver(weak_from_this());
364     }
365     bool isEmpty = cancelListeners_.empty();
366     cancelListeners_.push_back(cancelListener);
367     if (isEmpty) {
368         WantAgentClient::GetInstance().RegisterCancelListener(target, cancelReceiver_);
369     }
370 }
371 
NotifyCancelListeners(int32_t resultCode)372 void PendingWant::NotifyCancelListeners(int32_t resultCode)
373 {
374     std::vector<std::shared_ptr<CancelListener>> cancelListeners;
375     {
376         std::scoped_lock<std::mutex> lock(lock_object);
377         cancelListeners = std::vector<std::shared_ptr<CancelListener>>(cancelListeners_);
378     }
379     for (auto cancelListener : cancelListeners) {
380         if (cancelListener != nullptr) {
381             cancelListener->OnCancelled(resultCode);
382         }
383     }
384 }
385 
UnregisterCancelListener(const std::shared_ptr<CancelListener> & cancelListener,const sptr<AAFwk::IWantSender> & target)386 void PendingWant::UnregisterCancelListener(
387     const std::shared_ptr<CancelListener> &cancelListener, const sptr<AAFwk::IWantSender> &target)
388 {
389     if (cancelListener == nullptr) {
390         TAG_LOGE(AAFwkTag::WANTAGENT, "invalid input param");
391         return;
392     }
393 
394     std::scoped_lock<std::mutex> lock(lock_object);
395     bool isEmpty = cancelListeners_.empty();
396     cancelListeners_.erase(remove_if(cancelListeners_.begin(),
397         cancelListeners_.end(),
398         [cancelListener](std::shared_ptr<CancelListener> x) { return x == cancelListener; }),
399         cancelListeners_.end());
400     if (cancelListeners_.empty() && !isEmpty) {
401         WantAgentClient::GetInstance().UnregisterCancelListener(target, cancelReceiver_);
402     }
403 }
404 
GetHashCode(const sptr<AAFwk::IWantSender> & target,int & code)405 ErrCode PendingWant::GetHashCode(const sptr<AAFwk::IWantSender> &target, int &code)
406 {
407     return WantAgentClient::GetInstance().GetPendingWantCode(target, code);
408 }
409 
GetUid(const sptr<AAFwk::IWantSender> & target,int32_t & uid)410 ErrCode PendingWant::GetUid(const sptr<AAFwk::IWantSender> &target, int32_t &uid)
411 {
412     return WantAgentClient::GetInstance().GetPendingWantUid(target, uid);
413 }
414 
GetBundleName(const sptr<AAFwk::IWantSender> & target,std::string & bundleName)415 ErrCode PendingWant::GetBundleName(const sptr<AAFwk::IWantSender> &target, std::string &bundleName)
416 {
417     return WantAgentClient::GetInstance().GetPendingWantBundleName(target, bundleName);
418 }
419 
GetWant(const sptr<AAFwk::IWantSender> & target)420 std::shared_ptr<Want> PendingWant::GetWant(const sptr<AAFwk::IWantSender> &target)
421 {
422     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
423     std::shared_ptr<Want> want = std::make_shared<Want>();
424     int ret = WantAgentClient::GetInstance().GetPendingRequestWant(target, want);
425     return ret ? nullptr : want;
426 }
427 
Marshalling(Parcel & parcel) const428 bool PendingWant::Marshalling(Parcel &parcel) const
429 {
430     if (target_ == nullptr || !(static_cast<MessageParcel*>(&parcel))->WriteRemoteObject(target_->AsObject())) {
431         TAG_LOGE(AAFwkTag::WANTAGENT, "failed");
432         return false;
433     }
434 
435     return true;
436 }
437 
Unmarshalling(Parcel & parcel)438 PendingWant *PendingWant::Unmarshalling(Parcel &parcel)
439 {
440     PendingWant *pendingWant = new (std::nothrow) PendingWant();
441     if (pendingWant == nullptr) {
442         TAG_LOGE(AAFwkTag::WANTAGENT, "read from parcel failed");
443         return nullptr;
444     }
445     sptr<AAFwk::IWantSender> target =
446         iface_cast<AAFwk::IWantSender>((static_cast<MessageParcel*>(&parcel))->ReadRemoteObject());
447     if (target == nullptr) {
448         delete pendingWant;
449         return nullptr;
450     }
451     pendingWant->SetTarget(target);
452 
453     return pendingWant;
454 }
455 
GetWantSenderInfo(const sptr<AAFwk::IWantSender> & target)456 std::shared_ptr<WantSenderInfo> PendingWant::GetWantSenderInfo(const sptr<AAFwk::IWantSender> &target)
457 {
458     std::shared_ptr<WantSenderInfo> info = std::make_shared<WantSenderInfo>();
459     int ret = WantAgentClient::GetInstance().GetWantSenderInfo(target, info);
460     return ret ? nullptr : info;
461 }
462 
GetType(const sptr<AAFwk::IWantSender> & target,int32_t & operType)463 ErrCode PendingWant::GetType(const sptr<AAFwk::IWantSender> &target, int32_t &operType)
464 {
465     ErrCode result = WantAgentClient::GetInstance().GetPendingWantType(target, operType);
466     return result;
467 }
468 
GetWant(const sptr<AAFwk::IWantSender> & target,std::shared_ptr<AAFwk::Want> & want)469 ErrCode PendingWant::GetWant(const sptr<AAFwk::IWantSender> &target, std::shared_ptr<AAFwk::Want> &want)
470 {
471     ErrCode result = WantAgentClient::GetInstance().GetPendingRequestWant(target, want);
472     return result;
473 }
474 }  // namespace OHOS::AbilityRuntime::WantAgent
475