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_manager.h" 16094332d3Sopenharmony_ci#include <stdio.h> 17094332d3Sopenharmony_ci#include <stdlib.h> 18094332d3Sopenharmony_ci#include <unistd.h> 19094332d3Sopenharmony_ci#include <limits.h> 20094332d3Sopenharmony_ci#include <fcntl.h> 21094332d3Sopenharmony_ci#include <malloc.h> 22094332d3Sopenharmony_ci#include <sys/ioctl.h> 23094332d3Sopenharmony_ci#include <securec.h> 24094332d3Sopenharmony_ci#include "hdf_io_service_if.h" 25094332d3Sopenharmony_ci#include "osal_time.h" 26094332d3Sopenharmony_ci#include "input_common.h" 27094332d3Sopenharmony_ci 28094332d3Sopenharmony_ci#define TOUCH_INDEX 1 29094332d3Sopenharmony_ci#define PLACEHOLDER_LENGTH 2 30094332d3Sopenharmony_ci#define PLACEHOLDER_LIMIT 10 31094332d3Sopenharmony_ci 32094332d3Sopenharmony_cistatic InputDevManager *g_devManager; 33094332d3Sopenharmony_ciint32_t InstanceReporterHdi(InputReporter **hdi); 34094332d3Sopenharmony_ciint32_t InstanceControllerHdi(InputController **hdi); 35094332d3Sopenharmony_ciint32_t UpdateDevFullInfo(uint32_t devIndex); 36094332d3Sopenharmony_ci 37094332d3Sopenharmony_ciInputDevManager *GetDevManager(void) 38094332d3Sopenharmony_ci{ 39094332d3Sopenharmony_ci return g_devManager; 40094332d3Sopenharmony_ci} 41094332d3Sopenharmony_ci 42094332d3Sopenharmony_cistatic int32_t GetInputDevice(uint32_t devIndex, InputDeviceInfo **devInfo) 43094332d3Sopenharmony_ci{ 44094332d3Sopenharmony_ci int32_t ret; 45094332d3Sopenharmony_ci int32_t count = 3; // 3 : number of attempts 46094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 47094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 48094332d3Sopenharmony_ci InputDevManager *manager = NULL; 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_ci if (devIndex >= MAX_INPUT_DEV_NUM || devInfo == NULL) { 51094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 52094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 53094332d3Sopenharmony_ci } 54094332d3Sopenharmony_ci 55094332d3Sopenharmony_ci while ((count--) > 0) { 56094332d3Sopenharmony_ci ret = UpdateDevFullInfo(devIndex); 57094332d3Sopenharmony_ci if (ret == INPUT_SUCCESS) { 58094332d3Sopenharmony_ci break; 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci OsalMSleep(10); // 10 : delay time 61094332d3Sopenharmony_ci } 62094332d3Sopenharmony_ci if (count == 0) { 63094332d3Sopenharmony_ci HDF_LOGE("%s: update dev info failed", __func__); 64094332d3Sopenharmony_ci return ret; 65094332d3Sopenharmony_ci } 66094332d3Sopenharmony_ci 67094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 68094332d3Sopenharmony_ci 69094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 70094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 71094332d3Sopenharmony_ci if (pos->payload.devIndex != devIndex) { 72094332d3Sopenharmony_ci continue; 73094332d3Sopenharmony_ci } 74094332d3Sopenharmony_ci *devInfo = &pos->payload; 75094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 76094332d3Sopenharmony_ci HDF_LOGI("%s: device%u get dev info succ", __func__, devIndex); 77094332d3Sopenharmony_ci return INPUT_SUCCESS; 78094332d3Sopenharmony_ci } 79094332d3Sopenharmony_ci 80094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 81094332d3Sopenharmony_ci HDF_LOGE("%s: device%u doesn't exist, can't get device info", __func__, devIndex); 82094332d3Sopenharmony_ci return INPUT_FAILURE; 83094332d3Sopenharmony_ci} 84094332d3Sopenharmony_ci 85094332d3Sopenharmony_cistatic int32_t GetInputDeviceList(uint32_t *devNum, InputDeviceInfo **deviceList, uint32_t size) 86094332d3Sopenharmony_ci{ 87094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 88094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 89094332d3Sopenharmony_ci InputDevManager *manager = NULL; 90094332d3Sopenharmony_ci uint32_t tempSize = 0; 91094332d3Sopenharmony_ci InputDeviceInfo **tempList = NULL; 92094332d3Sopenharmony_ci 93094332d3Sopenharmony_ci if (devNum == NULL || deviceList == NULL) { 94094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 95094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 96094332d3Sopenharmony_ci } 97094332d3Sopenharmony_ci tempList = deviceList; 98094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 99094332d3Sopenharmony_ci 100094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 101094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 102094332d3Sopenharmony_ci if (tempSize >= size) { 103094332d3Sopenharmony_ci *devNum = manager->attachedDevNum; 104094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 105094332d3Sopenharmony_ci HDF_LOGE("%s: size is not enough, size = %u, devNum = %u", __func__, 106094332d3Sopenharmony_ci size, *devNum); 107094332d3Sopenharmony_ci return INPUT_FAILURE; 108094332d3Sopenharmony_ci } 109094332d3Sopenharmony_ci *tempList = &pos->payload; 110094332d3Sopenharmony_ci tempList++; 111094332d3Sopenharmony_ci tempSize++; 112094332d3Sopenharmony_ci } 113094332d3Sopenharmony_ci *devNum = manager->attachedDevNum; 114094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 115094332d3Sopenharmony_ci return INPUT_SUCCESS; 116094332d3Sopenharmony_ci} 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_cistatic int32_t CloseInputDevice(uint32_t devIndex) 119094332d3Sopenharmony_ci{ 120094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 121094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 122094332d3Sopenharmony_ci InputDevManager *manager = NULL; 123094332d3Sopenharmony_ci 124094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 125094332d3Sopenharmony_ci 126094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 127094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 128094332d3Sopenharmony_ci if (pos->payload.devIndex != devIndex) { 129094332d3Sopenharmony_ci continue; 130094332d3Sopenharmony_ci } 131094332d3Sopenharmony_ci HdfIoServiceRecycle(pos->service); 132094332d3Sopenharmony_ci DListRemove(&pos->node); 133094332d3Sopenharmony_ci free(pos); 134094332d3Sopenharmony_ci manager->attachedDevNum--; 135094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 136094332d3Sopenharmony_ci return INPUT_SUCCESS; 137094332d3Sopenharmony_ci } 138094332d3Sopenharmony_ci 139094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 140094332d3Sopenharmony_ci HDF_LOGE("%s: device%u doesn't exist", __func__, devIndex); 141094332d3Sopenharmony_ci return INPUT_FAILURE; 142094332d3Sopenharmony_ci} 143094332d3Sopenharmony_ci 144094332d3Sopenharmony_cistatic int32_t AddService(uint32_t index, const struct HdfIoService *service) 145094332d3Sopenharmony_ci{ 146094332d3Sopenharmony_ci InputDevManager *manager = NULL; 147094332d3Sopenharmony_ci DeviceInfoNode *device = NULL; 148094332d3Sopenharmony_ci 149094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 150094332d3Sopenharmony_ci device = (DeviceInfoNode *)malloc(sizeof(DeviceInfoNode)); 151094332d3Sopenharmony_ci if (device == NULL) { 152094332d3Sopenharmony_ci HDF_LOGE("%s: malloc fail", __func__); 153094332d3Sopenharmony_ci return INPUT_NOMEM; 154094332d3Sopenharmony_ci } 155094332d3Sopenharmony_ci (void)memset_s(device, sizeof(DeviceInfoNode), 0, sizeof(DeviceInfoNode)); 156094332d3Sopenharmony_ci 157094332d3Sopenharmony_ci device->payload.devIndex = index; 158094332d3Sopenharmony_ci device->service = (struct HdfIoService *)service; 159094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 160094332d3Sopenharmony_ci DListInsertTail(&device->node, &manager->devList); 161094332d3Sopenharmony_ci manager->attachedDevNum++; 162094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 163094332d3Sopenharmony_ci return INPUT_SUCCESS; 164094332d3Sopenharmony_ci} 165094332d3Sopenharmony_ci 166094332d3Sopenharmony_cistatic int32_t CheckIndex(uint32_t devIndex) 167094332d3Sopenharmony_ci{ 168094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 169094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 170094332d3Sopenharmony_ci InputDevManager *manager = NULL; 171094332d3Sopenharmony_ci 172094332d3Sopenharmony_ci if (devIndex >= MAX_INPUT_DEV_NUM) { 173094332d3Sopenharmony_ci HDF_LOGE("%s: invalid param", __func__); 174094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 175094332d3Sopenharmony_ci } 176094332d3Sopenharmony_ci 177094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 178094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 179094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 180094332d3Sopenharmony_ci if (pos->payload.devIndex == devIndex) { 181094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 182094332d3Sopenharmony_ci HDF_LOGE("%s: the device%u has existed", __func__, devIndex); 183094332d3Sopenharmony_ci return INPUT_FAILURE; 184094332d3Sopenharmony_ci } 185094332d3Sopenharmony_ci } 186094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 187094332d3Sopenharmony_ci return INPUT_SUCCESS; 188094332d3Sopenharmony_ci} 189094332d3Sopenharmony_ci 190094332d3Sopenharmony_cistatic int32_t OpenInputDevice(uint32_t devIndex) 191094332d3Sopenharmony_ci{ 192094332d3Sopenharmony_ci int32_t ret; 193094332d3Sopenharmony_ci int32_t len; 194094332d3Sopenharmony_ci struct HdfIoService *service = NULL; 195094332d3Sopenharmony_ci char serviceName[SERVICE_NAME_LEN] = {0}; 196094332d3Sopenharmony_ci 197094332d3Sopenharmony_ci if (CheckIndex(devIndex) != INPUT_SUCCESS) { 198094332d3Sopenharmony_ci return INPUT_FAILURE; 199094332d3Sopenharmony_ci } 200094332d3Sopenharmony_ci 201094332d3Sopenharmony_ci len = (devIndex < PLACEHOLDER_LIMIT) ? 1 : PLACEHOLDER_LENGTH; 202094332d3Sopenharmony_ci ret = snprintf_s(serviceName, SERVICE_NAME_LEN, strlen("hdf_input_event") + len, "%s%u", 203094332d3Sopenharmony_ci "hdf_input_event", devIndex); 204094332d3Sopenharmony_ci if (ret == -1) { 205094332d3Sopenharmony_ci HDF_LOGE("%s: snprintf_s fail", __func__); 206094332d3Sopenharmony_ci return INPUT_FAILURE; 207094332d3Sopenharmony_ci } 208094332d3Sopenharmony_ci 209094332d3Sopenharmony_ci service = HdfIoServiceBind(serviceName); 210094332d3Sopenharmony_ci if (service == NULL) { 211094332d3Sopenharmony_ci HDF_LOGE("%s: fail to get io service: %s", __func__, serviceName); 212094332d3Sopenharmony_ci return INPUT_NULL_PTR; 213094332d3Sopenharmony_ci } 214094332d3Sopenharmony_ci 215094332d3Sopenharmony_ci if (AddService(devIndex, service) < 0) { 216094332d3Sopenharmony_ci HDF_LOGE("%s: add device%d failed", __func__, devIndex); 217094332d3Sopenharmony_ci HdfIoServiceRecycle(service); 218094332d3Sopenharmony_ci return INPUT_FAILURE; 219094332d3Sopenharmony_ci } 220094332d3Sopenharmony_ci 221094332d3Sopenharmony_ci HDF_LOGI("%s: open dev%u succ, service name = %s", __func__, devIndex, serviceName); 222094332d3Sopenharmony_ci return INPUT_SUCCESS; 223094332d3Sopenharmony_ci} 224094332d3Sopenharmony_ci 225094332d3Sopenharmony_cistatic int32_t ScanInputDevice(InputDevDesc *staArr, uint32_t arrLen) 226094332d3Sopenharmony_ci{ 227094332d3Sopenharmony_ci InputDevManager *manager = NULL; 228094332d3Sopenharmony_ci struct HdfIoService *service = NULL; 229094332d3Sopenharmony_ci struct HdfSBuf *reply = NULL; 230094332d3Sopenharmony_ci char *data = {0}; 231094332d3Sopenharmony_ci uint32_t count = 0; 232094332d3Sopenharmony_ci uint32_t replayDataSize = 0; 233094332d3Sopenharmony_ci int32_t ret; 234094332d3Sopenharmony_ci 235094332d3Sopenharmony_ci GET_MANAGER_CHECK_RETURN(manager); 236094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 237094332d3Sopenharmony_ci if (manager->hostDev.service == NULL) { 238094332d3Sopenharmony_ci manager->hostDev.service = HdfIoServiceBind(DEV_MANAGER_SERVICE_NAME); 239094332d3Sopenharmony_ci } 240094332d3Sopenharmony_ci service = manager->hostDev.service; 241094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 242094332d3Sopenharmony_ci 243094332d3Sopenharmony_ci if (service == NULL) { 244094332d3Sopenharmony_ci HDF_LOGE("%s: HdfIoServiceBind failed", __func__); 245094332d3Sopenharmony_ci return INPUT_FAILURE; 246094332d3Sopenharmony_ci } 247094332d3Sopenharmony_ci reply = HdfSbufObtainDefaultSize(); 248094332d3Sopenharmony_ci if (reply == NULL) { 249094332d3Sopenharmony_ci HDF_LOGE("%s: fail to obtain sbuf data", __func__); 250094332d3Sopenharmony_ci return INPUT_FAILURE; 251094332d3Sopenharmony_ci } 252094332d3Sopenharmony_ci 253094332d3Sopenharmony_ci ret = service->dispatcher->Dispatch(&service->object, 0, NULL, reply); 254094332d3Sopenharmony_ci if (ret != INPUT_SUCCESS) { 255094332d3Sopenharmony_ci HDF_LOGE("%s: dispatch fail", __func__); 256094332d3Sopenharmony_ci HdfSbufRecycle(reply); 257094332d3Sopenharmony_ci return INPUT_FAILURE; 258094332d3Sopenharmony_ci } 259094332d3Sopenharmony_ci 260094332d3Sopenharmony_ci while (count < arrLen) { 261094332d3Sopenharmony_ci if (!HdfSbufReadBuffer(reply, (const void **)(&data), &replayDataSize) || 262094332d3Sopenharmony_ci replayDataSize != sizeof(InputDevDesc)) { 263094332d3Sopenharmony_ci HDF_LOGE("%s: sbuf read failed", __func__); 264094332d3Sopenharmony_ci break; 265094332d3Sopenharmony_ci } 266094332d3Sopenharmony_ci if (memcpy_s(&staArr[count], sizeof(InputDevDesc), data, replayDataSize) != EOK) { 267094332d3Sopenharmony_ci HDF_LOGE("%s: memcpy failed, line: %d", __func__, __LINE__); 268094332d3Sopenharmony_ci HdfSbufRecycle(reply); 269094332d3Sopenharmony_ci return INPUT_FAILURE; 270094332d3Sopenharmony_ci } 271094332d3Sopenharmony_ci HDF_LOGI("%s: type = %d, id =%d", __func__, staArr[count].devType, staArr[count].devIndex); 272094332d3Sopenharmony_ci count++; 273094332d3Sopenharmony_ci } 274094332d3Sopenharmony_ci HdfSbufRecycle(reply); 275094332d3Sopenharmony_ci return INPUT_SUCCESS; 276094332d3Sopenharmony_ci} 277094332d3Sopenharmony_ci 278094332d3Sopenharmony_cistatic int32_t InstanceManagerHdi(InputManager **manager) 279094332d3Sopenharmony_ci{ 280094332d3Sopenharmony_ci InputManager *managerHdi = (InputManager *)malloc(sizeof(InputManager)); 281094332d3Sopenharmony_ci if (managerHdi == NULL) { 282094332d3Sopenharmony_ci HDF_LOGE("%s: malloc fail", __func__); 283094332d3Sopenharmony_ci return INPUT_NOMEM; 284094332d3Sopenharmony_ci } 285094332d3Sopenharmony_ci 286094332d3Sopenharmony_ci (void)memset_s(managerHdi, sizeof(InputManager), 0, sizeof(InputManager)); 287094332d3Sopenharmony_ci 288094332d3Sopenharmony_ci managerHdi->ScanInputDevice = ScanInputDevice; 289094332d3Sopenharmony_ci managerHdi->OpenInputDevice = OpenInputDevice; 290094332d3Sopenharmony_ci managerHdi->CloseInputDevice = CloseInputDevice; 291094332d3Sopenharmony_ci managerHdi->GetInputDevice = GetInputDevice; 292094332d3Sopenharmony_ci managerHdi->GetInputDeviceList = GetInputDeviceList; 293094332d3Sopenharmony_ci *manager = managerHdi; 294094332d3Sopenharmony_ci return INPUT_SUCCESS; 295094332d3Sopenharmony_ci} 296094332d3Sopenharmony_ci 297094332d3Sopenharmony_cistatic int32_t InitDevManager(void) 298094332d3Sopenharmony_ci{ 299094332d3Sopenharmony_ci InputDevManager *manager = (InputDevManager *)malloc(sizeof(InputDevManager)); 300094332d3Sopenharmony_ci if (manager == NULL) { 301094332d3Sopenharmony_ci HDF_LOGE("%s: malloc fail", __func__); 302094332d3Sopenharmony_ci return INPUT_NOMEM; 303094332d3Sopenharmony_ci } 304094332d3Sopenharmony_ci 305094332d3Sopenharmony_ci (void)memset_s(manager, sizeof(InputDevManager), 0, sizeof(InputDevManager)); 306094332d3Sopenharmony_ci DListHeadInit(&manager->devList); 307094332d3Sopenharmony_ci pthread_mutex_init(&manager->mutex, NULL); 308094332d3Sopenharmony_ci manager->attachedDevNum = 0; 309094332d3Sopenharmony_ci manager->evtCallbackNum = 0; 310094332d3Sopenharmony_ci g_devManager = manager; 311094332d3Sopenharmony_ci return INPUT_SUCCESS; 312094332d3Sopenharmony_ci} 313094332d3Sopenharmony_ci 314094332d3Sopenharmony_cistatic void FreeInputHdi(IInputInterface **hdi) 315094332d3Sopenharmony_ci{ 316094332d3Sopenharmony_ci if (hdi == NULL || *hdi == NULL) { 317094332d3Sopenharmony_ci return; 318094332d3Sopenharmony_ci } 319094332d3Sopenharmony_ci if ((*hdi)->iInputManager != NULL) { 320094332d3Sopenharmony_ci free((*hdi)->iInputManager); 321094332d3Sopenharmony_ci (*hdi)->iInputManager = NULL; 322094332d3Sopenharmony_ci } 323094332d3Sopenharmony_ci 324094332d3Sopenharmony_ci if ((*hdi)->iInputController != NULL) { 325094332d3Sopenharmony_ci free((*hdi)->iInputController); 326094332d3Sopenharmony_ci (*hdi)->iInputController = NULL; 327094332d3Sopenharmony_ci } 328094332d3Sopenharmony_ci 329094332d3Sopenharmony_ci if ((*hdi)->iInputReporter != NULL) { 330094332d3Sopenharmony_ci free((*hdi)->iInputReporter); 331094332d3Sopenharmony_ci (*hdi)->iInputReporter = NULL; 332094332d3Sopenharmony_ci } 333094332d3Sopenharmony_ci free((*hdi)); 334094332d3Sopenharmony_ci *hdi = NULL; 335094332d3Sopenharmony_ci} 336094332d3Sopenharmony_ci 337094332d3Sopenharmony_cistatic IInputInterface *InstanceInputHdi(void) 338094332d3Sopenharmony_ci{ 339094332d3Sopenharmony_ci int32_t ret; 340094332d3Sopenharmony_ci IInputInterface *hdi = (IInputInterface *)malloc(sizeof(IInputInterface)); 341094332d3Sopenharmony_ci if (hdi == NULL) { 342094332d3Sopenharmony_ci HDF_LOGE("%s: malloc fail", __func__); 343094332d3Sopenharmony_ci return NULL; 344094332d3Sopenharmony_ci } 345094332d3Sopenharmony_ci (void)memset_s(hdi, sizeof(IInputInterface), 0, sizeof(IInputInterface)); 346094332d3Sopenharmony_ci 347094332d3Sopenharmony_ci ret = InstanceManagerHdi(&hdi->iInputManager); 348094332d3Sopenharmony_ci if (ret != INPUT_SUCCESS) { 349094332d3Sopenharmony_ci FreeInputHdi(&hdi); 350094332d3Sopenharmony_ci return NULL; 351094332d3Sopenharmony_ci } 352094332d3Sopenharmony_ci 353094332d3Sopenharmony_ci ret = InstanceControllerHdi(&hdi->iInputController); 354094332d3Sopenharmony_ci if (ret != INPUT_SUCCESS) { 355094332d3Sopenharmony_ci FreeInputHdi(&hdi); 356094332d3Sopenharmony_ci return NULL; 357094332d3Sopenharmony_ci } 358094332d3Sopenharmony_ci 359094332d3Sopenharmony_ci ret = InstanceReporterHdi(&hdi->iInputReporter); 360094332d3Sopenharmony_ci if (ret != INPUT_SUCCESS) { 361094332d3Sopenharmony_ci FreeInputHdi(&hdi); 362094332d3Sopenharmony_ci return NULL; 363094332d3Sopenharmony_ci } 364094332d3Sopenharmony_ci return hdi; 365094332d3Sopenharmony_ci} 366094332d3Sopenharmony_ci 367094332d3Sopenharmony_ciint32_t GetInputInterface(IInputInterface **inputInterface) 368094332d3Sopenharmony_ci{ 369094332d3Sopenharmony_ci int32_t ret; 370094332d3Sopenharmony_ci IInputInterface *inputHdi = NULL; 371094332d3Sopenharmony_ci 372094332d3Sopenharmony_ci if (inputInterface == NULL) { 373094332d3Sopenharmony_ci HDF_LOGE("%s: parameter is null", __func__); 374094332d3Sopenharmony_ci return INPUT_INVALID_PARAM; 375094332d3Sopenharmony_ci } 376094332d3Sopenharmony_ci 377094332d3Sopenharmony_ci inputHdi = InstanceInputHdi(); 378094332d3Sopenharmony_ci if (inputHdi == NULL) { 379094332d3Sopenharmony_ci HDF_LOGE("%s: failed to instance hdi", __func__); 380094332d3Sopenharmony_ci return INPUT_NULL_PTR; 381094332d3Sopenharmony_ci } 382094332d3Sopenharmony_ci 383094332d3Sopenharmony_ci ret = InitDevManager(); 384094332d3Sopenharmony_ci if (ret != INPUT_SUCCESS) { 385094332d3Sopenharmony_ci HDF_LOGE("%s: failed to initialize manager", __func__); 386094332d3Sopenharmony_ci FreeInputHdi(&inputHdi); 387094332d3Sopenharmony_ci return INPUT_FAILURE; 388094332d3Sopenharmony_ci } 389094332d3Sopenharmony_ci 390094332d3Sopenharmony_ci *inputInterface = inputHdi; 391094332d3Sopenharmony_ci HDF_LOGI("%s: exit succ", __func__); 392094332d3Sopenharmony_ci return INPUT_SUCCESS; 393094332d3Sopenharmony_ci} 394094332d3Sopenharmony_ci 395094332d3Sopenharmony_cistatic void FreeDevManager(InputDevManager *manager) 396094332d3Sopenharmony_ci{ 397094332d3Sopenharmony_ci (void)HdfDeviceUnregisterEventListener(manager->hostDev.service, manager->hostDev.listener); 398094332d3Sopenharmony_ci if (manager->hostDev.listener != NULL) { 399094332d3Sopenharmony_ci free(manager->hostDev.listener); 400094332d3Sopenharmony_ci manager->hostDev.listener = NULL; 401094332d3Sopenharmony_ci manager->hostDev.hostCb = NULL; 402094332d3Sopenharmony_ci } 403094332d3Sopenharmony_ci (void)HdfIoServiceRecycle(manager->hostDev.service); 404094332d3Sopenharmony_ci pthread_mutex_unlock(&manager->mutex); 405094332d3Sopenharmony_ci pthread_mutex_destroy(&manager->mutex); 406094332d3Sopenharmony_ci free(manager); 407094332d3Sopenharmony_ci g_devManager = NULL; 408094332d3Sopenharmony_ci} 409094332d3Sopenharmony_ci 410094332d3Sopenharmony_civoid ReleaseInputInterface(IInputInterface **inputInterface) 411094332d3Sopenharmony_ci{ 412094332d3Sopenharmony_ci DeviceInfoNode *pos = NULL; 413094332d3Sopenharmony_ci DeviceInfoNode *next = NULL; 414094332d3Sopenharmony_ci InputDevManager *manager = NULL; 415094332d3Sopenharmony_ci 416094332d3Sopenharmony_ci if (inputInterface == NULL) { 417094332d3Sopenharmony_ci return; 418094332d3Sopenharmony_ci } 419094332d3Sopenharmony_ci FreeInputHdi(inputInterface); 420094332d3Sopenharmony_ci 421094332d3Sopenharmony_ci if (g_devManager == NULL) { 422094332d3Sopenharmony_ci return; 423094332d3Sopenharmony_ci } 424094332d3Sopenharmony_ci manager = g_devManager; 425094332d3Sopenharmony_ci pthread_mutex_lock(&manager->mutex); 426094332d3Sopenharmony_ci DLIST_FOR_EACH_ENTRY_SAFE(pos, next, &manager->devList, DeviceInfoNode, node) { 427094332d3Sopenharmony_ci (void)HdfDeviceUnregisterEventListener(pos->service, pos->listener); 428094332d3Sopenharmony_ci if (pos->listener != NULL) { 429094332d3Sopenharmony_ci free(pos->listener); 430094332d3Sopenharmony_ci pos->listener = NULL; 431094332d3Sopenharmony_ci pos->eventCb = NULL; 432094332d3Sopenharmony_ci } 433094332d3Sopenharmony_ci (void)HdfIoServiceRecycle(pos->service); 434094332d3Sopenharmony_ci DListRemove(&pos->node); 435094332d3Sopenharmony_ci free(pos); 436094332d3Sopenharmony_ci } 437094332d3Sopenharmony_ci FreeDevManager(manager); 438094332d3Sopenharmony_ci}