libusb 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. data/.gitignore +8 -0
  2. data/.travis.yml +10 -0
  3. data/.yardopts +6 -1
  4. data/Gemfile +16 -0
  5. data/{History.txt → History.md} +28 -16
  6. data/README.md +144 -0
  7. data/Rakefile +28 -24
  8. data/ext/extconf.rb +33 -0
  9. data/ext/libusbx-1.0.14/AUTHORS +50 -0
  10. data/ext/libusbx-1.0.14/COPYING +504 -0
  11. data/ext/libusbx-1.0.14/ChangeLog +139 -0
  12. data/ext/libusbx-1.0.14/INSTALL +234 -0
  13. data/ext/libusbx-1.0.14/Makefile.am +23 -0
  14. data/ext/libusbx-1.0.14/Makefile.in +803 -0
  15. data/ext/libusbx-1.0.14/NEWS +2 -0
  16. data/ext/libusbx-1.0.14/PORTING +94 -0
  17. data/ext/libusbx-1.0.14/README +28 -0
  18. data/ext/libusbx-1.0.14/THANKS +7 -0
  19. data/ext/libusbx-1.0.14/TODO +2 -0
  20. data/ext/libusbx-1.0.14/aclocal.m4 +9480 -0
  21. data/ext/libusbx-1.0.14/compile +143 -0
  22. data/ext/libusbx-1.0.14/config.guess +1501 -0
  23. data/ext/libusbx-1.0.14/config.h.in +116 -0
  24. data/ext/libusbx-1.0.14/config.sub +1705 -0
  25. data/ext/libusbx-1.0.14/configure +14818 -0
  26. data/ext/libusbx-1.0.14/configure.ac +230 -0
  27. data/ext/libusbx-1.0.14/depcomp +630 -0
  28. data/ext/libusbx-1.0.14/doc/Makefile.am +9 -0
  29. data/ext/libusbx-1.0.14/doc/Makefile.in +380 -0
  30. data/ext/libusbx-1.0.14/doc/doxygen.cfg.in +1288 -0
  31. data/ext/libusbx-1.0.14/examples/Makefile.am +18 -0
  32. data/ext/libusbx-1.0.14/examples/Makefile.in +596 -0
  33. data/ext/libusbx-1.0.14/examples/dpfp.c +506 -0
  34. data/ext/libusbx-1.0.14/examples/dpfp_threaded.c +544 -0
  35. data/ext/libusbx-1.0.14/examples/ezusb.c +616 -0
  36. data/ext/libusbx-1.0.14/examples/ezusb.h +107 -0
  37. data/ext/libusbx-1.0.14/examples/fxload.c +261 -0
  38. data/ext/libusbx-1.0.14/examples/getopt/getopt.c +1060 -0
  39. data/ext/libusbx-1.0.14/examples/getopt/getopt.h +180 -0
  40. data/ext/libusbx-1.0.14/examples/getopt/getopt1.c +188 -0
  41. data/ext/libusbx-1.0.14/examples/listdevs.c +63 -0
  42. data/ext/libusbx-1.0.14/examples/xusb.c +1036 -0
  43. data/ext/libusbx-1.0.14/install-sh +520 -0
  44. data/ext/libusbx-1.0.14/libusb-1.0.pc.in +11 -0
  45. data/ext/libusbx-1.0.14/libusb/Makefile.am +56 -0
  46. data/ext/libusbx-1.0.14/libusb/Makefile.in +721 -0
  47. data/ext/libusbx-1.0.14/libusb/core.c +1951 -0
  48. data/ext/libusbx-1.0.14/libusb/descriptor.c +731 -0
  49. data/ext/libusbx-1.0.14/libusb/io.c +2450 -0
  50. data/ext/libusbx-1.0.14/libusb/libusb-1.0.def +126 -0
  51. data/ext/libusbx-1.0.14/libusb/libusb-1.0.rc +59 -0
  52. data/ext/libusbx-1.0.14/libusb/libusb.h +1506 -0
  53. data/ext/libusbx-1.0.14/libusb/libusbi.h +910 -0
  54. data/ext/libusbx-1.0.14/libusb/os/darwin_usb.c +1807 -0
  55. data/ext/libusbx-1.0.14/libusb/os/darwin_usb.h +169 -0
  56. data/ext/libusbx-1.0.14/libusb/os/linux_usbfs.c +2569 -0
  57. data/ext/libusbx-1.0.14/libusb/os/linux_usbfs.h +149 -0
  58. data/ext/libusbx-1.0.14/libusb/os/openbsd_usb.c +727 -0
  59. data/ext/libusbx-1.0.14/libusb/os/poll_posix.h +10 -0
  60. data/ext/libusbx-1.0.14/libusb/os/poll_windows.c +747 -0
  61. data/ext/libusbx-1.0.14/libusb/os/poll_windows.h +114 -0
  62. data/ext/libusbx-1.0.14/libusb/os/threads_posix.c +80 -0
  63. data/ext/libusbx-1.0.14/libusb/os/threads_posix.h +50 -0
  64. data/ext/libusbx-1.0.14/libusb/os/threads_windows.c +211 -0
  65. data/ext/libusbx-1.0.14/libusb/os/threads_windows.h +87 -0
  66. data/ext/libusbx-1.0.14/libusb/os/windows_usb.c +4369 -0
  67. data/ext/libusbx-1.0.14/libusb/os/windows_usb.h +979 -0
  68. data/ext/libusbx-1.0.14/libusb/sync.c +321 -0
  69. data/ext/libusbx-1.0.14/libusb/version.h +18 -0
  70. data/ext/libusbx-1.0.14/libusb/version_nano.h +1 -0
  71. data/ext/libusbx-1.0.14/ltmain.sh +9636 -0
  72. data/ext/libusbx-1.0.14/missing +376 -0
  73. data/lib/libusb.rb +2 -3
  74. data/lib/libusb/call.rb +49 -7
  75. data/lib/libusb/compat.rb +15 -9
  76. data/lib/libusb/configuration.rb +15 -3
  77. data/lib/libusb/constants.rb +19 -6
  78. data/lib/libusb/context.rb +181 -3
  79. data/lib/libusb/dev_handle.rb +91 -40
  80. data/lib/libusb/endpoint.rb +41 -14
  81. data/lib/libusb/eventmachine.rb +183 -0
  82. data/lib/libusb/transfer.rb +21 -8
  83. data/lib/libusb/version_gem.rb +19 -0
  84. data/lib/libusb/{version.rb → version_struct.rb} +0 -0
  85. data/libusb.gemspec +31 -0
  86. data/test/test_libusb_compat.rb +1 -1
  87. data/test/test_libusb_compat_mass_storage.rb +2 -2
  88. data/test/test_libusb_descriptors.rb +1 -1
  89. data/test/test_libusb_event_machine.rb +118 -0
  90. data/test/test_libusb_iso_transfer.rb +6 -1
  91. data/test/test_libusb_mass_storage.rb +9 -3
  92. data/test/test_libusb_mass_storage2.rb +1 -1
  93. data/test/test_libusb_structs.rb +45 -0
  94. data/test/test_libusb_threads.rb +89 -0
  95. data/test/test_libusb_version.rb +4 -0
  96. metadata +109 -44
  97. data/.autotest +0 -23
  98. data/.gemtest +0 -0
  99. data/Manifest.txt +0 -3
  100. data/README.rdoc +0 -115
  101. data/test/test_libusb_keyboard.rb +0 -50
