1 /*
2 * Copyright (c) 2022-2024 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 "connection_state_manager.h"
17
18 #include "connection_observer_errors.h"
19 #include "global_constant.h"
20 #include "hilog_tag_wrapper.h"
21 #include "hitrace_meter.h"
22 #include "iservice_registry.h"
23 #include "system_ability_definition.h"
24
25 namespace OHOS {
26 namespace AAFwk {
27 namespace {
28 static const int MAX_RETRY = 10;
29 static const int DELAY_TIME = 1000;
GetAppMgr()30 OHOS::sptr<OHOS::AppExecFwk::IAppMgr> GetAppMgr()
31 {
32 OHOS::sptr<OHOS::ISystemAbilityManager> systemAbilityManager =
33 OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
34 if (!systemAbilityManager) {
35 return nullptr;
36 }
37 OHOS::sptr<OHOS::IRemoteObject> object = systemAbilityManager->GetSystemAbility(OHOS::APP_MGR_SERVICE_ID);
38 return OHOS::iface_cast<OHOS::AppExecFwk::IAppMgr>(object);
39 }
40 }
41 using namespace OHOS::AbilityRuntime;
42
ConnectionStateManager()43 ConnectionStateManager::ConnectionStateManager() {}
44
~ConnectionStateManager()45 ConnectionStateManager::~ConnectionStateManager() {}
46
GetProcessNameByPid(int32_t pid)47 std::string ConnectionStateManager::GetProcessNameByPid(int32_t pid)
48 {
49 return std::to_string(pid);
50 }
51
Init(const std::shared_ptr<TaskHandlerWrap> & handler)52 void ConnectionStateManager::Init(const std::shared_ptr<TaskHandlerWrap> &handler)
53 {
54 if (!observerController_) {
55 observerController_ = std::make_shared<ConnectionObserverController>();
56 }
57 handler_ = handler;
58 if (!handler) {
59 TAG_LOGW(AAFwkTag::CONNECTION, "invalid eventhandler");
60 InitAppStateObserver();
61 return;
62 }
63 auto initConnectionStateManagerTask = [weak = weak_from_this()]() {
64 auto self = weak.lock();
65 if (!self) {
66 TAG_LOGW(AAFwkTag::CONNECTION, "invalid self pointer");
67 return;
68 }
69 self->InitAppStateObserver();
70 };
71 handler->SubmitTask(initConnectionStateManagerTask, "InitConnectionStateManager");
72 }
73
RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> & observer)74 int ConnectionStateManager::RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer)
75 {
76 if (!observerController_) {
77 return ERR_SERVICE_NOT_INIT;
78 }
79
80 return observerController_->AddObserver(observer);
81 }
82
UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> & observer)83 int ConnectionStateManager::UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer)
84 {
85 if (!observerController_) {
86 return ERR_SERVICE_NOT_INIT;
87 }
88 observerController_->RemoveObserver(observer);
89
90 return 0;
91 }
92
AddConnection(std::shared_ptr<ConnectionRecord> connectionRecord)93 void ConnectionStateManager::AddConnection(std::shared_ptr<ConnectionRecord> connectionRecord)
94 {
95 std::shared_ptr<ConnectionObserverController> controller = observerController_;
96 if (!controller) {
97 return;
98 }
99
100 if (!connectionRecord) {
101 TAG_LOGE(AAFwkTag::CONNECTION, "invalid connection record");
102 return;
103 }
104
105 ConnectionData connectionData;
106 ConnectionEvent connectionEvent;
107 if (!AddConnectionInner(connectionRecord, connectionData, connectionEvent)) {
108 TAG_LOGD(AAFwkTag::CONNECTION, "no need notify observers");
109 return;
110 }
111 if (connectionEvent.connectedEvent) {
112 controller->NotifyExtensionConnected(connectionData);
113 }
114
115 if (connectionEvent.resumedEvent) {
116 controller->NotifyExtensionResumed(connectionData);
117 }
118 }
119
RemoveConnection(std::shared_ptr<ConnectionRecord> connectionRecord,bool isCallerDied)120 void ConnectionStateManager::RemoveConnection(std::shared_ptr<ConnectionRecord> connectionRecord,
121 bool isCallerDied)
122 {
123 std::shared_ptr<ConnectionObserverController> controller = observerController_;
124 if (!controller) {
125 return;
126 }
127
128 if (!connectionRecord) {
129 TAG_LOGE(AAFwkTag::CONNECTION, "invalid connection record");
130 return;
131 }
132
133 // if caller died, notify at once.
134 if (isCallerDied) {
135 HandleCallerDied(connectionRecord->GetCallerPid());
136 return;
137 }
138
139 ConnectionData connectionData;
140 ConnectionEvent connectionEvent;
141 if (!RemoveConnectionInner(connectionRecord, connectionData, connectionEvent)) {
142 TAG_LOGD(AAFwkTag::CONNECTION, "no need notify observers");
143 return;
144 }
145 if (connectionEvent.disconnectedEvent) {
146 controller->NotifyExtensionDisconnected(connectionData);
147 }
148
149 if (connectionEvent.suspendedEvent) {
150 controller->NotifyExtensionSuspended(connectionData);
151 }
152 }
153
AddDataAbilityConnection(const DataAbilityCaller & caller,const std::shared_ptr<DataAbilityRecord> & record)154 void ConnectionStateManager::AddDataAbilityConnection(const DataAbilityCaller &caller,
155 const std::shared_ptr<DataAbilityRecord> &record)
156 {
157 if (!CheckDataAbilityConnectionParams(caller, record)) {
158 return;
159 }
160
161 ConnectionData connectionData;
162 if (!AddDataAbilityConnectionInner(caller, record, connectionData)) {
163 TAG_LOGW(AAFwkTag::CONNECTION, "no need notify observers");
164 return;
165 }
166 observerController_->NotifyExtensionConnected(connectionData);
167 }
168
RemoveDataAbilityConnection(const DataAbilityCaller & caller,const std::shared_ptr<DataAbilityRecord> & record)169 void ConnectionStateManager::RemoveDataAbilityConnection(const DataAbilityCaller &caller,
170 const std::shared_ptr<DataAbilityRecord> &record)
171 {
172 if (!CheckDataAbilityConnectionParams(caller, record)) {
173 return;
174 }
175
176 ConnectionData connectionData;
177 if (!RemoveDataAbilityConnectionInner(caller, record, connectionData)) {
178 TAG_LOGW(AAFwkTag::CONNECTION, "no need notify observers");
179 return;
180 }
181 observerController_->NotifyExtensionDisconnected(connectionData);
182 }
183
CheckDataAbilityConnectionParams(const DataAbilityCaller & caller,const std::shared_ptr<DataAbilityRecord> & record) const184 bool ConnectionStateManager::CheckDataAbilityConnectionParams(const DataAbilityCaller &caller,
185 const std::shared_ptr<DataAbilityRecord> &record) const
186 {
187 if (!observerController_) {
188 return false;
189 }
190
191 if (!record) {
192 TAG_LOGE(AAFwkTag::CONNECTION, "invalid data ability record");
193 return false;
194 }
195
196 if (caller.callerPid == 0) {
197 TAG_LOGE(AAFwkTag::CONNECTION, "invalid callerPid");
198 return false;
199 }
200
201 return true;
202 }
203
HandleDataAbilityDied(const std::shared_ptr<DataAbilityRecord> & record)204 void ConnectionStateManager::HandleDataAbilityDied(const std::shared_ptr<DataAbilityRecord> &record)
205 {
206 if (!record) {
207 TAG_LOGE(AAFwkTag::CONNECTION, "invalid data ability");
208 return;
209 }
210
211 auto token = record->GetToken();
212 if (!token) {
213 TAG_LOGE(AAFwkTag::CONNECTION, "invalid token");
214 return;
215 }
216
217 std::vector<AbilityRuntime::ConnectionData> allData;
218 HandleDataAbilityDiedInner(token, allData);
219 if (allData.empty()) {
220 TAG_LOGW(AAFwkTag::CONNECTION, "empty allData");
221 return;
222 }
223
224 std::shared_ptr<ConnectionObserverController> controller = observerController_;
225 if (!controller) {
226 return;
227 }
228
229 for (auto& item : allData) {
230 controller->NotifyExtensionDisconnected(item);
231 }
232 }
233
HandleDataAbilityCallerDied(int32_t callerPid)234 void ConnectionStateManager::HandleDataAbilityCallerDied(int32_t callerPid)
235 {
236 if (callerPid <= 0) {
237 TAG_LOGW(AAFwkTag::CONNECTION, "invalid callerPid");
238 return;
239 }
240
241 HandleCallerDied(callerPid);
242 }
243
244 #ifdef WITH_DLP
AddDlpManager(const std::shared_ptr<AbilityRecord> & dlpManger)245 void ConnectionStateManager::AddDlpManager(const std::shared_ptr<AbilityRecord> &dlpManger)
246 {
247 if (!dlpManger) {
248 return;
249 }
250
251 auto userId = dlpManger->GetOwnerMissionUserId();
252 std::lock_guard<ffrt::mutex> guard(dlpLock_);
253 auto it = dlpItems_.find(userId);
254 if (it == dlpItems_.end()) {
255 dlpItems_[userId] = std::make_shared<DlpStateItem>(dlpManger->GetUid(), dlpManger->GetPid());
256 }
257 }
258
RemoveDlpManager(const std::shared_ptr<AbilityRecord> & dlpManger)259 void ConnectionStateManager::RemoveDlpManager(const std::shared_ptr<AbilityRecord> &dlpManger)
260 {
261 if (!dlpManger) {
262 return;
263 }
264
265 std::lock_guard<ffrt::mutex> guard(dlpLock_);
266 dlpItems_.erase(dlpManger->GetOwnerMissionUserId());
267 }
268
AddDlpAbility(const std::shared_ptr<AbilityRecord> & dlpAbility)269 void ConnectionStateManager::AddDlpAbility(const std::shared_ptr<AbilityRecord> &dlpAbility)
270 {
271 std::shared_ptr<ConnectionObserverController> controller = observerController_;
272 if (!controller) {
273 return;
274 }
275
276 DlpStateData dlpData;
277 if (!HandleDlpAbilityInner(dlpAbility, true, dlpData)) {
278 TAG_LOGD(AAFwkTag::CONNECTION, "no need report dlp opened conn state");
279 return;
280 }
281 controller->NotifyDlpAbilityOpened(dlpData);
282 }
283
RemoveDlpAbility(const std::shared_ptr<AbilityRecord> & dlpAbility)284 void ConnectionStateManager::RemoveDlpAbility(const std::shared_ptr<AbilityRecord> &dlpAbility)
285 {
286 std::shared_ptr<ConnectionObserverController> controller = observerController_;
287 if (!controller) {
288 return;
289 }
290
291 DlpStateData dlpData;
292 if (!HandleDlpAbilityInner(dlpAbility, false, dlpData)) {
293 TAG_LOGD(AAFwkTag::CONNECTION, "no need report dlp closed conn state");
294 return;
295 }
296 controller->NotifyDlpAbilityClosed(dlpData);
297 }
298 #endif // WITH_DLP
299
HandleAppDied(int32_t pid)300 void ConnectionStateManager::HandleAppDied(int32_t pid)
301 {
302 HandleCallerDied(pid);
303 }
304
305 #ifdef WITH_DLP
GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> & infos)306 void ConnectionStateManager::GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> &infos)
307 {
308 std::lock_guard<ffrt::mutex> guard(dlpLock_);
309 for (auto it = dlpItems_.begin(); it != dlpItems_.end(); it++) {
310 auto item = it->second;
311 if (!item) {
312 continue;
313 }
314
315 AbilityRuntime::DlpConnectionInfo info;
316 info.dlpUid = item->GetDlpUid();
317 info.openedAbilityCount = item->GetOpenedAbilitySize();
318 infos.emplace_back(info);
319 }
320 }
321 #endif // WITH_DLP
322
GetConnectionData(std::vector<AbilityRuntime::ConnectionData> & connectionData)323 void ConnectionStateManager::GetConnectionData(std::vector<AbilityRuntime::ConnectionData> &connectionData)
324 {
325 std::lock_guard guard(stateLock_);
326 for (const auto &stateItem : connectionStates_) {
327 if (!stateItem.second) {
328 TAG_LOGW(AAFwkTag::CONNECTION, "Unexpected null");
329 continue;
330 }
331
332 std::vector<AbilityRuntime::ConnectionData> allConnectionData;
333 stateItem.second->GenerateAllConnectionData(allConnectionData);
334 connectionData.insert(connectionData.end(), allConnectionData.begin(), allConnectionData.end());
335 }
336 TAG_LOGD(AAFwkTag::CONNECTION, "GetConnectionData: %{public}zu", connectionData.size());
337 }
338
AddConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,AbilityRuntime::ConnectionData & data,ConnectionEvent & connectionEvent)339 bool ConnectionStateManager::AddConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,
340 AbilityRuntime::ConnectionData &data, ConnectionEvent &connectionEvent
341
342 )
343 {
344 std::shared_ptr<ConnectionStateItem> targetItem = nullptr;
345 auto callerPid = connectionRecord->GetCallerPid();
346 std::lock_guard<ffrt::mutex> guard(stateLock_);
347 auto it = connectionStates_.find(callerPid);
348 if (it == connectionStates_.end()) {
349 targetItem = ConnectionStateItem::CreateConnectionStateItem(connectionRecord);
350 if (targetItem) {
351 connectionStates_[callerPid] = targetItem;
352 }
353 } else {
354 targetItem = it->second;
355 }
356
357 if (!targetItem) {
358 TAG_LOGE(AAFwkTag::CONNECTION, "find targetItem failed");
359 return false;
360 }
361
362 return targetItem->AddConnection(connectionRecord, data, connectionEvent);
363 }
364
RemoveConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,AbilityRuntime::ConnectionData & data,ConnectionEvent & connectionEvent)365 bool ConnectionStateManager::RemoveConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,
366 AbilityRuntime::ConnectionData &data, ConnectionEvent &connectionEvent)
367 {
368 auto callerPid = connectionRecord->GetCallerPid();
369 std::lock_guard<ffrt::mutex> guard(stateLock_);
370 auto it = connectionStates_.find(callerPid);
371 if (it == connectionStates_.end()) {
372 TAG_LOGW(AAFwkTag::CONNECTION, "find target failed, callerPid:%{public}d", callerPid);
373 return false;
374 }
375
376 auto targetItem = it->second;
377 if (!targetItem) {
378 TAG_LOGE(AAFwkTag::CONNECTION, "find targetItem failed");
379 return false;
380 }
381
382 bool result = targetItem->RemoveConnection(connectionRecord, data, connectionEvent);
383 if (result && targetItem->IsEmpty()) {
384 connectionStates_.erase(it);
385 }
386 return result;
387 }
388
HandleCallerDied(int32_t callerPid)389 void ConnectionStateManager::HandleCallerDied(int32_t callerPid)
390 {
391 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
392 auto connectionStateItem = RemoveDiedCaller(callerPid);
393 if (!connectionStateItem) {
394 TAG_LOGD(AAFwkTag::CONNECTION, "no connectionStateItem");
395 return;
396 }
397
398 std::vector<AbilityRuntime::ConnectionData> allConnectionData;
399 connectionStateItem->GenerateAllConnectionData(allConnectionData);
400 if (allConnectionData.empty()) {
401 TAG_LOGW(AAFwkTag::CONNECTION, "empty allConnectionData");
402 return;
403 }
404
405 std::shared_ptr<ConnectionObserverController> controller = observerController_;
406 if (!controller) {
407 return;
408 }
409
410 for (auto& connectionData : allConnectionData) {
411 controller->NotifyExtensionDisconnected(connectionData);
412 }
413 }
414
RemoveDiedCaller(int32_t callerPid)415 std::shared_ptr<ConnectionStateItem> ConnectionStateManager::RemoveDiedCaller(int32_t callerPid)
416 {
417 std::lock_guard<ffrt::mutex> guard(stateLock_);
418 auto it = connectionStates_.find(callerPid);
419 if (it == connectionStates_.end()) {
420 TAG_LOGW(AAFwkTag::CONNECTION, "callerPid:%{public}d", callerPid);
421 return nullptr;
422 }
423 auto stateItem = it->second;
424 (void)connectionStates_.erase(it);
425
426 return stateItem;
427 }
428
AddDataAbilityConnectionInner(const DataAbilityCaller & caller,const std::shared_ptr<DataAbilityRecord> & record,ConnectionData & data)429 bool ConnectionStateManager::AddDataAbilityConnectionInner(const DataAbilityCaller &caller,
430 const std::shared_ptr<DataAbilityRecord> &record, ConnectionData &data)
431 {
432 std::shared_ptr<ConnectionStateItem> targetItem = nullptr;
433 std::lock_guard<ffrt::mutex> guard(stateLock_);
434 auto it = connectionStates_.find(caller.callerPid);
435 if (it == connectionStates_.end()) {
436 targetItem = ConnectionStateItem::CreateConnectionStateItem(caller);
437 if (targetItem) {
438 connectionStates_[caller.callerPid] = targetItem;
439 }
440 } else {
441 targetItem = it->second;
442 }
443
444 if (!targetItem) {
445 TAG_LOGE(AAFwkTag::CONNECTION, "find targetItem failed");
446 return false;
447 }
448
449 return targetItem->AddDataAbilityConnection(caller, record, data);
450 }
451
RemoveDataAbilityConnectionInner(const DataAbilityCaller & caller,const std::shared_ptr<DataAbilityRecord> & record,AbilityRuntime::ConnectionData & data)452 bool ConnectionStateManager::RemoveDataAbilityConnectionInner(const DataAbilityCaller &caller,
453 const std::shared_ptr<DataAbilityRecord> &record, AbilityRuntime::ConnectionData &data)
454 {
455 std::lock_guard<ffrt::mutex> guard(stateLock_);
456 auto it = connectionStates_.find(caller.callerPid);
457 if (it == connectionStates_.end()) {
458 TAG_LOGW(AAFwkTag::CONNECTION, "find target item failed, callerPid:%{public}d", caller.callerPid);
459 return false;
460 }
461
462 auto targetItem = it->second;
463 if (!targetItem) {
464 TAG_LOGE(AAFwkTag::CONNECTION, "find targetItem failed");
465 return false;
466 }
467
468 bool result = targetItem->RemoveDataAbilityConnection(caller, record, data);
469 if (result && targetItem->IsEmpty()) {
470 connectionStates_.erase(it);
471 }
472 return result;
473 }
474
HandleDataAbilityDiedInner(const sptr<IRemoteObject> & abilityToken,std::vector<AbilityRuntime::ConnectionData> & allData)475 void ConnectionStateManager::HandleDataAbilityDiedInner(const sptr<IRemoteObject> &abilityToken,
476 std::vector<AbilityRuntime::ConnectionData> &allData)
477 {
478 std::lock_guard<ffrt::mutex> guard(stateLock_);
479 for (auto it = connectionStates_.begin(); it != connectionStates_.end();) {
480 auto item = it->second;
481 if (!item) {
482 it = connectionStates_.erase(it);
483 continue;
484 }
485
486 AbilityRuntime::ConnectionData data;
487 if (item->HandleDataAbilityDied(abilityToken, data)) {
488 allData.emplace_back(data);
489 }
490
491 if (item->IsEmpty()) {
492 it = connectionStates_.erase(it);
493 } else {
494 it++;
495 }
496 }
497 }
498
499 #ifdef WITH_DLP
HandleDlpAbilityInner(const std::shared_ptr<AbilityRecord> & dlpAbility,bool isAdd,AbilityRuntime::DlpStateData & dlpData)500 bool ConnectionStateManager::HandleDlpAbilityInner(const std::shared_ptr<AbilityRecord> &dlpAbility,
501 bool isAdd, AbilityRuntime::DlpStateData &dlpData)
502 {
503 if (!dlpAbility) {
504 TAG_LOGD(AAFwkTag::CONNECTION, "invalid dlp ability");
505 return false;
506 }
507
508 if (dlpAbility->GetAppIndex() <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
509 TAG_LOGD(AAFwkTag::CONNECTION, " not dlp ability, do not report connection stat");
510 return false;
511 }
512
513 std::lock_guard<ffrt::mutex> guard(dlpLock_);
514 auto it = dlpItems_.find(dlpAbility->GetOwnerMissionUserId());
515 if (it == dlpItems_.end()) {
516 TAG_LOGW(AAFwkTag::CONNECTION, "invalid state");
517 return false;
518 }
519
520 auto dlpItem = it->second;
521 if (!dlpItem) {
522 TAG_LOGW(AAFwkTag::CONNECTION, "invalid dlpItem");
523 return false;
524 }
525
526 if (isAdd) {
527 return dlpItem->AddDlpConnectionState(dlpAbility, dlpData);
528 }
529
530 return dlpItem->RemoveDlpConnectionState(dlpAbility, dlpData);
531 }
532 #endif // WITH_DLP
533
InitAppStateObserver()534 void ConnectionStateManager::InitAppStateObserver()
535 {
536 if (appStateObserver_) {
537 return;
538 }
539
540 sptr<OHOS::AppExecFwk::IAppMgr> appManager = GetAppMgr();
541 if (!appManager) {
542 TAG_LOGW(AAFwkTag::CONNECTION, "null appManager, retry:%{public}d", retry_);
543 if (retry_ < MAX_RETRY && handler_) {
544 auto initConnectionStateManagerTask = [weak = weak_from_this()]() {
545 auto self = weak.lock();
546 if (!self) {
547 TAG_LOGW(AAFwkTag::CONNECTION, "invalid self pointer");
548 return;
549 }
550 self->InitAppStateObserver();
551 };
552 handler_->SubmitTaskJust(initConnectionStateManagerTask, "InitConnectionStateManager", DELAY_TIME);
553 retry_++;
554 }
555 return;
556 }
557
558 appStateObserver_ = new (std::nothrow)InnerAppStateObserver([](int32_t pid) {
559 DelayedSingleton<ConnectionStateManager>::GetInstance()->HandleAppDied(pid);
560 });
561 if (!appStateObserver_) {
562 TAG_LOGE(AAFwkTag::CONNECTION, "init app state observer err");
563 return;
564 }
565
566 int32_t err = appManager->RegisterApplicationStateObserver(appStateObserver_);
567 if (err != 0) {
568 TAG_LOGE(AAFwkTag::CONNECTION, "register to appmgr err:%{public}d", err);
569 appStateObserver_ = nullptr;
570 return;
571 }
572 }
573
SuspendConnection(std::shared_ptr<ConnectionRecord> connectionRecord)574 void ConnectionStateManager::SuspendConnection(std::shared_ptr<ConnectionRecord> connectionRecord)
575 {
576 std::shared_ptr<ConnectionObserverController> controller = observerController_;
577 if (!controller) {
578 return;
579 }
580
581 if (!connectionRecord) {
582 TAG_LOGE(AAFwkTag::CONNECTION, "invalid connection record");
583 return;
584 }
585
586 ConnectionData connectionData;
587 if (!SuspendConnectionInner(connectionRecord, connectionData)) {
588 TAG_LOGD(AAFwkTag::CONNECTION, "no need notify observers");
589 return;
590 }
591 controller->NotifyExtensionSuspended(connectionData);
592 }
593
SuspendConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,AbilityRuntime::ConnectionData & data)594 bool ConnectionStateManager::SuspendConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,
595 AbilityRuntime::ConnectionData &data)
596 {
597 auto callerPid = connectionRecord->GetCallerPid();
598 std::lock_guard<ffrt::mutex> guard(stateLock_);
599 auto it = connectionStates_.find(callerPid);
600 if (it == connectionStates_.end()) {
601 TAG_LOGW(AAFwkTag::CONNECTION, "find target failed, callerPid:%{public}d", callerPid);
602 return false;
603 }
604
605 auto targetItem = it->second;
606 if (!targetItem) {
607 TAG_LOGE(AAFwkTag::CONNECTION, "find targetItem failed");
608 return false;
609 }
610
611 return targetItem->SuspendConnection(connectionRecord, data);
612 }
613
ResumeConnection(std::shared_ptr<ConnectionRecord> connectionRecord)614 void ConnectionStateManager::ResumeConnection(std::shared_ptr<ConnectionRecord> connectionRecord)
615 {
616 std::shared_ptr<ConnectionObserverController> controller = observerController_;
617 if (!controller) {
618 return;
619 }
620
621 if (!connectionRecord) {
622 TAG_LOGE(AAFwkTag::CONNECTION, "invalid connection record");
623 return;
624 }
625
626 ConnectionData connectionData;
627 if (!ResumeConnectionInner(connectionRecord, connectionData)) {
628 TAG_LOGD(AAFwkTag::CONNECTION, "no need notify observers");
629 return;
630 }
631 controller->NotifyExtensionResumed(connectionData);
632 }
633
ResumeConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,AbilityRuntime::ConnectionData & data)634 bool ConnectionStateManager::ResumeConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,
635 AbilityRuntime::ConnectionData &data)
636 {
637 auto callerPid = connectionRecord->GetCallerPid();
638 std::lock_guard<ffrt::mutex> guard(stateLock_);
639 auto it = connectionStates_.find(callerPid);
640 if (it == connectionStates_.end()) {
641 TAG_LOGW(AAFwkTag::CONNECTION, "find target failed, callerPid:%{public}d", callerPid);
642 return false;
643 }
644
645 auto targetItem = it->second;
646 if (!targetItem) {
647 TAG_LOGE(AAFwkTag::CONNECTION, "find targetItem failed");
648 return false;
649 }
650
651 return targetItem->ResumeConnection(connectionRecord, data);
652 }
653 } // namespace AAFwk
654 } // namespace OHOS
655