javaextensions/pim/jni/src/pimlistimpl.cpp
branchRCL_3
changeset 14 04becd199f91
--- /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<int>(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