1 /*
2 * Copyright (C) 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 "ohos.usbManager.impl.hpp"
17 #include "ashmem.h"
18 #include "event_handler.h"
19 #include "hilog_wrapper.h"
20 #include "ohos.usbManager.proj.hpp"
21 #include "stdexcept"
22 #include "taihe/runtime.hpp"
23 #include "usb_errors.h"
24 #include "usb_srv_client.h"
25 #include "v1_2/usb_types.h"
26 #include "ohos.usbManager.SubmitTransferCallback.ani.2.h"
27
28 using namespace taihe;
29 using namespace ohos::usbManager;
30 using OHOS::Ashmem;
31 using OHOS::sptr;
32 using OHOS::USB::MODULE_JS_NAPI;
33 using OHOS::USB::USB_MGR_LABEL;
34
35 static int32_t g_accFd = 0;
36 const int32_t IO_ERROR = -1;
37 const int32_t INVALID_PARAM = -2;
38 const int32_t NO_DEVICE = -4;
39 const int32_t NOT_FOUND = -5;
40 const int32_t ERROR_BUSY = -6;
41 const int32_t NO_MEM = -11;
42
43 const int32_t ERROR = -1;
44 const int32_t HDF_DEV_ERR_NO_DEVICE = -202;
45 const int32_t USB_DEVICE_PIPE_CHECK_ERROR = 14400013;
46
47 static OHOS::USB::UsbSrvClient &g_usbClient = OHOS::USB::UsbSrvClient::GetInstance();
48
49 enum UsbManagerFeature {
50 FEATURE_HOST = 0,
51 FEATURE_DEVICE = 1,
52 FEATURE_PORT = 2,
53 };
54
HasFeature(UsbManagerFeature feature)55 static bool HasFeature(UsbManagerFeature feature)
56 {
57 switch (feature) {
58 case FEATURE_HOST:
59 #ifndef USB_MANAGER_FEATURE_HOST
60 return false;
61 #else
62 return true;
63 #endif // USB_MANAGER_FEATURE_HOST
64 case FEATURE_DEVICE:
65 #ifndef USB_MANAGER_FEATURE_DEVICE
66 return false;
67 #else
68 return true;
69 #endif // USB_MANAGER_FEATURE_DEVICE
70 case FEATURE_PORT:
71 #ifndef USB_MANAGER_FEATURE_PORT
72 return false;
73 #else
74 return true;
75 #endif // USB_MANAGER_FEATURE_PORT
76 default:;
77 }
78 return false;
79 }
80
81 enum UsbJsErrCode : int32_t {
82 OHEC_COMMON_PERMISSION_NOT_ALLOWED = 201,
83 OHEC_COMMON_NORMAL_APP_NOT_ALLOWED = 202,
84 OHEC_COMMON_PARAM_ERROR = 401,
85 CAPABILITY_NOT_SUPPORT = 801,
86
87 UEC_COMMON_BASE = 14400000,
88 UEC_COMMON_HAS_NO_RIGHT = UEC_COMMON_BASE + 1,
89 UEC_COMMON_HDC_NOT_ALLOWED = UEC_COMMON_BASE + 2,
90 UEC_COMMON_PORTROLE_SWITCH_NOT_ALLOWED = UEC_COMMON_BASE + 3,
91 UEC_COMMON_SERVICE_EXCEPTION = UEC_COMMON_BASE + 4,
92 UEC_COMMON_RIGHT_DATABASE_ERROR = UEC_COMMON_BASE + 5,
93 UEC_COMMON_FUNCTION_NOT_SUPPORT = UEC_COMMON_BASE + 6,
94
95 UEC_ACCESSORY_BASE = UEC_COMMON_BASE + 1000,
96 UEC_ACCESSORY_NOT_MATCH = UEC_ACCESSORY_BASE + 1,
97 UEC_ACCESSORY_OPEN_FAILED = UEC_ACCESSORY_BASE + 2,
98 UEC_ACCESSORY_CAN_NOT_REOPEN = UEC_ACCESSORY_BASE + 3,
99
100 USB_SUBMIT_TRANSFER_RESOURCE_BUSY_ERROR = 14400007,
101 USB_SUBMIT_TRANSFER_NO_DEVICE_ERROR = 14400008,
102 USB_SUBMIT_TRANSFER_NO_MEM_ERROR = 14400009,
103 USB_SUBMIT_TRANSFER_OTHER_ERROR = 14400010,
104 USB_SUBMIT_TRANSFER_NOT_FOUND_ERROR = 14400011,
105 USB_SUBMIT_TRANSFER_IO_ERROR = 14400012,
106 };
107
108 const std::map<int32_t, std::string_view> ERRCODE_MSG_MAP = {
109 {OHEC_COMMON_PERMISSION_NOT_ALLOWED,
110 "BusinessError 201:Permission verification failed. "
111 "The application does not have the permission required to call the API."},
112 {OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "BusinessError 202:Permission denied. Normal application uses system api."},
113 {OHEC_COMMON_PARAM_ERROR, "BusinessError 401:Parameter error."},
114 {CAPABILITY_NOT_SUPPORT, "BusinessError 801:Capability not supported."},
115 {UEC_COMMON_HAS_NO_RIGHT, "BusinessError 14400001:Permission denied."},
116 {UEC_COMMON_HDC_NOT_ALLOWED, "BusinessError 14400002:Permission denied. The HDC is disabled by the system."},
117 {UEC_COMMON_PORTROLE_SWITCH_NOT_ALLOWED,
118 "BusinessError 14400003:Unsupported operation.The current device does not support port role switching."},
119 {UEC_COMMON_SERVICE_EXCEPTION,
120 "BusinessError 14400004:Service exception. Possible causes:No accessory is plugged in."},
121 {UEC_COMMON_RIGHT_DATABASE_ERROR, "BusinessError 14400005:Database operation exception."},
122 {UEC_COMMON_FUNCTION_NOT_SUPPORT, "BusinessError 14400006:Unsupported operation. The function is not supported."},
123 {UEC_ACCESSORY_NOT_MATCH, "BusinessError 14401001:The target USBAccessory not matched."},
124 {UEC_ACCESSORY_OPEN_FAILED, "BusinessError 14401002:Failed to open the native accessory node."},
125 {UEC_ACCESSORY_CAN_NOT_REOPEN, "BusinessError 14401003:Cannot reopen the accessory."},
126
127 {USB_SUBMIT_TRANSFER_RESOURCE_BUSY_ERROR, "BusinessError 14400007:Resource busy."},
128 {USB_SUBMIT_TRANSFER_NO_DEVICE_ERROR, "BusinessError 14400008:No such device (it may have been disconnected)."},
129 {USB_SUBMIT_TRANSFER_NO_MEM_ERROR, "BusinessError 14400009:Insufficient memory."},
130 {USB_SUBMIT_TRANSFER_OTHER_ERROR, "BusinessError 14400010:Other USB error."},
131 {USB_SUBMIT_TRANSFER_NOT_FOUND_ERROR,
132 "BusinessError 14400011:The transfer is not in progress, or is already complete or cancelled."},
133 {USB_SUBMIT_TRANSFER_IO_ERROR, "BusinessError 14400012:Transmission I/O error."},
134 };
135
GetErrMsgByErrCode(int32_t errCode)136 static std::string_view GetErrMsgByErrCode(int32_t errCode)
137 {
138 auto obj = ERRCODE_MSG_MAP.find(errCode);
139 if (obj == ERRCODE_MSG_MAP.end()) {
140 return "";
141 }
142 return obj->second;
143 }
144
ThrowBusinessError(int32_t errCode,const std::string & errMsg)145 static void ThrowBusinessError(int32_t errCode, const std::string &errMsg)
146 {
147 set_business_error(errCode, std::string(GetErrMsgByErrCode(errCode)) + errMsg);
148 }
149
150 namespace {
151
ParseToUSBEndpoint(const OHOS::USB::USBEndpoint & usbEndpoint)152 static ohos::usbManager::USBEndpoint ParseToUSBEndpoint(const OHOS::USB::USBEndpoint &usbEndpoint)
153 {
154 auto directionKey = usbEndpoint.GetDirection() == OHOS::USB::USB_ENDPOINT_DIR_OUT ?
155 ohos::usbManager::USBRequestDirection::key_t::USB_REQUEST_DIR_TO_DEVICE :
156 ohos::usbManager::USBRequestDirection::key_t::USB_REQUEST_DIR_FROM_DEVICE;
157 return {
158 .address = usbEndpoint.GetAddress(),
159 .attributes = usbEndpoint.GetAttributes(),
160 .interval = usbEndpoint.GetInterval(),
161 .maxPacketSize = usbEndpoint.GetMaxPacketSize(),
162 .direction = ohos::usbManager::USBRequestDirection(directionKey),
163 .endpointAddr = usbEndpoint.GetEndpointNumber(),
164 .type = usbEndpoint.GetType(),
165 .interfaceId = usbEndpoint.GetInterfaceId()
166 };
167 }
168
ParseToUSBInterface(OHOS::USB::UsbInterface & usbInterface)169 static ohos::usbManager::USBInterface ParseToUSBInterface(OHOS::USB::UsbInterface &usbInterface)
170 {
171 std::vector<ohos::usbManager::USBEndpoint> endpoints;
172 for (const auto &endpoint : usbInterface.GetEndpoints()) {
173 endpoints.push_back(ParseToUSBEndpoint(endpoint));
174 }
175 return {
176 .id = usbInterface.GetId(),
177 .protocol = usbInterface.GetProtocol(),
178 .clazz = usbInterface.GetClass(),
179 .subClass = usbInterface.GetSubClass(),
180 .alternateSetting = usbInterface.GetAlternateSetting(),
181 .name = usbInterface.GetName(),
182 .endpoints = array<ohos::usbManager::USBEndpoint>(endpoints)
183 };
184 }
185
ParseToUSBConfiguration(OHOS::USB::USBConfig & usbConfig)186 static ohos::usbManager::USBConfiguration ParseToUSBConfiguration(OHOS::USB::USBConfig &usbConfig)
187 {
188 std::vector<ohos::usbManager::USBInterface> interfaces;
189 for (auto &interface : usbConfig.GetInterfaces()) {
190 interfaces.push_back(ParseToUSBInterface(interface));
191 }
192 return {
193 .id = usbConfig.GetId(),
194 .attributes = usbConfig.GetAttributes(),
195 .maxPower = usbConfig.GetMaxPower(),
196 .name = usbConfig.GetName(),
197 .isRemoteWakeup = usbConfig.IsRemoteWakeup(),
198 .isSelfPowered = usbConfig.IsSelfPowered(),
199 .interfaces = array<ohos::usbManager::USBInterface>(interfaces)
200 };
201 }
202
ParseToUSBDevice(OHOS::USB::UsbDevice & usbDevice)203 static ohos::usbManager::USBDevice ParseToUSBDevice(OHOS::USB::UsbDevice &usbDevice)
204 {
205 std::vector<ohos::usbManager::USBConfiguration> configs;
206 for (auto &config : usbDevice.GetConfigs()) {
207 configs.push_back(ParseToUSBConfiguration(config));
208 }
209 return {
210 .busNum = usbDevice.GetBusNum(),
211 .devAddress = usbDevice.GetDevAddr(),
212 .serial = usbDevice.GetmSerial(),
213 .name = usbDevice.GetName(),
214 .manufacturerName = usbDevice.GetManufacturerName(),
215 .productName = usbDevice.GetProductName(),
216 .version = usbDevice.GetVersion(),
217 .vendorId = usbDevice.GetVendorId(),
218 .productId = usbDevice.GetProductId(),
219 .clazz = usbDevice.GetClass(),
220 .subClass = usbDevice.GetSubclass(),
221 .protocol = usbDevice.GetProtocol(),
222 .configs = array<ohos::usbManager::USBConfiguration>(configs)
223 };
224 }
225
226 std::map<OHOS::USB::UsbErrCode, std::string> errorTable = {
227 {OHOS::USB::UsbErrCode::UEC_SERIAL_OTHER_ERROR, "Connecting to the service failed."},
228 {OHOS::USB::UsbErrCode::UEC_INTERFACE_PERMISSION_DENIED, "Permission is denied" },
229 {OHOS::USB::UsbErrCode::UEC_SERVICE_PERMISSION_DENIED_SYSAPI, "System permission is denied" },
230 {OHOS::USB::UsbErrCode::UEC_INTERFACE_INVALID_VALUE, "Invalid input parameter." }
231 };
232
ConvertToUSBEndpoint(const ohos::usbManager::USBEndpoint & usbEndpoint)233 static OHOS::USB::USBEndpoint ConvertToUSBEndpoint(const ohos::usbManager::USBEndpoint &usbEndpoint)
234 {
235 OHOS::USB::USBEndpoint point;
236 point.SetAddr(usbEndpoint.address);
237 point.SetAttr(usbEndpoint.attributes);
238 point.SetInterval(usbEndpoint.interval);
239 point.SetMaxPacketSize(usbEndpoint.maxPacketSize);
240 point.SetInterfaceId(usbEndpoint.interfaceId);
241 return point;
242 }
243
ConvertToUsbInterface(ohos::usbManager::USBInterface const & usbInterface)244 static OHOS::USB::UsbInterface ConvertToUsbInterface(ohos::usbManager::USBInterface const &usbInterface)
245 {
246 std::vector<OHOS::USB::USBEndpoint> endpts;
247 for (const auto &endpoint : usbInterface.endpoints) {
248 endpts.push_back(ConvertToUSBEndpoint(endpoint));
249 }
250 OHOS::USB::UsbInterface interface;
251 interface.SetId(usbInterface.id);
252 interface.SetProtocol(usbInterface.protocol);
253 interface.SetClass(usbInterface.clazz);
254 interface.SetSubClass(usbInterface.subClass);
255 interface.SetAlternateSetting(usbInterface.alternateSetting);
256 interface.SetName(usbInterface.name.c_str());
257 interface.SetEndpoints(endpts);
258 return interface;
259 }
260
ConvertUSBDevicePipe(ohos::usbManager::USBDevicePipe const & usbDevice)261 static OHOS::USB::USBDevicePipe ConvertUSBDevicePipe(ohos::usbManager::USBDevicePipe const &usbDevice)
262 {
263 OHOS::USB::USBDevicePipe device;
264 device.SetBusNum(static_cast<uint8_t>(usbDevice.busNum));
265 device.SetDevAddr(static_cast<uint8_t>(usbDevice.devAddress));
266 return device;
267 }
268
ConvertToUSBConfig(ohos::usbManager::USBConfiguration const & usbConfiguration)269 static OHOS::USB::USBConfig ConvertToUSBConfig(ohos::usbManager::USBConfiguration const &usbConfiguration)
270 {
271 std::vector<OHOS::USB::UsbInterface> interfaces;
272 for (auto &interface : usbConfiguration.interfaces) {
273 interfaces.push_back(ConvertToUsbInterface(interface));
274 }
275 OHOS::USB::USBConfig usbConfig;
276 usbConfig.SetId(usbConfiguration.id);
277 usbConfig.SetAttribute(usbConfiguration.attributes);
278 usbConfig.SetMaxPower(usbConfiguration.maxPower);
279 usbConfig.SetName(usbConfiguration.name.c_str());
280 usbConfig.SetInterfaces(interfaces);
281 return usbConfig;
282 }
283
ConvertUsbDevice(ohos::usbManager::USBAccessory const & usbDevice)284 static OHOS::USB::USBAccessory ConvertUsbDevice(ohos::usbManager::USBAccessory const &usbDevice)
285 {
286 OHOS::USB::USBAccessory device;
287 device.SetManufacturer(usbDevice.manufacturer.c_str());
288 device.SetProduct(usbDevice.product.c_str());
289 device.SetDescription(usbDevice.description.c_str());
290 device.SetVersion(usbDevice.version.c_str());
291 device.SetSerialNumber(usbDevice.serialNumber.c_str());
292 return device;
293 }
294
ConvertToUsbDevice(ohos::usbManager::USBDevice const & usbDevice)295 static OHOS::USB::UsbDevice ConvertToUsbDevice(ohos::usbManager::USBDevice const &usbDevice)
296 {
297 std::vector<OHOS::USB::USBConfig> configs;
298 for (auto &config : usbDevice.configs) {
299 configs.push_back(ConvertToUSBConfig(config));
300 }
301 OHOS::USB::UsbDevice device;
302 device.SetConfigs(configs);
303 device.SetDevAddr(usbDevice.devAddress);
304 device.SetBusNum(usbDevice.busNum);
305 device.SetName(usbDevice.name.c_str());
306 device.SetManufacturerName(usbDevice.manufacturerName.c_str());
307 device.SetProductName(usbDevice.productName.c_str());
308 device.SetVersion(usbDevice.version.c_str());
309 device.SetVendorId(usbDevice.vendorId);
310 device.SetProductId(usbDevice.productId);
311 device.SetClass(usbDevice.clazz);
312 device.SetSubclass(usbDevice.subClass);
313 device.SetProtocol(usbDevice.protocol);
314 return device;
315 }
316
ConvertUSBPortStatus(OHOS::USB::UsbPortStatus const & usbDevice)317 static ohos::usbManager::USBPortStatus ConvertUSBPortStatus(OHOS::USB::UsbPortStatus const &usbDevice)
318 {
319 ohos::usbManager::USBPortStatus device;
320 device.currentDataRole = usbDevice.currentDataRole;
321 device.currentMode = usbDevice.currentMode;
322 device.currentPowerRole = usbDevice.currentPowerRole;
323 return device;
324 }
325
ConvertUSBPort(OHOS::USB::UsbPort const & usbDevice)326 static ohos::usbManager::USBPort ConvertUSBPort(OHOS::USB::UsbPort const &usbDevice)
327 {
328 using PortModeType = ohos::usbManager::PortModeType;
329 using key_t = PortModeType::key_t;
330 key_t modeKey = key_t::NONE;
331 if (usbDevice.supportedModes >= 0 && usbDevice.supportedModes < static_cast<int32_t>(key_t::NUM_MODES)) {
332 modeKey = static_cast<key_t>(usbDevice.supportedModes);
333 }
334 return {
335 .id = usbDevice.id,
336 .supportedModes = PortModeType(modeKey),
337 .status = ConvertUSBPortStatus(usbDevice.usbPortStatus)
338 };
339 }
340
connectDevice(USBDevice const & device)341 USBDevicePipe connectDevice(USBDevice const &device)
342 {
343 OHOS::USB::USBDevicePipe pipe;
344 if (!HasFeature(FEATURE_HOST)) {
345 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
346 return {};
347 }
348 OHOS::USB::UsbDevice usbDev = ConvertToUsbDevice(device);
349 int32_t ret = g_usbClient.OpenDevice(usbDev, pipe);
350 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED || ret == OHOS::USB::UEC_INTERFACE_PERMISSION_DENIED) {
351 ThrowBusinessError(UEC_COMMON_HAS_NO_RIGHT, "need call requestRight to get the permission");
352 USB_HILOGE(MODULE_JS_NAPI, "Connect Device failed, return code:%{public}d", ret);
353 return {};
354 }
355 return {
356 .busNum = pipe.GetBusNum(),
357 .devAddress = pipe.GetDevAddr()
358 };
359 }
360
ParseEndpointObj(const ohos::usbManager::USBEndpoint endpoint,OHOS::USB::USBEndpoint & ep)361 static void ParseEndpointObj(const ohos::usbManager::USBEndpoint endpoint, OHOS::USB::USBEndpoint &ep)
362 {
363 ep = OHOS::USB::USBEndpoint(endpoint.address, endpoint.attributes, endpoint.interval, endpoint.maxPacketSize);
364 ep.SetInterfaceId(endpoint.interfaceId);
365 }
366
getDevices()367 array<ohos::usbManager::USBDevice> getDevices()
368 {
369 std::vector<ohos::usbManager::USBDevice> res;
370 if (!HasFeature(FEATURE_HOST)) {
371 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
372 return array<ohos::usbManager::USBDevice>(res);
373 }
374 std::vector<OHOS::USB::UsbDevice> deviceList;
375 auto ret = g_usbClient.GetDevices(deviceList);
376 if (ret != 0) {
377 return array<ohos::usbManager::USBDevice>(res);
378 }
379 for (auto &usbDevice : deviceList) {
380 res.push_back(ParseToUSBDevice(usbDevice));
381 }
382 return array<ohos::usbManager::USBDevice>(res);
383 }
384
hasRight(string_view deviceName)385 bool hasRight(string_view deviceName)
386 {
387 if (!HasFeature(FEATURE_HOST)) {
388 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
389 return false;
390 }
391 bool result = g_usbClient.HasRight(std::string(deviceName));
392 return result;
393 }
394
requestRightSync(string_view deviceName)395 bool requestRightSync(string_view deviceName)
396 {
397 bool bRet = false;
398 if (!HasFeature(FEATURE_HOST)) {
399 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
400 return bRet;
401 }
402 int32_t ret = g_usbClient.RequestRight(std::string(deviceName));
403 if (ret == OHOS::USB::UEC_OK) {
404 bRet = true;
405 } else {
406 USB_HILOGE(MODULE_JS_NAPI, "RequestRight failed, return code:%{public}d", ret);
407 ThrowBusinessError(ret, "");
408 return bRet;
409 }
410 return bRet;
411 }
412
removeRight(string_view deviceName)413 bool removeRight(string_view deviceName)
414 {
415 bool bResult = false;
416 if (!HasFeature(FEATURE_HOST)) {
417 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
418 return bResult;
419 }
420 int32_t ret = g_usbClient.RemoveRight(std::string(deviceName));
421 if (ret == OHOS::USB::UEC_OK) {
422 bResult = true;
423 } else {
424 USB_HILOGE(MODULE_JS_NAPI, "RemoveRight failed, return code:%{public}d", ret);
425 ThrowBusinessError(ret, "");
426 return bResult;
427 }
428 return bResult;
429 }
430
addDeviceAccessRight(string_view tokenId,string_view deviceName)431 bool addDeviceAccessRight(string_view tokenId, string_view deviceName)
432 {
433 bool bResult = false;
434 if (!HasFeature(FEATURE_HOST)) {
435 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
436 return bResult;
437 }
438 int32_t ret = g_usbClient.AddAccessRight(std::string(tokenId), std::string(deviceName));
439 if (ret == OHOS::USB::UEC_OK) {
440 bResult = true;
441 } else if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI) {
442 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "Normal app not allowed");
443 return bResult;
444 } else if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED) {
445 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "Permission not allowed");
446 return bResult;
447 } else {
448 ThrowBusinessError(ret, "");
449 return bResult;
450 }
451 return bResult;
452 }
453
getFunctionsFromString(string_view funcs)454 int32_t getFunctionsFromString(string_view funcs)
455 {
456 if (!HasFeature(FEATURE_DEVICE)) {
457 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
458 return CAPABILITY_NOT_SUPPORT;
459 }
460 int32_t numFuncs = g_usbClient.UsbFunctionsFromString(std::string(funcs));
461 if (numFuncs == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI) {
462 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "");
463 return OHEC_COMMON_NORMAL_APP_NOT_ALLOWED;
464 }
465 if (numFuncs == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED) {
466 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "");
467 return OHEC_COMMON_PERMISSION_NOT_ALLOWED;
468 }
469 return static_cast<int32_t>(numFuncs);
470 }
471
getStringFromFunctions(FunctionType funcs)472 string getStringFromFunctions(FunctionType funcs)
473 {
474 if (!HasFeature(FEATURE_DEVICE)) {
475 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
476 return "";
477 }
478 std::string strFuncs = g_usbClient.UsbFunctionsToString(funcs);
479 if (strFuncs == OHOS::USB::PERMISSION_DENIED_SYSAPI) {
480 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "");
481 return "";
482 }
483 if (strFuncs == OHOS::USB::SYS_APP_PERMISSION_DENIED_SYSAPI) {
484 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "");
485 return "";
486 }
487 return strFuncs;
488 }
489
setDeviceFunctionsSync(FunctionType funcs)490 void setDeviceFunctionsSync(FunctionType funcs)
491 {
492 if (!HasFeature(FEATURE_DEVICE)) {
493 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
494 return;
495 }
496 int32_t ret = g_usbClient.SetCurrentFunctions(funcs);
497 if (ret == OHOS::USB::UEC_OK) {
498 return;
499 } else if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI) {
500 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "");
501 return;
502 } else if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED) {
503 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "");
504 return;
505 } else if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_CHECK_HDC) {
506 ThrowBusinessError(UEC_COMMON_HDC_NOT_ALLOWED, "");
507 return;
508 } else if (ret == OHOS::USB::UEC_SERVICE_FUNCTION_NOT_SUPPORT) {
509 ThrowBusinessError(UEC_COMMON_FUNCTION_NOT_SUPPORT, "");
510 return;
511 } else {
512 USB_HILOGE(MODULE_JS_NAPI, "setDeviceFunctionsSync failed, return code:%{public}d", ret);
513 ThrowBusinessError(ret, "");
514 return;
515 }
516 }
517
getDeviceFunctions()518 FunctionType getDeviceFunctions()
519 {
520 int32_t cfuncs = 0;
521 if (!HasFeature(FEATURE_DEVICE)) {
522 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
523 return {FunctionType::key_t(cfuncs)};
524 }
525 int32_t ret = g_usbClient.GetCurrentFunctions(cfuncs);
526 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI) {
527 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "Normal app not allowed");
528 return {FunctionType::key_t(cfuncs)};
529 }
530 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED) {
531 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "Permission not allowed");
532 return {FunctionType::key_t(cfuncs)};
533 }
534 if (ret != OHOS::USB::UEC_OK) {
535 ThrowBusinessError(ret, "");
536 }
537 return {FunctionType::key_t(cfuncs)};
538 }
539
getPortList()540 array<USBPort> getPortList()
541 {
542 if (!HasFeature(FEATURE_PORT)) {
543 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
544 return {};
545 }
546 std::vector<OHOS::USB::UsbPort> ports;
547 int32_t ret = g_usbClient.GetPorts(ports);
548 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI) {
549 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "");
550 return {};
551 }
552 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED) {
553 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "");
554 return {};
555 }
556 if (ret != OHOS::USB::UEC_OK) {
557 ThrowBusinessError(ret, "");
558 return {};
559 }
560 if (ports.empty()) {
561 USB_HILOGE(MODULE_JS_NAPI, "ports empty");
562 return {};
563 }
564 std::vector<::ohos::usbManager::USBPort> convertedPorts;
565 convertedPorts.reserve(ports.size());
566 for (const auto &port : ports) {
567 convertedPorts.push_back(ConvertUSBPort(port));
568 }
569 return ::taihe::array<::ohos::usbManager::USBPort>(
570 taihe::array_view<::ohos::usbManager::USBPort>(convertedPorts.data(), convertedPorts.size()));
571 }
572
getPortSupportModes(int32_t portId)573 PortModeType getPortSupportModes(int32_t portId)
574 {
575 int32_t result = 0;
576 if (!HasFeature(FEATURE_PORT)) {
577 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
578 return {PortModeType::key_t(result)};
579 }
580 if (portId < 0) {
581 ThrowBusinessError(OHEC_COMMON_PARAM_ERROR, "");
582 return {PortModeType::key_t(result)};
583 }
584 int32_t ret = g_usbClient.GetSupportedModes(portId, result);
585 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI) {
586 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "");
587 return {PortModeType::key_t(result)};
588 }
589 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED) {
590 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "");
591 return {PortModeType::key_t(result)};
592 }
593 if (ret != OHOS::USB::UEC_OK) {
594 USB_HILOGE(MODULE_JS_NAPI, "false ret = %{public}d", ret);
595 ThrowBusinessError(ret, "");
596 }
597 return {PortModeType::key_t(result)};
598 }
599
setPortRoleTypesSync(int32_t portId,PowerRoleType powerRole,DataRoleType dataRole)600 void setPortRoleTypesSync(int32_t portId, PowerRoleType powerRole, DataRoleType dataRole)
601 {
602 if (!HasFeature(FEATURE_PORT)) {
603 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
604 return;
605 }
606 if (portId < 0 || powerRole < 0 || dataRole < 0) {
607 ThrowBusinessError(OHEC_COMMON_PARAM_ERROR, "");
608 return;
609 }
610 int ret = g_usbClient.SetPortRole(portId, powerRole, dataRole);
611 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI) {
612 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "");
613 return;
614 }
615 if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED) {
616 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "");
617 return;
618 }
619 if (ret == OHOS::USB::UEC_SERVICE_NOT_SUPPORT_SWITCH_PORT) {
620 ThrowBusinessError(UEC_COMMON_PORTROLE_SWITCH_NOT_ALLOWED, "");
621 return;
622 }
623 if (ret != OHOS::USB::UEC_OK) {
624 ThrowBusinessError(ret, "false ret: " + std::to_string(ret));
625 return;
626 }
627 }
628
addAccessoryRight(int32_t tokenId,ohos::usbManager::USBAccessory const & accessory)629 void addAccessoryRight(int32_t tokenId, ohos::usbManager::USBAccessory const &accessory)
630 {
631 if (!HasFeature(FEATURE_DEVICE)) {
632 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
633 return;
634 }
635 int32_t ret = g_usbClient.AddAccessoryRight(tokenId, ConvertUsbDevice(accessory));
636
637 switch (ret) {
638 case OHOS::USB::UEC_OK:
639 return;
640 case OHOS::USB::UEC_SERVICE_GET_TOKEN_INFO_FAILED:
641 ThrowBusinessError(OHEC_COMMON_PARAM_ERROR, "");
642 break;
643 case OHOS::USB::UEC_SERVICE_ACCESSORY_NOT_MATCH:
644 ThrowBusinessError(OHEC_COMMON_PARAM_ERROR, "Get accessory through getAccessoryList");
645 break;
646 case OHOS::USB::UEC_SERVICE_DATABASE_OPERATION_FAILED:
647 ThrowBusinessError(UEC_COMMON_RIGHT_DATABASE_ERROR, "Database request operation exception");
648 break;
649 case OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI:
650 ThrowBusinessError(OHEC_COMMON_NORMAL_APP_NOT_ALLOWED, "");
651 break;
652 case OHOS::USB::UEC_SERVICE_PERMISSION_DENIED_SYSAPI_FAILED:
653 ThrowBusinessError(OHEC_COMMON_PERMISSION_NOT_ALLOWED, "");
654 break;
655 default:
656 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION, "Service exception");
657 break;
658 }
659 USB_HILOGD(MODULE_JS_NAPI, "Device call AddAccessoryRight ret: %{public}d", ret);
660 }
661
claimInterface(USBDevicePipe const & pipe,USBInterface const & iface,optional_view<bool> force)662 int32_t claimInterface(USBDevicePipe const &pipe, USBInterface const &iface, optional_view<bool> force)
663 {
664 if (!HasFeature(FEATURE_HOST)) {
665 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
666 return ERROR;
667 }
668 OHOS::USB::USBDevicePipe internalPipe = ConvertUSBDevicePipe(pipe);
669 bool forceClaim = force.has_value() ? *force : false;
670 int ret = internalPipe.ClaimInterface(ConvertToUsbInterface(iface), forceClaim);
671 if (ret != OHOS::USB::UEC_OK) {
672 ThrowBusinessError(ret, "pipe call ClaimInterface");
673 }
674 return ret;
675 }
676
releaseInterface(USBDevicePipe const & pipe,USBInterface const & iface)677 int32_t releaseInterface(USBDevicePipe const &pipe, USBInterface const &iface)
678 {
679 if (!HasFeature(FEATURE_HOST)) {
680 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
681 return ERROR;
682 }
683 OHOS::USB::USBDevicePipe internalPipe = ConvertUSBDevicePipe(pipe);
684 int ret = internalPipe.ReleaseInterface(ConvertToUsbInterface(iface));
685 if (ret != OHOS::USB::UEC_OK) {
686 USB_HILOGE(MODULE_JS_NAPI, "releaseInterface failed:%{public}d", ret);
687 ThrowBusinessError(ret, "");
688 }
689 return ret;
690 }
691
setConfiguration(USBDevicePipe const & pipe,USBConfiguration const & config)692 int32_t setConfiguration(USBDevicePipe const &pipe, USBConfiguration const &config)
693 {
694 if (!HasFeature(FEATURE_HOST)) {
695 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
696 return ERROR;
697 }
698 OHOS::USB::USBDevicePipe internalPipe = ConvertUSBDevicePipe(pipe);
699 int ret = g_usbClient.SetConfiguration(internalPipe, ConvertToUSBConfig(config));
700 if (ret != OHOS::USB::UEC_OK) {
701 USB_HILOGE(MODULE_JS_NAPI, "setConfiguration failed:%{public}d", ret);
702 ThrowBusinessError(ret, "");
703 }
704 return ret;
705 }
706
setInterface(USBDevicePipe const & pipe,USBInterface const & iface)707 int32_t setInterface(USBDevicePipe const &pipe, USBInterface const &iface)
708 {
709 if (!HasFeature(FEATURE_HOST)) {
710 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
711 return ERROR;
712 }
713 OHOS::USB::USBDevicePipe internalPipe = ConvertUSBDevicePipe(pipe);
714 int ret = g_usbClient.SetInterface(internalPipe, ConvertToUsbInterface(iface));
715 if (ret != OHOS::USB::UEC_OK) {
716 USB_HILOGE(MODULE_JS_NAPI, "setInterface failed:%{public}d", ret);
717 ThrowBusinessError(ret, "");
718 }
719 return ret;
720 }
721
getRawDescriptor(USBDevicePipe const & pipe)722 array<uint8_t> getRawDescriptor(USBDevicePipe const &pipe)
723 {
724 if (!HasFeature(FEATURE_HOST)) {
725 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
726 return {};
727 }
728 std::vector<uint8_t> bufferData;
729 OHOS::USB::USBDevicePipe internalPipe = ConvertUSBDevicePipe(pipe);
730 int ret = g_usbClient.GetRawDescriptors(internalPipe, bufferData);
731 if (ret != OHOS::USB::UEC_OK) {
732 USB_HILOGE(MODULE_JS_NAPI, "getRawDescriptor failed:%{public}d", ret);
733 ThrowBusinessError(ret, "");
734 }
735 return ::taihe::array<uint8_t>(bufferData);
736 }
737
getFileDescriptor(USBDevicePipe const & pipe)738 int32_t getFileDescriptor(USBDevicePipe const &pipe)
739 {
740 if (!HasFeature(FEATURE_HOST)) {
741 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
742 return ERROR;
743 }
744 int32_t fd = ERROR;
745 OHOS::USB::USBDevicePipe internalPipe = ConvertUSBDevicePipe(pipe);
746 int32_t ret = g_usbClient.GetFileDescriptor(internalPipe, fd);
747 if (ret != OHOS::USB::UEC_OK) {
748 USB_HILOGE(MODULE_JS_NAPI, "getFileDescriptor failed:%{public}d", ret);
749 }
750 return static_cast<int32_t>(fd);
751 }
752
usbControlTransferSync(USBDevicePipe const & pipe,USBDeviceRequestParams const & requestparam,optional_view<int32_t> timeout)753 int32_t usbControlTransferSync(
754 USBDevicePipe const &pipe, USBDeviceRequestParams const &requestparam, optional_view<int32_t> timeout)
755 {
756 if (!HasFeature(FEATURE_HOST)) {
757 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
758 return ERROR;
759 }
760 OHOS::USB::USBDevicePipe nativePipe;
761 nativePipe.SetBusNum(static_cast<uint8_t>(pipe.busNum));
762 nativePipe.SetDevAddr(static_cast<uint8_t>(pipe.devAddress));
763 int32_t timeOut = 0;
764 if (timeout.has_value()) {
765 timeOut = int(timeout.value());
766 }
767 const OHOS::HDI::Usb::V1_2::UsbCtrlTransferParams tctrl = {requestparam.bmRequestType, requestparam.bRequest,
768 requestparam.wValue, requestparam.wIndex, requestparam.wLength, timeOut};
769
770 ani_ref bufferRef;
771 ani_env *env = ::taihe::get_env();
772 ani_object array_obj = reinterpret_cast<ani_object>(requestparam.data);
773 if (ANI_OK != env->Object_GetFieldByName_Ref(array_obj, "buffer", &bufferRef)) {
774 USB_HILOGE(MODULE_JS_NAPI, "Object_GetFieldByName_Ref failed.");
775 return ERROR;
776 }
777 void *data;
778 size_t size;
779 if (ANI_OK != env->ArrayBuffer_GetInfo(static_cast<ani_arraybuffer>(bufferRef), &data, &size)) {
780 USB_HILOGE(MODULE_JS_NAPI, "ArrayBuffer_GetInfo failed.");
781 return ERROR;
782 }
783 int32_t ret;
784 std::vector<uint8_t> bufferData(static_cast<uint8_t *>(data), static_cast<uint8_t *>(data) + size);
785 ret = nativePipe.UsbControlTransfer(tctrl, bufferData);
786 if ((uint32_t(requestparam.bmRequestType) & OHOS::USB::USB_ENDPOINT_DIR_MASK) == OHOS::USB::USB_ENDPOINT_DIR_IN) {
787 ret = memcpy_s(data, size, bufferData.data(), bufferData.size());
788 }
789 if (ret != OHOS::USB::UEC_OK) {
790 return ERROR;
791 }
792 return bufferData.size();
793 }
794
bulkTransferSync(::ohos::usbManager::USBDevicePipe const & pipe,::ohos::usbManager::USBEndpoint const & endpoint,uintptr_t buffer,optional_view<int32_t> timeout)795 int32_t bulkTransferSync(::ohos::usbManager::USBDevicePipe const &pipe, ::ohos::usbManager::USBEndpoint const &endpoint,
796 uintptr_t buffer, optional_view<int32_t> timeout)
797 {
798 if (!HasFeature(FEATURE_HOST)) {
799 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
800 return ERROR;
801 }
802 ani_ref bufferRef;
803 ani_env *env = ::taihe::get_env();
804 ani_object array_obj = reinterpret_cast<ani_object>(buffer);
805 if (ANI_OK != env->Object_GetFieldByName_Ref(array_obj, "buffer", &bufferRef)) {
806 USB_HILOGE(MODULE_JS_NAPI, "Object_GetFieldByName_Ref failed.");
807 return ERROR;
808 }
809 void *data;
810 size_t size;
811 if (ANI_OK != env->ArrayBuffer_GetInfo(static_cast<ani_arraybuffer>(bufferRef), &data, &size)) {
812 USB_HILOGE(MODULE_JS_NAPI, "ArrayBuffer_GetInfo failed.");
813 return ERROR;
814 }
815 OHOS::USB::USBEndpoint ep;
816 ParseEndpointObj(endpoint, ep);
817 std::vector<uint8_t> bufferData(static_cast<uint8_t *>(data), static_cast<uint8_t *>(data) + size);
818 OHOS::USB::USBDevicePipe nativePipe;
819 nativePipe.SetBusNum(static_cast<uint8_t>(pipe.busNum));
820 nativePipe.SetDevAddr(static_cast<uint8_t>(pipe.devAddress));
821 int32_t timeOut = 0;
822 if (timeout.has_value()) {
823 timeOut = timeout.value();
824 }
825 int32_t ret = nativePipe.BulkTransfer(ep, bufferData, timeOut);
826 if (ep.GetDirection() == OHOS::USB::USB_ENDPOINT_DIR_IN) {
827 ret = memcpy_s(data, size, bufferData.data(), bufferData.size());
828 }
829 if (ret == OHOS::USB::UEC_OK) {
830 return bufferData.size();
831 } else {
832 return ERROR;
833 }
834 }
835
closePipe(USBDevicePipe const & pipe)836 int32_t closePipe(USBDevicePipe const &pipe)
837 {
838 if (!HasFeature(FEATURE_HOST)) {
839 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
840 return ERROR;
841 }
842 OHOS::USB::USBDevicePipe nativePipe;
843 nativePipe.SetBusNum(static_cast<uint8_t>(pipe.busNum));
844 nativePipe.SetDevAddr(static_cast<uint8_t>(pipe.devAddress));
845 return nativePipe.Close();
846 }
847
taihe2Native(ohos::usbManager::USBAccessory accessory)848 static OHOS::USB::USBAccessory taihe2Native(ohos::usbManager::USBAccessory accessory)
849 {
850 OHOS::USB::USBAccessory nativeAccessory = {accessory.manufacturer.c_str(), accessory.product.c_str(),
851 accessory.description.c_str(), accessory.version.c_str(), accessory.serialNumber.c_str()};
852 return nativeAccessory;
853 }
854
native2Taihe(OHOS::USB::USBAccessory accessory)855 static ohos::usbManager::USBAccessory native2Taihe(OHOS::USB::USBAccessory accessory)
856 {
857 ohos::usbManager::USBAccessory taiheAccessory = {accessory.GetManufacturer(), accessory.GetProduct(),
858 accessory.GetDescription(), accessory.GetVersion(), accessory.GetSerialNumber()};
859 return taiheAccessory;
860 }
861
hasAccessoryRight(ohos::usbManager::USBAccessory const & accessory)862 bool hasAccessoryRight(ohos::usbManager::USBAccessory const &accessory)
863 {
864 bool result = false;
865 if (!HasFeature(FEATURE_DEVICE)) {
866 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
867 return result;
868 }
869 int32_t ret = g_usbClient.HasAccessoryRight(taihe2Native(accessory), result);
870 if (ret == OHOS::USB::UEC_OK) {
871 return result;
872 } else if (ret == OHOS::USB::UEC_SERVICE_ACCESSORY_NOT_MATCH) {
873 ThrowBusinessError(UEC_ACCESSORY_NOT_MATCH, "Get accessory through getAccessoryList");
874 return result;
875 } else if (ret == OHOS::USB::UEC_SERVICE_DATABASE_OPERATION_FAILED) {
876 ThrowBusinessError(UEC_COMMON_RIGHT_DATABASE_ERROR, "Database request operation exception");
877 return result;
878 } else {
879 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION, "Service exception");
880 }
881 return result;
882 }
883
requestAccessoryRightSync(ohos::usbManager::USBAccessory const & accessory)884 bool requestAccessoryRightSync(ohos::usbManager::USBAccessory const &accessory)
885 {
886 bool result = false;
887 if (!HasFeature(FEATURE_DEVICE)) {
888 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
889 return result;
890 }
891 int32_t ret = g_usbClient.RequestAccessoryRight(taihe2Native(accessory), result);
892 if (ret == OHOS::USB::UEC_OK) {
893 return result;
894 } else if (ret == OHOS::USB::UEC_SERVICE_ACCESSORY_NOT_MATCH) {
895 ThrowBusinessError(UEC_ACCESSORY_NOT_MATCH, "");
896 return result;
897 } else if (ret == OHOS::USB::UEC_SERVICE_DATABASE_OPERATION_FAILED) {
898 ThrowBusinessError(UEC_COMMON_RIGHT_DATABASE_ERROR, "");
899 return result;
900 } else {
901 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION, "");
902 }
903 return result;
904 }
905
cancelAccessoryRight(ohos::usbManager::USBAccessory const & accessory)906 void cancelAccessoryRight(ohos::usbManager::USBAccessory const &accessory)
907 {
908 if (!HasFeature(FEATURE_DEVICE)) {
909 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
910 return;
911 }
912 if (g_accFd != 0) {
913 close(g_accFd);
914 g_accFd = 0;
915 g_usbClient.CloseAccessory(g_accFd);
916 }
917 int32_t ret = g_usbClient.CancelAccessoryRight(taihe2Native(accessory));
918 if (ret == OHOS::USB::UEC_OK) {
919 return;
920 } else if (ret == OHOS::USB::UEC_SERVICE_ACCESSORY_NOT_MATCH) {
921 ThrowBusinessError(UEC_ACCESSORY_NOT_MATCH, "Get accessory through getAccessoryList");
922 return;
923 } else if (ret == OHOS::USB::UEC_SERVICE_DATABASE_OPERATION_FAILED) {
924 ThrowBusinessError(UEC_COMMON_RIGHT_DATABASE_ERROR, "Database request operation exception");
925 return;
926 } else {
927 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION, "Service exception");
928 return;
929 }
930 }
931
getAccessoryList()932 array<ohos::usbManager::USBAccessory> getAccessoryList()
933 {
934 if (!HasFeature(FEATURE_DEVICE)) {
935 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
936 return {};
937 }
938 std::vector<OHOS::USB::USBAccessory> accessoryList;
939 std::vector<ohos::usbManager::USBAccessory> results;
940 if (!HasFeature(FEATURE_DEVICE)) {
941 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
942 return array<ohos::usbManager::USBAccessory>(results);
943 }
944 int32_t ret = g_usbClient.GetAccessoryList(accessoryList);
945 if (ret == OHOS::USB::UEC_OK) {
946 for (const auto &item : accessoryList) {
947 results.push_back(native2Taihe(item));
948 }
949 } else {
950 results.clear();
951 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION, "Service exception");
952 }
953 return array<ohos::usbManager::USBAccessory>(results);
954 }
955
openAccessory(ohos::usbManager::USBAccessory const & accessory)956 USBAccessoryHandle openAccessory(ohos::usbManager::USBAccessory const &accessory)
957 {
958 USBAccessoryHandle handler;
959 if (!HasFeature(FEATURE_DEVICE)) {
960 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
961 return handler;
962 }
963 int32_t fd = -1;
964 int32_t ret = g_usbClient.OpenAccessory(taihe2Native(accessory), fd);
965 if (ret == OHOS::USB::UEC_OK) {
966 g_accFd = fd;
967 handler.accessoryFd = fd;
968 } else if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED || ret == OHOS::USB::UEC_INTERFACE_PERMISSION_DENIED) {
969 ThrowBusinessError(UEC_COMMON_HAS_NO_RIGHT, "");
970 } else if (ret == OHOS::USB::UEC_SERVICE_ACCESSORY_NOT_MATCH) {
971 ThrowBusinessError(UEC_ACCESSORY_NOT_MATCH, "");
972 } else if (ret == OHOS::USB::UEC_SERVICE_ACCESSORY_OPEN_NATIVE_NODE_FAILED) {
973 ThrowBusinessError(UEC_ACCESSORY_OPEN_FAILED, "");
974 } else if (ret == OHOS::USB::UEC_SERVICE_ACCESSORY_REOPEN) {
975 ThrowBusinessError(UEC_ACCESSORY_CAN_NOT_REOPEN, "");
976 } else {
977 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION, "");
978 }
979 return handler;
980 }
981
closeAccessory(USBAccessoryHandle const & accessoryHandle)982 void closeAccessory(USBAccessoryHandle const &accessoryHandle)
983 {
984 if (!HasFeature(FEATURE_DEVICE)) {
985 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
986 return;
987 }
988 auto accessoryFd = accessoryHandle.accessoryFd;
989 if (accessoryFd == 0 || accessoryFd != g_accFd || g_accFd == 0) {
990 ThrowBusinessError(OHEC_COMMON_PARAM_ERROR, "Parameter accessoryHandle error, need openAccessory first.");
991 return;
992 }
993 close(accessoryFd);
994 accessoryFd = 0;
995 int32_t ret = g_usbClient.CloseAccessory(g_accFd);
996 g_accFd = 0;
997 if (ret != OHOS::USB::UEC_OK) {
998 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION, "Service exception");
999 }
1000 return;
1001 }
1002
UsbSubmitTransferErrorCode(int32_t & error)1003 static int32_t UsbSubmitTransferErrorCode(int32_t &error)
1004 {
1005 switch (error) {
1006 case IO_ERROR:
1007 return USB_SUBMIT_TRANSFER_IO_ERROR;
1008 case INVALID_PARAM:
1009 return OHEC_COMMON_PARAM_ERROR;
1010 case NO_DEVICE:
1011 return USB_SUBMIT_TRANSFER_NO_DEVICE_ERROR;
1012 case NOT_FOUND:
1013 return USB_SUBMIT_TRANSFER_NOT_FOUND_ERROR;
1014 case ERROR_BUSY:
1015 return USB_SUBMIT_TRANSFER_RESOURCE_BUSY_ERROR;
1016 case NO_MEM:
1017 return USB_SUBMIT_TRANSFER_NO_MEM_ERROR;
1018 case OHOS::USB::UEC_SERVICE_PERMISSION_DENIED:
1019 return UEC_COMMON_HAS_NO_RIGHT;
1020 default:
1021 return USB_SUBMIT_TRANSFER_OTHER_ERROR;
1022 }
1023 }
1024
1025 struct USBTransferAsyncContext {
1026 ani_vm *vm;
1027 OHOS::USB::USBDevicePipe pipe;
1028 int32_t endpoint;
1029 int32_t flags;
1030 int32_t type;
1031 int32_t status;
1032 int32_t timeOut = 0;
1033 int32_t length;
1034 int32_t actualLength;
1035 size_t bufferLength = 0;
1036 sptr<Ashmem> ashmem = nullptr;
1037 uint8_t *userData;
1038 uint8_t *buffer;
1039 uint32_t numIsoPackets;
1040 std::string name = "CreateAshmem";
1041 ani_object callbackRef;
1042 };
1043
CreateAndWriteAshmem(USBTransferAsyncContext * asyncContext,OHOS::HDI::Usb::V1_2::USBTransferInfo & obj)1044 static bool CreateAndWriteAshmem(USBTransferAsyncContext *asyncContext, OHOS::HDI::Usb::V1_2::USBTransferInfo &obj)
1045 {
1046 asyncContext->ashmem = Ashmem::CreateAshmem(asyncContext->name.c_str(), asyncContext->length);
1047 if (asyncContext->ashmem == nullptr) {
1048 return false;
1049 }
1050 uint8_t endpointId = static_cast<uint8_t>(asyncContext->endpoint) & OHOS::USB::USB_ENDPOINT_DIR_MASK;
1051 if (endpointId == OHOS::USB::USB_ENDPOINT_DIR_OUT) {
1052 std::vector<uint8_t> bufferData(asyncContext->buffer, asyncContext->buffer + asyncContext->bufferLength);
1053 obj.length = static_cast<int32_t>(bufferData.size());
1054 asyncContext->ashmem->MapReadAndWriteAshmem();
1055 if (!asyncContext->ashmem->WriteToAshmem(asyncContext->buffer, bufferData.size(), 0)) {
1056 asyncContext->ashmem->CloseAshmem();
1057 return false;
1058 }
1059 }
1060 return true;
1061 }
1062
ReadDataToBuffer(USBTransferAsyncContext * asyncContext,const OHOS::USB::TransferCallbackInfo & info)1063 static void ReadDataToBuffer(USBTransferAsyncContext *asyncContext, const OHOS::USB::TransferCallbackInfo &info)
1064 {
1065 uint8_t endpointId = static_cast<uint8_t>(asyncContext->endpoint) & OHOS::USB::USB_ENDPOINT_DIR_MASK;
1066 if (endpointId == OHOS::USB::USB_ENDPOINT_DIR_IN) {
1067 asyncContext->ashmem->MapReadAndWriteAshmem();
1068 auto ashmemBuffer = asyncContext->ashmem->ReadFromAshmem(info.actualLength, 0);
1069 if (ashmemBuffer == nullptr) {
1070 asyncContext->ashmem->UnmapAshmem();
1071 asyncContext->ashmem->CloseAshmem();
1072 return;
1073 }
1074 int32_t ret = memcpy_s(asyncContext->buffer, asyncContext->bufferLength, ashmemBuffer, info.actualLength);
1075 if (ret != EOK) {
1076 USB_HILOGE(MODULE_JS_NAPI, "memcpy_s fatal failed error: %{public}d", ret);
1077 }
1078 }
1079 asyncContext->ashmem->UnmapAshmem();
1080 asyncContext->ashmem->CloseAshmem();
1081 }
1082
GetDefaultBusinessError(ani_env * env)1083 static ani_object GetDefaultBusinessError(ani_env *env)
1084 {
1085 static const char *businessErrorName = "L@ohos/base/BusinessError;";
1086 ani_class cls;
1087 auto status = env->FindClass(businessErrorName, &cls);
1088 if (ANI_OK != status) {
1089 USB_HILOGE(MODULE_JS_NAPI, "Not found class '%{public}s' errcode %{public}d.", businessErrorName, status);
1090 return nullptr;
1091 }
1092 ani_method ctor;
1093 status = env->Class_FindMethod(cls, "<ctor>", ":V", &ctor);
1094 if (ANI_OK != status) {
1095 USB_HILOGE(MODULE_JS_NAPI, "Not found ctor of '%{public}s' errcode %{public}d.", businessErrorName, status);
1096 return nullptr;
1097 }
1098 ani_object businessErrorObject;
1099 status = env->Object_New(cls, ctor, &businessErrorObject);
1100 if (ANI_OK != status) {
1101 USB_HILOGE(MODULE_JS_NAPI, "Can not create business error errcode %{public}d.", status);
1102 return nullptr;
1103 }
1104 return businessErrorObject;
1105 }
1106
1107 static thread_local std::shared_ptr<OHOS::AppExecFwk::EventHandler> mainHandler = nullptr;
1108
SendEventToMainThread(const std::function<void ()> func)1109 static bool SendEventToMainThread(const std::function<void()> func)
1110 {
1111 if (func == nullptr) {
1112 USB_HILOGE(MODULE_JS_NAPI, "func is nullptr!");
1113 return false;
1114 }
1115
1116 if (!mainHandler) {
1117 auto runner = OHOS::AppExecFwk::EventRunner::GetMainEventRunner();
1118 if (!runner) {
1119 USB_HILOGE(MODULE_JS_NAPI, "get main event runner failed!");
1120 return false;
1121 }
1122 mainHandler = std::make_shared<OHOS::AppExecFwk::EventHandler>(runner);
1123 }
1124 mainHandler->PostTask(func, "", 0, OHOS::AppExecFwk::EventQueue::Priority::HIGH, {});
1125 return true;
1126 }
1127
1128 static constexpr int32_t LOCAL_SCOPE_SIZE = 16;
AniCallBack(USBTransferAsyncContext * asyncContext,const OHOS::USB::TransferCallbackInfo & info,const std::vector<OHOS::HDI::Usb::V1_2::UsbIsoPacketDescriptor> & isoInfo)1129 static void AniCallBack(USBTransferAsyncContext *asyncContext, const OHOS::USB::TransferCallbackInfo &info,
1130 const std::vector<OHOS::HDI::Usb::V1_2::UsbIsoPacketDescriptor> &isoInfo)
1131 {
1132 USB_HILOGI(MODULE_JS_NAPI, "AniCallBack enter.");
1133 using ::ohos::usbManager::UsbTransferStatus;
1134 ReadDataToBuffer(asyncContext, info);
1135 int32_t actualLength = info.actualLength;
1136 UsbTransferStatus status((UsbTransferStatus::key_t)info.status);
1137 std::vector<UsbIsoPacketDescriptor> isoPacketDesc;
1138 for (const auto &isoInfoItem : isoInfo) {
1139 USB_HILOGE(MODULE_JS_NAPI, "AniCallBack has iso info.");
1140 UsbIsoPacketDescriptor descriptor = {
1141 isoInfoItem.isoActualLength, isoInfoItem.isoLength, {(UsbTransferStatus::key_t)isoInfoItem.isoStatus}};
1142 isoPacketDesc.push_back(descriptor);
1143 }
1144 ::taihe::array<UsbIsoPacketDescriptor> isoPacketDescs(isoPacketDesc);
1145 ::ohos::usbManager::SubmitTransferCallback callbackParam = {
1146 std::move(actualLength), std::move(status), std::move(isoPacketDescs)};
1147 auto task = [asyncContext, callbackParam]() {
1148 ani_env *env = nullptr;
1149 ani_options aniArgs {0, nullptr};
1150 if (ANI_ERROR == asyncContext->vm->AttachCurrentThread(&aniArgs, ANI_VERSION_1, &env)) {
1151 if (ANI_OK != asyncContext->vm->GetEnv(ANI_VERSION_1, &env)) {
1152 USB_HILOGI(MODULE_JS_NAPI, "GetEnv failed.");
1153 return;
1154 }
1155 }
1156 if (ANI_OK != env->CreateLocalScope(LOCAL_SCOPE_SIZE)) {
1157 USB_HILOGI(MODULE_JS_NAPI, "CreateLocalScope failed.");
1158 return;
1159 }
1160 auto businessError = GetDefaultBusinessError(env);
1161 auto param = ::taihe::into_ani<::ohos::usbManager::SubmitTransferCallback>(env, callbackParam);
1162 auto callbackFunc = asyncContext->callbackRef;
1163 ani_ref ani_argv[] = {businessError, param};
1164 ani_ref ani_result;
1165 ani_class cls;
1166 env->FindClass("Lstd/core/Function2;", &cls);
1167 ani_boolean ret;
1168 env->Object_InstanceOf(callbackFunc, cls, &ret);
1169 if (!ret) {
1170 USB_HILOGI(MODULE_JS_NAPI, "%{public}s: callbackFunc is not instance Of Function2.", __func__);
1171 }
1172 auto errCode = env->FunctionalObject_Call(static_cast<ani_fn_object>(callbackFunc), 2, ani_argv, &ani_result);
1173 env->DestroyLocalScope();
1174 USB_HILOGI(MODULE_JS_NAPI, "AniCallBack enter 5 call returned %{public}d.", errCode);
1175 };
1176 if (!SendEventToMainThread(task)) {
1177 USB_HILOGI(MODULE_JS_NAPI, "SendEventToMainThread failed.");
1178 }
1179 }
1180
CreateTransferContext(const UsbDataTransferParams & transfer)1181 USBTransferAsyncContext* CreateTransferContext(const UsbDataTransferParams& transfer)
1182 {
1183 auto context = new (std::nothrow) USBTransferAsyncContext();
1184 if (!context) {
1185 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
1186 return nullptr;
1187 }
1188 context->pipe.SetBusNum(static_cast<uint8_t>(transfer.devPipe.busNum));
1189 context->pipe.SetDevAddr(static_cast<uint8_t>(transfer.devPipe.devAddress));
1190 context->flags = transfer.flags;
1191 context->endpoint = transfer.endpoint;
1192 context->type = transfer.type;
1193 context->timeOut = transfer.timeout;
1194 context->length = transfer.length;
1195 context->numIsoPackets = transfer.isoPacketCount;
1196 return context;
1197 }
1198
ExtractBufferData(USBTransferAsyncContext * context,ani_object array_obj)1199 bool ExtractBufferData(USBTransferAsyncContext* context, ani_object array_obj)
1200 {
1201 ani_ref buffer;
1202 ani_env* env = ::taihe::get_env();
1203 ani_vm* vm = nullptr;
1204 if (env->GetVM(&vm) != ANI_OK ||
1205 env->Object_GetFieldByName_Ref(array_obj, "buffer", &buffer) != ANI_OK) {
1206 return false;
1207 }
1208 void* data;
1209 size_t size;
1210 if (env->ArrayBuffer_GetInfo(static_cast<ani_arraybuffer>(buffer), &data, &size) != ANI_OK) {
1211 return false;
1212 }
1213 context->vm = vm;
1214 context->buffer = static_cast<uint8_t*>(data);
1215 context->bufferLength = size;
1216 return true;
1217 }
1218
SetupCallback(USBTransferAsyncContext * context,ani_object callbackObj)1219 bool SetupCallback(USBTransferAsyncContext* context, ani_object callbackObj)
1220 {
1221 ani_ref callback;
1222 ani_env* env = ::taihe::get_env();
1223 if (env->GlobalReference_Create(callbackObj, &callback) == ANI_OK) {
1224 context->callbackRef = reinterpret_cast<ani_object>(callback);
1225 return true;
1226 } else {
1227 return false;
1228 }
1229 }
1230
PrepareTransferInfo(const UsbDataTransferParams & transfer,USBTransferAsyncContext * context)1231 OHOS::HDI::Usb::V1_2::USBTransferInfo PrepareTransferInfo(
1232 const UsbDataTransferParams& transfer, USBTransferAsyncContext* context)
1233 {
1234 OHOS::HDI::Usb::V1_2::USBTransferInfo obj;
1235 obj.endpoint = transfer.endpoint;
1236 obj.type = transfer.type;
1237 obj.timeOut = transfer.timeout;
1238 obj.length = transfer.length;
1239 obj.numIsoPackets = transfer.isoPacketCount;
1240 obj.userData = reinterpret_cast<std::uintptr_t>(context);
1241 return obj;
1242 }
1243
TransferCompleteCallback(const OHOS::USB::TransferCallbackInfo & info,const std::vector<OHOS::HDI::Usb::V1_2::UsbIsoPacketDescriptor> & isoInfo,uint64_t userData)1244 static void TransferCompleteCallback(
1245 const OHOS::USB::TransferCallbackInfo& info,
1246 const std::vector<OHOS::HDI::Usb::V1_2::UsbIsoPacketDescriptor>& isoInfo,
1247 uint64_t userData)
1248 {
1249 USBTransferAsyncContext* context = reinterpret_cast<USBTransferAsyncContext*>(userData);
1250 AniCallBack(context, info, isoInfo);
1251 }
1252
usbSubmitTransfer(UsbDataTransferParams const & transfer)1253 void usbSubmitTransfer(UsbDataTransferParams const &transfer)
1254 {
1255 if (!HasFeature(FEATURE_HOST)) {
1256 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
1257 return;
1258 }
1259 USB_HILOGE(MODULE_JS_NAPI, "SubmitTransfer enter");
1260 if (!HasFeature(FEATURE_HOST)) {
1261 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
1262 return;
1263 }
1264 auto context = CreateTransferContext(transfer);
1265 if (!context) {
1266 return;
1267 }
1268 if (!ExtractBufferData(context, reinterpret_cast<ani_object>(transfer.buffer)) ||
1269 !SetupCallback(context, reinterpret_cast<ani_object>(transfer.callback))) {
1270 delete context;
1271 return;
1272 }
1273 auto transferInfo = PrepareTransferInfo(transfer, context);
1274 if (!CreateAndWriteAshmem(context, transferInfo)) {
1275 delete context;
1276 return;
1277 }
1278 USB_HILOGE(MODULE_JS_NAPI, "CreateAndWriteAshmem OK.");
1279 int32_t ret = context->pipe.UsbSubmitTransfer(transferInfo, TransferCompleteCallback, context->ashmem);
1280 USB_HILOGE(MODULE_JS_NAPI, "usbSubmitTransfer ret: %{public}d", ret);
1281 if (ret != OHOS::USB::UEC_OK) {
1282 context->ashmem->CloseAshmem();
1283 delete context;
1284 ThrowBusinessError(UsbSubmitTransferErrorCode(ret), "");
1285 }
1286 USB_HILOGE(MODULE_JS_NAPI, "usbSubmitTransfer fin.");
1287 }
1288
usbCancelTransfer(UsbDataTransferParams const & transfer)1289 void usbCancelTransfer(UsbDataTransferParams const &transfer)
1290 {
1291 if (!HasFeature(FEATURE_HOST)) {
1292 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "");
1293 return;
1294 }
1295 OHOS::USB::USBDevicePipe nativePipe;
1296 nativePipe.SetBusNum(static_cast<uint8_t>(transfer.devPipe.busNum));
1297 nativePipe.SetDevAddr(static_cast<uint8_t>(transfer.devPipe.devAddress));
1298 int32_t endpoint = transfer.endpoint;
1299 int32_t ret = nativePipe.UsbCancelTransfer(endpoint);
1300 if (ret != OHOS::USB::UEC_OK) {
1301 ret = UsbSubmitTransferErrorCode(ret);
1302 ThrowBusinessError(ret, "");
1303 }
1304 }
1305
resetUsbDevice(::ohos::usbManager::USBDevicePipe const & pipe)1306 bool resetUsbDevice(::ohos::usbManager::USBDevicePipe const& pipe)
1307 {
1308 bool result = false;
1309 if (!HasFeature(FEATURE_HOST)) {
1310 ThrowBusinessError(CAPABILITY_NOT_SUPPORT, "Capability not supported.");
1311 return result;
1312 }
1313 OHOS::USB::USBDevicePipe pipe_tmp = ConvertUSBDevicePipe(pipe);
1314 int32_t ret = g_usbClient.ResetDevice(pipe_tmp);
1315 if (ret == OHOS::USB::UEC_OK) {
1316 result = true;
1317 } else if (ret == HDF_DEV_ERR_NO_DEVICE || ret == OHOS::USB::UEC_INTERFACE_NAME_NOT_FOUND) {
1318 ThrowBusinessError(USB_SUBMIT_TRANSFER_NO_DEVICE_ERROR,
1319 "BusinessError 14400008:No such device (it may have been disconnected).");
1320 return result;
1321 } else if (ret == OHOS::USB::UEC_SERVICE_PERMISSION_DENIED) {
1322 ThrowBusinessError(UEC_COMMON_HAS_NO_RIGHT, "No permission.");
1323 return result;
1324 } else if (ret == OHOS::USB::USB_RIGHT_FAILURE) {
1325 ThrowBusinessError(USB_DEVICE_PIPE_CHECK_ERROR, "Check devicePipe failed.");
1326 return result;
1327 } else if (ret == OHOS::USB::UEC_SERVICE_INVALID_VALUE) {
1328 ThrowBusinessError(UEC_COMMON_SERVICE_EXCEPTION,
1329 "BusinessError 14400004:Service exception. Possible causes:No accessory is plugged in.");
1330 return result;
1331 } else {
1332 ThrowBusinessError(USB_SUBMIT_TRANSFER_OTHER_ERROR, "BusinessError 14400010:Other USB error.");
1333 }
1334 return result;
1335 }
1336 } // namespace
1337
1338 // Since these macros are auto-generate, lint will cause false positive.
1339 // NOLINTBEGIN
1340 TH_EXPORT_CPP_API_getDevices(getDevices);
1341 TH_EXPORT_CPP_API_connectDevice(connectDevice);
1342 TH_EXPORT_CPP_API_hasRight(hasRight);
1343 TH_EXPORT_CPP_API_requestRightSync(requestRightSync);
1344 TH_EXPORT_CPP_API_removeRight(removeRight);
1345 TH_EXPORT_CPP_API_addDeviceAccessRight(addDeviceAccessRight);
1346 TH_EXPORT_CPP_API_getFunctionsFromString(getFunctionsFromString);
1347 TH_EXPORT_CPP_API_getStringFromFunctions(getStringFromFunctions);
1348 TH_EXPORT_CPP_API_setDeviceFunctionsSync(setDeviceFunctionsSync);
1349 TH_EXPORT_CPP_API_getDeviceFunctions(getDeviceFunctions);
1350 TH_EXPORT_CPP_API_getPortList(getPortList);
1351 TH_EXPORT_CPP_API_getPortSupportModes(getPortSupportModes);
1352 TH_EXPORT_CPP_API_setPortRoleTypesSync(setPortRoleTypesSync);
1353 TH_EXPORT_CPP_API_addAccessoryRight(addAccessoryRight);
1354 TH_EXPORT_CPP_API_claimInterface(claimInterface);
1355 TH_EXPORT_CPP_API_releaseInterface(releaseInterface);
1356 TH_EXPORT_CPP_API_setConfiguration(setConfiguration);
1357 TH_EXPORT_CPP_API_setInterface(setInterface);
1358 TH_EXPORT_CPP_API_getRawDescriptor(getRawDescriptor);
1359 TH_EXPORT_CPP_API_getFileDescriptor(getFileDescriptor);
1360 TH_EXPORT_CPP_API_usbControlTransferSync(usbControlTransferSync);
1361 TH_EXPORT_CPP_API_bulkTransferSync(bulkTransferSync);
1362 TH_EXPORT_CPP_API_closePipe(closePipe);
1363 TH_EXPORT_CPP_API_hasAccessoryRight(hasAccessoryRight);
1364 TH_EXPORT_CPP_API_requestAccessoryRightSync(requestAccessoryRightSync);
1365 TH_EXPORT_CPP_API_cancelAccessoryRight(cancelAccessoryRight);
1366 TH_EXPORT_CPP_API_getAccessoryList(getAccessoryList);
1367 TH_EXPORT_CPP_API_openAccessory(openAccessory);
1368 TH_EXPORT_CPP_API_closeAccessory(closeAccessory);
1369 TH_EXPORT_CPP_API_usbSubmitTransfer(usbSubmitTransfer);
1370 TH_EXPORT_CPP_API_usbCancelTransfer(usbCancelTransfer);
1371 TH_EXPORT_CPP_API_resetUsbDevice(resetUsbDevice);
1372 // NOLINTEND
1373