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