javaextensions/location/landmarks/src/landmark.cpp
branchRCL_3
changeset 19 04becd199f91
child 23 98ccebc37403
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/location/landmarks/src/landmark.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,479 @@
+/*
+* 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 of Landmark class
+ *
+*/
+
+
+// INTERNAL INCLUDES
+#include "javax_microedition_location_Landmark.h"
+#include "jstringutils.h"
+#include "s60commonutils.h"
+#include "lapijnicommon.h"
+#include "logger.h"
+#include "clapilandmark.h"
+#include "clapiaddressinfo.h"
+#include "cleanupresetanddestroy.h"
+#include "locationfunctionserver.h"
+
+using namespace java::location;
+
+LOCAL_C void CreateLandmarkL(TInt* aHandle)
+{
+    CLAPILandmark::TCtorParams params;
+    params.iLandmark = NULL;
+    params.iLandmarkStore = NULL;
+
+    CLAPILandmark* landmark = CLAPILandmark::NewLC(params);
+    // Add the created object to event source
+    TInt handle = reinterpret_cast<TInt>(landmark);
+    CleanupStack::Pop(landmark);
+    *aHandle = handle;
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _createNativePeer
+ * Signature: (I)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_Landmark__1createNativePeer(
+    JNIEnv* /*aJniEnv*/,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+
+    TInt handle = KErrGeneral;
+
+    TInt error = eventSource->ExecuteTrap(
+                     CreateLandmarkL,
+                     &handle);
+
+    // Return the handle if it was successfully obtained
+
+    return error == KErrNone ? handle : error;
+
+}
+
+LOCAL_C void LandmarkNameL(JNIEnv* aJniEnv, CLAPILandmark* aLandmark,
+                           jstring* aName)
+{
+
+    const TDesC& name = aLandmark->NameL();
+    *aName = java::util::S60CommonUtils::NativeToJavaString(*aJniEnv, name);
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _getName
+ * Signature: (II)Ljava/lang/String;
+ */
+JNIEXPORT jstring
+JNICALL Java_javax_microedition_location_Landmark__1getName(
+    JNIEnv* , jobject /*aPeer*/, jint aEventSourceHandle, jint aLandmarkHandle)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    jstring name(NULL);
+
+    TInt error = eventSource->ExecuteTrap(
+                     LandmarkNameL,
+                     eventSource->getValidJniEnv(),
+                     landmark,
+                     &name);
+
+    // Null indicates an error. Landmark should always have a name
+    return name;
+}
+
+LOCAL_C void LandmarkDescriptionL(CLAPILandmark* aLandmark,
+                                  const TDesC** aDescription)
+{
+    *aDescription = aLandmark->DescriptionL();
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _getDescription
+ * Signature: (II)Ljava/lang/String;
+ */
+JNIEXPORT jstring
+JNICALL Java_javax_microedition_location_Landmark__1getDescription(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aLandmarkHandle)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    const TDesC* description(NULL);
+
+    TInt error = eventSource->ExecuteTrap(
+                     LandmarkDescriptionL,
+                     landmark,
+                     &description);
+
+    jstring javaDescription(NULL);
+    // Zero length descriptions are not allowed
+    if (description && description->Length()> 0)
+    {
+        javaDescription = java::util::S60CommonUtils::NativeToJavaString(*aJniEnv, *description);
+    }
+
+    // Null indicates an error or that the landmark didn't have a description
+    return javaDescription;
+}
+
+LOCAL_C void LandmarkCoordinatesL(CLAPILandmark* aLandmark,
+                                  const TLocality** aPosition)
+{
+    *aPosition = aLandmark->CoordinatesL();
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _getCoordinates
+ * Signature: (II[D[F)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_Landmark__1getCoordinates(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aLandmarkHandle,
+    jdoubleArray aCoordinates,
+    jfloatArray aCoordinateInfo)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    const TLocality* position(NULL);
+
+    TInt error = eventSource->ExecuteTrap(
+                     LandmarkCoordinatesL,
+                     landmark,
+                     &position);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_Landmark__1getCoordinates - error %d", error);
+
+    if (error == KErrNone)
+    {
+        if (position)
+        {
+            // The position was successfully received from the landmark. Create
+            // position data arrays from the native landmark position
+            CreateCoordinateInfos(*aJniEnv, *position, aCoordinates, aCoordinateInfo);
+        }
+        else
+        {
+            // Position has not been set to the landmark.
+            error = KErrNotFound;
+        }
+    }
+
+    return error;
+}
+
+LOCAL_C void AddressInfosL(JNIEnv* aJniEnv, CLAPILandmark* aLandmark,
+                           jobjectArray* aJavaStringArray)
+{
+
+    // Read all address information from the landmark
+    const CLAPIAddressInfo* info = aLandmark->AddressInfoL();
+    if (info && info->ValueCount() > 0)
+    {
+        RPointerArray<HBufC> values(ELAPINumAddressInfos);
+        CleanupResetAndDestroyPushL(values);
+
+        for (TInt i = 1; i <= ELAPINumAddressInfos; i++)
+        {
+            const TDesC* value = info->Value(i);
+            // Null elements indicate an empty address info field
+            HBufC* newValue = value ? value->AllocLC() : NULL;
+            values.AppendL(newValue);
+            // Pop the value if it was added to the cleanup stack
+            if (newValue)
+            {
+                CleanupStack::Pop(newValue);
+            }
+        }
+
+        // Create a java string array from the address info array
+        *aJavaStringArray = CreateJavaStringArray(*aJniEnv, values);
+        CleanupStack::PopAndDestroy(&values);
+    }
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _getAddressInfo
+ * Signature: (II)[Ljava/lang/String;
+ */
+JNIEXPORT jobjectArray
+JNICALL Java_javax_microedition_location_Landmark__1getAddressInfo(
+    JNIEnv* ,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aLandmarkHandle)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    // Ownership of the name array is transferred to Java side
+    jobjectArray javaStringArray(NULL);
+
+    TInt error = eventSource->ExecuteTrap(
+                     AddressInfosL,
+                     eventSource->getValidJniEnv(),
+                     landmark,
+                     &javaStringArray);
+
+    return javaStringArray; // NULL indicates an error
+}
+
+LOCAL_C void SetNameL(CLAPILandmark* aLandmark, const TDesC* aName)
+{
+    aLandmark->SetNameL(*aName);
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _setName
+ * Signature: (IILjava/lang/String;)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_Landmark__1setName(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aLandmarkHandle,
+    jstring aName)
+{
+    JELOG2(EJavaLocation);
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    // Convert the description to a native descriptor. NULL is ok
+    const JStringUtils name(*aJniEnv, aName);
+    const TDesC* nativeName = (aName ? &name : NULL);
+
+    TInt error = eventSource->ExecuteTrap(
+                     SetNameL,
+                     landmark,
+                     nativeName);
+    return error;
+}
+
+LOCAL_C void SetDescriptionL(CLAPILandmark* aLandmark,
+                             const TDesC* aDescription)
+{
+    aLandmark->SetDescriptionL(aDescription);
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _setDescription
+ * Signature: (IILjava/lang/String;)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_Landmark__1setDescription(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aLandmarkHandle,
+    jstring aDescription)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    // Convert the description to a native descriptor. NULL is ok
+    const JStringUtils description(*aJniEnv, aDescription);
+    const TDesC* nativeDesc = (aDescription ? &description : NULL);
+
+    TInt error = eventSource->ExecuteTrap(
+                     SetDescriptionL,
+                     landmark,
+                     nativeDesc);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_Landmark__1setDescription - error %d", error);
+    return error;
+}
+
+LOCAL_C void SetCoordinatesL(CLAPILandmark* aLandmark, TLocality* aCoordinates)
+{
+    aLandmark->SetCoordinatesL(aCoordinates);
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _setCoordinates
+ * Signature: (II[D[F)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_Landmark__1setCoordinates(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aLandmarkHandle,
+    jdoubleArray aCoordinates,
+    jfloatArray aCoordinateInfo)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    TLocality position;
+    if (aCoordinates && aCoordinateInfo)
+    {
+        position = CreatePosition(*aJniEnv,
+                                  aCoordinates,
+                                  aCoordinateInfo);
+    }
+
+    TInt error = eventSource->ExecuteTrap(
+                     SetCoordinatesL,
+                     landmark,
+                     aCoordinates && aCoordinateInfo ? &position : NULL);
+    return error;
+}
+
+LOCAL_C void SetAddressInfoL(JNIEnv* aJniEnv, CLAPILandmark* aLandmark,
+                             jobjectArray* aAddressInfo)
+{
+    RPointerArray<HBufC> addressInfos = CreateNativeStringArrayL(*aJniEnv,
+                                        *aAddressInfo);
+    CleanupResetAndDestroyPushL(addressInfos);
+    TInt count = addressInfos.Count();
+    if (count > 0)
+    {
+        // Currently, the Java side address info object is handled so that
+        // if the value is completely changed, all fields will be reset
+        // So if the address info is set from the Java-side, it is expected
+        // that it will completely replace the existing one. Works correctly if
+        // the existing address info is modified or replaced with a new one
+        CLAPIAddressInfo* info = CLAPIAddressInfo::NewLC();
+        // Copy the address information from the array
+        for (TInt i = 0; i < count; i++)
+        {
+            // The ownership of the value is NOT transferred to "info"
+            info->SetValueL(i + 1, addressInfos[i]);
+        }
+        aLandmark->SetAddressInfoL(info);
+        // The landmark takes the ownership of the address information object
+        CleanupStack::Pop(info);
+    }
+    else
+    {
+        // Clear the address information from the landmark
+        aLandmark->SetAddressInfoL(NULL);
+    }
+    // The array is not needed anymore
+    CleanupStack::PopAndDestroy(&addressInfos);
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _setAddressInfo
+ * Signature: (II[Ljava/lang/String;)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_Landmark__1setAddressInfo(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aLandmarkHandle,
+    jobjectArray aAddressInfo)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    // Array must be created within a leave-safe content so it must be
+    // passed to the Event Server's thread. A global reference is needed
+    jobjectArray arrayRef(NULL);
+    if (aAddressInfo)
+    {
+        // Create a new global reference.
+        arrayRef = static_cast< jobjectArray>(
+                       aJniEnv->NewGlobalRef(aAddressInfo));
+    }
+
+    TInt error = eventSource->ExecuteTrap(
+                     SetAddressInfoL,
+                     eventSource->getValidJniEnv(),
+                     landmark,
+                     &arrayRef);
+
+    // Remove the created global reference
+    if (arrayRef)
+    {
+        aJniEnv->DeleteGlobalRef(arrayRef);
+    }
+    return error;
+}
+
+/*
+ * Class:     javax_microedition_location_Landmark
+ * Method:    _dispose
+ * Signature: (II)V
+ */
+JNIEXPORT void
+JNICALL Java_javax_microedition_location_Landmark__1dispose(
+    JNIEnv* /*aJniEnv*/,
+    jobject /*aPeer*/,
+    jint /*aEventSourceHandle*/,
+    jint aLandmarkHandle)
+{
+    JELOG2(EJavaLocation);
+
+    CBase* object = reinterpret_cast< CBase*>(aLandmarkHandle);
+
+    delete object;
+}
+
+// End of file