• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <algorithm>
17 #include <cerrno>
18 #include <cstdint>
19 #include <cstring>
20 #include <iproxy_broker.h>
21 #include <memory.h>
22 #include <securec.h>
23 #include <unordered_map>
24 #include <vector>
25 
26 #include "hid_ddk_api.h"
27 #include "hid_ddk_types.h"
28 #include "v1_1/ihid_ddk.h"
29 #include "hilog_wrapper.h"
30 #include "ipc_error_code.h"
31 
32 using namespace OHOS;
33 using namespace OHOS::ExternalDeviceManager;
34 namespace {
35 static OHOS::sptr<OHOS::HDI::Input::Ddk::V1_1::IHidDdk> g_ddk = nullptr;
36 static OHOS::sptr<IRemoteObject::DeathRecipient> recipient_ = nullptr;
37 std::mutex g_mutex;
38 
39 constexpr uint32_t MAX_EMIT_ITEM_NUM = 20;
40 constexpr uint32_t MAX_HID_DEVICE_PROP_LEN = 7;
41 constexpr uint32_t MAX_HID_EVENT_TYPES_LEN = 5;
42 constexpr uint32_t MAX_HID_KEYS_LEN = 100;
43 constexpr uint32_t MAX_HID_ABS_LEN = 26;
44 constexpr uint32_t MAX_HID_REL_BITS_LEN = 13;
45 constexpr uint32_t MAX_HID_MISC_EVENT_LEN = 6;
46 constexpr uint32_t MAX_NAME_LENGTH = 80;
47 
48 }
49 #ifdef __cplusplus
50 extern "C" {
51 #endif /* __cplusplus */
52 static std::unordered_map<int32_t, std::shared_ptr<struct TempDevice>> g_deviceMap;
53 
54 struct TempDevice {
55     OHOS::HDI::Input::Ddk::V1_0::Hid_Device tempDevice;
56     OHOS::HDI::Input::Ddk::V1_0::Hid_EventProperties tempProperties;
57     uint32_t realId;
58 };
59 
60 struct Hid_DeviceHandle {
61     OHOS::HDI::Input::Ddk::V1_1::HidDeviceHandle impl;
62 
Hid_DeviceHandleHid_DeviceHandle63     Hid_DeviceHandle()
64     {
65         impl.fd = -1;
66         impl.nonBlock = 0;
67     }
68 } __attribute__ ((aligned(8)));
69 
NewHidDeviceHandle()70 Hid_DeviceHandle *NewHidDeviceHandle()
71 {
72     return new Hid_DeviceHandle;
73 }
74 
DeleteHidDeviceHandle(Hid_DeviceHandle ** dev)75 void DeleteHidDeviceHandle(Hid_DeviceHandle **dev)
76 {
77     if (*dev != nullptr) {
78         delete *dev;
79         *dev = nullptr;
80     }
81 }
82 
TransToHidCode(int32_t ret)83 static int32_t TransToHidCode(int32_t ret)
84 {
85     if (ret >= OH_IPC_ERROR_CODE_BASE && ret <= OH_IPC_ERROR_CODE_MAX) {
86         return HID_DDK_SERVICE_ERROR;
87     }
88     return ret;
89 }
90 
91 class HidDeathRecipient : public IRemoteObject::DeathRecipient {
92 public:
93         void OnRemoteDied(const wptr<IRemoteObject> &object) override;
94 };
95 
OnRemoteDied(const wptr<IRemoteObject> & object)96 void HidDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &object)
97 {
98     std::lock_guard<std::mutex> lock(g_mutex);
99     EDM_LOGI(MODULE_HID_DDK, "hid_ddk remote died");
100     if (g_ddk != nullptr) {
101         sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<OHOS::HDI::Input::Ddk::V1_0::IHidDdk>(g_ddk);
102         remote->RemoveDeathRecipient(recipient_);
103         recipient_.clear();
104         g_ddk = nullptr;
105         EDM_LOGI(MODULE_HID_DDK, "remove death recipient success");
106     }
107 }
108 
GetRealDeviceId(int32_t deviceId)109 static uint32_t GetRealDeviceId(int32_t deviceId)
110 {
111     if (g_deviceMap.find(deviceId) != g_deviceMap.end()) {
112         if (g_deviceMap[deviceId] != nullptr) {
113             return g_deviceMap[deviceId]->realId;
114         }
115     }
116     return static_cast<uint32_t>(deviceId);
117 }
118 
Connect()119 static int32_t Connect()
120 {
121     if (g_ddk == nullptr) {
122         g_ddk = OHOS::HDI::Input::Ddk::V1_1::IHidDdk::Get();
123         if (g_ddk == nullptr) {
124             EDM_LOGE(MODULE_HID_DDK, "get hid ddk faild");
125             return HID_DDK_FAILURE;
126         }
127         if (g_deviceMap.size() > 0) {
128             for (const auto &[_, value] : g_deviceMap) {
129                 (void)g_ddk->CreateDevice(value->tempDevice, value->tempProperties, value->realId);
130             }
131         }
132         recipient_ = new HidDeathRecipient();
133         sptr<IRemoteObject> remote = OHOS::HDI::hdi_objcast<OHOS::HDI::Input::Ddk::V1_1::IHidDdk>(g_ddk);
134         if (!remote->AddDeathRecipient(recipient_)) {
135             EDM_LOGE(MODULE_HID_DDK, "add DeathRecipient failed");
136             return HID_DDK_FAILURE;
137         }
138     }
139     return HID_DDK_SUCCESS;
140 }
141 
ParseHidDevice(Hid_Device * hidDevice)142 static OHOS::HDI::Input::Ddk::V1_0::Hid_Device ParseHidDevice(Hid_Device *hidDevice)
143 {
144     OHOS::HDI::Input::Ddk::V1_0::Hid_Device tempDevice = {
145         .deviceName = hidDevice->deviceName,
146         .vendorId = hidDevice->vendorId,
147         .productId = hidDevice->productId,
148         .version = hidDevice->version,
149         .bustype = hidDevice->bustype
150     };
151 
152     if (hidDevice->properties != nullptr) {
153         std::transform(hidDevice->properties, hidDevice->properties + hidDevice->propLength,
154             std::back_inserter(tempDevice.properties), [](uint32_t n) {
155                 return static_cast<OHOS::HDI::Input::Ddk::V1_0::Hid_DeviceProp>(n);
156             });
157     }
158 
159     return tempDevice;
160 }
161 
ParseHidEventProperties(Hid_EventProperties * hidEventProperties)162 static OHOS::HDI::Input::Ddk::V1_0::Hid_EventProperties ParseHidEventProperties(Hid_EventProperties *hidEventProperties)
163 {
164     const uint16_t absLength = 64;
165     OHOS::HDI::Input::Ddk::V1_0::Hid_EventProperties tempProperties = {
166         .hidAbsMax = std::vector<int32_t>(hidEventProperties->hidAbsMax, hidEventProperties->hidAbsMax + absLength),
167         .hidAbsMin = std::vector<int32_t>(hidEventProperties->hidAbsMin, hidEventProperties->hidAbsMin + absLength),
168         .hidAbsFuzz = std::vector<int32_t>(hidEventProperties->hidAbsFuzz, hidEventProperties->hidAbsFuzz + absLength),
169         .hidAbsFlat = std::vector<int32_t>(hidEventProperties->hidAbsFlat, hidEventProperties->hidAbsFlat + absLength)
170     };
171 
172     if (hidEventProperties->hidEventTypes.hidEventType != nullptr) {
173         std::transform(hidEventProperties->hidEventTypes.hidEventType,
174             hidEventProperties->hidEventTypes.hidEventType + hidEventProperties->hidEventTypes.length,
175             std::back_inserter(tempProperties.hidEventTypes), [](uint32_t n) {
176                 return static_cast<OHOS::HDI::Input::Ddk::V1_0::Hid_EventType>(n);
177             });
178     }
179 
180     if (hidEventProperties->hidKeys.hidKeyCode != nullptr) {
181         std::transform(hidEventProperties->hidKeys.hidKeyCode,
182             hidEventProperties->hidKeys.hidKeyCode + hidEventProperties->hidKeys.length,
183             std::back_inserter(tempProperties.hidKeys), [](uint32_t n) {
184                 return static_cast<OHOS::HDI::Input::Ddk::V1_0::Hid_KeyCode>(n);
185             });
186     }
187 
188     if (hidEventProperties->hidAbs.hidAbsAxes != nullptr) {
189         std::transform(hidEventProperties->hidAbs.hidAbsAxes,
190             hidEventProperties->hidAbs.hidAbsAxes + hidEventProperties->hidAbs.length,
191             std::back_inserter(tempProperties.hidAbs), [](uint32_t n) {
192                 return static_cast<OHOS::HDI::Input::Ddk::V1_0::Hid_AbsAxes>(n);
193             });
194     }
195 
196     if (hidEventProperties->hidRelBits.hidRelAxes != nullptr) {
197         std::transform(hidEventProperties->hidRelBits.hidRelAxes,
198             hidEventProperties->hidRelBits.hidRelAxes + hidEventProperties->hidRelBits.length,
199             std::back_inserter(tempProperties.hidRelBits), [](uint32_t n) {
200                 return static_cast<OHOS::HDI::Input::Ddk::V1_0::Hid_RelAxes>(n);
201             });
202     }
203 
204     if (hidEventProperties->hidMiscellaneous.hidMscEvent != nullptr) {
205         std::transform(hidEventProperties->hidMiscellaneous.hidMscEvent,
206             hidEventProperties->hidMiscellaneous.hidMscEvent + hidEventProperties->hidMiscellaneous.length,
207             std::back_inserter(tempProperties.hidMiscellaneous), [](uint32_t n) {
208                 return static_cast<OHOS::HDI::Input::Ddk::V1_0::Hid_MscEvent>(n);
209             });
210     }
211 
212     return tempProperties;
213 }
214 
CacheDeviceInfor(OHOS::HDI::Input::Ddk::V1_0::Hid_Device tempDevice,OHOS::HDI::Input::Ddk::V1_0::Hid_EventProperties tempProperties,uint32_t deviceId)215 static int32_t CacheDeviceInfor(OHOS::HDI::Input::Ddk::V1_0::Hid_Device tempDevice,
216     OHOS::HDI::Input::Ddk::V1_0::Hid_EventProperties tempProperties, uint32_t deviceId)
217 {
218     EDM_LOGD(MODULE_HID_DDK, "enter CacheDeviceInfor");
219     int32_t id = static_cast<int32_t>(deviceId);
220     std::shared_ptr<struct TempDevice> device = std::make_shared<struct TempDevice>();
221     device->tempDevice = tempDevice;
222     device->tempProperties = tempProperties;
223     device->realId = deviceId;
224 
225     g_deviceMap[id] = device;
226     return id;
227 }
228 
CheckHidDevice(Hid_Device * hidDevice)229 static bool CheckHidDevice(Hid_Device *hidDevice)
230 {
231     if (hidDevice == nullptr) {
232         EDM_LOGE(MODULE_HID_DDK, "hidDevice is null");
233         return false;
234     }
235 
236     if (hidDevice->propLength > MAX_HID_DEVICE_PROP_LEN) {
237         EDM_LOGE(MODULE_HID_DDK, "properties length is out of range");
238         return false;
239     }
240 
241     if (hidDevice->deviceName == nullptr) {
242         EDM_LOGE(MODULE_HID_DDK, "hidDevice->deviceName is nullpointer");
243         return false;
244     }
245 
246     if (strlen(hidDevice->deviceName) == 0 || strlen(hidDevice->deviceName) > MAX_NAME_LENGTH - 1) {
247         EDM_LOGE(MODULE_HID_DDK, "length of hidDevice->deviceName is out of range");
248         return false;
249     }
250     return true;
251 }
252 
OH_Hid_CreateDevice(Hid_Device * hidDevice,Hid_EventProperties * hidEventProperties)253 int32_t OH_Hid_CreateDevice(Hid_Device *hidDevice, Hid_EventProperties *hidEventProperties)
254 {
255     std::lock_guard<std::mutex> lock(g_mutex);
256     if (Connect() != HID_DDK_SUCCESS) {
257         return HID_DDK_INVALID_OPERATION;
258     }
259 
260     if (!CheckHidDevice(hidDevice)) {
261         return HID_DDK_INVALID_PARAMETER;
262     }
263 
264     if (hidEventProperties == nullptr) {
265         EDM_LOGE(MODULE_HID_DDK, "hidEventProperties is null");
266         return HID_DDK_INVALID_PARAMETER;
267     }
268 
269     if (hidEventProperties->hidEventTypes.length > MAX_HID_EVENT_TYPES_LEN) {
270         EDM_LOGE(MODULE_HID_DDK, "hidEventTypes length is out of range");
271         return HID_DDK_INVALID_PARAMETER;
272     }
273 
274     if (hidEventProperties->hidKeys.length > MAX_HID_KEYS_LEN) {
275         EDM_LOGE(MODULE_HID_DDK, "hidKeys length is out of range");
276         return HID_DDK_INVALID_PARAMETER;
277     }
278 
279     if (hidEventProperties->hidAbs.length > MAX_HID_ABS_LEN) {
280         EDM_LOGE(MODULE_HID_DDK, "hidAbs length is out of range");
281         return HID_DDK_INVALID_PARAMETER;
282     }
283 
284     if (hidEventProperties->hidRelBits.length > MAX_HID_REL_BITS_LEN) {
285         EDM_LOGE(MODULE_HID_DDK, "hidRelBits length is out of range");
286         return HID_DDK_INVALID_PARAMETER;
287     }
288 
289     if (hidEventProperties->hidMiscellaneous.length > MAX_HID_MISC_EVENT_LEN) {
290         EDM_LOGE(MODULE_HID_DDK, "hidMiscellaneous length is out of range");
291         return HID_DDK_INVALID_PARAMETER;
292     }
293 
294     auto tempDevice = ParseHidDevice(hidDevice);
295     auto tempEventProperties = ParseHidEventProperties(hidEventProperties);
296 
297     uint32_t deviceId = 0;
298     auto ret = g_ddk->CreateDevice(tempDevice, tempEventProperties, deviceId);
299     ret = (ret == HDF_ERR_NOPERM) ? HID_DDK_NO_PERM : ret;
300     if (ret != HID_DDK_SUCCESS) {
301         EDM_LOGE(MODULE_HID_DDK, "create device failed:%{public}d", ret);
302         return ret;
303     }
304     return CacheDeviceInfor(tempDevice, tempEventProperties, deviceId);
305 }
306 
OH_Hid_EmitEvent(int32_t deviceId,const Hid_EmitItem items[],uint16_t length)307 int32_t OH_Hid_EmitEvent(int32_t deviceId, const Hid_EmitItem items[], uint16_t length)
308 {
309     std::lock_guard<std::mutex> lock(g_mutex);
310     if (Connect() != HID_DDK_SUCCESS) {
311         return HID_DDK_INVALID_OPERATION;
312     }
313 
314     if (deviceId < 0) {
315         EDM_LOGE(MODULE_HID_DDK, "device id is invaild");
316         return HID_DDK_INVALID_PARAMETER;
317     }
318 
319     if (length > MAX_EMIT_ITEM_NUM) {
320         EDM_LOGE(MODULE_HID_DDK, "items length is out of range");
321         return HID_DDK_INVALID_PARAMETER;
322     }
323 
324     if (items == nullptr) {
325         EDM_LOGE(MODULE_HID_DDK, "items is null");
326         return HID_DDK_INVALID_PARAMETER;
327     }
328 
329     std::vector<OHOS::HDI::Input::Ddk::V1_0::Hid_EmitItem> itemsTemp;
330     std::transform(items, items + length, std::back_inserter(itemsTemp), [](Hid_EmitItem item) {
331         return *reinterpret_cast<OHOS::HDI::Input::Ddk::V1_0::Hid_EmitItem *>(&item);
332     });
333 
334     auto ret = g_ddk->EmitEvent(GetRealDeviceId(deviceId), itemsTemp);
335     ret = (ret == HDF_ERR_NOPERM) ? HID_DDK_NO_PERM : ret;
336     if (ret != HID_DDK_SUCCESS) {
337         EDM_LOGE(MODULE_HID_DDK, "emit event failed:%{public}d", ret);
338         return ret;
339     }
340     return HID_DDK_SUCCESS;
341 }
342 
OH_Hid_DestroyDevice(int32_t deviceId)343 int32_t OH_Hid_DestroyDevice(int32_t deviceId)
344 {
345     std::lock_guard<std::mutex> lock(g_mutex);
346     if (Connect() != HID_DDK_SUCCESS) {
347         return HID_DDK_INVALID_OPERATION;
348     }
349 
350     auto ret = g_ddk->DestroyDevice(GetRealDeviceId(deviceId));
351     ret = (ret == HDF_ERR_NOPERM) ? HID_DDK_NO_PERM : ret;
352     if (ret != HID_DDK_SUCCESS) {
353         EDM_LOGE(MODULE_HID_DDK, "destroy device failed:%{public}d", ret);
354         return ret;
355     }
356 
357     g_deviceMap.erase(deviceId);
358     return HID_DDK_SUCCESS;
359 }
360 
OH_Hid_Init(void)361 int32_t OH_Hid_Init(void)
362 {
363     g_ddk = OHOS::HDI::Input::Ddk::V1_1::IHidDdk::Get();
364     if (g_ddk == nullptr) {
365         EDM_LOGE(MODULE_HID_DDK, "get ddk failed");
366         return HID_DDK_INIT_ERROR;
367     }
368 
369     return TransToHidCode(g_ddk->Init());
370 }
371 
OH_Hid_Release(void)372 int32_t OH_Hid_Release(void)
373 {
374     if (g_ddk == nullptr) {
375         EDM_LOGE(MODULE_HID_DDK, "ddk is null");
376         return HID_DDK_INIT_ERROR;
377     }
378     int32_t ret = g_ddk->Release();
379     g_ddk.clear();
380 
381     return TransToHidCode(ret);
382 }
383 
OH_Hid_Open(uint64_t deviceId,uint8_t interfaceIndex,Hid_DeviceHandle ** dev)384 int32_t OH_Hid_Open(uint64_t deviceId, uint8_t interfaceIndex, Hid_DeviceHandle **dev)
385 {
386     if (g_ddk == nullptr) {
387         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
388         return HID_DDK_INIT_ERROR;
389     }
390     if (dev == nullptr) {
391         EDM_LOGE(MODULE_HID_DDK, "invalid param");
392         return HID_DDK_INVALID_PARAMETER;
393     }
394 
395     *dev = NewHidDeviceHandle();
396     if (*dev == nullptr) {
397         EDM_LOGE(MODULE_HID_DDK, "malloc failed, errno=%{public}d", errno);
398         return HID_DDK_MEMORY_ERROR;
399     }
400 
401     return TransToHidCode(g_ddk->Open(deviceId, interfaceIndex, (*dev)->impl));
402 }
403 
OH_Hid_Close(Hid_DeviceHandle ** dev)404 int32_t OH_Hid_Close(Hid_DeviceHandle **dev)
405 {
406     if (g_ddk == nullptr) {
407         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
408         return HID_DDK_INIT_ERROR;
409     }
410     if (dev == nullptr || *dev == nullptr) {
411         EDM_LOGE(MODULE_HID_DDK, "invalid param");
412         return HID_DDK_INVALID_PARAMETER;
413     }
414 
415     int32_t ret = g_ddk->Close((*dev)->impl);
416     DeleteHidDeviceHandle(dev);
417 
418     return TransToHidCode(ret);
419 }
420 
OH_Hid_Write(Hid_DeviceHandle * dev,uint8_t * data,uint32_t length,uint32_t * bytesWritten)421 int32_t OH_Hid_Write(Hid_DeviceHandle *dev, uint8_t *data, uint32_t length, uint32_t *bytesWritten)
422 {
423     if (g_ddk == nullptr) {
424         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
425         return HID_DDK_INIT_ERROR;
426     }
427 
428     if (dev == nullptr || data == nullptr || length == 0 || length > HID_MAX_REPORT_BUFFER_SIZE ||
429         bytesWritten == nullptr) {
430         EDM_LOGE(MODULE_HID_DDK, "invalid param");
431         return HID_DDK_INVALID_PARAMETER;
432     }
433 
434     std::vector<uint8_t> writeData(data, data + length);
435     int32_t ret =  TransToHidCode(g_ddk->Write(dev->impl, writeData, *bytesWritten));
436     if (ret != HID_DDK_SUCCESS) {
437         EDM_LOGE(MODULE_HID_DDK, "write failed");
438         *bytesWritten = 0;
439         return ret;
440     }
441     return HID_DDK_SUCCESS;
442 }
443 
OH_Hid_ReadTimeout(Hid_DeviceHandle * dev,uint8_t * data,uint32_t bufSize,int timeout,uint32_t * bytesRead)444 int32_t OH_Hid_ReadTimeout(Hid_DeviceHandle *dev, uint8_t *data, uint32_t bufSize, int timeout, uint32_t *bytesRead)
445 {
446     if (g_ddk == nullptr) {
447         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
448         return HID_DDK_INIT_ERROR;
449     }
450 
451     if (dev == nullptr || data == nullptr || bufSize == 0 || bufSize > HID_MAX_REPORT_BUFFER_SIZE ||
452         bytesRead == nullptr) {
453         EDM_LOGE(MODULE_HID_DDK, "invalid param");
454         return HID_DDK_INVALID_PARAMETER;
455     }
456 
457     std::vector<uint8_t> readData(bufSize);
458     int32_t ret = TransToHidCode(g_ddk->ReadTimeout(dev->impl, readData, bufSize, timeout, *bytesRead));
459     if (ret != HID_DDK_SUCCESS) {
460         EDM_LOGE(MODULE_HID_DDK, "read timeout failed");
461         return ret;
462     }
463     errno_t err = memcpy_s(data, bufSize, readData.data(), *bytesRead);
464     if (err != EOK) {
465         EDM_LOGE(MODULE_HID_DDK, "memcpy_s failed");
466         return HID_DDK_MEMORY_ERROR;
467     }
468 
469     return HID_DDK_SUCCESS;
470 }
471 
OH_Hid_Read(Hid_DeviceHandle * dev,uint8_t * data,uint32_t bufSize,uint32_t * bytesRead)472 int32_t OH_Hid_Read(Hid_DeviceHandle *dev, uint8_t *data, uint32_t bufSize, uint32_t *bytesRead)
473 {
474     if (g_ddk == nullptr) {
475         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
476         return HID_DDK_INIT_ERROR;
477     }
478 
479     if (dev == nullptr || data == nullptr || bufSize == 0 || bufSize > HID_MAX_REPORT_BUFFER_SIZE ||
480         bytesRead == nullptr) {
481         EDM_LOGE(MODULE_HID_DDK, "invalid param");
482         return HID_DDK_INVALID_PARAMETER;
483     }
484 
485     std::vector<uint8_t> readData(bufSize);
486     int32_t ret = TransToHidCode(g_ddk->ReadTimeout(dev->impl, readData, bufSize, (dev->impl.nonBlock) ? 0 : -1,
487         *bytesRead));
488     if (ret != HID_DDK_SUCCESS) {
489         EDM_LOGE(MODULE_HID_DDK, "read failed");
490         return ret;
491     }
492     errno_t err = memcpy_s(data, bufSize, readData.data(), *bytesRead);
493     if (err != EOK) {
494         EDM_LOGE(MODULE_HID_DDK, "memcpy_s failed");
495         return HID_DDK_MEMORY_ERROR;
496     }
497 
498     return HID_DDK_SUCCESS;
499 }
500 
OH_Hid_SetNonBlocking(Hid_DeviceHandle * dev,int nonBlock)501 int32_t OH_Hid_SetNonBlocking(Hid_DeviceHandle *dev, int nonBlock)
502 {
503     if (g_ddk == nullptr) {
504         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
505         return HID_DDK_INIT_ERROR;
506     }
507 
508     if (dev == nullptr || !(nonBlock == 0 || nonBlock == 1)) {
509         EDM_LOGE(MODULE_HID_DDK, "invalid param");
510         return HID_DDK_INVALID_PARAMETER;
511     }
512 
513     int32_t ret = g_ddk->SetNonBlocking(dev->impl, nonBlock);
514     if (ret == HID_DDK_SUCCESS) {
515         dev->impl.nonBlock = nonBlock;
516     }
517     return TransToHidCode(ret);
518 }
519 
OH_Hid_GetRawInfo(Hid_DeviceHandle * dev,Hid_RawDevInfo * rawDevInfo)520 int32_t OH_Hid_GetRawInfo(Hid_DeviceHandle *dev, Hid_RawDevInfo *rawDevInfo)
521 {
522     if (g_ddk == nullptr) {
523         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
524         return HID_DDK_INIT_ERROR;
525     }
526 
527     if (dev == nullptr || rawDevInfo == nullptr) {
528         EDM_LOGE(MODULE_HID_DDK, "invalid param");
529         return HID_DDK_INVALID_PARAMETER;
530     }
531 
532     OHOS::HDI::Input::Ddk::V1_1::HidRawDevInfo tmpRawDevInfo;
533     int32_t ret = TransToHidCode(g_ddk->GetRawInfo(dev->impl, tmpRawDevInfo));
534     if (ret != HID_DDK_SUCCESS) {
535         EDM_LOGE(MODULE_HID_DDK, "get raw info failed");
536         return ret;
537     }
538 
539     rawDevInfo->busType = tmpRawDevInfo.busType;
540     rawDevInfo->vendor = tmpRawDevInfo.vendor;
541     rawDevInfo->product = tmpRawDevInfo.product;
542 
543     return HID_DDK_SUCCESS;
544 }
545 
OH_Hid_GetRawName(Hid_DeviceHandle * dev,char * data,uint32_t bufSize)546 int32_t OH_Hid_GetRawName(Hid_DeviceHandle *dev, char *data, uint32_t bufSize)
547 {
548     if (g_ddk == nullptr) {
549         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
550         return HID_DDK_INIT_ERROR;
551     }
552 
553     if (dev == nullptr || data == nullptr || bufSize == 0 || bufSize > HID_MAX_REPORT_BUFFER_SIZE) {
554         EDM_LOGE(MODULE_HID_DDK, "invalid param");
555         return HID_DDK_INVALID_PARAMETER;
556     }
557 
558     std::vector<uint8_t> tmpData(bufSize);
559     int32_t ret = TransToHidCode(g_ddk->GetRawName(dev->impl, tmpData, bufSize));
560     if (ret != HID_DDK_SUCCESS) {
561         EDM_LOGE(MODULE_HID_DDK, "get raw name failed");
562         return ret;
563     }
564 
565     errno_t err = memcpy_s(data, bufSize, tmpData.data(), tmpData.size());
566     if (err != EOK) {
567         EDM_LOGE(MODULE_HID_DDK, "memcpy_s failed");
568         return HID_DDK_MEMORY_ERROR;
569     }
570 
571     return HID_DDK_SUCCESS;
572 }
573 
OH_Hid_GetPhysicalAddress(Hid_DeviceHandle * dev,char * data,uint32_t bufSize)574 int32_t OH_Hid_GetPhysicalAddress(Hid_DeviceHandle *dev, char *data, uint32_t bufSize)
575 {
576     if (g_ddk == nullptr) {
577         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
578         return HID_DDK_INIT_ERROR;
579     }
580 
581     if (dev == nullptr || data == nullptr || bufSize == 0 || bufSize > HID_MAX_REPORT_BUFFER_SIZE) {
582         EDM_LOGE(MODULE_HID_DDK, "invalid param");
583         return HID_DDK_INVALID_PARAMETER;
584     }
585 
586     std::vector<uint8_t> tmpData(bufSize);
587     int32_t ret = TransToHidCode(g_ddk->GetPhysicalAddress(dev->impl, tmpData, bufSize));
588     if (ret != HID_DDK_SUCCESS) {
589         EDM_LOGE(MODULE_HID_DDK, "get physical address failed");
590         return ret;
591     }
592 
593     errno_t err = memcpy_s(data, bufSize, tmpData.data(), tmpData.size());
594     if (err != EOK) {
595         EDM_LOGE(MODULE_HID_DDK, "memcpy_s failed");
596         return HID_DDK_MEMORY_ERROR;
597     }
598 
599     return HID_DDK_SUCCESS;
600 }
601 
OH_Hid_GetRawUniqueId(Hid_DeviceHandle * dev,uint8_t * data,uint32_t bufSize)602 int32_t OH_Hid_GetRawUniqueId(Hid_DeviceHandle *dev, uint8_t *data, uint32_t bufSize)
603 {
604     if (g_ddk == nullptr) {
605         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
606         return HID_DDK_INIT_ERROR;
607     }
608 
609     if (dev == nullptr || data == nullptr || bufSize == 0 || bufSize > HID_MAX_REPORT_BUFFER_SIZE) {
610         EDM_LOGE(MODULE_HID_DDK, "invalid param");
611         return HID_DDK_INVALID_PARAMETER;
612     }
613 
614     std::vector<uint8_t> tmpData(bufSize);
615     int32_t ret = TransToHidCode(g_ddk->GetRawUniqueId(dev->impl, tmpData, bufSize));
616     if (ret != HID_DDK_SUCCESS) {
617         EDM_LOGE(MODULE_HID_DDK, "get raw unique id address failed");
618         return ret;
619     }
620 
621     errno_t err = memcpy_s(data, tmpData.size(), tmpData.data(), tmpData.size());
622     if (err != EOK) {
623         EDM_LOGE(MODULE_HID_DDK, "memcpy_s failed");
624         return HID_DDK_MEMORY_ERROR;
625     }
626 
627     return HID_DDK_SUCCESS;
628 }
629 
OH_Hid_SendReport(Hid_DeviceHandle * dev,Hid_ReportType reportType,const uint8_t * data,uint32_t length)630 int32_t OH_Hid_SendReport(Hid_DeviceHandle *dev, Hid_ReportType reportType, const uint8_t *data, uint32_t length)
631 {
632     if (g_ddk == nullptr) {
633         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
634         return HID_DDK_INIT_ERROR;
635     }
636 
637     if (dev == nullptr || data == nullptr || length == 0 || length > HID_MAX_REPORT_BUFFER_SIZE) {
638         EDM_LOGE(MODULE_HID_DDK, "invalid param");
639         return HID_DDK_INVALID_PARAMETER;
640     }
641 
642     const std::vector<uint8_t> tmpData(data, data + length);
643     auto tmpReportType = static_cast<OHOS::HDI::Input::Ddk::V1_1::HidReportType>(reportType);
644     int32_t ret = TransToHidCode(g_ddk->SendReport(dev->impl, tmpReportType, tmpData));
645     if (ret != HID_DDK_SUCCESS) {
646         EDM_LOGE(MODULE_HID_DDK, "send report failed");
647         return ret;
648     }
649 
650     return HID_DDK_SUCCESS;
651 }
652 
OH_Hid_GetReport(Hid_DeviceHandle * dev,Hid_ReportType reportType,uint8_t * data,uint32_t bufSize)653 int32_t OH_Hid_GetReport(Hid_DeviceHandle *dev, Hid_ReportType reportType, uint8_t *data, uint32_t bufSize)
654 {
655     if (g_ddk == nullptr) {
656         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
657         return HID_DDK_INIT_ERROR;
658     }
659 
660     if (dev == nullptr || data == nullptr || bufSize == 0 || bufSize > HID_MAX_REPORT_BUFFER_SIZE) {
661         EDM_LOGE(MODULE_HID_DDK, "invalid param");
662         return HID_DDK_INVALID_PARAMETER;
663     }
664 
665     std::vector<uint8_t> tmpData(bufSize);
666     auto reportNumber = data[0];
667     auto tmpReportType = static_cast<OHOS::HDI::Input::Ddk::V1_1::HidReportType>(reportType);
668     int32_t ret = TransToHidCode(g_ddk->GetReport(dev->impl, tmpReportType, reportNumber, tmpData, bufSize));
669     if (ret != HID_DDK_SUCCESS) {
670         EDM_LOGE(MODULE_HID_DDK, "get report failed");
671         return ret;
672     }
673 
674     errno_t err = memcpy_s(data, bufSize, tmpData.data(), tmpData.size());
675     if (err != EOK) {
676         EDM_LOGE(MODULE_HID_DDK, "memcpy_s failed");
677         return HID_DDK_MEMORY_ERROR;
678     }
679 
680     return HID_DDK_SUCCESS;
681 }
682 
OH_Hid_GetReportDescriptor(Hid_DeviceHandle * dev,uint8_t * buf,uint32_t bufSize,uint32_t * bytesRead)683 int32_t OH_Hid_GetReportDescriptor(Hid_DeviceHandle *dev, uint8_t *buf, uint32_t bufSize, uint32_t *bytesRead)
684 {
685     if (g_ddk == nullptr) {
686         EDM_LOGE(MODULE_HID_DDK, "invalid obj");
687         return HID_DDK_INIT_ERROR;
688     }
689 
690     if (dev == nullptr || buf == nullptr || bufSize == 0 || bufSize > HID_MAX_REPORT_BUFFER_SIZE ||
691         bytesRead == nullptr) {
692         EDM_LOGE(MODULE_HID_DDK, "invalid param");
693         return HID_DDK_INVALID_PARAMETER;
694     }
695 
696     std::vector<uint8_t> tmpBuf(bufSize);
697     int32_t ret = TransToHidCode(g_ddk->GetReportDescriptor(dev->impl, tmpBuf, bufSize, *bytesRead));
698     if (ret != HID_DDK_SUCCESS) {
699         EDM_LOGE(MODULE_HID_DDK, "get report descriptor failed");
700         return ret;
701     }
702 
703     errno_t err = memcpy_s(buf, bufSize, tmpBuf.data(), *bytesRead);
704     if (err != EOK) {
705         EDM_LOGE(MODULE_HID_DDK, "memcpy_s failed");
706         return HID_DDK_MEMORY_ERROR;
707     }
708 
709     return HID_DDK_SUCCESS;
710 }
711 
712 #ifdef __cplusplus
713 }
714 #endif /* __cplusplus */
715