• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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