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