• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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