javaextensions/sensor/src/sensorconnectionimpl.cpp
branchRCL_3
changeset 19 04becd199f91
--- /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<jlong*>(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<jboolean*>(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();
+}