First stab at OSX maven build.

This commit is contained in:
Endolf 2018-05-12 11:17:38 +01:00
parent e0a512be48
commit 4e98105deb
27 changed files with 152 additions and 168 deletions

View file

@ -0,0 +1,3 @@
/net_java_games_input_OSXHIDDevice.h
/net_java_games_input_OSXHIDDeviceIterator.h
/net_java_games_input_OSXHIDQueue.h

View file

@ -0,0 +1,197 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <CoreServices/CoreServices.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <jni.h>
#include "util.h"
#include "macosxutil.h"
typedef struct {
JNIEnv *env;
jobject map;
} dict_context_t;
typedef struct {
JNIEnv *env;
jobjectArray array;
jsize index;
} array_context_t;
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject);
static jstring createStringFromCFString(JNIEnv *env, CFStringRef cfstring) {
CFIndex unicode_length = CFStringGetLength(cfstring);
CFIndex utf8_length = CFStringGetMaximumSizeForEncoding(unicode_length, kCFStringEncodingUTF8);
// Allocate buffer large enough, plus \0 terminator
char *buffer = (char *)malloc(utf8_length + 1);
if (buffer == NULL)
return NULL;
Boolean result = CFStringGetCString(cfstring, buffer, utf8_length + 1, kCFStringEncodingUTF8);
if (!result) {
free(buffer);
return NULL;
}
jstring str = (*env)->NewStringUTF(env, buffer);
free(buffer);
return str;
}
static jobject createDoubleObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
double value;
Boolean result = CFNumberGetValue(cfnumber, kCFNumberDoubleType, &value);
if (!result)
return NULL;
return newJObject(env, "java/lang/Double", "(D)V", (jdouble)value);
}
static jobject createLongObjectFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
SInt64 value;
Boolean result = CFNumberGetValue(cfnumber, kCFNumberSInt64Type, &value);
if (!result)
return NULL;
return newJObject(env, "java/lang/Long", "(J)V", (jlong)value);
}
static jobject createNumberFromCFNumber(JNIEnv *env, CFNumberRef cfnumber) {
CFNumberType number_type = CFNumberGetType(cfnumber);
switch (number_type) {
case kCFNumberSInt8Type:
case kCFNumberSInt16Type:
case kCFNumberSInt32Type:
case kCFNumberSInt64Type:
case kCFNumberCharType:
case kCFNumberShortType:
case kCFNumberIntType:
case kCFNumberLongType:
case kCFNumberLongLongType:
case kCFNumberCFIndexType:
return createLongObjectFromCFNumber(env, cfnumber);
case kCFNumberFloat32Type:
case kCFNumberFloat64Type:
case kCFNumberFloatType:
case kCFNumberDoubleType:
return createDoubleObjectFromCFNumber(env, cfnumber);
default:
return NULL;
}
}
static void createArrayEntries(const void *value, void *context) {
array_context_t *array_context = (array_context_t *)context;
jobject jval = createObjectFromCFObject(array_context->env, value);
(*array_context->env)->SetObjectArrayElement(array_context->env, array_context->array, array_context->index++, jval);
(*array_context->env)->DeleteLocalRef(array_context->env, jval);
}
static jobject createArrayFromCFArray(JNIEnv *env, CFArrayRef cfarray) {
jclass Object_class = (*env)->FindClass(env, "java/lang/Object");
if (Object_class == NULL)
return NULL;
CFIndex size = CFArrayGetCount(cfarray);
CFRange range = {0, size};
jobjectArray array = (*env)->NewObjectArray(env, size, Object_class, NULL);
array_context_t array_context;
array_context.env = env;
array_context.array = array;
array_context.index = 0;
CFArrayApplyFunction(cfarray, range, createArrayEntries, &array_context);
return array;
}
static jobject createObjectFromCFObject(JNIEnv *env, CFTypeRef cfobject) {
CFTypeID type_id = CFGetTypeID(cfobject);
if (type_id == CFDictionaryGetTypeID()) {
return createMapFromCFDictionary(env, cfobject);
} else if (type_id == CFArrayGetTypeID()) {
return createArrayFromCFArray(env, cfobject);
} else if (type_id == CFStringGetTypeID()) {
return createStringFromCFString(env, cfobject);
} else if (type_id == CFNumberGetTypeID()) {
return createNumberFromCFNumber(env, cfobject);
} else {
return NULL;
}
}
static void createMapKeys(const void *key, const void *value, void *context) {
dict_context_t *dict_context = (dict_context_t *)context;
jclass Map_class = (*dict_context->env)->GetObjectClass(dict_context->env, dict_context->map);
if (Map_class == NULL)
return;
jmethodID map_put = (*dict_context->env)->GetMethodID(dict_context->env, Map_class, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
if (map_put == NULL)
return;
jobject jkey = createObjectFromCFObject(dict_context->env, key);
jobject jvalue = createObjectFromCFObject(dict_context->env, value);
if (jkey == NULL || jvalue == NULL)
return;
(*dict_context->env)->CallObjectMethod(dict_context->env, dict_context->map, map_put, jkey, jvalue);
(*dict_context->env)->DeleteLocalRef(dict_context->env, jkey);
(*dict_context->env)->DeleteLocalRef(dict_context->env, jvalue);
}
jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict) {
jobject map = newJObject(env, "java/util/HashMap", "()V");
if (map == NULL)
return NULL;
dict_context_t dict_context;
dict_context.env = env;
dict_context.map = map;
CFDictionaryApplyFunction(dict, createMapKeys, &dict_context);
return map;
}
void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return) {
jclass OSXEvent_class = (*env)->GetObjectClass(env, event_return);
if (OSXEvent_class == NULL) {
return;
}
jmethodID OSXEvent_set = (*env)->GetMethodID(env, OSXEvent_class, "set", "(JJIJ)V");
if (OSXEvent_set == NULL) {
return;
}
Nanoseconds nanos = AbsoluteToNanoseconds(event->timestamp);
uint64_t nanos64= *((uint64_t *)&nanos);
(*env)->CallVoidMethod(env, event_return, OSXEvent_set, (jlong)event->type, (jlong)(intptr_t)event->elementCookie, (jint)event->value, (jlong)nanos64);
}

