Revision: a1644a430e75
Branch: default
Author: Phillip Nguyen <
evil.p...@gmail.com>
Date: Mon Jan 7 19:10:41 2013
Log: Issue 625: check length of IOHIDValue before trying to get
integer value.
http://code.google.com/p/pyglet/source/detail?r=a1644a430e75
Modified:
/pyglet/input/darwin_hid.py
=======================================
--- /pyglet/input/darwin_hid.py Mon Jun 18 01:35:07 2012
+++ /pyglet/input/darwin_hid.py Mon Jan 7 19:10:41 2013
@@ -178,6 +178,9 @@
iokit.IOHIDValueGetIntegerValue.restype = CFIndex
iokit.IOHIDValueGetIntegerValue.argtypes = [c_void_p]
+iokit.IOHIDValueGetLength.restype = CFIndex
+iokit.IOHIDValueGetLength.argtypes = [c_void_p]
+
iokit.IOHIDValueGetTimeStamp.restype = c_uint64
iokit.IOHIDValueGetTimeStamp.argtypes = [c_void_p]
@@ -204,7 +207,14 @@
assert(cf.CFGetTypeID(valueRef) == iokit.IOHIDValueGetTypeID())
self.valueRef = valueRef
self.timestamp = iokit.IOHIDValueGetTimeStamp(valueRef)
- self.intvalue = iokit.IOHIDValueGetIntegerValue(valueRef)
+ self.length = iokit.IOHIDValueGetLength(valueRef)
+ if self.length <= 4:
+ self.intvalue = iokit.IOHIDValueGetIntegerValue(valueRef)
+ else:
+ # Values may be byte data rather than integers.
+ # e.g. the PS3 controller has a 39-byte HIDValue element.
+ # We currently do not try to handle these cases.
+ self.intvalue = None
elementRef = c_void_p(iokit.IOHIDValueGetElement(valueRef))
self.element = HIDDeviceElement.get_element(elementRef)