diff -r f5050f1da672 -r 04becd199f91 javaextensions/pim/jni/src/pimlistimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javaextensions/pim/jni/src/pimlistimpl.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,594 @@ +/* +* 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: PIMListImpl JNI wrapper. + * +*/ + + +// INCLUDE FILES + +#include "com_nokia_mj_impl_pim_PIMListImpl.h" +#include "pimbaselist.h" +#include "pimbaseitem.h" +#include "pimcommon.h" +#include "pimutils.h" +#include "pimpanics.h" +#include "cpimlist.h" +#include "logger.h" +#include "s60commonutils.h" // need to be removed once localisation is finalised + +// CONSTANTS + +/** + * Represents the type of label fetched from the framework. Used in + * the common implementation of all three label getting operations. + */ +enum TPIMLabelType +{ + EPIMLabelTypeField = com_nokia_mj_impl_pim_PIMListImpl_LABEL_TYPE_FIELD, + + EPIMLabelTypeAttribute = com_nokia_mj_impl_pim_PIMListImpl_LABEL_TYPE_ATTRIBUTE, + + EPIMLabelTypeArrayElement = com_nokia_mj_impl_pim_PIMListImpl_LABEL_TYPE_ARRAY_ELEMENT +}; + +/** + * Represents enumeration (item listing) type in different enumeration + * operations. + */ +enum TPIMEnumerationType +{ + EPIMEnumerationTypeAll = com_nokia_mj_impl_pim_PIMListImpl_ENUMERATION_ITEMS_ALL, + + EPIMEnumerationTypeMatchingItem = com_nokia_mj_impl_pim_PIMListImpl_ENUMERATION_ITEMS_MATCHING_ITEM, + + EPIMEnumerationTypeMatchingString = com_nokia_mj_impl_pim_PIMListImpl_ENUMERATION_ITEMS_MATCHING_STRING, + + EPIMEnumerationTypeMatchingCategory = com_nokia_mj_impl_pim_PIMListImpl_ENUMERATION_ITEMS_MATCHING_CATEGORY +}; + +JNIEXPORT void +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1dispose( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + delete list; +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1createItem( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + pimbaseitem* item = NULL; + int error = 0; + try + { + item = list->createItem(); + } + catch (int aErr) + { + error = aErr; + } + SetJavaErrorCode(aJniEnv, aError, error); + // We now own the item (through the handle) + return reinterpret_cast(item); +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1removeItem( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle, + jint aItemHandle) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + pimbaseitem* item = reinterpret_cast< pimbaseitem *>(aItemHandle); + int error = 0; + try + { + list->removeItem(item); + } + catch (int err) + { + error = err; + } + return error; +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1addCommittedItem( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle, + jint aItemHandle) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + pimbaseitem* item = reinterpret_cast< pimbaseitem *>(aItemHandle); + int error = 0; + // Ownership of the item retains with the Java side peer item object. + try + { + list->addCommittedItem(item); + } + catch (int err) + { + error = err; + } + return error; +} + +JNIEXPORT jstring +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1getName( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jstring javaName = javaName =list->getName(aJniEnv); + // We now own the name + return javaName; // if NULL, it indicates error +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1close( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + int error = 0; + try + { + list->close(); + } + catch (int aError) + { + error = aError; + } + return error; +} + +JNIEXPORT jintArray +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1items( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aEnumerationType, + jint aMatchingItemHandle, + jstring aStringArg, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + int enumerationType; + switch (aEnumerationType) + { + case EPIMEnumerationTypeAll: + enumerationType = EPIMItemAll; + break; + case EPIMEnumerationTypeMatchingItem: + enumerationType = EPIMItemMatchingItem; + break; + case EPIMEnumerationTypeMatchingString: + enumerationType = EPIMItemMatchingString; + break; + case EPIMEnumerationTypeMatchingCategory: + enumerationType = EPIMItemMatchingCategory; + break; + default: + enumerationType = EPIMItemCorrupt; + } + + jintArray itemHandles =list->callItemsByEnumerationType( + aJniEnv, + enumerationType, + aMatchingItemHandle, + aStringArg, + aError); + + return itemHandles; +} + +JNIEXPORT jobjectArray +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1getCategories( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jobjectArray javaCategories = list->getCategories(aJniEnv, aError); + // Ownership of the categories is not transferred. + return javaCategories; +} + +JNIEXPORT jboolean +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1isCategory( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jstring aCategory, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + + jboolean isCategory = list->isCategory( + aCategory, aJniEnv, aError); + return isCategory; +} + +JNIEXPORT void +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1addCategory( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jstring aCategory, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + + list->addCategory(aCategory,aJniEnv,aError); +} + +JNIEXPORT jintArray +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1deleteCategory( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jstring aCategory, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + + jintArray itemHandles = list->deleteCategory(aCategory,aJniEnv, aError); + + return itemHandles; +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1renameCategory( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jstring aCurrentCategory, + jstring aNewCategory) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + + jint error = list->renameCategory( + aCurrentCategory, aNewCategory, aJniEnv); + + return error; +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1maxCategories( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jint maxCategories = list->maxCategories(); + return maxCategories; +} + +JNIEXPORT jboolean +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1isSupportedField( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle, + jint aField) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jboolean isSupportedField = isSupportedField = list->isSupportedField(aField); + return isSupportedField; +} + +JNIEXPORT jintArray +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1getSupportedFields( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jintArray javaFields = list->getSupportedFields(aJniEnv); + return javaFields; // NULL indicates error +} + +JNIEXPORT jboolean +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1isSupportedAttribute( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle, + jint aField, + jint aAttribute) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jboolean isSupportedAttribute = list->isSupportedAttribute( + aField, + aAttribute); + return isSupportedAttribute; +} + +JNIEXPORT jintArray +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1getSupportedAttributes( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aField, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + + jintArray javaAttributes = list->getSupportedAttributes( + aField, + aJniEnv, + aError); + + return javaAttributes; +} + +JNIEXPORT jboolean +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1isSupportedArrayElement( + JNIEnv* /*aJniEnv*/, + jobject /*aPeer*/, + jint aListHandle, + jint aStringArrayField, + jint aStringArrayElement) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jboolean isSupportedArrayElement = list->isSupportedArrayElement( + aStringArrayField, + aStringArrayElement); + + return isSupportedArrayElement; +} + +JNIEXPORT jintArray +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1getSupportedArrayElements( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aStringArrayField, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + + jintArray javaElements = list->getSupportedArrayElements( + aStringArrayField, + aJniEnv, + aError); + + return javaElements; +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1getFieldDataType( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aField, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jint fieldDataType = list->getFieldDataType( + aField, + aJniEnv, + aError); + return fieldDataType; +} + +/** + * Calls GetFieldLabelL, GetAttributeLabelL or GetArrayElementLabelL + * as indicated by the aLabelType argument. + * + * @param aList The list to which the call is delegated. + * @param aLabelType Label type (field, attribute, array element). + * @param aLabelSpecElems Label specification elements which specify + * the requested label. + * @param aLabelSpecLen Length of the label specification. + * @param aRetVal The label. Ownership of the label is transferred to + * caller. + */ +LOCAL_C void CallGetLabelL(CPIMList* aList, jint aLabelType, + jint* aLabelSpecElems, jint /*aLabelSpecLen*/, HBufC** aRetVal) +{ + if (aLabelType == EPIMLabelTypeField) + { + *aRetVal = aList->GetFieldLabelL(aLabelSpecElems[0]); // field constant + } + else if (aLabelType == EPIMLabelTypeAttribute) + { + *aRetVal = aList->GetAttributeLabelL(aLabelSpecElems[0]); // attribute constant + } + else if (aLabelType == EPIMLabelTypeArrayElement) + { + *aRetVal = aList->GetArrayElementLabelL(aLabelSpecElems[0], // string array field constant + aLabelSpecElems[1]); // string array element constant + } + else + { + // We should never end up here + User::Panic(KPIMPanicCategory, EPIMPanicInvalidState); + } +} + +JNIEXPORT jstring +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1getLabel( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aLabelType, + jintArray aLabelSpec, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* baseList = reinterpret_cast< pimbaselist*>(aListHandle); + CPIMList* list = static_cast< CPIMList*>(baseList); + + TInt labelSpecLen = aJniEnv->GetArrayLength(aLabelSpec); + jint* labelSpecElems = aJniEnv->GetIntArrayElements(aLabelSpec, NULL); + + if (!labelSpecElems) + { + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + return NULL; + } + + HBufC* label = NULL; + + TInt error = 0; + TRAP(error, CallGetLabelL( + list, + aLabelType, + labelSpecElems, + labelSpecLen, + &label)); + + SetJavaErrorCode(aJniEnv, aError, error); + aJniEnv->ReleaseIntArrayElements(aLabelSpec, labelSpecElems, 0); + + // The label might be NULL on error + if (error != KErrNone || !label) + { + return NULL; + } + + // We now own the label + + jstring javaLabel = java::util::S60CommonUtils::NativeToJavaString(*aJniEnv, *label); + delete label; + + if (!javaLabel) + { + SetJavaErrorCode(aJniEnv, aError, KErrNoMemory); + } + + return javaLabel; +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1maxValues( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aField, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jint maxValues = list->maxValues( + aField, + aJniEnv, + aError); + + return maxValues; +} + +JNIEXPORT jint +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1stringArraySize( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aStringArrayField, + jintArray aError) +{ + JELOG2(EPim); + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + + int stringArraySize = list->stringArraySize( + aStringArrayField, + aError, + aJniEnv); + + return stringArraySize; +} + +/** + * Calls CPIMList::UpdateListL() for given list and converts the + * result into set of JNI handles. + * + * New handles are made and set for new items and the items are added + * to the Event Source. + * + * @param aJniEnv JNIEnv for jintArray manipulation. + * @param aList The list for which the update is called and the list + * of new and removed items is got. + * @param aMatchingItem An item from which the initialized fields + * can be fetched and loaded from the database to all items + * @param aNewAndRemovedItemHandles Pointer to a jintArray (pointer + * to a pointer) through which the resulting array of new + * and removed item handles are returned. + * + * @par Leaving: + * @li Any - internal error. + */ + +JNIEXPORT jintArray +JNICALL Java_com_nokia_mj_impl_pim_PIMListImpl__1updateList( + JNIEnv* aJniEnv, + jobject /*aPeer*/, + jint aListHandle, + jint aMatchingItemHandle, + jintArray aError) +{ + JELOG2(EPim); + pimbaseitem* matchingItem = NULL; + if (aMatchingItemHandle) + { + matchingItem = reinterpret_cast< pimbaseitem *>(aMatchingItemHandle); + } + + pimbaselist* list = reinterpret_cast< pimbaselist*>(aListHandle); + jintArray newAndRemovedItemHandles = NULL; + try + { + newAndRemovedItemHandles = list->updateList(aJniEnv, + matchingItem); + SetJavaErrorCode(aJniEnv, aError, 0); + } + catch (int error) + { + SetJavaErrorCode(aJniEnv, aError, error); + } + + return newAndRemovedItemHandles; +} + +// End of File