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_manager.h"
17
18 #include <atomic>
19 #include <chrono>
20 #include <thread>
21
22 #include "ability_manager_service.h"
23 #include "ability_util.h"
24 #include "distributed_client.h"
25 #include "hilog_wrapper.h"
26 #include "in_process_call_wrapper.h"
27 #include "permission_verification.h"
28
29 namespace OHOS {
30 namespace AAFwk {
31 using namespace OHOS::EventFwk;
32 using namespace std::chrono;
33 using namespace std::placeholders;
34
PendingWantManager()35 PendingWantManager::PendingWantManager()
36 {
37 HILOG_DEBUG("%{public}s(%{public}d)", __PRETTY_FUNCTION__, __LINE__);
38 }
39
~PendingWantManager()40 PendingWantManager::~PendingWantManager()
41 {
42 HILOG_DEBUG("%{public}s(%{public}d)", __PRETTY_FUNCTION__, __LINE__);
43 }
44
GetWantSender(int32_t callingUid,int32_t uid,const std::string & apl,const WantSenderInfo & wantSenderInfo,const sptr<IRemoteObject> & callerToken)45 sptr<IWantSender> PendingWantManager::GetWantSender(int32_t callingUid, int32_t uid, const std::string &apl,
46 const WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken)
47 {
48 HILOG_INFO("PendingWantManager::GetWantSender begin.");
49 if (wantSenderInfo.type != static_cast<int32_t>(OperationType::SEND_COMMON_EVENT)) {
50 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
51 if (!isSaCall && apl != AbilityUtil::SYSTEM_BASIC && apl != AbilityUtil::SYSTEM_CORE) {
52 if (callingUid != uid) {
53 HILOG_ERROR("is not allowed to send");
54 return nullptr;
55 }
56 }
57 }
58
59 WantSenderInfo info = wantSenderInfo;
60 return GetWantSenderLocked(callingUid, uid, wantSenderInfo.userId, info, callerToken);
61 }
62
GetWantSenderLocked(const int32_t callingUid,const int32_t uid,const int32_t userId,WantSenderInfo & wantSenderInfo,const sptr<IRemoteObject> & callerToken)63 sptr<IWantSender> PendingWantManager::GetWantSenderLocked(const int32_t callingUid, const int32_t uid,
64 const int32_t userId, WantSenderInfo &wantSenderInfo, const sptr<IRemoteObject> &callerToken)
65 {
66 HILOG_DEBUG("begin");
67
68 bool needCreate = (static_cast<uint32_t>(wantSenderInfo.flags) &
69 static_cast<uint32_t>(Flags::NO_BUILD_FLAG)) == 0;
70 bool needCancel = (static_cast<uint32_t>(wantSenderInfo.flags) &
71 static_cast<uint32_t>(Flags::CANCEL_PRESENT_FLAG)) != 0;
72 bool needUpdate = (static_cast<uint32_t>(wantSenderInfo.flags) &
73 static_cast<uint32_t>(Flags::UPDATE_PRESENT_FLAG)) != 0;
74
75 std::shared_ptr<PendingWantKey> pendingKey = std::make_shared<PendingWantKey>();
76 pendingKey->SetBundleName(wantSenderInfo.bundleName);
77 pendingKey->SetRequestWho(wantSenderInfo.resultWho);
78 pendingKey->SetRequestCode(wantSenderInfo.requestCode);
79 pendingKey->SetFlags(wantSenderInfo.flags);
80 pendingKey->SetUserId(wantSenderInfo.userId);
81 pendingKey->SetType(wantSenderInfo.type);
82 if (wantSenderInfo.allWants.size() > 0) {
83 pendingKey->SetRequestWant(wantSenderInfo.allWants.back().want);
84 pendingKey->SetRequestResolvedType(wantSenderInfo.allWants.back().resolvedTypes);
85 pendingKey->SetAllWantsInfos(wantSenderInfo.allWants);
86 }
87 std::lock_guard<ffrt::mutex> locker(mutex_);
88 auto ref = GetPendingWantRecordByKey(pendingKey);
89 if (ref != nullptr) {
90 if (!needCancel) {
91 if (needUpdate && wantSenderInfo.allWants.size() > 0) {
92 ref->GetKey()->SetRequestWant(wantSenderInfo.allWants.back().want);
93 ref->GetKey()->SetRequestResolvedType(wantSenderInfo.allWants.back().resolvedTypes);
94 wantSenderInfo.allWants.back().want = ref->GetKey()->GetRequestWant();
95 wantSenderInfo.allWants.back().resolvedTypes = ref->GetKey()->GetRequestResolvedType();
96 ref->GetKey()->SetAllWantsInfos(wantSenderInfo.allWants);
97 ref->SetCallerUid(callingUid);
98 }
99 return ref;
100 }
101 MakeWantSenderCanceledLocked(*ref);
102 wantRecords_.erase(ref->GetKey());
103 }
104
105 if (!needCreate) {
106 return (ref != nullptr) ? ref : nullptr;
107 }
108
109 sptr<PendingWantRecord> rec =
110 new (std::nothrow) PendingWantRecord(shared_from_this(), uid, IPCSkeleton::GetCallingTokenID(),
111 callerToken, pendingKey);
112 if (rec != nullptr) {
113 rec->SetCallerUid(callingUid);
114 pendingKey->SetCode(PendingRecordIdCreate());
115 wantRecords_.insert(std::make_pair(pendingKey, rec));
116 HILOG_INFO("wantRecords_ size %{public}zu", wantRecords_.size());
117 return rec;
118 }
119 return nullptr;
120 }
121
MakeWantSenderCanceledLocked(PendingWantRecord & record)122 void PendingWantManager::MakeWantSenderCanceledLocked(PendingWantRecord &record)
123 {
124 HILOG_INFO("begin");
125
126 record.SetCanceled();
127 for (auto &callback : record.GetCancelCallbacks()) {
128 callback->Send(record.GetKey()->GetRequestCode());
129 }
130 }
131
GetPendingWantRecordByKey(const std::shared_ptr<PendingWantKey> & key)132 sptr<PendingWantRecord> PendingWantManager::GetPendingWantRecordByKey(const std::shared_ptr<PendingWantKey> &key)
133 {
134 HILOG_DEBUG("begin");
135 for (const auto &item : wantRecords_) {
136 const auto &pendingKey = item.first;
137 const auto &pendingRecord = item.second;
138 if ((pendingRecord != nullptr) && CheckPendingWantRecordByKey(pendingKey, key)) {
139 return pendingRecord;
140 }
141 }
142 return nullptr;
143 }
144
CheckPendingWantRecordByKey(const std::shared_ptr<PendingWantKey> & inputKey,const std::shared_ptr<PendingWantKey> & key)145 bool PendingWantManager::CheckPendingWantRecordByKey(
146 const std::shared_ptr<PendingWantKey> &inputKey, const std::shared_ptr<PendingWantKey> &key)
147 {
148 if (inputKey->GetBundleName().compare(key->GetBundleName()) != 0) {
149 return false;
150 }
151 if (inputKey->GetType() != key->GetType()) {
152 return false;
153 }
154 if (inputKey->GetRequestWho().compare(key->GetRequestWho()) != 0) {
155 return false;
156 }
157 if (inputKey->GetRequestCode() != key->GetRequestCode()) {
158 return false;
159 }
160
161 if (inputKey->GetRequestResolvedType().compare(key->GetRequestResolvedType()) != 0) {
162 return false;
163 }
164 if (inputKey->GetUserId() != key->GetUserId()) {
165 return false;
166 }
167
168 if (!inputKey->GetRequestWantRef().IsEquals(key->GetRequestWantRef())) {
169 return false;
170 }
171
172 return true;
173 }
174
SendWantSender(const sptr<IWantSender> & target,const SenderInfo & senderInfo)175 int32_t PendingWantManager::SendWantSender(const sptr<IWantSender> &target, const SenderInfo &senderInfo)
176 {
177 HILOG_INFO("begin");
178
179 if (target == nullptr) {
180 HILOG_ERROR("sender is nullptr.");
181 return ERR_INVALID_VALUE;
182 }
183 SenderInfo info = senderInfo;
184 sptr<PendingWantRecord> record = iface_cast<PendingWantRecord>(target->AsObject());
185 return record->SenderInner(info);
186 }
187
CancelWantSender(std::string & apl,const sptr<IWantSender> & sender)188 void PendingWantManager::CancelWantSender(std::string &apl, const sptr<IWantSender> &sender)
189 {
190 HILOG_INFO("begin");
191
192 if (sender == nullptr) {
193 HILOG_ERROR("sender is nullptr.");
194 return;
195 }
196
197 std::lock_guard<ffrt::mutex> locker(mutex_);
198 auto isSaCall = AAFwk::PermissionVerification::GetInstance()->IsSACall();
199 if (!isSaCall && apl != AbilityUtil::SYSTEM_BASIC && apl != AbilityUtil::SYSTEM_CORE) {
200 HILOG_ERROR("is not allowed to send");
201 return;
202 }
203
204 sptr<PendingWantRecord> record = iface_cast<PendingWantRecord>(sender->AsObject());
205 CancelWantSenderLocked(*record, true);
206 }
207
CancelWantSenderLocked(PendingWantRecord & record,bool cleanAbility)208 void PendingWantManager::CancelWantSenderLocked(PendingWantRecord &record, bool cleanAbility)
209 {
210 HILOG_INFO("begin.");
211
212 MakeWantSenderCanceledLocked(record);
213 if (cleanAbility) {
214 wantRecords_.erase(record.GetKey());
215 }
216 }
DeviceIdDetermine(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t requestCode,const int32_t callerUid)217 int32_t PendingWantManager::DeviceIdDetermine(
218 const Want &want, const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid)
219 {
220 int32_t result = ERR_OK;
221 std::string localDeviceId;
222 DelayedSingleton<AbilityManagerService>::GetInstance()->GetLocalDeviceId(localDeviceId);
223 if (want.GetElement().GetDeviceID() == "" || want.GetElement().GetDeviceID() == localDeviceId) {
224 result = DelayedSingleton<AbilityManagerService>::GetInstance()->StartAbility(
225 want, callerToken, requestCode, callerUid);
226 if (result != ERR_OK && result != START_ABILITY_WAITING) {
227 HILOG_ERROR("%{public}s:result != ERR_OK && result != START_ABILITY_WAITING.", __func__);
228 }
229 return result;
230 }
231
232 sptr<IRemoteObject> remoteObject =
233 OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->GetSystemAbility(DISTRIBUTED_SCHED_SA_ID);
234 if (remoteObject == nullptr) {
235 HILOG_ERROR("failed to get distributed schedule manager service");
236 result = ERR_INVALID_VALUE;
237 return result;
238 }
239 DistributedClient dmsClient;
240 uint32_t accessToken = IPCSkeleton::GetCallingTokenID();
241 int32_t callingUid = IPCSkeleton::GetCallingUid();
242 result = dmsClient.StartRemoteAbility(want, callingUid, requestCode, accessToken);
243 if (result != ERR_OK) {
244 HILOG_ERROR("%{public}s: StartRemoteAbility Error! result = %{public}d", __func__, result);
245 }
246
247 return result;
248 }
249
PendingWantStartAbility(const Want & want,const sptr<IRemoteObject> & callerToken,int32_t requestCode,const int32_t callerUid)250 int32_t PendingWantManager::PendingWantStartAbility(
251 const Want &want, const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid)
252 {
253 HILOG_INFO("begin");
254 int32_t result = DeviceIdDetermine(want, callerToken, requestCode, callerUid);
255 return result;
256 }
257
PendingWantStartAbilitys(const std::vector<WantsInfo> wantsInfo,const sptr<IRemoteObject> & callerToken,int32_t requestCode,const int32_t callerUid)258 int32_t PendingWantManager::PendingWantStartAbilitys(const std::vector<WantsInfo> wantsInfo,
259 const sptr<IRemoteObject> &callerToken, int32_t requestCode, const int32_t callerUid)
260 {
261 HILOG_INFO("begin");
262
263 int32_t result = ERR_OK;
264 for (const auto &item : wantsInfo) {
265 auto res = DeviceIdDetermine(item.want, callerToken, requestCode, callerUid);
266 if (res != ERR_OK && res != START_ABILITY_WAITING) {
267 result = res;
268 }
269 }
270 return result;
271 }
272
PendingWantPublishCommonEvent(const Want & want,const SenderInfo & senderInfo,int32_t callerUid,int32_t callerTokenId)273 int32_t PendingWantManager::PendingWantPublishCommonEvent(
274 const Want &want, const SenderInfo &senderInfo, int32_t callerUid, int32_t callerTokenId)
275 {
276 HILOG_INFO("begin");
277
278 CommonEventData eventData;
279 eventData.SetWant(want);
280 eventData.SetCode(senderInfo.code);
281
282 CommonEventPublishInfo eventPublishData;
283
284 if (!want.GetBundle().empty()) {
285 HILOG_INFO("eventPublishData set bundleName = %{public}s", want.GetBundle().c_str());
286 eventPublishData.SetBundleName(want.GetBundle());
287 }
288
289 if (!senderInfo.requiredPermission.empty()) {
290 std::vector<std::string> permissions;
291 permissions.emplace_back(senderInfo.requiredPermission);
292 eventPublishData.SetSubscriberPermissions(permissions);
293 }
294
295 std::shared_ptr<PendingWantCommonEvent> pendingWantCommonEvent = nullptr;
296 if (senderInfo.finishedReceiver != nullptr) {
297 eventPublishData.SetOrdered(true);
298 pendingWantCommonEvent = std::make_shared<PendingWantCommonEvent>();
299 pendingWantCommonEvent->SetFinishedReceiver(senderInfo.finishedReceiver);
300 WantParams wantParams = {};
301 pendingWantCommonEvent->SetWantParams(wantParams);
302 }
303 bool result = IN_PROCESS_CALL(DelayedSingleton<EventFwk::CommonEvent>::GetInstance()->PublishCommonEvent(
304 eventData, eventPublishData, pendingWantCommonEvent, callerUid, callerTokenId));
305 return ((result == true) ? ERR_OK : (-1));
306 }
307
PendingRecordIdCreate()308 int32_t PendingWantManager::PendingRecordIdCreate()
309 {
310 HILOG_INFO("begin");
311
312 static std::atomic_int id(0);
313 return ++id;
314 }
315
GetPendingWantRecordByCode(int32_t code)316 sptr<PendingWantRecord> PendingWantManager::GetPendingWantRecordByCode(int32_t code)
317 {
318 HILOG_INFO("begin. wantRecords_ size = %{public}zu", wantRecords_.size());
319
320 std::lock_guard<ffrt::mutex> locker(mutex_);
321 auto iter = std::find_if(wantRecords_.begin(), wantRecords_.end(), [&code](const auto &pair) {
322 return pair.second->GetKey()->GetCode() == code;
323 });
324 return ((iter == wantRecords_.end()) ? nullptr : iter->second);
325 }
326
GetPendingWantUid(const sptr<IWantSender> & target)327 int32_t PendingWantManager::GetPendingWantUid(const sptr<IWantSender> &target)
328 {
329 HILOG_INFO("begin");
330
331 if (target == nullptr) {
332 HILOG_ERROR("target is nullptr.");
333 return -1;
334 }
335
336 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(target->AsObject());
337 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
338 return ((record != nullptr) ? (record->GetUid()) : (-1));
339 }
340
GetPendingWantUserId(const sptr<IWantSender> & target)341 int32_t PendingWantManager::GetPendingWantUserId(const sptr<IWantSender> &target)
342 {
343 HILOG_DEBUG("begin");
344
345 if (target == nullptr) {
346 HILOG_ERROR("%{public}s:target is nullptr.", __func__);
347 return -1;
348 }
349
350 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(target->AsObject());
351 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
352 return ((record != nullptr) ? (record->GetKey()->GetUserId()) : (-1));
353 }
354
GetPendingWantBundleName(const sptr<IWantSender> & target)355 std::string PendingWantManager::GetPendingWantBundleName(const sptr<IWantSender> &target)
356 {
357 HILOG_DEBUG("begin");
358
359 if (target == nullptr) {
360 HILOG_ERROR("%{public}s:target is nullptr.", __func__);
361 return "";
362 }
363
364 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(target->AsObject());
365 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
366 if (record != nullptr) {
367 return record->GetKey()->GetBundleName();
368 }
369 return "";
370 }
371
GetPendingWantCode(const sptr<IWantSender> & target)372 int32_t PendingWantManager::GetPendingWantCode(const sptr<IWantSender> &target)
373 {
374 HILOG_DEBUG("begin");
375
376 if (target == nullptr) {
377 HILOG_ERROR("%{public}s:target is nullptr.", __func__);
378 return -1;
379 }
380
381 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(target->AsObject());
382 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
383 return ((record != nullptr) ? (record->GetKey()->GetCode()) : (-1));
384 }
385
GetPendingWantType(const sptr<IWantSender> & target)386 int32_t PendingWantManager::GetPendingWantType(const sptr<IWantSender> &target)
387 {
388 HILOG_DEBUG("begin");
389
390 if (target == nullptr) {
391 HILOG_ERROR("%{public}s:target is nullptr.", __func__);
392 return -1;
393 }
394
395 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(target->AsObject());
396 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
397 return ((record != nullptr) ? (record->GetKey()->GetType()) : (-1));
398 }
399
RegisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & recevier)400 void PendingWantManager::RegisterCancelListener(const sptr<IWantSender> &sender, const sptr<IWantReceiver> &recevier)
401 {
402 HILOG_INFO("begin");
403
404 if ((sender == nullptr) || (recevier == nullptr)) {
405 HILOG_ERROR("%{public}s:sender is nullptr or recevier is nullptr.", __func__);
406 return;
407 }
408
409 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(sender->AsObject());
410 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
411 if (record == nullptr) {
412 HILOG_ERROR("%{public}s:record is nullptr. code = %{public}d", __func__, targetRecord->GetKey()->GetCode());
413 return;
414 }
415 bool cancel = record->GetCanceled();
416 std::lock_guard<ffrt::mutex> locker(mutex_);
417 if (!cancel) {
418 record->RegisterCancelListener(recevier);
419 }
420 }
421
UnregisterCancelListener(const sptr<IWantSender> & sender,const sptr<IWantReceiver> & recevier)422 void PendingWantManager::UnregisterCancelListener(const sptr<IWantSender> &sender, const sptr<IWantReceiver> &recevier)
423 {
424 HILOG_INFO("begin");
425
426 if (sender == nullptr || recevier == nullptr) {
427 HILOG_ERROR("%{public}s:sender is nullptr or recevier is nullptr.", __func__);
428 return;
429 }
430
431 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(sender->AsObject());
432 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
433 if (record == nullptr) {
434 HILOG_ERROR("%{public}s:record is nullptr.", __func__);
435 return;
436 }
437 std::lock_guard<ffrt::mutex> locker(mutex_);
438 record->UnregisterCancelListener(recevier);
439 }
440
GetPendingRequestWant(const sptr<IWantSender> & target,std::shared_ptr<Want> & want)441 int32_t PendingWantManager::GetPendingRequestWant(const sptr<IWantSender> &target, std::shared_ptr<Want> &want)
442 {
443 HILOG_DEBUG("begin");
444 if (target == nullptr) {
445 HILOG_ERROR("%{public}s:target is nullptr.", __func__);
446 return ERR_INVALID_VALUE;
447 }
448 if (want == nullptr) {
449 HILOG_ERROR("%{public}s:want is nullptr.", __func__);
450 return ERR_INVALID_VALUE;
451 }
452 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(target->AsObject());
453
454 if (targetRecord == nullptr) {
455 HILOG_ERROR("%{public}s:targetRecord is nullptr.", __func__);
456 return ERR_INVALID_VALUE;
457 }
458
459 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
460 if (record == nullptr) {
461 HILOG_ERROR("%{public}s:record is nullptr.", __func__);
462 return ERR_INVALID_VALUE;
463 }
464 want.reset(new (std::nothrow) Want(record->GetKey()->GetRequestWant()));
465 HILOG_ERROR("%{public}s:want is ok.", __func__);
466 return NO_ERROR;
467 }
468
GetWantSenderInfo(const sptr<IWantSender> & target,std::shared_ptr<WantSenderInfo> & info)469 int32_t PendingWantManager::GetWantSenderInfo(const sptr<IWantSender> &target, std::shared_ptr<WantSenderInfo> &info)
470 {
471 HILOG_DEBUG("begin");
472 if (target == nullptr) {
473 HILOG_ERROR("%{public}s:target is nullptr.", __func__);
474 return ERR_INVALID_VALUE;
475 }
476 if (info == nullptr) {
477 HILOG_ERROR("%{public}s:info is nullptr.", __func__);
478 return ERR_INVALID_VALUE;
479 }
480 sptr<PendingWantRecord> targetRecord = iface_cast<PendingWantRecord>(target->AsObject());
481 auto record = GetPendingWantRecordByCode(targetRecord->GetKey()->GetCode());
482 if (record == nullptr) {
483 HILOG_ERROR("%{public}s:record is nullptr.", __func__);
484 return ERR_INVALID_VALUE;
485 }
486 WantSenderInfo wantSenderInfo;
487 wantSenderInfo.requestCode = record->GetKey()->GetRequestCode();
488 wantSenderInfo.type = record->GetKey()->GetType();
489 wantSenderInfo.flags = (uint32_t)(record->GetKey()->GetFlags());
490 wantSenderInfo.allWants = record->GetKey()->GetAllWantsInfos();
491 info.reset(new (std::nothrow) WantSenderInfo(wantSenderInfo));
492 HILOG_ERROR("%{public}s:want is ok.", __func__);
493 return NO_ERROR;
494 }
495
ClearPendingWantRecord(const std::string & bundleName,int32_t uid)496 void PendingWantManager::ClearPendingWantRecord(const std::string &bundleName, int32_t uid)
497 {
498 HILOG_INFO("bundleName: %{public}s", bundleName.c_str());
499 auto abilityManagerService = DelayedSingleton<AbilityManagerService>::GetInstance();
500 CHECK_POINTER(abilityManagerService);
501 auto handler = abilityManagerService->GetTaskHandler();
502 CHECK_POINTER(handler);
503 auto task = [bundleName, uid, self = shared_from_this()]() { self->ClearPendingWantRecordTask(bundleName, uid); };
504 handler->SubmitTask(task);
505 }
506
ClearPendingWantRecordTask(const std::string & bundleName,int32_t uid)507 void PendingWantManager::ClearPendingWantRecordTask(const std::string &bundleName, int32_t uid)
508 {
509 HILOG_INFO("bundleName: %{public}s", bundleName.c_str());
510 std::lock_guard<ffrt::mutex> locker(mutex_);
511 auto iter = wantRecords_.begin();
512 while (iter != wantRecords_.end()) {
513 bool hasBundle = false;
514 const auto &pendingRecord = iter->second;
515 if ((pendingRecord != nullptr)) {
516 auto wantInfos = pendingRecord->GetKey()->GetAllWantsInfos();
517 for (const auto &wantInfo: wantInfos) {
518 if (wantInfo.want.GetBundle() == bundleName && uid == pendingRecord->GetUid()) {
519 hasBundle = true;
520 break;
521 }
522 }
523 if (hasBundle) {
524 iter = wantRecords_.erase(iter);
525 HILOG_INFO("wantRecords_ size %{public}zu", wantRecords_.size());
526 } else {
527 ++iter;
528 }
529 } else {
530 ++iter;
531 }
532 }
533 }
534
Dump(std::vector<std::string> & info)535 void PendingWantManager::Dump(std::vector<std::string> &info)
536 {
537 std::string dumpInfo = " PendingWantRecords:";
538 info.push_back(dumpInfo);
539
540 for (const auto &item : wantRecords_) {
541 const auto &pendingKey = item.first;
542 dumpInfo = " PendWantRecord ID #" + std::to_string(pendingKey->GetCode()) +
543 " type #" + std::to_string(pendingKey->GetType());
544 info.push_back(dumpInfo);
545 dumpInfo = " bundle name [" + pendingKey->GetBundleName() + "]";
546 info.push_back(dumpInfo);
547 dumpInfo = " result who [" + pendingKey->GetRequestWho() + "]";
548 info.push_back(dumpInfo);
549 dumpInfo = " request code #" + std::to_string(pendingKey->GetRequestCode()) +
550 " flags #" + std::to_string(pendingKey->GetFlags());
551 info.push_back(dumpInfo);
552 dumpInfo = " resolved type [" + pendingKey->GetRequestResolvedType() + "]";
553 info.push_back(dumpInfo);
554 dumpInfo = " Wants:";
555 info.push_back(dumpInfo);
556 auto Wants = pendingKey->GetAllWantsInfos();
557 for (const auto &Want : Wants) {
558 dumpInfo = " uri [" + Want.want.GetElement().GetDeviceID() + "//" +
559 Want.want.GetElement().GetBundleName() + "/" + Want.want.GetElement().GetAbilityName() + "]";
560 info.push_back(dumpInfo);
561 dumpInfo = " resolved types [" + Want.resolvedTypes + "]";
562 info.push_back(dumpInfo);
563 }
564 }
565 }
DumpByRecordId(std::vector<std::string> & info,const std::string & args)566 void PendingWantManager::DumpByRecordId(std::vector<std::string> &info, const std::string &args)
567 {
568 std::string dumpInfo = " PendingWantRecords:";
569 info.push_back(dumpInfo);
570
571 for (const auto &item : wantRecords_) {
572 const auto &pendingKey = item.first;
573 if (args == std::to_string(pendingKey->GetCode())) {
574 dumpInfo = " PendWantRecord ID #" + std::to_string(pendingKey->GetCode()) +
575 " type #" + std::to_string(pendingKey->GetType());
576 info.push_back(dumpInfo);
577 dumpInfo = " bundle name [" + pendingKey->GetBundleName() + "]";
578 info.push_back(dumpInfo);
579 dumpInfo = " result who [" + pendingKey->GetRequestWho() + "]";
580 info.push_back(dumpInfo);
581 dumpInfo = " request code #" + std::to_string(pendingKey->GetRequestCode()) +
582 " flags #" + std::to_string(pendingKey->GetFlags());
583 info.push_back(dumpInfo);
584 dumpInfo = " resolved type [" + pendingKey->GetRequestResolvedType() + "]";
585 info.push_back(dumpInfo);
586 dumpInfo = " Wants:";
587 info.push_back(dumpInfo);
588 auto Wants = pendingKey->GetAllWantsInfos();
589 for (const auto& Want : Wants) {
590 dumpInfo = " uri [" + Want.want.GetElement().GetDeviceID() + "//" +
591 Want.want.GetElement().GetBundleName() + "/" + Want.want.GetElement().GetAbilityName() + "]";
592 info.push_back(dumpInfo);
593 dumpInfo = " resolved types [" + Want.resolvedTypes + "]";
594 info.push_back(dumpInfo);
595 }
596 }
597 }
598 }
599 } // namespace AAFwk
600 } // namespace OHOS
601