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