usb 2.4.3 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitmodules +2 -2
- package/CHANGELOG.md +5 -0
- package/README.md +34 -0
- package/binding.gyp +48 -25
- package/dist/usb/bindings.d.ts +1 -0
- package/dist/usb/index.d.ts +2 -0
- package/dist/usb/index.js +25 -13
- package/dist/usb/index.js.map +1 -1
- package/package.json +1 -1
- package/prebuilds/android-arm/node.napi.armv7.node +0 -0
- package/prebuilds/android-arm64/node.napi.armv8.node +0 -0
- package/prebuilds/darwin-x64+arm64/node.napi.node +0 -0
- package/prebuilds/linux-arm/node.napi.armv6.node +0 -0
- package/prebuilds/linux-arm/node.napi.armv7.node +0 -0
- package/prebuilds/linux-arm64/node.napi.armv8.node +0 -0
- package/prebuilds/linux-ia32/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
- package/prebuilds/linux-x64/node.napi.musl.node +0 -0
- package/prebuilds/win32-ia32/node.napi.node +0 -0
- package/prebuilds/win32-x64/node.napi.node +0 -0
- package/src/device.cc +309 -309
- package/src/helpers.h +36 -36
- package/src/hotplug/hotplug.h +22 -0
- package/src/hotplug/libusb.cc +91 -0
- package/src/hotplug/windows.cc +160 -0
- package/src/node_usb.cc +246 -282
- package/src/node_usb.h +64 -67
- package/src/thread_name.cc +1 -1
- package/src/transfer.cc +114 -114
- package/test/usb.coffee +178 -178
- package/test/webusb.coffee +140 -140
- package/tsc/usb/bindings.ts +1 -0
- package/tsc/usb/index.ts +30 -12
package/src/node_usb.cc
CHANGED
|
@@ -1,346 +1,310 @@
|
|
|
1
1
|
#include "node_usb.h"
|
|
2
2
|
#include "thread_name.h"
|
|
3
|
+
#include "hotplug/hotplug.h"
|
|
3
4
|
|
|
4
5
|
Napi::Value SetDebugLevel(const Napi::CallbackInfo& info);
|
|
5
6
|
Napi::Value UseUsbDkBackend(const Napi::CallbackInfo& info);
|
|
6
7
|
Napi::Value GetDeviceList(const Napi::CallbackInfo& info);
|
|
7
8
|
Napi::Value GetLibusbCapability(const Napi::CallbackInfo& info);
|
|
9
|
+
Napi::Value SupportedHotplugEvents(const Napi::CallbackInfo& info);
|
|
8
10
|
Napi::Value EnableHotplugEvents(const Napi::CallbackInfo& info);
|
|
9
11
|
Napi::Value DisableHotplugEvents(const Napi::CallbackInfo& info);
|
|
10
12
|
Napi::Value RefHotplugEvents(const Napi::CallbackInfo& info);
|
|
11
13
|
Napi::Value UnrefHotplugEvents(const Napi::CallbackInfo& info);
|
|
12
14
|
void initConstants(Napi::Object target);
|
|
13
15
|
|
|
14
|
-
void handleHotplug(HotPlug* info){
|
|
15
|
-
Napi::ObjectReference* hotplugThis = info->hotplugThis;
|
|
16
|
-
Napi::Env env = hotplugThis->Env();
|
|
17
|
-
Napi::HandleScope scope(env);
|
|
18
|
-
|
|
19
|
-
libusb_device* dev = info->device;
|
|
20
|
-
libusb_hotplug_event event = info->event;
|
|
21
|
-
|
|
22
|
-
DEBUG_LOG("HandleHotplug %p %i", dev, event);
|
|
23
|
-
|
|
24
|
-
Napi::Value v8dev = Device::get(env, dev);
|
|
25
|
-
libusb_unref_device(dev);
|
|
26
|
-
|
|
27
|
-
Napi::String eventName;
|
|
28
|
-
if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) {
|
|
29
|
-
DEBUG_LOG("Device arrived");
|
|
30
|
-
eventName = Napi::String::New(env, "attach");
|
|
31
|
-
|
|
32
|
-
} else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) {
|
|
33
|
-
DEBUG_LOG("Device left");
|
|
34
|
-
eventName = Napi::String::New(env, "detach");
|
|
35
|
-
|
|
36
|
-
} else {
|
|
37
|
-
DEBUG_LOG("Unhandled hotplug event %d\n", event);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
hotplugThis->Get("emit").As<Napi::Function>().MakeCallback(hotplugThis->Value(), { eventName, v8dev });
|
|
42
|
-
delete info;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
16
|
void USBThreadFn(ModuleData* instanceData) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
17
|
+
SetThreadName("node-usb events");
|
|
18
|
+
libusb_context* usb_context = instanceData->usb_context;
|
|
19
|
+
|
|
20
|
+
while(true) {
|
|
21
|
+
if (instanceData->handlingEvents == false) {
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
libusb_handle_events(usb_context);
|
|
25
|
+
}
|
|
55
26
|
}
|
|
56
27
|
|
|
57
28
|
ModuleData::ModuleData(libusb_context* usb_context) : usb_context(usb_context), hotplugQueue(handleHotplug) {
|
|
58
|
-
|
|
59
|
-
|
|
29
|
+
handlingEvents = true;
|
|
30
|
+
usb_thread = std::thread(USBThreadFn, this);
|
|
31
|
+
hotplugManager = HotPlugManager::create();
|
|
60
32
|
}
|
|
61
33
|
|
|
62
34
|
ModuleData::~ModuleData() {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
int LIBUSB_CALL hotplug_callback(libusb_context* ctx, libusb_device* device,
|
|
74
|
-
libusb_hotplug_event event, void* user_data) {
|
|
75
|
-
libusb_ref_device(device);
|
|
76
|
-
ModuleData* instanceData = (ModuleData*)user_data;
|
|
77
|
-
instanceData->hotplugQueue.post(new HotPlug {device, event, &instanceData->hotplugThis});
|
|
78
|
-
return 0;
|
|
35
|
+
handlingEvents = false;
|
|
36
|
+
libusb_interrupt_event_handler(usb_context);
|
|
37
|
+
usb_thread.join();
|
|
38
|
+
|
|
39
|
+
if (usb_context != nullptr) {
|
|
40
|
+
libusb_exit(usb_context);
|
|
41
|
+
usb_context = nullptr;
|
|
42
|
+
}
|
|
79
43
|
}
|
|
80
44
|
|
|
81
45
|
Napi::Object Init(Napi::Env env, Napi::Object exports) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
46
|
+
Napi::HandleScope scope(env);
|
|
47
|
+
initConstants(exports);
|
|
48
|
+
|
|
49
|
+
// Initialize libusb. On error, halt initialization.
|
|
50
|
+
libusb_context* usb_context = nullptr;
|
|
51
|
+
int res = libusb_init(&usb_context);
|
|
52
|
+
|
|
53
|
+
exports.Set("INIT_ERROR", Napi::Number::New(env, res));
|
|
54
|
+
if (res != 0) {
|
|
55
|
+
return exports;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
env.SetInstanceData(new ModuleData(usb_context));
|
|
59
|
+
|
|
60
|
+
Device::Init(env, exports);
|
|
61
|
+
Transfer::Init(env, exports);
|
|
62
|
+
|
|
63
|
+
exports.Set("setDebugLevel", Napi::Function::New(env, SetDebugLevel));
|
|
64
|
+
exports.Set("useUsbDkBackend", Napi::Function::New(env, UseUsbDkBackend));
|
|
65
|
+
exports.Set("getDeviceList", Napi::Function::New(env, GetDeviceList));
|
|
66
|
+
exports.Set("_getLibusbCapability", Napi::Function::New(env, GetLibusbCapability));
|
|
67
|
+
exports.Set("_supportedHotplugEvents", Napi::Function::New(env, SupportedHotplugEvents));
|
|
68
|
+
exports.Set("_enableHotplugEvents", Napi::Function::New(env, EnableHotplugEvents));
|
|
69
|
+
exports.Set("_disableHotplugEvents", Napi::Function::New(env, DisableHotplugEvents));
|
|
70
|
+
exports.Set("refHotplugEvents", Napi::Function::New(env, RefHotplugEvents));
|
|
71
|
+
exports.Set("unrefHotplugEvents", Napi::Function::New(env, UnrefHotplugEvents));
|
|
72
|
+
return exports;
|
|
108
73
|
}
|
|
109
74
|
|
|
110
75
|
NODE_API_MODULE(usb_bindings, Init)
|
|
111
76
|
|
|
112
77
|
Napi::Value SetDebugLevel(const Napi::CallbackInfo& info) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
78
|
+
Napi::Env env = info.Env();
|
|
79
|
+
Napi::HandleScope scope(env);
|
|
80
|
+
if (info.Length() != 1 || !info[0].IsNumber() || info[0].As<Napi::Number>().Uint32Value() > 4) {
|
|
81
|
+
THROW_BAD_ARGS("Usb::SetDebugLevel argument is invalid. [uint:[0-4]]!")
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
libusb_context* usb_context = env.GetInstanceData<ModuleData>()->usb_context;
|
|
85
|
+
libusb_set_option(usb_context, LIBUSB_OPTION_LOG_LEVEL, info[0].As<Napi::Number>().Int32Value());
|
|
86
|
+
return env.Undefined();
|
|
122
87
|
}
|
|
123
88
|
|
|
124
89
|
Napi::Value UseUsbDkBackend(const Napi::CallbackInfo& info) {
|
|
125
|
-
|
|
126
|
-
|
|
90
|
+
Napi::Env env = info.Env();
|
|
91
|
+
Napi::HandleScope scope(env);
|
|
127
92
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
93
|
+
libusb_context* usb_context = env.GetInstanceData<ModuleData>()->usb_context;
|
|
94
|
+
libusb_set_option(usb_context, LIBUSB_OPTION_USE_USBDK);
|
|
95
|
+
return env.Undefined();
|
|
131
96
|
}
|
|
132
97
|
|
|
133
98
|
Napi::Value GetDeviceList(const Napi::CallbackInfo& info) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
99
|
+
Napi::Env env = info.Env();
|
|
100
|
+
Napi::HandleScope scope(env);
|
|
101
|
+
libusb_device** devs;
|
|
137
102
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
103
|
+
libusb_context* usb_context = env.GetInstanceData<ModuleData>()->usb_context;
|
|
104
|
+
int cnt = libusb_get_device_list(usb_context, &devs);
|
|
105
|
+
CHECK_USB(cnt);
|
|
141
106
|
|
|
142
|
-
|
|
107
|
+
Napi::Array arr = Napi::Array::New(env, cnt);
|
|
143
108
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
109
|
+
for(int i = 0; i < cnt; i++) {
|
|
110
|
+
arr.Set(i, Device::get(env, devs[i]));
|
|
111
|
+
}
|
|
112
|
+
libusb_free_device_list(devs, true);
|
|
113
|
+
return arr;
|
|
149
114
|
}
|
|
150
115
|
|
|
151
116
|
Napi::Value GetLibusbCapability(const Napi::CallbackInfo& info) {
|
|
152
|
-
|
|
117
|
+
Napi::Env env = info.Env();
|
|
118
|
+
|
|
119
|
+
if (info.Length() != 1 || !info[0].IsNumber()) {
|
|
120
|
+
THROW_BAD_ARGS("Usb::GetLibusbCapability argument is invalid!")
|
|
121
|
+
}
|
|
153
122
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
123
|
+
int res = libusb_has_capability(info[0].As<Napi::Number>().Int32Value());
|
|
124
|
+
return Napi::Number::New(env, res);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
Napi::Value SupportedHotplugEvents(const Napi::CallbackInfo& info) {
|
|
128
|
+
Napi::Env env = info.Env();
|
|
129
|
+
Napi::HandleScope scope(env);
|
|
130
|
+
ModuleData* instanceData = env.GetInstanceData<ModuleData>();
|
|
157
131
|
|
|
158
|
-
|
|
159
|
-
|
|
132
|
+
int res = instanceData->hotplugManager->supportedHotplugEvents();
|
|
133
|
+
return Napi::Number::New(env, res);
|
|
160
134
|
}
|
|
161
135
|
|
|
162
136
|
Napi::Value EnableHotplugEvents(const Napi::CallbackInfo& info) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
LIBUSB_HOTPLUG_MATCH_ANY,
|
|
177
|
-
LIBUSB_HOTPLUG_MATCH_ANY,
|
|
178
|
-
hotplug_callback,
|
|
179
|
-
instanceData,
|
|
180
|
-
&instanceData->hotplugHandle
|
|
181
|
-
));
|
|
182
|
-
instanceData->hotplugQueue.start(env);
|
|
183
|
-
instanceData->hotplugEnabled = true;
|
|
184
|
-
}
|
|
185
|
-
return env.Undefined();
|
|
137
|
+
Napi::Env env = info.Env();
|
|
138
|
+
Napi::HandleScope scope(env);
|
|
139
|
+
ModuleData* instanceData = env.GetInstanceData<ModuleData>();
|
|
140
|
+
|
|
141
|
+
if (!instanceData->hotplugEnabled) {
|
|
142
|
+
instanceData->hotplugThis.Reset(info.This().As<Napi::Object>(), 1);
|
|
143
|
+
|
|
144
|
+
instanceData->hotplugManager->enableHotplug(env, instanceData);
|
|
145
|
+
|
|
146
|
+
instanceData->hotplugQueue.start(env);
|
|
147
|
+
instanceData->hotplugEnabled = true;
|
|
148
|
+
}
|
|
149
|
+
return env.Undefined();
|
|
186
150
|
}
|
|
187
151
|
|
|
188
152
|
Napi::Value DisableHotplugEvents(const Napi::CallbackInfo& info) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
153
|
+
Napi::Env env = info.Env();
|
|
154
|
+
Napi::HandleScope scope(env);
|
|
155
|
+
ModuleData* instanceData = env.GetInstanceData<ModuleData>();
|
|
156
|
+
|
|
157
|
+
if (instanceData->hotplugEnabled) {
|
|
158
|
+
instanceData->hotplugManager->disableHotplug(env, instanceData);
|
|
159
|
+
|
|
160
|
+
instanceData->hotplugQueue.stop();
|
|
161
|
+
instanceData->hotplugEnabled = false;
|
|
162
|
+
}
|
|
163
|
+
return env.Undefined();
|
|
200
164
|
}
|
|
201
165
|
|
|
202
166
|
Napi::Value RefHotplugEvents(const Napi::CallbackInfo& info) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
167
|
+
Napi::Env env = info.Env();
|
|
168
|
+
Napi::HandleScope scope(env);
|
|
169
|
+
ModuleData* instanceData = env.GetInstanceData<ModuleData>();
|
|
170
|
+
|
|
171
|
+
if (instanceData->hotplugEnabled) {
|
|
172
|
+
instanceData->hotplugQueue.ref(env);
|
|
173
|
+
}
|
|
174
|
+
return env.Undefined();
|
|
211
175
|
}
|
|
212
176
|
|
|
213
177
|
Napi::Value UnrefHotplugEvents(const Napi::CallbackInfo& info) {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
178
|
+
Napi::Env env = info.Env();
|
|
179
|
+
Napi::HandleScope scope(env);
|
|
180
|
+
ModuleData* instanceData = env.GetInstanceData<ModuleData>();
|
|
181
|
+
|
|
182
|
+
if (instanceData->hotplugEnabled) {
|
|
183
|
+
instanceData->hotplugQueue.unref(env);
|
|
184
|
+
}
|
|
185
|
+
return env.Undefined();
|
|
222
186
|
}
|
|
223
187
|
|
|
224
188
|
#define DEFINE_CONSTANT(OBJ, VALUE) \
|
|
225
|
-
|
|
189
|
+
OBJ.DefineProperty(Napi::PropertyDescriptor::Value(#VALUE, Napi::Number::New(OBJ.Env(), VALUE), static_cast<napi_property_attributes>(napi_enumerable | napi_configurable)));
|
|
226
190
|
|
|
227
191
|
void initConstants(Napi::Object target){
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
192
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_PER_INTERFACE);
|
|
193
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_AUDIO);
|
|
194
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_COMM);
|
|
195
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_HID);
|
|
196
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_PRINTER);
|
|
197
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_PTP);
|
|
198
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_MASS_STORAGE);
|
|
199
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_HUB);
|
|
200
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_DATA);
|
|
201
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_WIRELESS);
|
|
202
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_APPLICATION);
|
|
203
|
+
DEFINE_CONSTANT(target, LIBUSB_CLASS_VENDOR_SPEC);
|
|
204
|
+
// libusb_standard_request
|
|
205
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_STATUS);
|
|
206
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_CLEAR_FEATURE);
|
|
207
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_FEATURE);
|
|
208
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_ADDRESS );
|
|
209
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_DESCRIPTOR);
|
|
210
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_DESCRIPTOR);
|
|
211
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_CONFIGURATION);
|
|
212
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_CONFIGURATION );
|
|
213
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_INTERFACE);
|
|
214
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_INTERFACE);
|
|
215
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_SYNCH_FRAME);
|
|
216
|
+
// libusb_descriptor_type
|
|
217
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_DEVICE);
|
|
218
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_CONFIG);
|
|
219
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_STRING);
|
|
220
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_BOS);
|
|
221
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_INTERFACE);
|
|
222
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_ENDPOINT);
|
|
223
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_HID);
|
|
224
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_REPORT);
|
|
225
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_PHYSICAL);
|
|
226
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_HUB);
|
|
227
|
+
// libusb_endpoint_direction
|
|
228
|
+
DEFINE_CONSTANT(target, LIBUSB_ENDPOINT_IN);
|
|
229
|
+
DEFINE_CONSTANT(target, LIBUSB_ENDPOINT_OUT);
|
|
230
|
+
// libusb_transfer_type
|
|
231
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_CONTROL);
|
|
232
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_ISOCHRONOUS);
|
|
233
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_BULK);
|
|
234
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_INTERRUPT);
|
|
235
|
+
// libusb_iso_sync_type
|
|
236
|
+
DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_NONE);
|
|
237
|
+
DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_ASYNC);
|
|
238
|
+
DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_ADAPTIVE);
|
|
239
|
+
DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_SYNC);
|
|
240
|
+
// libusb_iso_usage_type
|
|
241
|
+
DEFINE_CONSTANT(target, LIBUSB_ISO_USAGE_TYPE_DATA);
|
|
242
|
+
DEFINE_CONSTANT(target, LIBUSB_ISO_USAGE_TYPE_FEEDBACK);
|
|
243
|
+
DEFINE_CONSTANT(target, LIBUSB_ISO_USAGE_TYPE_IMPLICIT);
|
|
244
|
+
// libusb_transfer_status
|
|
245
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_COMPLETED);
|
|
246
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_ERROR);
|
|
247
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TIMED_OUT);
|
|
248
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_CANCELLED);
|
|
249
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_STALL);
|
|
250
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_NO_DEVICE);
|
|
251
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_OVERFLOW);
|
|
252
|
+
// libusb_transfer_flags
|
|
253
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_SHORT_NOT_OK);
|
|
254
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_FREE_BUFFER);
|
|
255
|
+
DEFINE_CONSTANT(target, LIBUSB_TRANSFER_FREE_TRANSFER);
|
|
256
|
+
// libusb_request_type
|
|
257
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_STANDARD);
|
|
258
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_CLASS);
|
|
259
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_VENDOR);
|
|
260
|
+
DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_RESERVED);
|
|
261
|
+
// libusb_request_recipient
|
|
262
|
+
DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_DEVICE);
|
|
263
|
+
DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_INTERFACE);
|
|
264
|
+
DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_ENDPOINT);
|
|
265
|
+
DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_OTHER);
|
|
266
|
+
|
|
267
|
+
DEFINE_CONSTANT(target, LIBUSB_CONTROL_SETUP_SIZE);
|
|
268
|
+
DEFINE_CONSTANT(target, LIBUSB_DT_BOS_SIZE);
|
|
269
|
+
|
|
270
|
+
// libusb_capability
|
|
271
|
+
DEFINE_CONSTANT(target, LIBUSB_CAP_HAS_CAPABILITY);
|
|
272
|
+
DEFINE_CONSTANT(target, LIBUSB_CAP_HAS_HOTPLUG);
|
|
273
|
+
DEFINE_CONSTANT(target, LIBUSB_CAP_HAS_HID_ACCESS);
|
|
274
|
+
DEFINE_CONSTANT(target, LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER);
|
|
275
|
+
|
|
276
|
+
// libusb_error
|
|
277
|
+
// Input/output error
|
|
278
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_IO);
|
|
279
|
+
// Invalid parameter
|
|
280
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_INVALID_PARAM);
|
|
281
|
+
// Access denied (insufficient permissions)
|
|
282
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_ACCESS);
|
|
283
|
+
// No such device (it may have been disconnected)
|
|
284
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_NO_DEVICE);
|
|
285
|
+
// Entity not found
|
|
286
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_NOT_FOUND);
|
|
287
|
+
// Resource busy
|
|
288
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_BUSY);
|
|
289
|
+
// Operation timed out
|
|
290
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_TIMEOUT);
|
|
291
|
+
// Overflow
|
|
292
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_OVERFLOW);
|
|
293
|
+
// Pipe error
|
|
294
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_PIPE);
|
|
295
|
+
// System call interrupted (perhaps due to signal)
|
|
296
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_INTERRUPTED);
|
|
297
|
+
// Insufficient memory
|
|
298
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_NO_MEM);
|
|
299
|
+
// Operation not supported or unimplemented on this platform
|
|
300
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_NOT_SUPPORTED);
|
|
301
|
+
// Other error
|
|
302
|
+
DEFINE_CONSTANT(target, LIBUSB_ERROR_OTHER);
|
|
339
303
|
}
|
|
340
304
|
|
|
341
305
|
Napi::Error libusbException(Napi::Env env, int errorno) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
306
|
+
const char* err = libusb_error_name(errorno);
|
|
307
|
+
Napi::Error e = Napi::Error::New(env, err);
|
|
308
|
+
e.Set("errno", (double)errorno);
|
|
309
|
+
return e;
|
|
346
310
|
}
|