javaextensions/location/landmarks/src/landmarkstore.cpp
changeset 21 2a9601315dfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/location/landmarks/src/landmarkstore.cpp	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,570 @@
+/*
+* 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 LandmarkStore class
+ *
+*/
+
+
+// INTERNAL INCLUDES
+#include "javax_microedition_location_LandmarkStore.h"
+#include "logger.h"
+#include "jstringutils.h"
+#include "lapijnicommon.h"
+#include "clapilandmark.h"
+#include "clapilandmarkstore.h"
+#include "mlapicategorymanager.h"
+#include "tlapisearchcriteria.h"
+#include "lapipanics.h"
+#include "locationfunctionserver.h"
+
+using namespace java::location;
+
+LOCAL_C void AddLandmarkL(CLAPILandmarkStore* aLandmarkStore,
+                          CLAPILandmark* aLandmark, const TDesC* aCategory)
+{
+    JELOG2(EJavaLocation);
+    MLAPICategoryManager* categoryManager = aLandmarkStore->CategoryManagerL();
+    // Category argument can be null
+    if (aCategory && categoryManager)
+    {
+        TRAPD(err, categoryManager->AddLandmarkToCategoryL(*aLandmark,
+                *aCategory));
+        // The landmark was not found from the store. Add new
+        if (err == KErrNotFound)
+        {
+            aLandmarkStore->AddLandmarkL(*aLandmark);
+            categoryManager->AddLandmarkToCategoryL(*aLandmark, *aCategory);
+            err = KErrNone;
+        }
+        // Leave if some other error occured
+        User::LeaveIfError(err);
+    }
+    else
+    {
+        // No category information. Add a new landmark
+        aLandmarkStore->AddLandmarkL(*aLandmark);
+    }
+
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _addLandmark
+ * Signature: (III)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_LandmarkStore__1addLandmark(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jint aLandmarkHandle,
+    jstring aCategory)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    const JStringUtils category(*aJniEnv, aCategory);
+    const TDesC* categoryArg = (aCategory ? &category : NULL);
+
+    TInt error = eventSource->ExecuteTrap(
+                     AddLandmarkL,
+                     landmarkStore,
+                     landmark,
+                     categoryArg);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_LandmarkStore__1addLandmark - error %d", error);
+
+    return error;
+}
+
+LOCAL_C void LandmarksL(JNIEnv* aJniEnv, CLAPILandmarkStore* aLandmarkStore,
+                        TUint* aAttributes, TLAPISearchCriteria* aSearchCriteria,
+                        jintArray* aLandmarkHandles)
+{
+    JELOG2(EJavaLocation);
+
+    // Get items using the specified search criteria
+    CArrayPtr<CLAPILandmark>* landmarks = aLandmarkStore->LandmarksL(
+                                              *aAttributes, aSearchCriteria);
+    // No need to push the array to the cleanup stack since it is
+    // used from non-leaving context
+    *aLandmarkHandles = CreateHandleArray(*aJniEnv, *landmarks);
+    // Reset the items since the ownership is transferred to Java side
+    landmarks->Reset();
+    // Delete the empty array
+    delete landmarks;
+    // Leave if the result array is null
+    __ASSERT_ALWAYS(aLandmarkHandles, User::Leave(KErrNoMemory));
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _getLandmarks
+ * Signature: (II[I)[I
+ */
+JNIEXPORT jintArray
+JNICALL Java_javax_microedition_location_LandmarkStore__1getLandmarks(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jintArray aError)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+
+    // VM will own the result array
+    jintArray handles(NULL);
+    // Criteria is null so all landmark should be returned
+    TLAPISearchCriteria* criteria(NULL);
+    // Initialize only the name from each landmark
+    TUint initializedAttributes = ELAPILmAttrName;
+
+    TInt error = eventSource->ExecuteTrap(
+                     LandmarksL,
+                     eventSource->getValidJniEnv(),
+                     landmarkStore,
+                     &initializedAttributes,
+                     criteria,
+                     &handles);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_LandmarkStore__1getLandmarks - error %d", error);
+
+    // Set error code if LandmarksL leaved. KErrNone if successful
+    SetJavaErrorCode(*aJniEnv, aError, error);
+    return handles; // NULL indicates an error
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _getLandmarksFromCategory
+ * Signature: (IILjava/lang/String;Ljava/lang/String;[I)[I
+ */
+JNIEXPORT jintArray
+JNICALL Java_javax_microedition_location_LandmarkStore__1getLandmarksFromCategory(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jstring aCategory,
+    jstring aName,
+    jintArray aError)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+
+    // VM will own the result array
+    jintArray handles(NULL);
+    // Resolve name argument. NULL indicates a wild card
+    const JStringUtils name(*aJniEnv, aName);
+    const TDesC* nameArg = (aName ? &name : NULL);
+    // Resolve category argument. NULL indicates a wild card
+    const JStringUtils category(*aJniEnv, aCategory);
+    const TDesC* categoryArg = (aCategory ? &category : NULL);
+
+    TLAPISearchCriteria criteria;
+    criteria.SetCategoryName(categoryArg);
+    criteria.SetText(nameArg);
+    criteria.SetTextAttributes(ELAPILmAttrName);
+
+    // Initialize name information to each item. Category information
+    // cannot be currently obtained using the Java landmark so there
+    // is no need to initialize it
+    TUint initializedAttributes = ELAPILmAttrName;
+
+    TInt error = eventSource->ExecuteTrap(
+                     LandmarksL,
+                     eventSource->getValidJniEnv(),
+                     landmarkStore,
+                     &initializedAttributes,
+                     &criteria,
+                     &handles);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_LandmarkStore__1getLandmarksFromCategory - error %d", error);
+
+    // Set error code if LandmarksL leaved. KErrNone if successful. Invalid search
+    // arguments will return null result with no errors
+    error = error == KErrArgument ? KErrNone : error;
+    SetJavaErrorCode(*aJniEnv, aError, error);
+    return handles; // NULL indicates an error
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _getLandmarksFromArea
+ * Signature: (IILjava/lang/String;DDDD[I)[I
+ */
+JNIEXPORT jintArray
+JNICALL Java_javax_microedition_location_LandmarkStore__1getLandmarksFromArea(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jstring aCategory,
+    jdouble aMinLatitude,
+    jdouble aMaxLatitude,
+    jdouble aMinLongitude,
+    jdouble aMaxLongitude,
+    jintArray aError)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+
+    // VM will own the result array
+    jintArray handles(NULL);
+    const JStringUtils category(*aJniEnv, aCategory);
+    const TDesC* categoryArg = (aCategory ? &category : NULL);
+
+    TLAPISearchCriteria criteria;
+    criteria.SetCategoryName(categoryArg);
+    criteria.SetArea(aMinLatitude, aMaxLatitude, aMinLongitude, aMaxLongitude);
+
+    // Initialize name and position to each item. Category information
+    // cannot be currently obtained using the Java landmark so there
+    // is no need to initialize it
+    TUint initializedAttributes = ELAPILmAttrName | ELAPILmAttrPosition;
+
+    TInt error = eventSource->ExecuteTrap(
+                     LandmarksL,
+                     eventSource->getValidJniEnv(),
+                     landmarkStore,
+                     &initializedAttributes,
+                     &criteria,
+                     &handles);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_LandmarkStore__1getLandmarksFromArea - error %d", error);
+
+    // Set error code if LandmarksL leaved. KErrNone if successful. Invalid search
+    // arguments will return null result with no errors
+    error = error == KErrArgument ? KErrNone : error;
+    SetJavaErrorCode(*aJniEnv, aError, error);
+    return handles; // NULL indicates an error
+}
+
+LOCAL_C void RemoveLandmarkFromCategoryL(CLAPILandmarkStore* aLandmarkStore,
+        CLAPILandmark* aLandmark, const TDesC* aCategoryName)
+{
+    JELOG2(EJavaLocation);
+    __ASSERT_DEBUG(aCategoryName, LAPIError::Panic(ELAPIPanicNullArgument));
+    MLAPICategoryManager* categoryManager = aLandmarkStore->CategoryManagerL();
+    if (categoryManager)
+    {
+        // Remove the landmark from the category if it is possible
+        categoryManager->RemoveLandmarkFromCategoryL(*aLandmark, *aCategoryName);
+    }
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _removeLandmarkFromCategory
+ * Signature: (IIILjava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL
+Java_javax_microedition_location_LandmarkStore__1removeLandmarkFromCategory(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jint aLandmarkHandle,
+    jstring aCategory)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    const JStringUtils category(*aJniEnv, aCategory);
+
+    TInt error = eventSource->ExecuteTrap(
+                     RemoveLandmarkFromCategoryL,
+                     landmarkStore,
+                     landmark,
+                     static_cast< const TDesC*>(&category));
+
+    return error;
+}
+
+LOCAL_C void UpdateLandmarkL(CLAPILandmarkStore* aLandmarkStore,
+                             CLAPILandmark* aLandmark)
+{
+    aLandmarkStore->UpdateLandmarkL(*aLandmark);
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _updateLandmark
+ * Signature: (III)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_LandmarkStore__1updateLandmark(
+    JNIEnv* /*aJniEnv*/,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jint aLandmarkHandle)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    TInt error = eventSource->ExecuteTrap(
+                     UpdateLandmarkL,
+                     landmarkStore,
+                     landmark);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_LandmarkStore__1updateLandmark - error %d", error);
+
+    return error;
+}
+
+LOCAL_C void DeleteLandmarkL(CLAPILandmarkStore* aLandmarkStore,
+                             CLAPILandmark* aLandmark)
+{
+    aLandmarkStore->RemoveLandmarkL(*aLandmark);
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _deleteLandmark
+ * Signature: (III)I
+ */
+JNIEXPORT jint
+JNICALL Java_javax_microedition_location_LandmarkStore__1deleteLandmark(
+    JNIEnv* /*aJniEnv*/,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jint aLandmarkHandle)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+    CLAPILandmark* landmark =
+        reinterpret_cast< CLAPILandmark*>(aLandmarkHandle);
+
+    TInt error = eventSource->ExecuteTrap(
+                     DeleteLandmarkL,
+                     landmarkStore,
+                     landmark);
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_LandmarkStore__1deleteLandmark - error %d", error);
+
+    // Ignore errors indicating that the landmark has already been ignored
+    return error == KErrNotFound ? KErrNone : error;
+}
+
+LOCAL_C void ListCategoriesL(JNIEnv* aJniEnv,
+                             CLAPILandmarkStore* aLandmarkStore, jobjectArray* aCategories)
+{
+    JELOG2(EJavaLocation);
+
+    // Get an array of landmark store uris from the manager
+    MLAPICategoryManager* categoryManager = aLandmarkStore->CategoryManagerL();
+    // Supports category handling
+    if (categoryManager)
+    {
+        const CDesCArray& categories = categoryManager->ListCategoriesL();
+        // Create a java object array from the category names. Java-side takes
+        // the ownership of the new object array
+        *aCategories = CopyToNewJavaStringArrayL(*aJniEnv, categories);
+    }
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _listCategories
+ * Signature: (II[I)[Ljava/lang/String;
+ */
+JNIEXPORT jobjectArray
+JNICALL Java_javax_microedition_location_LandmarkStore__1listCategories(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jintArray aError)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+
+    // Ownership of the name array is transferred to Java side
+    jobjectArray javaStringArray = NULL;
+
+    TInt error = eventSource->ExecuteTrap(
+                     ListCategoriesL,
+                     eventSource->getValidJniEnv(),
+                     landmarkStore,
+                     &javaStringArray);
+
+    SetJavaErrorCode(*aJniEnv, aError, error);
+    return javaStringArray;
+}
+
+LOCAL_C void AddCategoryL(CLAPILandmarkStore* aLandmarkStore,
+                          const TDesC* aCategoryName)
+{
+    __ASSERT_DEBUG(aCategoryName, LAPIError::Panic(ELAPIPanicNullArgument));
+    // Get the category manager and add new category if the store supports it
+    MLAPICategoryManager* categoryManager = aLandmarkStore->CategoryManagerL();
+    // Supports category handling
+    if (categoryManager)
+    {
+        categoryManager->AddCategoryL(*aCategoryName);
+        // Compact the store if needed
+        aLandmarkStore->CompactIfNeededL();
+    }
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _addCategory
+ * Signature: (IILjava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_javax_microedition_location_LandmarkStore__1addCategory(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jstring aCategory)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+
+    // Store name must not be null
+    const JStringUtils categoryName(*aJniEnv, aCategory);
+
+    TInt error = eventSource->ExecuteTrap(
+                     AddCategoryL,
+                     landmarkStore,
+                     static_cast< const TDesC*>(&categoryName));
+
+    LOG1(EJavaLocation,EInfo, "Java_javax_microedition_location_LandmarkStore__1addCategory error %d", error);
+
+    return error;
+}
+
+LOCAL_C void DeleteCategoryL(CLAPILandmarkStore* aLandmarkStore,
+                             const TDesC* aCategoryName)
+{
+    __ASSERT_DEBUG(aCategoryName, LAPIError::Panic(ELAPIPanicNullArgument));
+    // Get the category manager and add new category if the store supports it
+    MLAPICategoryManager* categoryManager = aLandmarkStore->CategoryManagerL();
+    // Supports category handling
+    if (categoryManager)
+    {
+        categoryManager->RemoveCategoryL(*aCategoryName);
+
+    }
+}
+
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _deleteCategory
+ * Signature: (IILjava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_javax_microedition_location_LandmarkStore__1deleteCategory(
+    JNIEnv* aJniEnv,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aStoreHandle,
+    jstring aCategory)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* landmarkStore =
+        reinterpret_cast< CLAPILandmarkStore*>(aStoreHandle);
+
+    // Store name must not be null
+    const JStringUtils categoryName(*aJniEnv, aCategory);
+
+    TInt error = eventSource->ExecuteTrap(
+                     DeleteCategoryL,
+                     landmarkStore,
+                     static_cast< const TDesC*>(&categoryName));
+
+    LOG1(EJavaLocation,EInfo,
+         "Java_javax_microedition_location_LandmarkStore__1deleteCategory error %d", error);
+
+    return error;
+}
+
+LOCAL_C void DisposeObject(CLAPILandmarkStore* aLandmarkStore)
+{
+    delete aLandmarkStore;
+}
+/*
+ * Class:     javax_microedition_location_LandmarkStore
+ * Method:    _dispose
+ * Signature: (II)V
+ */
+JNIEXPORT void
+JNICALL Java_javax_microedition_location_LandmarkStore__1dispose(
+    JNIEnv* /*aJniEnv*/,
+    jobject /*aPeer*/,
+    jint aEventSourceHandle,
+    jint aManagerHandle)
+{
+    JELOG2(EJavaLocation);
+
+    LocationFunctionServer* eventSource =
+        reinterpret_cast< LocationFunctionServer*>(aEventSourceHandle);
+    CLAPILandmarkStore* object =
+        reinterpret_cast< CLAPILandmarkStore*>(aManagerHandle);
+
+    eventSource->ExecuteV(
+        DisposeObject,
+        object);
+}
+
+// End of file