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