View file

@ -0,0 +1,48 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <jni.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/hid/IOHIDLib.h>
extern jobject createMapFromCFDictionary(JNIEnv *env, CFDictionaryRef dict);
extern void copyEvent(JNIEnv *env, IOHIDEventStruct *event, jobject event_return);

View file

@ -0,0 +1,118 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <IOKit/IOTypes.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>
#include "net_java_games_input_OSXHIDDevice.h"
#include "util.h"
#include "macosxutil.h"
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nReleaseDevice(JNIEnv *env, jclass unused, jlong device_address, jlong interface_address) {
io_object_t hidDevice = (io_object_t)device_address;
IOHIDDeviceInterface **device_interface = (IOHIDDeviceInterface **)(intptr_t)interface_address;;
(*device_interface)->Release(device_interface);
IOObjectRelease(hidDevice);
}
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDevice_nGetDeviceProperties(JNIEnv *env, jclass unused, jlong device_address) {
io_object_t hidDevice = (io_object_t)device_address;
CFMutableDictionaryRef properties;
kern_return_t result = IORegistryEntryCreateCFProperties(hidDevice,
&properties,
kCFAllocatorDefault,
kNilOptions);
if (result != KERN_SUCCESS) {
throwIOException(env, "Failed to create properties for device (%ld)", result);
return NULL;
}
jobject map = createMapFromCFDictionary(env, properties);
CFRelease(properties);
return map;
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nOpen
(JNIEnv * env, jclass unused, jlong lpDevice) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
IOReturn ioReturnValue = (*hidDeviceInterface)->open(hidDeviceInterface, 0);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Device open failed: %d", ioReturnValue);
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nClose
(JNIEnv * env, jclass unused, jlong lpDevice) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
IOReturn ioReturnValue = (*hidDeviceInterface)->close(hidDeviceInterface);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Device close failed: %d", ioReturnValue);
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDevice_nGetElementValue
(JNIEnv * env, jclass unused, jlong lpDevice, jlong hidCookie, jobject event_return) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)lpDevice;
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)hidCookie;
IOHIDEventStruct event;
IOReturn ioReturnValue = (*hidDeviceInterface)->getElementValue(hidDeviceInterface, cookie, &event);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Device getElementValue failed: %d", ioReturnValue);
return;
}
copyEvent(env, &event, event_return);
if (event.longValue != NULL) {
free(event.longValue);
}
}
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDevice_nCreateQueue(JNIEnv *env, jclass unused, jlong device_address) {
IOHIDDeviceInterface **hidDeviceInterface = (IOHIDDeviceInterface **)(intptr_t)device_address;
IOHIDQueueInterface **queue = (*hidDeviceInterface)->allocQueue(hidDeviceInterface);
if (queue == NULL) {
throwIOException(env, "Could not allocate queue");
return 0;
}
return (jlong)(intptr_t)queue;
}

View file

