• 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_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