1 /*
2  * Copyright (c) 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 #ifndef OHOS_AAFWK_CONNECTION_STATE_MANAGER_H
17 #define OHOS_AAFWK_CONNECTION_STATE_MANAGER_H
18 
19 #include <mutex>
20 #include <unordered_map>
21 #include "cpp/mutex.h"
22 
23 #include "task_handler_wrap.h"
24 #include "application_state_observer_stub.h"
25 #include "connection_state_item.h"
26 #include "connection_observer_controller.h"
27 #ifdef WITH_DLP
28 #include "dlp_connection_info.h"
29 #include "dlp_state_item.h"
30 #endif // WITH_DLP
31 
32 namespace OHOS {
33 namespace AAFwk {
34 /**
35  * @class ConnectionStateManager
36  * ConnectionStateManager manage connection states.
37  */
38 class ConnectionStateManager : public std::enable_shared_from_this<ConnectionStateManager> {
39     DECLARE_DELAYED_SINGLETON(ConnectionStateManager)
40 public:
41     /**
42      * Get process name of a pid.
43      *
44      * @param pid target pid.
45      * @return process name of target pid.
46      */
47     static std::string GetProcessNameByPid(int32_t pid);
48 
49     /**
50      * init manager.
51      *
52      */
53     void Init(const std::shared_ptr<TaskHandlerWrap> &handler = nullptr);
54 
55     /**
56      * register connection state observer.
57      *
58      * @param observer callback of client.
59      * @return Returns ERR_OK if success.
60      */
61     int RegisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer);
62 
63     /**
64      * unregister connection state observer.
65      *
66      * @param observer callback of client.
67      * @return Returns ERR_OK if success.
68      */
69     int UnregisterObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer);
70 
71     /**
72      * add an connection to manager.
73      *
74      * @param connectionRecord connection record info.
75      */
76     void AddConnection(std::shared_ptr<ConnectionRecord> connectionRecord);
77 
78     /**
79      * remove an connection.
80      *
81      * @param connectionRecord connection record info.
82      * @param isCallerDied whether caller was died.
83      */
84     void RemoveConnection(std::shared_ptr<ConnectionRecord> connectionRecord, bool isCallerDied);
85 
86     /**
87      * add a data ability acquired information to manager.
88      *
89      * @param caller caller of data ability.
90      * @param record target data ability.
91      */
92     void AddDataAbilityConnection(const DataAbilityCaller &caller,
93         const std::shared_ptr<DataAbilityRecord> &record);
94 
95     /**
96      * remove a data ability acquired information from manager.
97      *
98      * @param caller caller of data ability.
99      * @param record target data ability.
100      */
101     void RemoveDataAbilityConnection(const DataAbilityCaller &caller,
102         const std::shared_ptr<DataAbilityRecord> &record);
103 
104     /**
105      * handle when data ability was died.
106      *
107      * @param record target data ability.
108      */
109     void HandleDataAbilityDied(const std::shared_ptr<DataAbilityRecord> &record);
110 
111     /**
112      * handle when data ability caller was died.
113      *
114      * @param callerPid caller pid of data ability.
115      */
116     void HandleDataAbilityCallerDied(int32_t callerPid);
117 
118 #ifdef WITH_DLP
119     /**
120      * add dlp manager to manager.
121      *
122      * @param dlpManger dlp manager record.
123      */
124     void AddDlpManager(const std::shared_ptr<AbilityRecord> &dlpManger);
125 
126     /**
127      * remove dlp manager from manager.
128      *
129      * @param dlpManger dlp manager record.
130      */
131     void RemoveDlpManager(const std::shared_ptr<AbilityRecord> &dlpManger);
132 
133     /**
134      * a dlp ability was started.
135      *
136      * @param dlpAbility dlp manager record.
137      */
138     void AddDlpAbility(const std::shared_ptr<AbilityRecord> &dlpAbility);
139 
140     /**
141      * a dlp ability was terminated.
142      *
143      * @param dlpAbility dlp manager record.
144      */
145     void RemoveDlpAbility(const std::shared_ptr<AbilityRecord> &dlpAbility);
146 #endif // WITH_DLP
147 
148     /**
149      * handle app process died.
150      *
151      * @param pid app process pid.
152      */
153     void HandleAppDied(int32_t pid);
154 
155 #ifdef WITH_DLP
156     /**
157      * get exist dlp connection infos.
158      *
159      * @param infos output dlp connection result.
160      */
161     void GetDlpConnectionInfos(std::vector<AbilityRuntime::DlpConnectionInfo> &infos);
162 #endif // WITH_DLP
163 
164     /**
165      * Get exist connection data including Extension and Data connection.
166      *
167      * @param infos output connection result.
168      */
169     void GetConnectionData(std::vector<AbilityRuntime::ConnectionData> &connectionData);
170 
171 private:
172     bool CheckDataAbilityConnectionParams(const DataAbilityCaller &caller,
173         const std::shared_ptr<DataAbilityRecord> &record) const;
174 
175 private:
176     class InnerAppStateObserver : public AppExecFwk::ApplicationStateObserverStub {
177     public:
178         using ProcessDiedHandler = std::function<void(int32_t)>;
InnerAppStateObserver(const ProcessDiedHandler handler)179         explicit InnerAppStateObserver(const ProcessDiedHandler handler) : handler_(handler) {}
180         ~InnerAppStateObserver() = default;
OnForegroundApplicationChanged(const AppExecFwk::AppStateData & appStateData)181         void OnForegroundApplicationChanged(const AppExecFwk::AppStateData &appStateData) {}
OnAbilityStateChanged(const AppExecFwk::AbilityStateData & abilityStateData)182         void OnAbilityStateChanged(const AppExecFwk::AbilityStateData &abilityStateData) {}
OnExtensionStateChanged(const AppExecFwk::AbilityStateData & abilityStateData)183         void OnExtensionStateChanged(const AppExecFwk::AbilityStateData &abilityStateData) {}
OnProcessCreated(const AppExecFwk::ProcessData & processData)184         void OnProcessCreated(const AppExecFwk::ProcessData &processData) {}
OnProcessStateChanged(const AppExecFwk::ProcessData & processData)185         void OnProcessStateChanged(const AppExecFwk::ProcessData &processData) {}
OnApplicationStateChanged(const AppExecFwk::AppStateData & appStateData)186         void OnApplicationStateChanged(const AppExecFwk::AppStateData &appStateData) {}
OnProcessDied(const AppExecFwk::ProcessData & processData)187         void OnProcessDied(const AppExecFwk::ProcessData &processData)
188         {
189             if (handler_) {
190                 handler_(processData.pid);
191             }
192         }
193 
194     private:
195         ProcessDiedHandler handler_;
196     };
197 
198     bool AddConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,
199         AbilityRuntime::ConnectionData &data);
200     bool RemoveConnectionInner(std::shared_ptr<ConnectionRecord> connectionRecord,
201         AbilityRuntime::ConnectionData &data);
202     bool AddDataAbilityConnectionInner(const DataAbilityCaller &caller,
203         const std::shared_ptr<DataAbilityRecord> &record, AbilityRuntime::ConnectionData &data);
204     bool RemoveDataAbilityConnectionInner(const DataAbilityCaller &caller,
205         const std::shared_ptr<DataAbilityRecord> &record, AbilityRuntime::ConnectionData &data);
206     void HandleCallerDied(int32_t callerPid);
207     std::shared_ptr<ConnectionStateItem> RemoveDiedCaller(int32_t callerPid);
208     void HandleDataAbilityDiedInner(const sptr<IRemoteObject> &abilityToken,
209         std::vector<AbilityRuntime::ConnectionData> &allData);
210 
211 #ifdef WITH_DLP
212     bool HandleDlpAbilityInner(const std::shared_ptr<AbilityRecord> &dlpAbility,
213         bool isAdd, AbilityRuntime::DlpStateData &dlpData);
214 #endif // WITH_DLP
215 
216     void InitAppStateObserver();
217 
218 private:
219     std::shared_ptr<ConnectionObserverController> observerController_;
220 
221     ffrt::mutex stateLock_;
222     std::unordered_map<int32_t, std::shared_ptr<ConnectionStateItem>> connectionStates_;
223 
224 #ifdef WITH_DLP
225     ffrt::mutex dlpLock_;
226     std::unordered_map<int32_t, std::shared_ptr<DlpStateItem>> dlpItems_;
227 #endif // WITH_DLP
228 
229     sptr<InnerAppStateObserver> appStateObserver_;
230     std::shared_ptr<TaskHandlerWrap> handler_;
231 
232     int32_t retry_ = 0;
233 };
234 }  // namespace AAFwk
235 }  // namespace OHOS
236 #endif  // OHOS_AAFWK_CONNECTION_STATE_MANAGER_H
237