1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#ifndef DEVICE_MANAGER_H 17c29fa5a6Sopenharmony_ci#define DEVICE_MANAGER_H 18c29fa5a6Sopenharmony_ci 19c29fa5a6Sopenharmony_ci#include <future> 20c29fa5a6Sopenharmony_ci#include <memory> 21c29fa5a6Sopenharmony_ci#include <set> 22c29fa5a6Sopenharmony_ci#include <string> 23c29fa5a6Sopenharmony_ci#include <unordered_map> 24c29fa5a6Sopenharmony_ci 25c29fa5a6Sopenharmony_ci#include "nocopyable.h" 26c29fa5a6Sopenharmony_ci 27c29fa5a6Sopenharmony_ci#include "enumerator.h" 28c29fa5a6Sopenharmony_ci#include "i_context.h" 29c29fa5a6Sopenharmony_ci#include "i_device_mgr.h" 30c29fa5a6Sopenharmony_ci#include "epoll_manager.h" 31c29fa5a6Sopenharmony_ci#include "monitor.h" 32c29fa5a6Sopenharmony_ci 33c29fa5a6Sopenharmony_cinamespace OHOS { 34c29fa5a6Sopenharmony_cinamespace Msdp { 35c29fa5a6Sopenharmony_cinamespace DeviceStatus { 36c29fa5a6Sopenharmony_ciclass DeviceManager final : public IDeviceManager, 37c29fa5a6Sopenharmony_ci public IEpollEventSource { 38c29fa5a6Sopenharmony_cipublic: 39c29fa5a6Sopenharmony_ci DeviceManager(); 40c29fa5a6Sopenharmony_ci DISALLOW_COPY_AND_MOVE(DeviceManager); 41c29fa5a6Sopenharmony_ci ~DeviceManager() = default; 42c29fa5a6Sopenharmony_ci 43c29fa5a6Sopenharmony_ci int32_t Init(IContext *context); 44c29fa5a6Sopenharmony_ci int32_t Enable(); 45c29fa5a6Sopenharmony_ci int32_t Disable(); 46c29fa5a6Sopenharmony_ci int32_t GetFd() const override; 47c29fa5a6Sopenharmony_ci void Dispatch(const struct epoll_event &ev) override; 48c29fa5a6Sopenharmony_ci std::shared_ptr<IDevice> GetDevice(int32_t id) const override; 49c29fa5a6Sopenharmony_ci int32_t AddDeviceObserver(std::weak_ptr<IDeviceObserver> observer) override; 50c29fa5a6Sopenharmony_ci void RemoveDeviceObserver(std::weak_ptr<IDeviceObserver> observer) override; 51c29fa5a6Sopenharmony_ci void RetriggerHotplug(std::weak_ptr<IDeviceObserver> observer) override; 52c29fa5a6Sopenharmony_ci bool AnyOf(std::function<bool(std::shared_ptr<IDevice>)> pred) override; 53c29fa5a6Sopenharmony_ci bool HasLocalPointerDevice() override; 54c29fa5a6Sopenharmony_ci bool HasLocalKeyboardDevice() override; 55c29fa5a6Sopenharmony_ci bool HasKeyboard() override; 56c29fa5a6Sopenharmony_ci std::vector<std::shared_ptr<IDevice>> GetKeyboard() override; 57c29fa5a6Sopenharmony_ci 58c29fa5a6Sopenharmony_ciprivate: 59c29fa5a6Sopenharmony_ci class HotplugHandler final : public IDeviceMgr { 60c29fa5a6Sopenharmony_ci public: 61c29fa5a6Sopenharmony_ci explicit HotplugHandler(DeviceManager &devMgr); 62c29fa5a6Sopenharmony_ci ~HotplugHandler() = default; 63c29fa5a6Sopenharmony_ci 64c29fa5a6Sopenharmony_ci void AddDevice(const std::string &devNode) override; 65c29fa5a6Sopenharmony_ci void RemoveDevice(const std::string &devNode) override; 66c29fa5a6Sopenharmony_ci 67c29fa5a6Sopenharmony_ci private: 68c29fa5a6Sopenharmony_ci DeviceManager &devMgr_; 69c29fa5a6Sopenharmony_ci }; 70c29fa5a6Sopenharmony_ci 71c29fa5a6Sopenharmony_ciprivate: 72c29fa5a6Sopenharmony_ci int32_t OnInit(IContext *context); 73c29fa5a6Sopenharmony_ci int32_t OnEnable(); 74c29fa5a6Sopenharmony_ci int32_t OnDisable(); 75c29fa5a6Sopenharmony_ci int32_t OnEpollDispatch(uint32_t events); 76c29fa5a6Sopenharmony_ci int32_t ParseDeviceId(const std::string &devNode); 77c29fa5a6Sopenharmony_ci void OnDeviceRemoved(std::shared_ptr<IDevice> dev); 78c29fa5a6Sopenharmony_ci void OnDeviceAdded(std::shared_ptr<IDevice> dev); 79c29fa5a6Sopenharmony_ci int32_t OnAddDeviceObserver(std::weak_ptr<IDeviceObserver> observer); 80c29fa5a6Sopenharmony_ci int32_t OnRemoveDeviceObserver(std::weak_ptr<IDeviceObserver> observer); 81c29fa5a6Sopenharmony_ci int32_t OnRetriggerHotplug(std::weak_ptr<IDeviceObserver> observer); 82c29fa5a6Sopenharmony_ci int32_t RunGetDevice(std::packaged_task<std::shared_ptr<IDevice>(int32_t)> &task, int32_t id) const; 83c29fa5a6Sopenharmony_ci std::shared_ptr<IDevice> OnGetDevice(int32_t id) const; 84c29fa5a6Sopenharmony_ci std::shared_ptr<IDevice> AddDevice(const std::string &devNode); 85c29fa5a6Sopenharmony_ci std::shared_ptr<IDevice> RemoveDevice(const std::string &devNode); 86c29fa5a6Sopenharmony_ci std::shared_ptr<IDevice> FindDevice(const std::string &devPath); 87c29fa5a6Sopenharmony_ci 88c29fa5a6Sopenharmony_ciprivate: 89c29fa5a6Sopenharmony_ci IContext *context_ { nullptr }; 90c29fa5a6Sopenharmony_ci Enumerator enumerator_; 91c29fa5a6Sopenharmony_ci Monitor monitor_; 92c29fa5a6Sopenharmony_ci HotplugHandler hotplug_; 93c29fa5a6Sopenharmony_ci std::shared_ptr<EpollManager> epollMgr_ { nullptr }; 94c29fa5a6Sopenharmony_ci std::set<std::weak_ptr<IDeviceObserver>> observers_; 95c29fa5a6Sopenharmony_ci std::unordered_map<int32_t, std::shared_ptr<IDevice>> devices_; 96c29fa5a6Sopenharmony_ci}; 97c29fa5a6Sopenharmony_ci 98c29fa5a6Sopenharmony_ciinline int32_t DeviceManager::GetFd() const 99c29fa5a6Sopenharmony_ci{ 100c29fa5a6Sopenharmony_ci return (epollMgr_ != nullptr ? epollMgr_->GetFd() : -1); 101c29fa5a6Sopenharmony_ci} 102c29fa5a6Sopenharmony_ci} // namespace DeviceStatus 103c29fa5a6Sopenharmony_ci} // namespace Msdp 104c29fa5a6Sopenharmony_ci} // namespace OHOS 105c29fa5a6Sopenharmony_ci#endif // DEVICE_MANAGER_H