void encode(ArgumentEncoder* encoder, CFNumberRef number) { CFNumberType numberType = CFNumberGetType(number); Vector<uint8_t> buffer(CFNumberGetByteSize(number)); bool result = CFNumberGetValue(number, numberType, buffer.data()); ASSERT_UNUSED(result, result); encoder->encodeEnum(numberType); encoder->encodeVariableLengthByteArray(buffer); }
kern_return_t IOHIDGetParameter( io_connect_t handle, CFStringRef key, IOByteCount maxSize, void * bytes, IOByteCount * actualSize ) { kern_return_t kr; // io_service_t hidsystem; CFDataRef data; CFNumberRef number; CFNumberType numberType; CFTypeRef typeRef = NULL; IOByteCount copySize; if (!bytes || !maxSize) return kIOReturnBadArgument; kr = IOHIDCopyCFTypeParameter(handle, key, &typeRef); if ( kr != kIOReturnSuccess ) return kr; if( !typeRef ) return kIOReturnBadArgument; if (CFGetTypeID(typeRef) == CFDataGetTypeID()) { data = (CFDataRef)typeRef; copySize = CFDataGetLength(data); *actualSize = copySize; if( maxSize < copySize) copySize = maxSize; bcopy( CFDataGetBytePtr(data), bytes, copySize ); } else if (CFGetTypeID(typeRef) == CFNumberGetTypeID()) { number = (CFNumberRef)typeRef; copySize = CFNumberGetByteSize(number); *actualSize = copySize; if( maxSize < copySize) copySize = maxSize; switch ( copySize ) { case sizeof(UInt64): numberType = kCFNumberSInt64Type; break; case sizeof(UInt32): numberType = kCFNumberSInt32Type; break; case sizeof(UInt16): numberType = kCFNumberSInt16Type; break; case sizeof(UInt8): numberType = kCFNumberSInt8Type; break; default: numberType = kCFNumberSInt32Type; break; } CFNumberGetValue( number, numberType, bytes ); } else { kr = kIOReturnBadArgument; } CFRelease(typeRef); return( kr ); }