@ -0,0 +1,143 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <IOKit/IOTypes.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>
#include "net_java_games_input_OSXHIDDeviceIterator.h"
#include "util.h"
JNIEXPORT jlong JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nCreateIterator(JNIEnv *env, jclass unused) {
io_iterator_t hidObjectIterator;
// Set up a matching dictionary to search the I/O Registry by class
// name for all HID class devices
//
CFMutableDictionaryRef hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
// Now search I/O Registry for matching devices.
// IOServiceGetMatchingServices consumes a reference to the dictionary so we don't have to release it
IOReturn ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, hidMatchDictionary, &hidObjectIterator);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Failed to create iterator (%ld)\n", ioReturnValue);
return 0;
}
if (hidObjectIterator == IO_OBJECT_NULL) {
throwIOException(env, "Failed to create iterator\n");
return 0;
}
return (jlong)hidObjectIterator;
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nReleaseIterator(JNIEnv *env, jclass unused, jlong address) {
io_iterator_t iterator = (io_iterator_t)address;
IOObjectRelease(iterator);
}
static IOHIDDeviceInterface **createHIDDevice(JNIEnv *env, io_object_t hidDevice) {
// io_name_t className;
IOHIDDeviceInterface **hidDeviceInterface;
IOCFPlugInInterface **plugInInterface;
SInt32 score;
/* ioReturnValue = IOObjectGetClass(hidDevice, className);
if (ioReturnValue != kIOReturnSuccess) {
printfJava(env, "Failed to get IOObject class name.");
}
printfJava(env, "Found device type [%s]\n", className);
*/
IOReturn ioReturnValue = IOCreatePlugInInterfaceForService(hidDevice,
kIOHIDDeviceUserClientTypeID,
kIOCFPlugInInterfaceID,
&plugInInterface,
&score);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Couldn't create plugin for device interface (%ld)\n", ioReturnValue);
return NULL;
}
//Call a method of the intermediate plug-in to create the device
//interface
//
HRESULT plugInResult = (*plugInInterface)->QueryInterface(plugInInterface,
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
(LPVOID)&hidDeviceInterface);
(*plugInInterface)->Release(plugInInterface);
if (plugInResult != S_OK) {
throwIOException(env, "Couldn't create HID class device interface (%ld)\n", plugInResult);
return NULL;
}
return hidDeviceInterface;
}
JNIEXPORT jobject JNICALL Java_net_java_games_input_OSXHIDDeviceIterator_nNext(JNIEnv *env, jclass unused, jlong address) {
io_iterator_t iterator = (io_iterator_t)address;
io_object_t hidDevice;
// io_string_t path;
// kern_return_t result;
hidDevice = IOIteratorNext(iterator);
if (hidDevice == MACH_PORT_NULL)
return NULL;
/* IOResult result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
if (result != KERN_SUCCESS) {
IOObjectRelease(hidDevice);
throwIOException("Failed to get device path (%ld)\n", result);
return NULL;
}
*/
IOHIDDeviceInterface **device_interface = createHIDDevice(env, hidDevice);
if (device_interface == NULL) {
IOObjectRelease(hidDevice);
return NULL;
}
jobject device_object = newJObject(env, "net/java/games/input/OSXHIDDevice", "(JJ)V", (jlong)hidDevice, (jlong)(intptr_t)device_interface);
if (device_object == NULL) {
(*device_interface)->Release(device_interface);
IOObjectRelease(hidDevice);
return NULL;
}
return device_object;
}

View file

@ -0,0 +1,135 @@
/*
* %W% %E%
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
/*****************************************************************************
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materails provided with the distribution.
*
* Neither the name Sun Microsystems, Inc. or the names of the contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
* ANY IMPLIED WARRANT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NON-INFRINGEMEN, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS
* A RESULT OF USING, MODIFYING OR DESTRIBUTING THIS SOFTWARE OR ITS
* DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
* REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
* INCIDENTAL OR PUNITIVE DAMAGES. HOWEVER CAUSED AND REGARDLESS OF THE THEORY
* OF LIABILITY, ARISING OUT OF THE USE OF OUR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed or intended for us in
* the design, construction, operation or maintenance of any nuclear facility
*
*****************************************************************************/
#include <IOKit/IOTypes.h>
#include <IOKit/IOKitLib.h>
#include <IOKit/IOCFPlugIn.h>
#include <IOKit/hid/IOHIDLib.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>
#include "net_java_games_input_OSXHIDQueue.h"
#include "util.h"
#include "macosxutil.h"
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nOpen(JNIEnv *env, jclass unused, jlong address, jint queue_depth) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->create(queue, 0, queue_depth);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue open failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStart(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->start(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue start failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nStop(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->stop(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue stop failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nClose(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->dispose(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue dispose failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nReleaseQueue(JNIEnv *env, jclass unused, jlong address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOReturn ioReturnValue = (*queue)->Release(queue);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue Release failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nAddElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
IOReturn ioReturnValue = (*queue)->addElement(queue, cookie, 0);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue addElement failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT void JNICALL Java_net_java_games_input_OSXHIDQueue_nRemoveElement(JNIEnv *env, jclass unused, jlong address, jlong cookie_address) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOHIDElementCookie cookie = (IOHIDElementCookie)(intptr_t)cookie_address;
IOReturn ioReturnValue = (*queue)->removeElement(queue, cookie);
if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue removeElement failed: %d\n", ioReturnValue);
return;
}
}
JNIEXPORT jboolean JNICALL Java_net_java_games_input_OSXHIDQueue_nGetNextEvent(JNIEnv *env, jclass unused, jlong address, jobject event_return) {
IOHIDQueueInterface **queue = (IOHIDQueueInterface **)(intptr_t)address;
IOHIDEventStruct event;
AbsoluteTime zeroTime = {0, 0};
IOReturn ioReturnValue = (*queue)->getNextEvent(queue, &event, zeroTime, 0);
if (ioReturnValue == kIOReturnUnderrun) {
return JNI_FALSE;
} else if (ioReturnValue != kIOReturnSuccess) {
throwIOException(env, "Queue getNextEvent failed: %d\n", ioReturnValue);
return JNI_FALSE;
}
copyEvent(env, &event, event_return);
if (event.longValue != NULL) {
free(event.longValue);
}
return JNI_TRUE;
}