diff -r f5050f1da672 -r 04becd199f91 javaextensions/sensor/src/sensorconnectionimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/sensor/src/sensorconnectionimpl.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,251 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: JNI implementation for SensorConnectionImpl.java +* +*/ + + +#include "com_nokia_mj_impl_sensor_SensorConnectionImpl.h" +#include "sensorjniutils.h" +#include "sensornativeconstants.h" +#include "sensor.h" +#include "sensorconnection.h" +#include "sensorconnectionlist.h" +#include "logger.h" + +void ConditionCallback(void* aJniEnv, void* aJavaPeer, void* aHandle, int aChannel, + double aValue, long aTimeStamp) +{ + JELOG2(ESensor); + JNIEnv* jniEnv = (JNIEnv*)aJniEnv; + jobject peer = (jobject) aJavaPeer; + jclass cls = jniEnv->GetObjectClass(peer); + jmethodID mid = jniEnv->GetMethodID(cls, "conditionMet", "(IIDJ)V"); + int condId = reinterpret_cast< int >(aHandle); + jniEnv->CallVoidMethod(peer, mid, aChannel, condId, aValue, aTimeStamp); + // Handle possible exception in callback + HandleException(*jniEnv); +} + +void FillData(DataFillerParams* aParams) +{ + JELOG2(ESensor); + JNIEnv* jniEnv = (JNIEnv*)aParams->iJniEnv; + jobjectArray destData = (jobjectArray)aParams->iDataObjects; + + // Assign data + for (int i = 0; i < aParams->iDataCount; i++) + { + jobject data = jniEnv->GetObjectArrayElement(destData, i); + jclass dataClass = jniEnv->GetObjectClass(data); + + if (aParams->iDatas[ i ]->iIntValues) + { + jfieldID field = jniEnv->GetFieldID(dataClass, "iIntValues", "[I"); + jintArray intValues = jniEnv->NewIntArray(aParams->iDatas[ i ]->iNumOfValues); + jniEnv->SetIntArrayRegion(intValues, 0, aParams->iDatas[ i ]->iNumOfValues, + aParams->iDatas[ i ]->iIntValues); + jniEnv->SetObjectField(data, field, intValues); + jniEnv->DeleteLocalRef(intValues); + HandleException(*jniEnv); + } + else if (aParams->iDatas[ i ]->iDoubleValues) + { + jfieldID field = jniEnv->GetFieldID(dataClass, "iDoubleValues", "[D"); + jdoubleArray doubleValues = jniEnv->NewDoubleArray(aParams->iDatas[ i ]->iNumOfValues); + jniEnv->SetDoubleArrayRegion(doubleValues, 0, aParams->iDatas[ i ]->iNumOfValues, + aParams->iDatas[ i ]->iDoubleValues); + jniEnv->SetObjectField(data, field, doubleValues); + jniEnv->DeleteLocalRef(doubleValues); + HandleException(*jniEnv); + } + if (aParams->iDatas[ i ]->iTimeStampsIncluded) + { + jfieldID field = jniEnv->GetFieldID(dataClass, "iTimestamps", "[J"); + jlongArray timestamps = jniEnv->NewLongArray(aParams->iDatas[ i ]->iNumOfValues); + jniEnv->SetLongArrayRegion(timestamps, 0, aParams->iDatas[ i ]->iNumOfValues, + reinterpret_cast(aParams->iDatas[ i ]->iTimeStamps)); + jniEnv->SetObjectField(data, field, timestamps); + jniEnv->DeleteLocalRef(timestamps); + HandleException(*jniEnv); + } + if (aParams->iDatas[ i ]->iValiditiesIncluded) + { + jfieldID field = jniEnv->GetFieldID(dataClass, "iValidities", "[Z"); + jbooleanArray validities = jniEnv->NewBooleanArray(aParams->iDatas[ i ]->iNumOfValues); + jniEnv->SetBooleanArrayRegion(validities, 0, aParams->iDatas[ i ]->iNumOfValues, + reinterpret_cast(aParams->iDatas[ i ]->iValidities)); + jniEnv->SetObjectField(data, field, validities); + jniEnv->DeleteLocalRef(validities); + HandleException(*jniEnv); + } + } + jobject peer = (jobject) aParams->iJavaPeer; + jclass cls = jniEnv->GetObjectClass(peer); + jmethodID mid = jniEnv->GetMethodID(cls, "dataReceived", "([Ljavax/microedition/sensor/Data;Z)V"); + jniEnv->CallVoidMethod(peer, mid, destData, aParams->iIsDataLost); + // Handle possible exception in callback + HandleException(*jniEnv); +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _createSensorConnection + * Signature: (II)I + */ +JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1createSensorConnection +(JNIEnv* aJniEnv, jobject aJobj, jint aSensorList, jint aIndex) +{ + JELOG2(ESensor); + SensorConnectionList* senList = reinterpret_cast< SensorConnectionList* >(aSensorList); + SensorConnection* conn = senList->CreateSensorConnection(aIndex); + if (!conn) + { + return ERROR_NOMEMORY; + } + int err = conn->GetSensor()->OpenChannel(conn); + if (err) + { + return err; + } + conn->SetJavaPeer(aJniEnv->NewWeakGlobalRef(aJobj)); + conn->SetCallbacks(&FillData, &ConditionCallback); + return reinterpret_cast< int >(conn); +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _startDataListening + * Signature: ([Ljavax/microedition/sensor/Data;IJZZ)I + */ + +JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1startDataListening +(JNIEnv* aJniEnv, jobject /*aPeer*/, jint aSensorConnection, jobjectArray aData, + jint aBufferSize, jlong aBufferingPeriod, jboolean aIsTimestampsIncluded, + jboolean aIsValidityIncluded, jboolean aIsOneShot, jint aDataType) +{ + JELOG2(ESensor); + SensorConnection* conn = reinterpret_cast< SensorConnection* >(aSensorConnection); + void* oldData = 0; + void* dataObjects = aJniEnv->NewGlobalRef(aData); + int err = conn->PrepareDataListening(dataObjects, + aJniEnv->GetArrayLength(aData), + oldData, + aDataType); + // Remove possible old data objects + if (oldData) + { + aJniEnv->DeleteGlobalRef((jobject)oldData); + } + + if (!err) + { + err = conn->StartDataListening(aBufferSize, aBufferingPeriod, + aIsTimestampsIncluded, aIsValidityIncluded, + aIsOneShot); + } + return err; +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _cancelDataListening + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1cancelDataListening +(JNIEnv *, jobject, jint aSensorConnection) +{ + JELOG2(ESensor); + SensorConnection* conn = reinterpret_cast< SensorConnection* >(aSensorConnection); + Sensor* sensor = conn->GetSensor(); + return sensor->CancelDataListening(); +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _removeConnection + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1removeConnection +(JNIEnv* aJniEnv, jobject, jint aSensorList, jint aSensorConnection) +{ + JELOG2(ESensor); + SensorConnectionList* senList = reinterpret_cast< SensorConnectionList* >(aSensorList); + SensorConnection* conn = reinterpret_cast< SensorConnection* >(aSensorConnection); + jobject dataObjects = (jobject)conn->DataObjects(); + if (dataObjects) + { + aJniEnv->DeleteGlobalRef(dataObjects); + } + aJniEnv->DeleteWeakGlobalRef((jweak)conn->GetJavaPeer()); + senList->RemoveConnection(conn); +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _startConditionListening + * Signature: (II)V + */ +JNIEXPORT void JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1startConditionListening +(JNIEnv *, jobject, jint aConnectionHandle , jint aListeningType) +{ + JELOG2(ESensor); + SensorConnection* conn = reinterpret_cast< SensorConnection* >(aConnectionHandle); + Sensor* sensor = conn->GetSensor(); + sensor->StartConditionListening(aListeningType); +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _stopConditionListening + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1stopConditionListening +(JNIEnv *, jobject, jint aConnectionHandle) +{ + JELOG2(ESensor); + SensorConnection* conn = reinterpret_cast< SensorConnection* >(aConnectionHandle); + Sensor* sensor = conn->GetSensor(); + sensor->StopConditionListening(); +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _startServer + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1startServer +(JNIEnv* aJniEnv, jobject, jint aConnectionHandle) +{ + JELOG2(ESensor); + SensorConnection* conn = reinterpret_cast< SensorConnection* >(aConnectionHandle); + Sensor* sensor = conn->GetSensor(); + // Store JNI env from this thread + conn->SetJni(aJniEnv); + sensor->StartServer(); +} + +/* + * Class: com_nokia_mj_impl_sensor_SensorConnectionImpl + * Method: _startServer + * Signature: (I)V + */ +JNIEXPORT void JNICALL Java_com_nokia_mj_impl_sensor_SensorConnectionImpl__1stopServer +(JNIEnv *, jobject, jint aConnectionHandle) +{ + JELOG2(ESensor); + SensorConnection* conn = reinterpret_cast< SensorConnection* >(aConnectionHandle); + Sensor* sensor = conn->GetSensor(); + sensor->StopServer(); +}