12d4d9a4dSopenharmony_ci/*
22d4d9a4dSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
32d4d9a4dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
42d4d9a4dSopenharmony_ci * you may not use this file except in compliance with the License.
52d4d9a4dSopenharmony_ci * You may obtain a copy of the License at
62d4d9a4dSopenharmony_ci *
72d4d9a4dSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
82d4d9a4dSopenharmony_ci *
92d4d9a4dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
102d4d9a4dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
112d4d9a4dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122d4d9a4dSopenharmony_ci * See the License for the specific language governing permissions and
132d4d9a4dSopenharmony_ci * limitations under the License.
142d4d9a4dSopenharmony_ci */
152d4d9a4dSopenharmony_ci
162d4d9a4dSopenharmony_ci#ifndef DISTRIBUTED_INPUT_HANDLER_H
172d4d9a4dSopenharmony_ci#define DISTRIBUTED_INPUT_HANDLER_H
182d4d9a4dSopenharmony_ci
192d4d9a4dSopenharmony_ci#include <functional>
202d4d9a4dSopenharmony_ci#include <map>
212d4d9a4dSopenharmony_ci#include <mutex>
222d4d9a4dSopenharmony_ci#include <string>
232d4d9a4dSopenharmony_ci
242d4d9a4dSopenharmony_ci#include <sys/epoll.h>
252d4d9a4dSopenharmony_ci#include <linux/input.h>
262d4d9a4dSopenharmony_ci
272d4d9a4dSopenharmony_ci#include "ihardware_handler.h"
282d4d9a4dSopenharmony_ci#include "single_instance.h"
292d4d9a4dSopenharmony_ci
302d4d9a4dSopenharmony_ci#include "constants_dinput.h"
312d4d9a4dSopenharmony_ci#include "input_hub.h"
322d4d9a4dSopenharmony_ci
332d4d9a4dSopenharmony_ci#ifndef API_EXPORT
342d4d9a4dSopenharmony_ci#define API_EXPORT __attribute__((visibility("default")))
352d4d9a4dSopenharmony_ci#endif
362d4d9a4dSopenharmony_ci
372d4d9a4dSopenharmony_cinamespace OHOS {
382d4d9a4dSopenharmony_cinamespace DistributedHardware {
392d4d9a4dSopenharmony_cinamespace DistributedInput {
402d4d9a4dSopenharmony_ciclass DistributedInputHandler : public IHardwareHandler {
412d4d9a4dSopenharmony_ciDECLARE_SINGLE_INSTANCE_BASE(DistributedInputHandler);
422d4d9a4dSopenharmony_cipublic:
432d4d9a4dSopenharmony_ci    API_EXPORT int32_t Initialize() override;
442d4d9a4dSopenharmony_ci    API_EXPORT virtual std::vector<DHItem> QueryMeta() override;
452d4d9a4dSopenharmony_ci    API_EXPORT virtual std::vector<DHItem> Query() override;
462d4d9a4dSopenharmony_ci    API_EXPORT virtual std::map<std::string, std::string> QueryExtraInfo() override;
472d4d9a4dSopenharmony_ci    API_EXPORT bool IsSupportPlugin() override;
482d4d9a4dSopenharmony_ci    API_EXPORT void RegisterPluginListener(std::shared_ptr<PluginListener> listener) override;
492d4d9a4dSopenharmony_ci    API_EXPORT void UnRegisterPluginListener() override;
502d4d9a4dSopenharmony_ci
512d4d9a4dSopenharmony_ci    API_EXPORT void FindDevicesInfoByType(const uint32_t inputTypes, std::map<int32_t, std::string> &datas);
522d4d9a4dSopenharmony_ci    API_EXPORT void FindDevicesInfoByDhId(std::vector<std::string> dhidsVec, std::map<int32_t, std::string> &datas);
532d4d9a4dSopenharmony_ciprivate:
542d4d9a4dSopenharmony_ci    DistributedInputHandler();
552d4d9a4dSopenharmony_ci    ~DistributedInputHandler();
562d4d9a4dSopenharmony_ci    void StructTransJson(const InputDevice &pBuf, std::string &strDescriptor);
572d4d9a4dSopenharmony_ci    std::shared_ptr<PluginListener> m_listener;
582d4d9a4dSopenharmony_ci    bool InitCollectEventsThread();
592d4d9a4dSopenharmony_ci    void NotifyHardWare(int iCnt);
602d4d9a4dSopenharmony_ci
612d4d9a4dSopenharmony_ci    pthread_t collectThreadID_;
622d4d9a4dSopenharmony_ci    bool isCollectingEvents_;
632d4d9a4dSopenharmony_ci    bool isStartCollectEventThread_;
642d4d9a4dSopenharmony_ci    static void *CollectEventsThread(void *param);
652d4d9a4dSopenharmony_ci    void StartInputMonitorDeviceThread();
662d4d9a4dSopenharmony_ci    void StopInputMonitorDeviceThread();
672d4d9a4dSopenharmony_ci
682d4d9a4dSopenharmony_ci    // The event queue.
692d4d9a4dSopenharmony_ci    static const int inputDeviceBufferSize_ = 32;
702d4d9a4dSopenharmony_ci    InputDeviceEvent mEventBuffer_[inputDeviceBufferSize_] = {};
712d4d9a4dSopenharmony_ci    std::mutex operationMutex_;
722d4d9a4dSopenharmony_ci    std::unique_ptr<InputHub> inputHub_;
732d4d9a4dSopenharmony_ci};
742d4d9a4dSopenharmony_ci
752d4d9a4dSopenharmony_ci#ifdef __cplusplus
762d4d9a4dSopenharmony_ciextern "C" {
772d4d9a4dSopenharmony_ci#endif
782d4d9a4dSopenharmony_ciAPI_EXPORT IHardwareHandler* GetHardwareHandler();
792d4d9a4dSopenharmony_ci#ifdef __cplusplus
802d4d9a4dSopenharmony_ci}
812d4d9a4dSopenharmony_ci#endif
822d4d9a4dSopenharmony_ci} // namespace DistributedInput
832d4d9a4dSopenharmony_ci} // namespace DistributedHardware
842d4d9a4dSopenharmony_ci} // namespace OHOS
852d4d9a4dSopenharmony_ci
862d4d9a4dSopenharmony_ci#endif // DISTRIBUTED_INPUT_HANDLER_H
87