aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/OSX
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/OSX')
-rw-r--r--plugins/OSX/src/native/JNIWrapper.java87
-rw-r--r--plugins/OSX/src/native/hidinputjnilib.c235
2 files changed, 218 insertions, 104 deletions
diff --git a/plugins/OSX/src/native/JNIWrapper.java b/plugins/OSX/src/native/JNIWrapper.java
index 34a8692..d2ded45 100644
--- a/plugins/OSX/src/native/JNIWrapper.java
+++ b/plugins/OSX/src/native/JNIWrapper.java
@@ -1,29 +1,78 @@
-//
-// JNIWrapper.java
-//
-// Created by Gregory Pierce on Wed Jul 23 2003.
-// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
-//
-
+/*
+ * %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
+*
+*****************************************************************************/
import java.util.*;
-public class JNIWrapper {
-
- static {
- // Ensure native JNI library is loaded
+public class JNIWrapper
+{
+ static
+ {
System.loadLibrary("hidinput");
}
- public JNIWrapper() {
+ public native void hidCreate();
+ public native void hidDispose();
+ public native void enumDevices( ArrayList list );
+
+
+ private ArrayList devices = new ArrayList();
+
+
+ public JNIWrapper()
+ {
System.out.println("JNIWrapper instance created");
+ }
+
+ public ArrayList getDevices()
+ {
+ return devices;
+ }
+
+ public void setDevices( ArrayList list )
+ {
+ devices = list;
+ }
+
+ private void addDevice( ArrayList list, long lpDevice, int type, String productName )
+ {
+ System.out.println("Found device [" + productName + "] of type [" + type + "]");
}
-
- native void hidCreate();
- native void hidDispose();
- native void enumDevices();
- native int native_method(String arg);
-
public static void main (String args[])
{
System.out.println("Started JNIWrapper");
@@ -33,7 +82,7 @@ public class JNIWrapper {
newjni.hidCreate();
System.out.println("Enumerating devices");
- newjni.enumDevices();
+ newjni.enumDevices( newjni.getDevices() );
System.out.println("Disposing HID engine");
newjni.hidDispose();
diff --git a/plugins/OSX/src/native/hidinputjnilib.c b/plugins/OSX/src/native/hidinputjnilib.c
index d877abb..2498edf 100644
--- a/plugins/OSX/src/native/hidinputjnilib.c
+++ b/plugins/OSX/src/native/hidinputjnilib.c
@@ -1,11 +1,41 @@
/*
- * hidinputjnilib.c
- * hidinput
- *
- * Created by Gregory Pierce on Wed Jul 23 2003.
- * Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+ * %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>
@@ -23,107 +53,59 @@
#include <Carbon/Carbon.h>
#include "JNIWrapper.h"
+Boolean init( JNIEnv * env );
void createMasterPort();
void disposeMasterPort();
-void enumDevices();
Boolean showDictionaryElement (CFDictionaryRef dictionary, CFStringRef key);
void showProperty(const void * key, const void * value);
void displayCFProperty(CFStringRef object, CFTypeRef value);
void CFObjectShow( CFTypeRef value );
-mach_port_t masterPort = NULL;
-io_iterator_t hidObjectIterator;
-int gElementIndex;
+jclass CLASS_JNIWrapper = NULL;
+jmethodID MID_AddDevice = NULL;
+mach_port_t masterPort = NULL;
+io_iterator_t hidObjectIterator;
+int gElementIndex;
+
+Boolean init(JNIEnv* env)
+{
+ CLASS_JNIWrapper = (*env)->FindClass(env,"JNIWrapper");
+ if ( CLASS_JNIWrapper == NULL )
+ {
+ printf("Class JNIWrapper not found... \n");
+ return FALSE;
+ }
+
+ MID_AddDevice = (*env)->GetMethodID(env, CLASS_JNIWrapper, "addDevice", "(Ljava/util/ArrayList;JILjava/lang/String;)V");
+ if (MID_AddDevice == NULL)
+ {
+ printf("Method addDevice not found... \n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
void createMasterPort()
{
IOReturn ioReturnValue = kIOReturnSuccess;
//Get a Mach port to initiate communication with I/O Kit.
+ //
ioReturnValue = IOMasterPort(bootstrap_port, &masterPort);
}
void disposeMasterPort()
{
//Free master port if we created one.
+ //
if (masterPort)
{
mach_port_deallocate(mach_task_self(), masterPort);
}
}
-/**
- * Enumerate the devices attached to this machine.
- **/
-void enumDevices()
-{
- CFMutableDictionaryRef hidMatchDictionary = NULL;
- IOReturn ioReturnValue = kIOReturnSuccess;
- Boolean noMatchingDevices = false;
-
- // Set up a matching dictionary to search the I/O Registry by class
- // name for all HID class devices
- //
- hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
-
- // Now search I/O Registry for matching devices.
- //
- ioReturnValue = IOServiceGetMatchingServices(masterPort, hidMatchDictionary, &hidObjectIterator);
-
- noMatchingDevices = ((ioReturnValue != kIOReturnSuccess) | (hidObjectIterator == NULL));
-
- // If search is unsuccessful, print message and hang.
- //
- if (noMatchingDevices)
- {
- printf("No matching HID class devices found.");
- }
-
- // IOServiceGetMatchingServices consumes a reference to the
- // dictionary, so we don't need to release the dictionary ref.
- //
- hidMatchDictionary = NULL;
-
- io_object_t hidDevice = NULL;
- CFMutableDictionaryRef properties = 0;
- char path[512];
- kern_return_t result;
-
-
- while ((hidDevice = IOIteratorNext(hidObjectIterator)))
- {
- result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
-
- if ( result == KERN_SUCCESS )
- {
- result = IORegistryEntryCreateCFProperties(hidDevice,
- &properties,
- kCFAllocatorDefault,
- kNilOptions);
- }
-
- if ((result == KERN_SUCCESS) && properties)
- {
- showDictionaryElement(properties, CFSTR(kIOHIDTransportKey));
- //MyShowDictionaryElement(properties, CFSTR(kIOHIDVendorKey));
- showDictionaryElement(properties, CFSTR(kIOHIDProductIDKey));
- showDictionaryElement(properties, CFSTR(kIOHIDVersionNumberKey));
- showDictionaryElement(properties, CFSTR(kIOHIDManufacturerKey));
- showDictionaryElement(properties, CFSTR(kIOHIDProductKey));
- showDictionaryElement(properties, CFSTR(kIOHIDSerialNumberKey));
- showDictionaryElement(properties, CFSTR(kIOHIDLocationIDKey));
- showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsageKey));
- showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsagePageKey));
- showDictionaryElement(properties, CFSTR(kIOHIDElementKey));
-
- //Release the properties dictionary
- CFRelease(properties);
- }
- }
-
- IOObjectRelease(hidObjectIterator);
-}
Boolean showDictionaryElement (CFDictionaryRef dictionary, CFStringRef key)
{
@@ -194,7 +176,6 @@ void CFObjectShow( CFTypeRef value )
{
showDictionaryElement (value, CFSTR(kIOHIDElementCookieKey));
showDictionaryElement (value, CFSTR(kIOHIDElementCollectionTypeKey));
- //showUsageAndPageElement (object);
showDictionaryElement (value, CFSTR(kIOHIDElementMinKey));
showDictionaryElement (value, CFSTR(kIOHIDElementMaxKey));
showDictionaryElement (value, CFSTR(kIOHIDElementScaledMinKey));
@@ -214,6 +195,8 @@ void CFObjectShow( CFTypeRef value )
showDictionaryElement (value, CFSTR(kIOHIDElementUnitExponentKey));
showDictionaryElement (value, CFSTR(kIOHIDElementNameKey));
showDictionaryElement (value, CFSTR(kIOHIDElementKey));
+
+ printf("\n\n\n");
}
else if (type == CFNumberGetTypeID())
{
@@ -256,7 +239,10 @@ void CFObjectShow( CFTypeRef value )
JNIEXPORT void JNICALL Java_JNIWrapper_hidCreate
(JNIEnv * env, jobject obj)
{
- createMasterPort();
+ if ( init( env ) )
+ {
+ createMasterPort();
+ }
}
/*
@@ -270,15 +256,94 @@ JNIEXPORT void JNICALL Java_JNIWrapper_hidDispose
disposeMasterPort();
}
+
/*
* Class: JNIWrapper
* Method: enumDevices
- * Signature: ()V
+ * Signature: (Ljava/util/ArrayList;)V
*/
JNIEXPORT void JNICALL Java_JNIWrapper_enumDevices
-(JNIEnv * env, jobject obj)
+(JNIEnv * env, jobject obj , jobject list)
{
- enumDevices();
+ CFMutableDictionaryRef hidMatchDictionary = NULL;
+ IOReturn ioReturnValue = kIOReturnSuccess;
+ Boolean noMatchingDevices = false;
+
+ // Set up a matching dictionary to search the I/O Registry by class
+ // name for all HID class devices
+ //
+ hidMatchDictionary = IOServiceMatching(kIOHIDDeviceKey);
+
+ // Now search I/O Registry for matching devices.
+ //
+ ioReturnValue = IOServiceGetMatchingServices(masterPort, hidMatchDictionary, &hidObjectIterator);
+
+ noMatchingDevices = ((ioReturnValue != kIOReturnSuccess) | (hidObjectIterator == NULL));
+
+ // If search is unsuccessful, print message and hang.
+ //
+ if (noMatchingDevices)
+ {
+ printf("No matching HID class devices found.");
+ }
+
+ // IOServiceGetMatchingServices consumes a reference to the
+ // dictionary, so we don't need to release the dictionary ref.
+ //
+ hidMatchDictionary = NULL;
+
+ io_object_t hidDevice = NULL;
+ CFMutableDictionaryRef properties = 0;
+ char path[512];
+ kern_return_t result;
+
+
+ while ((hidDevice = IOIteratorNext(hidObjectIterator)))
+ {
+ result = IORegistryEntryGetPath(hidDevice, kIOServicePlane, path);
+
+ if ( result == KERN_SUCCESS )
+ {
+ result = IORegistryEntryCreateCFProperties(hidDevice,
+ &properties,
+ kCFAllocatorDefault,
+ kNilOptions);
+ }
+
+ if ((result == KERN_SUCCESS) && properties)
+ {
+ //showDictionaryElement(properties, CFSTR(kIOHIDTransportKey));
+ //showDictionaryElement(properties, CFSTR(kIOHIDVendorKey));
+ //printf("ProductID: "); showDictionaryElement(properties, CFSTR(kIOHIDProductIDKey));
+ //printf("VersionNumber: "); showDictionaryElement(properties, CFSTR(kIOHIDVersionNumberKey));
+ //printf("Manufacturer: "); showDictionaryElement(properties, CFSTR(kIOHIDManufacturerKey));
+ printf("ProductKey: "); showDictionaryElement(properties, CFSTR(kIOHIDProductKey));
+ //printf("SerialNumber: "); showDictionaryElement(properties, CFSTR(kIOHIDSerialNumberKey));
+ //showDictionaryElement(properties, CFSTR(kIOHIDLocationIDKey));
+ //printf("PrimaryUsage: "); showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsageKey));
+ //showDictionaryElement(properties, CFSTR(kIOHIDPrimaryUsagePageKey));
+ //showDictionaryElement(properties, CFSTR(kIOHIDElementKey));
+
+ //printf("\n\n");
+ CFTypeRef object = CFDictionaryGetValue (properties, CFSTR(kIOHIDProductKey));
+
+
+
+ (*env)->CallVoidMethod(env, obj, MID_AddDevice,
+ list,
+ (jlong)(long)hidDevice,
+ kIOHIDPrimaryUsageKey,
+ (*env)->NewStringUTF( env, CFStringGetCStringPtr ( object, CFStringGetSystemEncoding ()) ) );
+
+
+ //Release the properties dictionary
+ CFRelease(properties);
+ }
+ }
+
+ IOObjectRelease(hidObjectIterator);
}
+
+