1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#ifndef WATCHER_MANAGER_KITS_H
17d9f0492fSopenharmony_ci#define WATCHER_MANAGER_KITS_H
18d9f0492fSopenharmony_ci#include <functional>
19d9f0492fSopenharmony_ci#include <map>
20d9f0492fSopenharmony_ci#include <mutex>
21d9f0492fSopenharmony_ci#include <thread>
22d9f0492fSopenharmony_ci
23d9f0492fSopenharmony_ci#include "iwatcher.h"
24d9f0492fSopenharmony_ci#include "iwatcher_manager.h"
25d9f0492fSopenharmony_ci#include "singleton.h"
26d9f0492fSopenharmony_ci#include "init_param.h"
27d9f0492fSopenharmony_ci#include "watcher.h"
28d9f0492fSopenharmony_ci#include "watcher_utils.h"
29d9f0492fSopenharmony_ci#include "beget_ext.h"
30d9f0492fSopenharmony_ci
31d9f0492fSopenharmony_cinamespace OHOS {
32d9f0492fSopenharmony_cinamespace init_param {
33d9f0492fSopenharmony_ciclass INIT_LOCAL_API WatcherManagerKits final : public DelayedRefSingleton<WatcherManagerKits> {
34d9f0492fSopenharmony_ci    DECLARE_DELAYED_REF_SINGLETON(WatcherManagerKits);
35d9f0492fSopenharmony_cipublic:
36d9f0492fSopenharmony_ci    DISALLOW_COPY_AND_MOVE(WatcherManagerKits);
37d9f0492fSopenharmony_ci
38d9f0492fSopenharmony_ci    static WatcherManagerKits &GetInstance(void);
39d9f0492fSopenharmony_ci    int32_t AddWatcher(const std::string &keyPrefix, ParameterChangePtr callback, void *context);
40d9f0492fSopenharmony_ci    int32_t DelWatcher(const std::string &keyPrefix, ParameterChangePtr callback, void *context);
41d9f0492fSopenharmony_ci    void ReAddWatcher(void);
42d9f0492fSopenharmony_ciprivate:
43d9f0492fSopenharmony_ci    class ParameterChangeListener {
44d9f0492fSopenharmony_ci    public:
45d9f0492fSopenharmony_ci        ParameterChangeListener(ParameterChangePtr callback, void *context)
46d9f0492fSopenharmony_ci            : callback_(callback), context_(context) {}
47d9f0492fSopenharmony_ci        ~ParameterChangeListener(void) = default;
48d9f0492fSopenharmony_ci
49d9f0492fSopenharmony_ci        bool IsEqual(ParameterChangePtr callback, const void *context) const
50d9f0492fSopenharmony_ci        {
51d9f0492fSopenharmony_ci            return (callback == callback_ && context == context_);
52d9f0492fSopenharmony_ci        }
53d9f0492fSopenharmony_ci        void OnParameterChange(const std::string &name, const std::string &value);
54d9f0492fSopenharmony_ci        bool CheckValueChange(const std::string &name, const std::string &value)
55d9f0492fSopenharmony_ci        {
56d9f0492fSopenharmony_ci            bool ret = (value_ == value && name_ == name);
57d9f0492fSopenharmony_ci            value_ = value;
58d9f0492fSopenharmony_ci            name_ = name;
59d9f0492fSopenharmony_ci            return ret;
60d9f0492fSopenharmony_ci        }
61d9f0492fSopenharmony_ci    private:
62d9f0492fSopenharmony_ci        std::string value_ {};
63d9f0492fSopenharmony_ci        std::string name_ {};
64d9f0492fSopenharmony_ci        ParameterChangePtr callback_ { nullptr };
65d9f0492fSopenharmony_ci        void *context_ { nullptr };
66d9f0492fSopenharmony_ci    };
67d9f0492fSopenharmony_ci
68d9f0492fSopenharmony_ci    class ParamWatcher {
69d9f0492fSopenharmony_ci    public:
70d9f0492fSopenharmony_ci        explicit ParamWatcher(const std::string &key) : keyPrefix_(key) {}
71d9f0492fSopenharmony_ci        ~ParamWatcher(void)
72d9f0492fSopenharmony_ci        {
73d9f0492fSopenharmony_ci            parameterChangeListeners.clear();
74d9f0492fSopenharmony_ci        };
75d9f0492fSopenharmony_ci        void OnParameterChange(const std::string &name, const std::string &value);
76d9f0492fSopenharmony_ci        int AddParameterListener(ParameterChangePtr callback, void *context);
77d9f0492fSopenharmony_ci        int DelParameterListener(ParameterChangePtr callback, void *context);
78d9f0492fSopenharmony_ci    private:
79d9f0492fSopenharmony_ci        ParameterChangeListener *GetParameterListener(uint32_t *idx);
80d9f0492fSopenharmony_ci        void RemoveParameterListener(uint32_t idx);
81d9f0492fSopenharmony_ci        std::string keyPrefix_ {};
82d9f0492fSopenharmony_ci        std::mutex mutex_;
83d9f0492fSopenharmony_ci        uint32_t listenerId_ { 0 };
84d9f0492fSopenharmony_ci        std::map<uint32_t, std::shared_ptr<ParameterChangeListener>> parameterChangeListeners;
85d9f0492fSopenharmony_ci    };
86d9f0492fSopenharmony_ci
87d9f0492fSopenharmony_ci    class RemoteWatcher final : public Watcher {
88d9f0492fSopenharmony_ci    public:
89d9f0492fSopenharmony_ci        explicit RemoteWatcher(WatcherManagerKits *watcherManager) : watcherManager_(watcherManager) {}
90d9f0492fSopenharmony_ci        ~RemoteWatcher(void) override {}
91d9f0492fSopenharmony_ci
92d9f0492fSopenharmony_ci        void OnParameterChange(const std::string &prefix, const std::string &name, const std::string &value) final;
93d9f0492fSopenharmony_ci    private:
94d9f0492fSopenharmony_ci        WatcherManagerKits *watcherManager_ = { nullptr };
95d9f0492fSopenharmony_ci    };
96d9f0492fSopenharmony_ci
97d9f0492fSopenharmony_ci    using ParamWatcherKitPtr = std::shared_ptr<WatcherManagerKits::ParamWatcher>;
98d9f0492fSopenharmony_ci    // For death event procession
99d9f0492fSopenharmony_ci    class DeathRecipient final : public IRemoteObject::DeathRecipient {
100d9f0492fSopenharmony_ci    public:
101d9f0492fSopenharmony_ci        DeathRecipient(void) = default;
102d9f0492fSopenharmony_ci        ~DeathRecipient(void) final = default;
103d9f0492fSopenharmony_ci        DISALLOW_COPY_AND_MOVE(DeathRecipient);
104d9f0492fSopenharmony_ci        void OnRemoteDied(const wptr<IRemoteObject> &remote) final;
105d9f0492fSopenharmony_ci    };
106d9f0492fSopenharmony_ci    sptr<IRemoteObject::DeathRecipient> GetDeathRecipient(void)
107d9f0492fSopenharmony_ci    {
108d9f0492fSopenharmony_ci        return deathRecipient_;
109d9f0492fSopenharmony_ci    }
110d9f0492fSopenharmony_ci
111d9f0492fSopenharmony_ci    uint32_t GetRemoteWatcher(void);
112d9f0492fSopenharmony_ci    ParamWatcher *GetParamWatcher(const std::string &keyPrefix);
113d9f0492fSopenharmony_ci    void ResetService(const wptr<IRemoteObject> &remote);
114d9f0492fSopenharmony_ci    sptr<IWatcherManager> GetService(void);
115d9f0492fSopenharmony_ci    std::mutex lock_;
116d9f0492fSopenharmony_ci    sptr<IWatcherManager> watcherManager_ {};
117d9f0492fSopenharmony_ci    sptr<IRemoteObject::DeathRecipient> deathRecipient_ {};
118d9f0492fSopenharmony_ci
119d9f0492fSopenharmony_ci    std::mutex mutex_;
120d9f0492fSopenharmony_ci    uint32_t remoteWatcherId_ = { 0 };
121d9f0492fSopenharmony_ci    sptr<Watcher>  remoteWatcher_ = { nullptr };
122d9f0492fSopenharmony_ci    std::map<std::string, ParamWatcherKitPtr> watchers_;
123d9f0492fSopenharmony_ci    std::atomic<bool> stop_ { false };
124d9f0492fSopenharmony_ci    std::thread *threadForReWatch_ { nullptr };
125d9f0492fSopenharmony_ci};
126d9f0492fSopenharmony_ci} // namespace init_param
127d9f0492fSopenharmony_ci} // namespace OHOS
128d9f0492fSopenharmony_ci#endif // WATCHER_MANAGER_KITS_H
129