--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/location/landmarks/src/landmarkstore.cpp Tue Apr 27 16:30:29 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