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_OBSERVER_CONTROLLER_H
17#define OHOS_AAFWK_CONNECTION_OBSERVER_CONTROLLER_H
18
19#include <mutex>
20#include <vector>
21#include "cpp/mutex.h"
22
23#include "iconnection_observer.h"
24
25namespace OHOS {
26namespace AAFwk {
27/**
28 * @class ConnectionObserverController
29 * ConnectionObserverController manage connection observers.
30 */
31class ConnectionObserverController : public std::enable_shared_from_this<ConnectionObserverController> {
32public:
33    ConnectionObserverController() = default;
34    ~ConnectionObserverController() = default;
35
36    /**
37     * add connection observer.
38     *
39     * @param observer the observer callback.
40     * @return Returns ERR_OK on success, others on failure.
41     */
42    int AddObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer);
43
44    /**
45     * delete a callback.
46     *
47     * @param observer the observer callback.
48     */
49    void RemoveObserver(const sptr<AbilityRuntime::IConnectionObserver> &observer);
50
51    /**
52     * notify observers that extension was connected.
53     *
54     * @param data connection data.
55     */
56    void NotifyExtensionConnected(const AbilityRuntime::ConnectionData& data);
57
58    /**
59     * notify observers that extension was disconnected.
60     *
61     * @param data connection data.
62     */
63    void NotifyExtensionDisconnected(const AbilityRuntime::ConnectionData& data);
64
65#ifdef WITH_DLP
66    /**
67     * notify observers that dlp ability was opened.
68     *
69     * @param data dlp state data.
70     */
71    void NotifyDlpAbilityOpened(const AbilityRuntime::DlpStateData& data);
72
73    /**
74     * notify observers that dlp ability was closed.
75     *
76     * @param data dlp state data.
77     */
78    void NotifyDlpAbilityClosed(const AbilityRuntime::DlpStateData& data);
79#endif // WITH_DLP
80
81private:
82    std::vector<sptr<AbilityRuntime::IConnectionObserver>> GetObservers();
83    void HandleRemoteDied(const wptr<IRemoteObject> &remote);
84
85    template<typename F, typename... Args>
86    void CallObservers(F func, Args&&... args)
87    {
88        auto observers = GetObservers();
89        for (auto& observer : observers) {
90            if (observer) {
91                (observer->*func)(std::forward<Args>(args)...);
92            }
93        }
94    }
95
96    class ObserverDeathRecipient : public IRemoteObject::DeathRecipient {
97    public:
98        using ObserverDeathHandler = std::function<void(const wptr<IRemoteObject> &)>;
99        explicit ObserverDeathRecipient(ObserverDeathHandler handler);
100        ~ObserverDeathRecipient() = default;
101        void OnRemoteDied(const wptr<IRemoteObject> &remote) final;
102
103    private:
104        ObserverDeathHandler deathHandler_;
105    };
106
107private:
108    ffrt::mutex observerLock_;
109    std::vector<sptr<AbilityRuntime::IConnectionObserver>> observers_;
110    sptr<IRemoteObject::DeathRecipient> observerDeathRecipient_;
111};
112}  // namespace AAFwk
113}  // namespace OHOS
114#endif  // OHOS_AAFWK_CONNECTION_OBSERVER_CONTROLLER_H
115