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