diff -r f5050f1da672 -r 04becd199f91 javaextensions/location/landmarks/src/landmarkstore.cpp --- /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* 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