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/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
- SetThreadName("node-usb events");
47
- libusb_context* usb_context = instanceData->usb_context;
48
-
49
- while(true) {
50
- if (instanceData->handlingEvents == false) {
51
- break;
52
- }
53
- libusb_handle_events(usb_context);
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
- handlingEvents = true;
59
- usb_thread = std::thread(USBThreadFn, this);
29
+ handlingEvents = true;
30
+ usb_thread = std::thread(USBThreadFn, this);
31
+ hotplugManager = HotPlugManager::create();
60
32
  }
61
33
 
62
34
  ModuleData::~ModuleData() {
63
- handlingEvents = false;
64
- libusb_interrupt_event_handler(usb_context);
65
- usb_thread.join();
66
-
67
- if (usb_context != nullptr) {
68
- libusb_exit(usb_context);
69
- usb_context = nullptr;
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
- Napi::HandleScope scope(env);
83
- initConstants(exports);
84
-
85
- // Initialize libusb. On error, halt initialization.
86
- libusb_context* usb_context = nullptr;
87
- int res = libusb_init(&usb_context);
88
-
89
- exports.Set("INIT_ERROR", Napi::Number::New(env, res));
90
- if (res != 0) {
91
- return exports;
92
- }
93
-
94
- env.SetInstanceData(new ModuleData(usb_context));
95
-
96
- Device::Init(env, exports);
97
- Transfer::Init(env, exports);
98
-
99
- exports.Set("setDebugLevel", Napi::Function::New(env, SetDebugLevel));
100
- exports.Set("useUsbDkBackend", Napi::Function::New(env, UseUsbDkBackend));
101
- exports.Set("getDeviceList", Napi::Function::New(env, GetDeviceList));
102
- exports.Set("_getLibusbCapability", Napi::Function::New(env, GetLibusbCapability));
103
- exports.Set("_enableHotplugEvents", Napi::Function::New(env, EnableHotplugEvents));
104
- exports.Set("_disableHotplugEvents", Napi::Function::New(env, DisableHotplugEvents));
105
- exports.Set("refHotplugEvents", Napi::Function::New(env, RefHotplugEvents));
106
- exports.Set("unrefHotplugEvents", Napi::Function::New(env, UnrefHotplugEvents));
107
- return exports;
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
- Napi::Env env = info.Env();
114
- Napi::HandleScope scope(env);
115
- if (info.Length() != 1 || !info[0].IsNumber() || info[0].As<Napi::Number>().Uint32Value() > 4) {
116
- THROW_BAD_ARGS("Usb::SetDebugLevel argument is invalid. [uint:[0-4]]!")
117
- }
118
-
119
- libusb_context* usb_context = env.GetInstanceData<ModuleData>()->usb_context;
120
- libusb_set_option(usb_context, LIBUSB_OPTION_LOG_LEVEL, info[0].As<Napi::Number>().Int32Value());
121
- return env.Undefined();
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
- Napi::Env env = info.Env();
126
- Napi::HandleScope scope(env);
90
+ Napi::Env env = info.Env();
91
+ Napi::HandleScope scope(env);
127
92
 
128
- libusb_context* usb_context = env.GetInstanceData<ModuleData>()->usb_context;
129
- libusb_set_option(usb_context, LIBUSB_OPTION_USE_USBDK);
130
- return env.Undefined();
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
- Napi::Env env = info.Env();
135
- Napi::HandleScope scope(env);
136
- libusb_device** devs;
99
+ Napi::Env env = info.Env();
100
+ Napi::HandleScope scope(env);
101
+ libusb_device** devs;
137
102
 
138
- libusb_context* usb_context = env.GetInstanceData<ModuleData>()->usb_context;
139
- int cnt = libusb_get_device_list(usb_context, &devs);
140
- CHECK_USB(cnt);
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
- Napi::Array arr = Napi::Array::New(env, cnt);
107
+ Napi::Array arr = Napi::Array::New(env, cnt);
143
108
 
144
- for(int i = 0; i < cnt; i++) {
145
- arr.Set(i, Device::get(env, devs[i]));
146
- }
147
- libusb_free_device_list(devs, true);
148
- return arr;
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
- Napi::Env env = info.Env();
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
- if (info.Length() != 1 || !info[0].IsNumber()) {
155
- THROW_BAD_ARGS("Usb::GetLibusbCapability argument is invalid!")
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
- int res = libusb_has_capability(info[0].As<Napi::Number>().Int32Value());
159
- return Napi::Number::New(env, res);
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
- Napi::Env env = info.Env();
164
- Napi::HandleScope scope(env);
165
- ModuleData* instanceData = env.GetInstanceData<ModuleData>();
166
-
167
- if (!instanceData->hotplugEnabled) {
168
- instanceData->hotplugThis.Reset(info.This().As<Napi::Object>(), 1);
169
-
170
- libusb_context* usb_context = instanceData->usb_context;
171
- CHECK_USB(libusb_hotplug_register_callback(
172
- usb_context,
173
- (libusb_hotplug_event)(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT),
174
- (libusb_hotplug_flag)0,
175
- LIBUSB_HOTPLUG_MATCH_ANY,
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
- Napi::Env env = info.Env();
190
- Napi::HandleScope scope(env);
191
- ModuleData* instanceData = env.GetInstanceData<ModuleData>();
192
-
193
- if (instanceData->hotplugEnabled) {
194
- libusb_context* usb_context = instanceData->usb_context;
195
- libusb_hotplug_deregister_callback(usb_context, instanceData->hotplugHandle);
196
- instanceData->hotplugQueue.stop();
197
- instanceData->hotplugEnabled = false;
198
- }
199
- return env.Undefined();
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
- Napi::Env env = info.Env();
204
- Napi::HandleScope scope(env);
205
- ModuleData* instanceData = env.GetInstanceData<ModuleData>();
206
-
207
- if (instanceData->hotplugEnabled) {
208
- instanceData->hotplugQueue.ref(env);
209
- }
210
- return env.Undefined();
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
- Napi::Env env = info.Env();
215
- Napi::HandleScope scope(env);
216
- ModuleData* instanceData = env.GetInstanceData<ModuleData>();
217
-
218
- if (instanceData->hotplugEnabled) {
219
- instanceData->hotplugQueue.unref(env);
220
- }
221
- return env.Undefined();
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
- OBJ.DefineProperty(Napi::PropertyDescriptor::Value(#VALUE, Napi::Number::New(OBJ.Env(), VALUE), static_cast<napi_property_attributes>(napi_enumerable | napi_configurable)));
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
- DEFINE_CONSTANT(target, LIBUSB_CLASS_PER_INTERFACE);
229
- DEFINE_CONSTANT(target, LIBUSB_CLASS_AUDIO);
230
- DEFINE_CONSTANT(target, LIBUSB_CLASS_COMM);
231
- DEFINE_CONSTANT(target, LIBUSB_CLASS_HID);
232
- DEFINE_CONSTANT(target, LIBUSB_CLASS_PRINTER);
233
- DEFINE_CONSTANT(target, LIBUSB_CLASS_PTP);
234
- DEFINE_CONSTANT(target, LIBUSB_CLASS_MASS_STORAGE);
235
- DEFINE_CONSTANT(target, LIBUSB_CLASS_HUB);
236
- DEFINE_CONSTANT(target, LIBUSB_CLASS_DATA);
237
- DEFINE_CONSTANT(target, LIBUSB_CLASS_WIRELESS);
238
- DEFINE_CONSTANT(target, LIBUSB_CLASS_APPLICATION);
239
- DEFINE_CONSTANT(target, LIBUSB_CLASS_VENDOR_SPEC);
240
- // libusb_standard_request
241
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_STATUS);
242
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_CLEAR_FEATURE);
243
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_FEATURE);
244
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_ADDRESS );
245
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_DESCRIPTOR);
246
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_DESCRIPTOR);
247
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_CONFIGURATION);
248
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_CONFIGURATION );
249
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_GET_INTERFACE);
250
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_SET_INTERFACE);
251
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_SYNCH_FRAME);
252
- // libusb_descriptor_type
253
- DEFINE_CONSTANT(target, LIBUSB_DT_DEVICE);
254
- DEFINE_CONSTANT(target, LIBUSB_DT_CONFIG);
255
- DEFINE_CONSTANT(target, LIBUSB_DT_STRING);
256
- DEFINE_CONSTANT(target, LIBUSB_DT_BOS);
257
- DEFINE_CONSTANT(target, LIBUSB_DT_INTERFACE);
258
- DEFINE_CONSTANT(target, LIBUSB_DT_ENDPOINT);
259
- DEFINE_CONSTANT(target, LIBUSB_DT_HID);
260
- DEFINE_CONSTANT(target, LIBUSB_DT_REPORT);
261
- DEFINE_CONSTANT(target, LIBUSB_DT_PHYSICAL);
262
- DEFINE_CONSTANT(target, LIBUSB_DT_HUB);
263
- // libusb_endpoint_direction
264
- DEFINE_CONSTANT(target, LIBUSB_ENDPOINT_IN);
265
- DEFINE_CONSTANT(target, LIBUSB_ENDPOINT_OUT);
266
- // libusb_transfer_type
267
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_CONTROL);
268
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_ISOCHRONOUS);
269
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_BULK);
270
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TYPE_INTERRUPT);
271
- // libusb_iso_sync_type
272
- DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_NONE);
273
- DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_ASYNC);
274
- DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_ADAPTIVE);
275
- DEFINE_CONSTANT(target, LIBUSB_ISO_SYNC_TYPE_SYNC);
276
- // libusb_iso_usage_type
277
- DEFINE_CONSTANT(target, LIBUSB_ISO_USAGE_TYPE_DATA);
278
- DEFINE_CONSTANT(target, LIBUSB_ISO_USAGE_TYPE_FEEDBACK);
279
- DEFINE_CONSTANT(target, LIBUSB_ISO_USAGE_TYPE_IMPLICIT);
280
- // libusb_transfer_status
281
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_COMPLETED);
282
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_ERROR);
283
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_TIMED_OUT);
284
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_CANCELLED);
285
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_STALL);
286
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_NO_DEVICE);
287
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_OVERFLOW);
288
- // libusb_transfer_flags
289
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_SHORT_NOT_OK);
290
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_FREE_BUFFER);
291
- DEFINE_CONSTANT(target, LIBUSB_TRANSFER_FREE_TRANSFER);
292
- // libusb_request_type
293
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_STANDARD);
294
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_CLASS);
295
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_VENDOR);
296
- DEFINE_CONSTANT(target, LIBUSB_REQUEST_TYPE_RESERVED);
297
- // libusb_request_recipient
298
- DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_DEVICE);
299
- DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_INTERFACE);
300
- DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_ENDPOINT);
301
- DEFINE_CONSTANT(target, LIBUSB_RECIPIENT_OTHER);
302
-
303
- DEFINE_CONSTANT(target, LIBUSB_CONTROL_SETUP_SIZE);
304
- DEFINE_CONSTANT(target, LIBUSB_DT_BOS_SIZE);
305
-
306
- // libusb_capability
307
- DEFINE_CONSTANT(target, LIBUSB_CAP_HAS_CAPABILITY);
308
- DEFINE_CONSTANT(target, LIBUSB_CAP_HAS_HOTPLUG);
309
- DEFINE_CONSTANT(target, LIBUSB_CAP_HAS_HID_ACCESS);
310
- DEFINE_CONSTANT(target, LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER);
311
-
312
- // libusb_error
313
- // Input/output error
314
- DEFINE_CONSTANT(target, LIBUSB_ERROR_IO);
315
- // Invalid parameter
316
- DEFINE_CONSTANT(target, LIBUSB_ERROR_INVALID_PARAM);
317
- // Access denied (insufficient permissions)
318
- DEFINE_CONSTANT(target, LIBUSB_ERROR_ACCESS);
319
- // No such device (it may have been disconnected)
320
- DEFINE_CONSTANT(target, LIBUSB_ERROR_NO_DEVICE);
321
- // Entity not found
322
- DEFINE_CONSTANT(target, LIBUSB_ERROR_NOT_FOUND);
323
- // Resource busy
324
- DEFINE_CONSTANT(target, LIBUSB_ERROR_BUSY);
325
- // Operation timed out
326
- DEFINE_CONSTANT(target, LIBUSB_ERROR_TIMEOUT);
327
- // Overflow
328
- DEFINE_CONSTANT(target, LIBUSB_ERROR_OVERFLOW);
329
- // Pipe error
330
- DEFINE_CONSTANT(target, LIBUSB_ERROR_PIPE);
331
- // System call interrupted (perhaps due to signal)
332
- DEFINE_CONSTANT(target, LIBUSB_ERROR_INTERRUPTED);
333
- // Insufficient memory
334
- DEFINE_CONSTANT(target, LIBUSB_ERROR_NO_MEM);
335
- // Operation not supported or unimplemented on this platform
336
- DEFINE_CONSTANT(target, LIBUSB_ERROR_NOT_SUPPORTED);
337
- // Other error
338
- DEFINE_CONSTANT(target, LIBUSB_ERROR_OTHER);
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
- const char* err = libusb_error_name(errorno);
343
- Napi::Error e = Napi::Error::New(env, err);
344
- e.Set("errno", (double)errorno);
345
- return e;
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
  }