00001 #include "../stdafx.h"
00002 #include <stdlib.h>
00003 #include "com_phidgets_Manager.h"
00004 #include "../cphidgetmanager.h"
00005 #include "../csocket.h"
00006 #include "phidget_jni.h"
00007
00008 static int CCONV attach_handler(CPhidgetHandle h, void *arg);
00009 static int CCONV detach_handler(CPhidgetHandle h, void *arg);
00010 static int CCONV serverConnect_handler(CPhidgetManagerHandle h, void *arg);
00011 static int CCONV serverDisconnect_handler(CPhidgetManagerHandle h, void *arg);
00012
00013 extern jfieldID managerPhidget_fid;
00014
00015 static jclass manager_class;
00016
00017 static jfieldID manager_handle_fid;
00018 static jfieldID nativeAttachHandler_fid;
00019 static jfieldID nativeDetachHandler_fid;
00020 static jfieldID nativeServerConnectHandler_fid;
00021 static jfieldID nativeServerDisconnectHandler_fid;
00022
00023 static jmethodID fireAttach_mid;
00024 static jmethodID fireDetach_mid;
00025 static jmethodID fireServerConnect_mid;
00026 static jmethodID fireServerDisconnect_mid;
00027
00028 void
00029 com_phidgets_Manager_OnLoad(JNIEnv *env)
00030 {
00031
00032 if (!(manager_class = (*env)->FindClass(env, "com/phidgets/Manager")))
00033 JNI_ABORT_STDERR("");
00034 if (!(manager_class = (jclass)(*env)->NewGlobalRef(env, manager_class)))
00035 JNI_ABORT_STDERR("");
00036
00037 if (!(manager_handle_fid = (*env)->GetFieldID(env, manager_class, "handle", "J")))
00038 JNI_ABORT_STDERR("");
00039 if (!(nativeAttachHandler_fid = (*env)->GetFieldID(env, manager_class, "nativeAttachHandler", "J")))
00040 JNI_ABORT_STDERR("");
00041 if (!(nativeDetachHandler_fid = (*env)->GetFieldID(env, manager_class, "nativeDetachHandler", "J")))
00042 JNI_ABORT_STDERR("");
00043 if (!(nativeServerConnectHandler_fid = (*env)->GetFieldID(env, manager_class, "nativeServerConnectHandler", "J")))
00044 JNI_ABORT_STDERR("");
00045 if (!(nativeServerDisconnectHandler_fid = (*env)->GetFieldID(env, manager_class, "nativeServerDisconnectHandler", "J")))
00046 JNI_ABORT_STDERR("");
00047
00048 if (!(fireAttach_mid = (*env)->GetMethodID(env, manager_class, "fireAttach", "(Lcom/phidgets/event/AttachEvent;)V")))
00049 JNI_ABORT_STDERR("");
00050 if (!(fireDetach_mid = (*env)->GetMethodID(env, manager_class, "fireDetach", "(Lcom/phidgets/event/DetachEvent;)V")))
00051 JNI_ABORT_STDERR("");
00052 if (!(fireServerConnect_mid = (*env)->GetMethodID(env, manager_class, "fireServerConnect", "(Lcom/phidgets/event/ServerConnectEvent;)V")))
00053 JNI_ABORT_STDERR("");
00054 if (!(fireServerDisconnect_mid = (*env)->GetMethodID(env, manager_class, "fireServerDisconnect", "(Lcom/phidgets/event/ServerDisconnectEvent;)V")))
00055 JNI_ABORT_STDERR("");
00056 }
00057
00058 JNIEXPORT jboolean JNICALL
00059 Java_com_phidgets_Manager_isAttached(JNIEnv *env, jobject obj)
00060 {
00061 CPhidgetHandle h = (CPhidgetHandle)(uintptr_t)(*env)->GetLongField(env,
00062 obj, manager_handle_fid);
00063 int error;
00064 int s;
00065
00066 if ((error = CPhidget_getDeviceStatus(h, &s)))
00067 PH_THROW(error);
00068
00069 return s == PHIDGET_ATTACHED;
00070 }
00071
00072 JNIEXPORT jboolean JNICALL
00073 Java_com_phidgets_Manager_isAttachedToServer(JNIEnv *env, jobject obj)
00074 {
00075 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)(*env)->GetLongField(env,
00076 obj, manager_handle_fid);
00077 int error;
00078 int s;
00079
00080 if ((error = CPhidgetManager_getServerStatus(h, &s)))
00081 PH_THROW(error);
00082
00083 return s == PHIDGET_ATTACHED;
00084 }
00085
00086 JNIEXPORT jint JNICALL
00087 Java_com_phidgets_Manager_getServerPort(JNIEnv *env, jobject obj)
00088 {
00089 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)(*env)->GetLongField(env,
00090 obj, manager_handle_fid);
00091 int error;
00092 int port;
00093 const char *addr;
00094
00095 if ((error = CPhidgetManager_getServerAddress(h, &addr, &port)))
00096 PH_THROW(error);
00097
00098 return port;
00099 }
00100
00101 JNIEXPORT jstring JNICALL
00102 Java_com_phidgets_Manager_getServerAddress(JNIEnv *env, jobject obj)
00103 {
00104 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)(*env)->GetLongField(env,
00105 obj, manager_handle_fid);
00106 int error;
00107 int port;
00108 const char *addr;
00109
00110 if ((error = CPhidgetManager_getServerAddress(h, &addr, &port)))
00111 PH_THROW(error);
00112
00113 return (*env)->NewStringUTF(env, addr);
00114 }
00115
00116 JNIEXPORT jstring JNICALL
00117 Java_com_phidgets_Manager_getServerID(JNIEnv *env, jobject obj)
00118 {
00119 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)(*env)->GetLongField(env,
00120 obj, manager_handle_fid);
00121 int error;
00122 const char *id;
00123
00124 if ((error = CPhidgetManager_getServerID(h, &id)))
00125 PH_THROW(error);
00126
00127 return (*env)->NewStringUTF(env, id);
00128 }
00129
00130 JNIEXPORT void JNICALL
00131 Java_com_phidgets_Manager_enableManagerAttachEvents(JNIEnv *env, jobject obj,
00132 jboolean b)
00133 {
00134 jlong gr = updateGlobalRef(env, obj, nativeAttachHandler_fid, b);
00135
00136 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)
00137 (*env)->GetLongField(env, obj, manager_handle_fid);
00138
00139 CPhidgetManager_set_OnAttach_Handler(h, b ? attach_handler : 0,
00140 (void *)(uintptr_t)gr);
00141 }
00142
00143 static int CCONV
00144 attach_handler(CPhidgetHandle h, void *arg)
00145 {
00146 JNIEnv *env;
00147 jobject obj;
00148 jobject device;
00149 jobject attachEvent;
00150 jlong devhandle;
00151
00152 if ((*ph_vm)->AttachCurrentThread(ph_vm, (JNIEnvPtr)&env, NULL))
00153 JNI_ABORT_STDERR("Couldn't AttachCurrentThread");
00154
00155 obj = (jobject)arg;
00156 devhandle = (jlong)(uintptr_t)h;
00157
00158 if (!(device = (*env)->NewObject(env, phidget_class, phidget_cons,
00159 devhandle)))
00160 return -1;
00161
00162 (*env)->SetBooleanField(env, device, managerPhidget_fid, JNI_TRUE);
00163
00164 if (!(attachEvent = (*env)->NewObject(env, attachEvent_class, attachEvent_cons,
00165 device)))
00166 return -1;
00167 (*env)->CallVoidMethod(env, obj, fireAttach_mid, attachEvent);
00168 (*env)->DeleteLocalRef(env, device);
00169 (*env)->DeleteLocalRef(env, attachEvent);
00170
00171 return 0;
00172 }
00173
00174 JNIEXPORT void JNICALL
00175 Java_com_phidgets_Manager_enableManagerDetachEvents(JNIEnv *env, jobject obj,
00176 jboolean b)
00177 {
00178 jlong gr = updateGlobalRef(env, obj, nativeDetachHandler_fid, b);
00179
00180 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)
00181 (*env)->GetLongField(env, obj, manager_handle_fid);
00182
00183 CPhidgetManager_set_OnDetach_Handler(h, b ? detach_handler : 0, (void *)(uintptr_t)gr);
00184 }
00185
00186 static int CCONV
00187 detach_handler(CPhidgetHandle h, void *arg)
00188 {
00189 JNIEnv *env;
00190 jobject obj;
00191 jobject device;
00192 jobject detachEvent;
00193 jlong devhandle;
00194
00195 if ((*ph_vm)->AttachCurrentThread(ph_vm, (JNIEnvPtr)&env, NULL))
00196 JNI_ABORT_STDERR("Couldn't AttachCurrentThread");
00197
00198 obj = (jobject)arg;
00199 devhandle = (jlong)(uintptr_t)h;
00200
00201 if (!(device = (*env)->NewObject(env, phidget_class, phidget_cons,
00202 devhandle)))
00203 return -1;
00204
00205 (*env)->SetBooleanField(env, device, managerPhidget_fid, JNI_TRUE);
00206
00207 if (!(detachEvent = (*env)->NewObject(env, detachEvent_class, detachEvent_cons,
00208 device)))
00209 return -1;
00210 (*env)->CallVoidMethod(env, obj, fireDetach_mid, detachEvent);
00211 (*env)->DeleteLocalRef(env, device);
00212 (*env)->DeleteLocalRef(env, detachEvent);
00213
00214 return 0;
00215 }
00216
00217 JNIEXPORT void JNICALL
00218 Java_com_phidgets_Manager_enableServerConnectEvents(JNIEnv *env, jobject obj,
00219 jboolean b)
00220 {
00221 jlong gr = updateGlobalRef(env, obj, nativeServerConnectHandler_fid, b);
00222 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)(*env)->GetLongField(env,
00223 obj, manager_handle_fid);
00224
00225 CPhidgetManager_set_OnServerConnect_Handler(h, b ? serverConnect_handler : 0,
00226 (void *)(uintptr_t)gr);
00227 }
00228
00229 static int CCONV
00230 serverConnect_handler(CPhidgetManagerHandle h, void *arg)
00231 {
00232 JNIEnv *env;
00233 jobject obj;
00234 jobject serverConnectEvent;
00235
00236 if ((*ph_vm)->AttachCurrentThread(ph_vm, (JNIEnvPtr)&env, NULL))
00237 JNI_ABORT_STDERR("Couldn't AttachCurrentThread");
00238
00239 obj = (jobject)arg;
00240
00241 if (!(serverConnectEvent = (*env)->NewObject(env, serverConnectEvent_class, serverConnectEvent_cons,
00242 obj)))
00243 return -1;
00244 (*env)->CallVoidMethod(env, obj, fireServerConnect_mid, serverConnectEvent);
00245 (*env)->DeleteLocalRef(env, serverConnectEvent);
00246
00247 return 0;
00248 }
00249
00250 JNIEXPORT void JNICALL
00251 Java_com_phidgets_Manager_enableServerDisconnectEvents(JNIEnv *env, jobject obj,
00252 jboolean b)
00253 {
00254 jlong gr = updateGlobalRef(env, obj, nativeServerDisconnectHandler_fid, b);
00255 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)(*env)->GetLongField(env,
00256 obj, manager_handle_fid);
00257
00258 CPhidgetManager_set_OnServerDisconnect_Handler(h, b ? serverDisconnect_handler : 0,
00259 (void *)(uintptr_t)gr);
00260 }
00261
00262 static int CCONV
00263 serverDisconnect_handler(CPhidgetManagerHandle h, void *arg)
00264 {
00265 JNIEnv *env;
00266 jobject obj;
00267 jobject serverDisconnectEvent;
00268
00269 if ((*ph_vm)->AttachCurrentThread(ph_vm, (JNIEnvPtr)&env, NULL))
00270 JNI_ABORT_STDERR("Couldn't AttachCurrentThread");
00271
00272 obj = (jobject)arg;
00273
00274 if (!(serverDisconnectEvent = (*env)->NewObject(env, serverDisconnectEvent_class, serverDisconnectEvent_cons,
00275 obj)))
00276 return -1;
00277 (*env)->CallVoidMethod(env, obj, fireServerDisconnect_mid, serverDisconnectEvent);
00278 (*env)->DeleteLocalRef(env, serverDisconnectEvent);
00279
00280 return 0;
00281 }
00282
00283 JNIEXPORT void JNICALL
00284 Java_com_phidgets_Manager_nativeOpen(JNIEnv *env, jobject obj)
00285 {
00286 int error;
00287
00288 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)
00289 (*env)->GetLongField(env, obj, manager_handle_fid);
00290
00291 if ((error = CPhidgetManager_open(h)))
00292 PH_THROW(error);
00293 }
00294
00295 JNIEXPORT void JNICALL
00296 Java_com_phidgets_Manager_nativeOpenRemote(JNIEnv *env, jobject obj, jstring serverID, jstring pass)
00297 {
00298 int error;
00299 jboolean iscopy;
00300 const char *serverIDcopy = serverID?(*env)->GetStringUTFChars(
00301 env, serverID, &iscopy):0;
00302 const char *passcopy = (*env)->GetStringUTFChars(
00303 env, pass, &iscopy);
00304
00305 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)
00306 (*env)->GetLongField(env, obj, manager_handle_fid);
00307
00308 if ((error = CPhidgetManager_openRemote(h, serverIDcopy, passcopy)))
00309 PH_THROW(error);
00310
00311 if(serverID)
00312 (*env)->ReleaseStringUTFChars(env, serverID, serverIDcopy);
00313 (*env)->ReleaseStringUTFChars(env, pass, passcopy);
00314 }
00315
00316 JNIEXPORT void JNICALL
00317 Java_com_phidgets_Manager_nativeOpenRemoteIP(JNIEnv *env, jobject obj, jstring ipAddr, jint port, jstring pass)
00318 {
00319 int error;
00320 jboolean iscopy;
00321 const char *ipAddrcopy = (*env)->GetStringUTFChars(
00322 env, ipAddr, &iscopy);
00323 const char *passcopy = (*env)->GetStringUTFChars(
00324 env, pass, &iscopy);
00325
00326 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)
00327 (*env)->GetLongField(env, obj, manager_handle_fid);
00328
00329 if ((error = CPhidgetManager_openRemoteIP(h, ipAddrcopy, port, passcopy)))
00330 PH_THROW(error);
00331
00332 (*env)->ReleaseStringUTFChars(env, ipAddr, ipAddrcopy);
00333 (*env)->ReleaseStringUTFChars(env, pass, passcopy);
00334 }
00335
00336 JNIEXPORT void JNICALL
00337 Java_com_phidgets_Manager_nativeDelete(JNIEnv *env, jobject obj)
00338 {
00339 int error;
00340
00341 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)
00342 (*env)->GetLongField(env, obj, manager_handle_fid);
00343
00344 if ((error = CPhidgetManager_delete(h)))
00345 PH_THROW(error);
00346 }
00347
00348 JNIEXPORT void JNICALL
00349 Java_com_phidgets_Manager_nativeClose(JNIEnv *env, jobject obj)
00350 {
00351 int error;
00352
00353 CPhidgetManagerHandle h = (CPhidgetManagerHandle)(uintptr_t)
00354 (*env)->GetLongField(env, obj, manager_handle_fid);
00355
00356 if ((error = CPhidgetManager_close(h)))
00357 PH_THROW(error);
00358 }
00359
00360 JNIEXPORT jlong JNICALL
00361 Java_com_phidgets_Manager_create(JNIEnv *env, jobject obj)
00362 {
00363 int error;
00364 CPhidgetManagerHandle phidm;
00365
00366 if ((error = CPhidgetManager_create(&phidm)))
00367 PH_THROW(error);
00368 return (jlong)(uintptr_t)phidm;
00369 }