1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci#include "input_reporter.h"
16094332d3Sopenharmony_ci#include <stdio.h>
17094332d3Sopenharmony_ci#include <unistd.h>
18094332d3Sopenharmony_ci#include <malloc.h>
19094332d3Sopenharmony_ci#include <sys/ioctl.h>
20094332d3Sopenharmony_ci#include <securec.h>
21094332d3Sopenharmony_ci#include "hdf_io_service_if.h"
22094332d3Sopenharmony_ci#include "osal_time.h"
23094332d3Sopenharmony_ci#include "input_common.h"
24094332d3Sopenharmony_ci
25094332d3Sopenharmony_ci#define POLL_WAIT_MS 100
26094332d3Sopenharmony_ci#define MOUSE_DATA_LEN 4
27094332d3Sopenharmony_ci#define REL_X_BYTE 1
28094332d3Sopenharmony_ci#define REL_Y_BYTE 2
29094332d3Sopenharmony_ci#define MAX_EVENT_PKG_NUM 100
30094332d3Sopenharmony_ci
31094332d3Sopenharmony_ciInputDevManager *GetDevManager(void);
32094332d3Sopenharmony_ci
33094332d3Sopenharmony_cistatic int32_t EventListenerCallback(struct HdfDevEventlistener *listener, struct HdfIoService *service,
34094332d3Sopenharmony_ci    uint32_t id, struct HdfSBuf *data)
35094332d3Sopenharmony_ci{
36094332d3Sopenharmony_ci    (void)listener;
37094332d3Sopenharmony_ci    (void)id;
38094332d3Sopenharmony_ci    int32_t count = 0;
39094332d3Sopenharmony_ci    uint32_t len = 0;
40094332d3Sopenharmony_ci    InputEventPackage *pkgs[MAX_EVENT_PKG_NUM] = {0};
41094332d3Sopenharmony_ci    DeviceInfoNode *pos = NULL;
42094332d3Sopenharmony_ci    DeviceInfoNode *next = NULL;
43094332d3Sopenharmony_ci    InputDevManager *manager = NULL;
44094332d3Sopenharmony_ci
45094332d3Sopenharmony_ci    if (service == NULL || data == NULL) {
46094332d3Sopenharmony_ci        HDF_LOGE("%s: invalid param", __func__);
47094332d3Sopenharmony_ci        return INPUT_INVALID_PARAM;
48094332d3Sopenharmony_ci    }
49094332d3Sopenharmony_ci
50094332d3Sopenharmony_ci    manager = GetDevManager();
51094332d3Sopenharmony_ci    if (manager == NULL) {
52094332d3Sopenharmony_ci        HDF_LOGE("%s: get manager failed", __func__);
53094332d3Sopenharmony_ci        return INPUT_NULL_PTR;
54094332d3Sopenharmony_ci    }
55094332d3Sopenharmony_ci
56094332d3Sopenharmony_ci    while (true) {
57094332d3Sopenharmony_ci        if (count >= MAX_EVENT_PKG_NUM) {
58094332d3Sopenharmony_ci            break;
59094332d3Sopenharmony_ci        }
60094332d3Sopenharmony_ci
61094332d3Sopenharmony_ci        if (!HdfSbufReadBuffer(data, (const void **)&pkgs[count], &len)) {
62094332d3Sopenharmony_ci            HDF_LOGE("%s: sbuf read finished", __func__);
63094332d3Sopenharmony_ci            break;
64094332d3Sopenharmony_ci        }
65094332d3Sopenharmony_ci
66094332d3Sopenharmony_ci        if (pkgs[count] == NULL) {
67094332d3Sopenharmony_ci            break;
68094332d3Sopenharmony_ci        }
69094332d3Sopenharmony_ci        count++;
70094332d3Sopenharmony_ci    }
71094332d3Sopenharmony_ci
72094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
73094332d3Sopenharmony_ci        if (pos->service == service) {
74094332d3Sopenharmony_ci            if (pos->eventCb == NULL) {
75094332d3Sopenharmony_ci                HDF_LOGE("%s: param is null", __func__);
76094332d3Sopenharmony_ci                return INPUT_NULL_PTR;
77094332d3Sopenharmony_ci            }
78094332d3Sopenharmony_ci            pos->eventCb->EventPkgCallback((const InputEventPackage **)pkgs, count, pos->payload.devIndex);
79094332d3Sopenharmony_ci        }
80094332d3Sopenharmony_ci    }
81094332d3Sopenharmony_ci    return INPUT_SUCCESS;
82094332d3Sopenharmony_ci}
83094332d3Sopenharmony_ci
84094332d3Sopenharmony_cistatic struct HdfDevEventlistener *EventListenerInstance(void)
85094332d3Sopenharmony_ci{
86094332d3Sopenharmony_ci    struct HdfDevEventlistener *listener = (struct HdfDevEventlistener *)malloc(sizeof(struct HdfDevEventlistener));
87094332d3Sopenharmony_ci    if (listener == NULL) {
88094332d3Sopenharmony_ci        HDF_LOGE("%s: instance listener failed", __func__);
89094332d3Sopenharmony_ci        return NULL;
90094332d3Sopenharmony_ci    }
91094332d3Sopenharmony_ci
92094332d3Sopenharmony_ci    (void)memset_s(listener, sizeof(struct HdfDevEventlistener), 0, sizeof(struct HdfDevEventlistener));
93094332d3Sopenharmony_ci    listener->onReceive = EventListenerCallback;
94094332d3Sopenharmony_ci    return listener;
95094332d3Sopenharmony_ci}
96094332d3Sopenharmony_ci
97094332d3Sopenharmony_cistatic int32_t RegisterReportCallback(uint32_t devIndex, InputEventCb *callback)
98094332d3Sopenharmony_ci{
99094332d3Sopenharmony_ci    DeviceInfoNode *pos = NULL;
100094332d3Sopenharmony_ci    DeviceInfoNode *next = NULL;
101094332d3Sopenharmony_ci    InputDevManager *manager = NULL;
102094332d3Sopenharmony_ci
103094332d3Sopenharmony_ci    if ((devIndex >= MAX_INPUT_DEV_NUM) || (callback == NULL) || (callback->EventPkgCallback == NULL)) {
104094332d3Sopenharmony_ci        HDF_LOGE("%s: invalid param", __func__);
105094332d3Sopenharmony_ci        return INPUT_INVALID_PARAM;
106094332d3Sopenharmony_ci    }
107094332d3Sopenharmony_ci    GET_MANAGER_CHECK_RETURN(manager);
108094332d3Sopenharmony_ci
109094332d3Sopenharmony_ci    pthread_mutex_lock(&manager->mutex);
110094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
111094332d3Sopenharmony_ci        if (pos->payload.devIndex != devIndex) {
112094332d3Sopenharmony_ci            continue;
113094332d3Sopenharmony_ci        }
114094332d3Sopenharmony_ci        struct HdfDevEventlistener *listener = EventListenerInstance();
115094332d3Sopenharmony_ci        if (listener == NULL) {
116094332d3Sopenharmony_ci            pthread_mutex_unlock(&manager->mutex);
117094332d3Sopenharmony_ci            return INPUT_FAILURE;
118094332d3Sopenharmony_ci        }
119094332d3Sopenharmony_ci        if (HdfDeviceRegisterEventListener(pos->service, listener) != INPUT_SUCCESS) {
120094332d3Sopenharmony_ci            free(listener);
121094332d3Sopenharmony_ci            pthread_mutex_unlock(&manager->mutex);
122094332d3Sopenharmony_ci            HDF_LOGE("%s: fail to register listener", __func__);
123094332d3Sopenharmony_ci            return INPUT_FAILURE;
124094332d3Sopenharmony_ci        }
125094332d3Sopenharmony_ci        manager->evtCallbackNum++;
126094332d3Sopenharmony_ci        pos->eventCb = callback;
127094332d3Sopenharmony_ci        pos->listener = listener;
128094332d3Sopenharmony_ci        pthread_mutex_unlock(&manager->mutex);
129094332d3Sopenharmony_ci        HDF_LOGI("%s: device%u register callback succ, evtCallbackNum = %d", __func__,
130094332d3Sopenharmony_ci            devIndex, manager->evtCallbackNum);
131094332d3Sopenharmony_ci        return INPUT_SUCCESS;
132094332d3Sopenharmony_ci    }
133094332d3Sopenharmony_ci
134094332d3Sopenharmony_ci    pthread_mutex_unlock(&manager->mutex);
135094332d3Sopenharmony_ci    HDF_LOGE("%s: device%u doesn't exist, can't register callback", __func__, devIndex);
136094332d3Sopenharmony_ci    return INPUT_FAILURE;
137094332d3Sopenharmony_ci}
138094332d3Sopenharmony_ci
139094332d3Sopenharmony_cistatic int32_t UnregisterReportCallback(uint32_t devIndex)
140094332d3Sopenharmony_ci{
141094332d3Sopenharmony_ci    DeviceInfoNode *pos = NULL;
142094332d3Sopenharmony_ci    DeviceInfoNode *next = NULL;
143094332d3Sopenharmony_ci    InputDevManager *manager = NULL;
144094332d3Sopenharmony_ci
145094332d3Sopenharmony_ci    if (devIndex >= MAX_INPUT_DEV_NUM) {
146094332d3Sopenharmony_ci        HDF_LOGE("%s: invalid param", __func__);
147094332d3Sopenharmony_ci        return INPUT_INVALID_PARAM;
148094332d3Sopenharmony_ci    }
149094332d3Sopenharmony_ci    GET_MANAGER_CHECK_RETURN(manager);
150094332d3Sopenharmony_ci
151094332d3Sopenharmony_ci    pthread_mutex_lock(&manager->mutex);
152094332d3Sopenharmony_ci    DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) {
153094332d3Sopenharmony_ci        if (pos->payload.devIndex != devIndex) {
154094332d3Sopenharmony_ci            continue;
155094332d3Sopenharmony_ci        }
156094332d3Sopenharmony_ci        if (pos->eventCb != NULL) {
157094332d3Sopenharmony_ci            if (HdfDeviceUnregisterEventListener(pos->service, pos->listener) != INPUT_SUCCESS) {
158094332d3Sopenharmony_ci                pthread_mutex_unlock(&manager->mutex);
159094332d3Sopenharmony_ci                HDF_LOGE("%s: fail to unregister listener", __func__);
160094332d3Sopenharmony_ci                return INPUT_FAILURE;
161094332d3Sopenharmony_ci            }
162094332d3Sopenharmony_ci            free(pos->listener);
163094332d3Sopenharmony_ci            pos->listener = NULL;
164094332d3Sopenharmony_ci            pos->eventCb = NULL;
165094332d3Sopenharmony_ci            manager->evtCallbackNum--;
166094332d3Sopenharmony_ci            pthread_mutex_unlock(&manager->mutex);
167094332d3Sopenharmony_ci            HDF_LOGI("%s: device%u unregister callback succ", __func__, devIndex);
168094332d3Sopenharmony_ci            return INPUT_SUCCESS;
169094332d3Sopenharmony_ci        } else {
170094332d3Sopenharmony_ci            pthread_mutex_unlock(&manager->mutex);
171094332d3Sopenharmony_ci            HDF_LOGE("%s: device%u does not register callback", __func__, devIndex);
172094332d3Sopenharmony_ci            return INPUT_FAILURE;
173094332d3Sopenharmony_ci        }
174094332d3Sopenharmony_ci    }
175094332d3Sopenharmony_ci
176094332d3Sopenharmony_ci    pthread_mutex_unlock(&manager->mutex);
177094332d3Sopenharmony_ci    HDF_LOGE("%s: device%u doesn't exist, can't unregister callback", __func__, devIndex);
178094332d3Sopenharmony_ci    return INPUT_FAILURE;
179094332d3Sopenharmony_ci}
180094332d3Sopenharmony_ci
181094332d3Sopenharmony_cistatic int32_t HotPlugEventListenerCallback(struct HdfDevEventlistener *listener,
182094332d3Sopenharmony_ci    struct HdfIoService *service, uint32_t id, struct HdfSBuf *data)
183094332d3Sopenharmony_ci{
184094332d3Sopenharmony_ci    (void)listener;
185094332d3Sopenharmony_ci    (void)id;
186094332d3Sopenharmony_ci    uint32_t len = 0;
187094332d3Sopenharmony_ci    InputHotPlugEvent *event = NULL;
188094332d3Sopenharmony_ci    InputDevManager *manager = NULL;
189094332d3Sopenharmony_ci    bool ret = false;
190094332d3Sopenharmony_ci
191094332d3Sopenharmony_ci    if (service == NULL || data == NULL) {
192094332d3Sopenharmony_ci        HDF_LOGE("%s: invalid param", __func__);
193094332d3Sopenharmony_ci        return INPUT_INVALID_PARAM;
194094332d3Sopenharmony_ci    }
195094332d3Sopenharmony_ci
196094332d3Sopenharmony_ci    GET_MANAGER_CHECK_RETURN(manager);
197094332d3Sopenharmony_ci
198094332d3Sopenharmony_ci    ret = HdfSbufReadBuffer(data, (const void **)&event, &len);
199094332d3Sopenharmony_ci    if (!ret) {
200094332d3Sopenharmony_ci        HDF_LOGE("%s: read sbuf failed", __func__);
201094332d3Sopenharmony_ci        return INPUT_FAILURE;
202094332d3Sopenharmony_ci    }
203094332d3Sopenharmony_ci    if (manager->hostDev.hostCb == NULL) {
204094332d3Sopenharmony_ci        HDF_LOGE("%s: param is null", __func__);
205094332d3Sopenharmony_ci        return INPUT_NULL_PTR;
206094332d3Sopenharmony_ci    }
207094332d3Sopenharmony_ci    manager->hostDev.hostCb->HotPlugCallback((const InputHotPlugEvent *)event);
208094332d3Sopenharmony_ci    return INPUT_SUCCESS;
209094332d3Sopenharmony_ci}
210094332d3Sopenharmony_ci
211094332d3Sopenharmony_cistatic struct HdfDevEventlistener *HotPlugEventListenerInstance(void)
212094332d3Sopenharmony_ci{
213094332d3Sopenharmony_ci    struct HdfDevEventlistener *listener = (struct HdfDevEventlistener *)malloc(sizeof(struct HdfDevEventlistener));
214094332d3Sopenharmony_ci    if (listener == NULL) {
215094332d3Sopenharmony_ci        HDF_LOGE("%s: instance listener failed", __func__);
216094332d3Sopenharmony_ci        return NULL;
217094332d3Sopenharmony_ci    }
218094332d3Sopenharmony_ci
219094332d3Sopenharmony_ci    (void)memset_s(listener, sizeof(struct HdfDevEventlistener), 0, sizeof(struct HdfDevEventlistener));
220094332d3Sopenharmony_ci    listener->onReceive = HotPlugEventListenerCallback;
221094332d3Sopenharmony_ci    return listener;
222094332d3Sopenharmony_ci}
223094332d3Sopenharmony_ci
224094332d3Sopenharmony_cistatic int32_t RegisterHotPlugCallback(InputHostCb *callback)
225094332d3Sopenharmony_ci{
226094332d3Sopenharmony_ci    InputDevManager *manager = NULL;
227094332d3Sopenharmony_ci
228094332d3Sopenharmony_ci    if ((callback == NULL) || (callback->HotPlugCallback == NULL)) {
229094332d3Sopenharmony_ci        HDF_LOGE("%s: invalid param", __func__);
230094332d3Sopenharmony_ci        return INPUT_INVALID_PARAM;
231094332d3Sopenharmony_ci    }
232094332d3Sopenharmony_ci    GET_MANAGER_CHECK_RETURN(manager);
233094332d3Sopenharmony_ci
234094332d3Sopenharmony_ci    pthread_mutex_lock(&manager->mutex);
235094332d3Sopenharmony_ci    if (manager->hostDev.service == NULL) {
236094332d3Sopenharmony_ci        manager->hostDev.service = HdfIoServiceBind(DEV_MANAGER_SERVICE_NAME);
237094332d3Sopenharmony_ci        if (manager->hostDev.service == NULL) {
238094332d3Sopenharmony_ci            pthread_mutex_unlock(&manager->mutex);
239094332d3Sopenharmony_ci            return INPUT_FAILURE;
240094332d3Sopenharmony_ci        }
241094332d3Sopenharmony_ci    }
242094332d3Sopenharmony_ci
243094332d3Sopenharmony_ci    struct HdfDevEventlistener *listener = HotPlugEventListenerInstance();
244094332d3Sopenharmony_ci    if (listener == NULL) {
245094332d3Sopenharmony_ci        pthread_mutex_unlock(&manager->mutex);
246094332d3Sopenharmony_ci        HDF_LOGE("%s: fail to instance listener", __func__);
247094332d3Sopenharmony_ci        return INPUT_FAILURE;
248094332d3Sopenharmony_ci    }
249094332d3Sopenharmony_ci    if (HdfDeviceRegisterEventListener(manager->hostDev.service, listener) != INPUT_SUCCESS) {
250094332d3Sopenharmony_ci        pthread_mutex_unlock(&manager->mutex);
251094332d3Sopenharmony_ci        HDF_LOGE("%s: fail to register listener", __func__);
252094332d3Sopenharmony_ci        free(listener);
253094332d3Sopenharmony_ci        return INPUT_FAILURE;
254094332d3Sopenharmony_ci    }
255094332d3Sopenharmony_ci    manager->hostDev.hostCb = callback;
256094332d3Sopenharmony_ci    manager->hostDev.listener = listener;
257094332d3Sopenharmony_ci    pthread_mutex_unlock(&manager->mutex);
258094332d3Sopenharmony_ci    return INPUT_SUCCESS;
259094332d3Sopenharmony_ci}
260094332d3Sopenharmony_ci
261094332d3Sopenharmony_cistatic int32_t UnregisterHotPlugCallback(void)
262094332d3Sopenharmony_ci{
263094332d3Sopenharmony_ci    InputDevManager *manager = NULL;
264094332d3Sopenharmony_ci    GET_MANAGER_CHECK_RETURN(manager);
265094332d3Sopenharmony_ci
266094332d3Sopenharmony_ci    pthread_mutex_lock(&manager->mutex);
267094332d3Sopenharmony_ci    if (manager->hostDev.listener != NULL) {
268094332d3Sopenharmony_ci        free(manager->hostDev.listener);
269094332d3Sopenharmony_ci        manager->hostDev.listener = NULL;
270094332d3Sopenharmony_ci    }
271094332d3Sopenharmony_ci    manager->hostDev.hostCb = NULL;
272094332d3Sopenharmony_ci    pthread_mutex_unlock(&manager->mutex);
273094332d3Sopenharmony_ci    return INPUT_SUCCESS;
274094332d3Sopenharmony_ci}
275094332d3Sopenharmony_ci
276094332d3Sopenharmony_ciint32_t InstanceReporterHdi(InputReporter **reporter)
277094332d3Sopenharmony_ci{
278094332d3Sopenharmony_ci    InputReporter *reporterHdi = (InputReporter *)malloc(sizeof(InputReporter));
279094332d3Sopenharmony_ci    if (reporterHdi == NULL) {
280094332d3Sopenharmony_ci        HDF_LOGE("%s: malloc fail", __func__);
281094332d3Sopenharmony_ci        return INPUT_NOMEM;
282094332d3Sopenharmony_ci    }
283094332d3Sopenharmony_ci
284094332d3Sopenharmony_ci    (void)memset_s(reporterHdi, sizeof(InputReporter), 0, sizeof(InputReporter));
285094332d3Sopenharmony_ci
286094332d3Sopenharmony_ci    reporterHdi->RegisterReportCallback = RegisterReportCallback;
287094332d3Sopenharmony_ci    reporterHdi->UnregisterReportCallback = UnregisterReportCallback;
288094332d3Sopenharmony_ci    reporterHdi->RegisterHotPlugCallback = RegisterHotPlugCallback;
289094332d3Sopenharmony_ci    reporterHdi->UnregisterHotPlugCallback = UnregisterHotPlugCallback;
290094332d3Sopenharmony_ci    *reporter = reporterHdi;
291094332d3Sopenharmony_ci
292094332d3Sopenharmony_ci    return INPUT_SUCCESS;
293094332d3Sopenharmony_ci}
294