@@ -0,0 +1,376 @@
1
+ #! /bin/sh
2
+ # Common stub for a few missing GNU programs while installing.
3
+
4
+ scriptversion=2009-04-28.21; # UTC
5
+
6
+ # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
7
+ # 2008, 2009 Free Software Foundation, Inc.
8
+ # Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
9
+
10
+ # This program is free software; you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation; either version 2, or (at your option)
13
+ # any later version.
14
+
15
+ # This program is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
22
+
23
+ # As a special exception to the GNU General Public License, if you
24
+ # distribute this file as part of a program that contains a
25
+ # configuration script generated by Autoconf, you may include it under
26
+ # the same distribution terms that you use for the rest of that program.
27
+
28
+ if test $# -eq 0; then
29
+ echo 1>&2 "Try \`$0 --help' for more information"
30
+ exit 1
31
+ fi
32
+
33
+ run=:
34
+ sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
35
+ sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
36
+
37
+ # In the cases where this matters, `missing' is being run in the
38
+ # srcdir already.
39
+ if test -f configure.ac; then
40
+ configure_ac=configure.ac
41
+ else
42
+ configure_ac=configure.in
43
+ fi
44
+
45
+ msg="missing on your system"
46
+
47
+ case $1 in
48
+ --run)
49
+ # Try to run requested program, and just exit if it succeeds.
50
+ run=
51
+ shift
52
+ "$@" && exit 0
53
+ # Exit code 63 means version mismatch. This often happens
54
+ # when the user try to use an ancient version of a tool on
55
+ # a file that requires a minimum version. In this case we
56
+ # we should proceed has if the program had been absent, or
57
+ # if --run hadn't been passed.
58
+ if test $? = 63; then
59
+ run=:
60
+ msg="probably too old"
61
+ fi
62
+ ;;
63
+
64
+ -h|--h|--he|--hel|--help)
65
+ echo "\
66
+ $0 [OPTION]... PROGRAM [ARGUMENT]...
67
+
68
+ Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
69
+ error status if there is no known handling for PROGRAM.
70
+
71
+ Options:
72
+ -h, --help display this help and exit
73
+ -v, --version output version information and exit
74
+ --run try to run the given command, and emulate it if it fails
75
+
76
+ Supported PROGRAM values:
77
+ aclocal touch file \`aclocal.m4'
78
+ autoconf touch file \`configure'
79
+ autoheader touch file \`config.h.in'
80
+ autom4te touch the output file, or create a stub one
81
+ automake touch all \`Makefile.in' files
82
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
83
+ flex create \`lex.yy.c', if possible, from existing .c
84
+ help2man touch the output file
85
+ lex create \`lex.yy.c', if possible, from existing .c
86
+ makeinfo touch the output file
87
+ tar try tar, gnutar, gtar, then tar without non-portable flags
88
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
89
+
90
+ Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
91
+ \`g' are ignored when checking the name.
92
+
93
+ Send bug reports to <bug-automake@gnu.org>."
94
+ exit $?
95
+ ;;
96
+
97
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
98
+ echo "missing $scriptversion (GNU Automake)"
99
+ exit $?
100
+ ;;
101
+
102
+ -*)
103
+ echo 1>&2 "$0: Unknown \`$1' option"
104
+ echo 1>&2 "Try \`$0 --help' for more information"
105
+ exit 1
106
+ ;;
107
+
108
+ esac
109
+
110
+ # normalize program name to check for.
111
+ program=`echo "$1" | sed '
112
+ s/^gnu-//; t
113
+ s/^gnu//; t
114
+ s/^g//; t'`
115
+
116
+ # Now exit if we have it, but it failed. Also exit now if we
117
+ # don't have it and --version was passed (most likely to detect
118
+ # the program). This is about non-GNU programs, so use $1 not
119
+ # $program.
120
+ case $1 in
121
+ lex*|yacc*)
122
+ # Not GNU programs, they don't have --version.
123
+ ;;
124
+
125
+ tar*)
126
+ if test -n "$run"; then
127
+ echo 1>&2 "ERROR: \`tar' requires --run"
128
+ exit 1
129
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
130
+ exit 1
131
+ fi
132
+ ;;
133
+
134
+ *)
135
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
136
+ # We have it, but it failed.
137
+ exit 1
138
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
139
+ # Could not run --version or --help. This is probably someone
140
+ # running `$TOOL --version' or `$TOOL --help' to check whether
141
+ # $TOOL exists and not knowing $TOOL uses missing.
142
+ exit 1
143
+ fi
144
+ ;;
145
+ esac
146
+
147
+ # If it does not exist, or fails to run (possibly an outdated version),
148
+ # try to emulate it.
149
+ case $program in
150
+ aclocal*)
151
+ echo 1>&2 "\
152
+ WARNING: \`$1' is $msg. You should only need it if
153
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
154
+ to install the \`Automake' and \`Perl' packages. Grab them from
155
+ any GNU archive site."
156
+ touch aclocal.m4
157
+ ;;
158
+
159
+ autoconf*)
160
+ echo 1>&2 "\
161
+ WARNING: \`$1' is $msg. You should only need it if
162
+ you modified \`${configure_ac}'. You might want to install the
163
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
164
+ archive site."
165
+ touch configure
166
+ ;;
167
+
168
+ autoheader*)
169
+ echo 1>&2 "\
170
+ WARNING: \`$1' is $msg. You should only need it if
171
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
172
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
173
+ from any GNU archive site."
174
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
175
+ test -z "$files" && files="config.h"
176
+ touch_files=
177
+ for f in $files; do
178
+ case $f in
179
+ *:*) touch_files="$touch_files "`echo "$f" |
180
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
181
+ *) touch_files="$touch_files $f.in";;
182
+ esac
183
+ done
184
+ touch $touch_files
185
+ ;;
186
+
187
+ automake*)
188
+ echo 1>&2 "\
189
+ WARNING: \`$1' is $msg. You should only need it if
190
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
191
+ You might want to install the \`Automake' and \`Perl' packages.
192
+ Grab them from any GNU archive site."
193
+ find . -type f -name Makefile.am -print |
194
+ sed 's/\.am$/.in/' |
195
+ while read f; do touch "$f"; done
196
+ ;;
197
+
198
+ autom4te*)
199
+ echo 1>&2 "\
200
+ WARNING: \`$1' is needed, but is $msg.
201
+ You might have modified some files without having the
202
+ proper tools for further handling them.
203
+ You can get \`$1' as part of \`Autoconf' from any GNU
204
+ archive site."
205
+
206
+ file=`echo "$*" | sed -n "$sed_output"`
207
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
208
+ if test -f "$file"; then
209
+ touch $file
210
+ else
211
+ test -z "$file" || exec >$file
212
+ echo "#! /bin/sh"
213
+ echo "# Created by GNU Automake missing as a replacement of"
214
+ echo "# $ $@"
215
+ echo "exit 0"
216
+ chmod +x $file
217
+ exit 1
218
+ fi
219
+ ;;
220
+
221
+ bison*|yacc*)
222
+ echo 1>&2 "\
223
+ WARNING: \`$1' $msg. You should only need it if
224
+ you modified a \`.y' file. You may need the \`Bison' package
225
+ in order for those modifications to take effect. You can get
226
+ \`Bison' from any GNU archive site."
227
+ rm -f y.tab.c y.tab.h
228
+ if test $# -ne 1; then
229
+ eval LASTARG="\${$#}"
230
+ case $LASTARG in
231
+ *.y)
232
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
233
+ if test -f "$SRCFILE"; then
234
+ cp "$SRCFILE" y.tab.c
235
+ fi
236
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
237
+ if test -f "$SRCFILE"; then
238
+ cp "$SRCFILE" y.tab.h
239
+ fi
240
+ ;;
241
+ esac
242
+ fi
243
+ if test ! -f y.tab.h; then
244
+ echo >y.tab.h
245
+ fi
246
+ if test ! -f y.tab.c; then
247
+ echo 'main() { return 0; }' >y.tab.c
248
+ fi
249
+ ;;
250
+
251
+ lex*|flex*)
252
+ echo 1>&2 "\
253
+ WARNING: \`$1' is $msg. You should only need it if
254
+ you modified a \`.l' file. You may need the \`Flex' package
255
+ in order for those modifications to take effect. You can get
256
+ \`Flex' from any GNU archive site."
257
+ rm -f lex.yy.c
258
+ if test $# -ne 1; then
259
+ eval LASTARG="\${$#}"
260
+ case $LASTARG in
261
+ *.l)
262
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
263
+ if test -f "$SRCFILE"; then
264
+ cp "$SRCFILE" lex.yy.c
265
+ fi
266
+ ;;
267
+ esac
268
+ fi
269
+ if test ! -f lex.yy.c; then
270
+ echo 'main() { return 0; }' >lex.yy.c
271
+ fi
272
+ ;;
273
+
274
+ help2man*)
275
+ echo 1>&2 "\
276
+ WARNING: \`$1' is $msg. You should only need it if
277
+ you modified a dependency of a manual page. You may need the
278
+ \`Help2man' package in order for those modifications to take
279
+ effect. You can get \`Help2man' from any GNU archive site."
280
+
281
+ file=`echo "$*" | sed -n "$sed_output"`
282
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
283
+ if test -f "$file"; then
284
+ touch $file
285
+ else
286
+ test -z "$file" || exec >$file
287
+ echo ".ab help2man is required to generate this page"
288
+ exit $?
289
+ fi
290
+ ;;
291
+
292
+ makeinfo*)
293
+ echo 1>&2 "\
294
+ WARNING: \`$1' is $msg. You should only need it if
295
+ you modified a \`.texi' or \`.texinfo' file, or any other file
296
+ indirectly affecting the aspect of the manual. The spurious
297
+ call might also be the consequence of using a buggy \`make' (AIX,
298
+ DU, IRIX). You might want to install the \`Texinfo' package or
299
+ the \`GNU make' package. Grab either from any GNU archive site."
300
+ # The file to touch is that specified with -o ...
301
+ file=`echo "$*" | sed -n "$sed_output"`
302
+ test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
303
+ if test -z "$file"; then
304
+ # ... or it is the one specified with @setfilename ...
305
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
306
+ file=`sed -n '
307
+ /^@setfilename/{
308
+ s/.* \([^ ]*\) *$/\1/
309
+ p
310
+ q
311
+ }' $infile`
312
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
313
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
314
+ fi
315
+ # If the file does not exist, the user really needs makeinfo;
316
+ # let's fail without touching anything.
317
+ test -f $file || exit 1
318
+ touch $file
319
+ ;;
320
+
321
+ tar*)
322
+ shift
323
+
324
+ # We have already tried tar in the generic part.
325
+ # Look for gnutar/gtar before invocation to avoid ugly error
326
+ # messages.
327
+ if (gnutar --version > /dev/null 2>&1); then
328
+ gnutar "$@" && exit 0
329
+ fi
330
+ if (gtar --version > /dev/null 2>&1); then
331
+ gtar "$@" && exit 0
332
+ fi
333
+ firstarg="$1"
334
+ if shift; then
335
+ case $firstarg in
336
+ *o*)
337
+ firstarg=`echo "$firstarg" | sed s/o//`
338
+ tar "$firstarg" "$@" && exit 0
339
+ ;;
340
+ esac
341
+ case $firstarg in
342
+ *h*)
343
+ firstarg=`echo "$firstarg" | sed s/h//`
344
+ tar "$firstarg" "$@" && exit 0
345
+ ;;
346
+ esac
347
+ fi
348
+
349
+ echo 1>&2 "\
350
+ WARNING: I can't seem to be able to run \`tar' with the given arguments.
351
+ You may want to install GNU tar or Free paxutils, or check the
352
+ command line arguments."
353
+ exit 1
354
+ ;;
355
+
356
+ *)
357
+ echo 1>&2 "\
358
+ WARNING: \`$1' is needed, and is $msg.
359
+ You might have modified some files without having the
360
+ proper tools for further handling them. Check the \`README' file,
361
+ it often tells you about the needed prerequisites for installing
362
+ this package. You may also peek at any GNU archive site, in case
363
+ some other package would contain this missing \`$1' program."
364
+ exit 1
365
+ ;;
366
+ esac
367
+
368
+ exit 0
369
+
370
+ # Local variables:
371
+ # eval: (add-hook 'write-file-hooks 'time-stamp)
372
+ # time-stamp-start: "scriptversion="
373
+ # time-stamp-format: "%:y-%02m-%02d.%02H"
374
+ # time-stamp-time-zone: "UTC"
375
+ # time-stamp-end: "; # UTC"
376
+ # End:
@@ -14,12 +14,11 @@
14
14
  # along with Libusb for Ruby. If not, see <http://www.gnu.org/licenses/>.
15
15
 
16
16
  module LIBUSB
17
- VERSION = "0.2.2"
18
-
19
17
  require 'libusb/call'
20
18
  require 'libusb/constants'
21
19
  require 'libusb/context'
22
- autoload :Version, 'libusb/version'
20
+ autoload :VERSION, 'libusb/version_gem'
21
+ autoload :Version, 'libusb/version_struct'
23
22
  autoload :Configuration, 'libusb/configuration'
24
23
  autoload :DevHandle, 'libusb/dev_handle'
25
24
  autoload :Device, 'libusb/device'
@@ -17,16 +17,15 @@ require 'rubygems'
17
17
  require 'ffi'
18
18
 
19
19
  module LIBUSB
20
- # C level interface
20
+ # C level interface - for internal use only
21
+ #
22
+ # All enum codes are available as constants in {LIBUSB} namespace.
21
23
  module Call
22
24
  extend FFI::Library
23
25
 
24
- if FFI::Platform.windows?
25
- bundled_dll = File.join(File.dirname(__FILE__), '..', 'libusb-1.0.dll')
26
- ffi_lib(['libusb-1.0', bundled_dll])
27
- else
28
- ffi_lib 'libusb-1.0'
29
- end
26
+ ext = FFI::Platform.windows? ? 'dll' : 'so'
27
+ bundled_dll = File.expand_path("../../libusb-1.0.#{ext}", __FILE__)
28
+ ffi_lib(['libusb-1.0', bundled_dll])
30
29
 
31
30
  ClassCodes = enum :libusb_class_code, [
32
31
  :CLASS_PER_INTERFACE, 0,
@@ -211,7 +210,16 @@ module LIBUSB
211
210
  attach_function 'libusb_free_transfer', [:pointer], :void
212
211
 
213
212
  attach_function 'libusb_handle_events', [:libusb_context], :int, :blocking=>true
213
+ try_attach_function 'libusb_handle_events_completed', [:libusb_context, :pointer], :int, :blocking=>true
214
+ attach_function 'libusb_handle_events_timeout', [:libusb_context, :pointer], :int, :blocking=>true
215
+ try_attach_function 'libusb_handle_events_timeout_completed', [:libusb_context, :pointer, :pointer], :int, :blocking=>true
216
+
217
+ callback :libusb_pollfd_added_cb, [:int, :short, :pointer], :void
218
+ callback :libusb_pollfd_removed_cb, [:int, :pointer], :void
214
219
 
220
+ attach_function 'libusb_get_pollfds', [:libusb_context], :pointer
221
+ attach_function 'libusb_get_next_timeout', [:libusb_context, :pointer], :int
222
+ attach_function 'libusb_set_pollfd_notifiers', [:libusb_context, :libusb_pollfd_added_cb, :libusb_pollfd_removed_cb, :pointer], :void
215
223
 
216
224
  callback :libusb_transfer_cb_fn, [:pointer], :void
217
225
 
@@ -267,5 +275,39 @@ module LIBUSB
267
275
  :iSerialNumber, :uint8,
268
276
  :bNumConfigurations, :uint8
269
277
  end
278
+
279
+ class Timeval < FFI::Struct
280
+ layout :tv_sec, :long,
281
+ :tv_usec, :long
282
+
283
+ # set timeval to the number of milliseconds
284
+ # @param [Fixnum] value
285
+ def in_ms=(value)
286
+ self[:tv_sec], self[:tv_usec] = (value*1000).divmod(1000000)
287
+ end
288
+
289
+ # get the number of milliseconds in timeval
290
+ # @return [Fixnum]
291
+ def in_ms
292
+ self[:tv_sec]*1000 + self[:tv_usec]/1000
293
+ end
294
+
295
+ # set timeval to the number of seconds
296
+ # @param [Numeric] value
297
+ def in_s=(value)
298
+ self[:tv_sec], self[:tv_usec] = (value*1000000).divmod(1000000)
299
+ end
300
+
301
+ # get the number of seconds in timeval
302
+ # @return [Float]
303
+ def in_s
304
+ self[:tv_sec] + self[:tv_usec]/1000000.0
305
+ end
306
+ end
307
+
308
+ class Pollfd < FFI::Struct
309
+ layout :fd, :int,
310
+ :events, :short
311
+ end
270
312
  end
271
313
  end