javaextensions/pim/framework/src.s60/pimjnitools.cpp
branchRCL_3
changeset 14 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/pim/framework/src.s60/pimjnitools.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,215 @@
+/*
+* 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:  Tools for PIM JNI wrappers.
+ *
+*/
+
+
+//  INCLUDE FILES
+#include "pimjnitools.h"
+#include <e32base.h>
+#include "cpimitem.h"
+#include "pimpanics.h"
+#include "s60commonutils.h"
+#include "jstringutils.h"
+#include "logger.h"
+
+
+jintArray ConvertToJavaIntArray(JNIEnv& aJniEnv,
+                                const CArrayFix<TInt>& aSourceArray)
+{
+    JELOG2(EPim);
+    const TInt n = aSourceArray.Count();
+    jintArray targetArray = aJniEnv.NewIntArray(n);
+
+    if (!targetArray)
+    {
+        return NULL; // Error
+    }
+
+    if (n > 0)
+    {
+        aJniEnv.SetIntArrayRegion(targetArray, 0, n,
+                                  const_cast<int*>(aSourceArray.Back(0)));
+    }
+
+    return targetArray;
+}
+
+jintArray GetJavaItemHandles(JNIEnv& aJniEnv,
+                             const RPointerArray<CPIMItem>& aItems)
+{
+    JELOG2(EPim);
+    const TInt numItems = aItems.Count();
+    jintArray itemHandles = aJniEnv.NewIntArray(numItems);
+
+    if (!itemHandles)
+    {
+        return NULL; // Error
+    }
+
+    if (numItems > 0)
+    {
+        jint* elems = aJniEnv.GetIntArrayElements(itemHandles, NULL);
+
+        if (elems == NULL)
+        {
+            return NULL; // Error
+        }
+
+        for (TInt i = 0; i < numItems; i++)
+        {
+            pimbaseitem* item = aItems[i];
+            elems[i] = reinterpret_cast<int>(item);
+        }
+
+        aJniEnv.ReleaseIntArrayElements(itemHandles, elems, 0);
+    }
+
+    return itemHandles;
+}
+
+jintArray NativeDatesToJavaInts(JNIEnv& aJniEnv,
+                                const CArrayFix<TPIMDate>& aDates)
+{
+    JELOG2(EPim);
+    const TInt n = aDates.Count();
+
+    // Create an int array of double size to fit the dates in half
+    // size elements.
+    jintArray retArr = aJniEnv.NewIntArray(n * 2);
+
+    if (!retArr)
+    {
+        return NULL; // Error
+    }
+
+    if (n == 0)
+    {
+        return retArr; // Nothing to do, return empty (non-NULL) array
+    }
+
+    jint* elems = aJniEnv.GetIntArrayElements(retArr, NULL);
+
+    if (elems == NULL)
+    {
+        return NULL; // Error
+    }
+
+    for (TInt i = 0; i < n; i++)
+    {
+        jlong javaDate = java::util::S60CommonUtils::TTimeToJavaTime(aDates[i]);
+        TInt64 int64Val = *reinterpret_cast<TInt64*>(&javaDate);
+        elems[2 * i] = I64HIGH(int64Val); // high part to even element
+        elems[(2 * i) + 1] = I64LOW(int64Val); // low part to odd element
+    }
+
+    aJniEnv.ReleaseIntArrayElements(retArr, elems, 0);
+    return retArr;
+}
+
+CDesCArray* CreateNativeStringArrayL(JNIEnv* aJniEnv, jobjectArray aJavaArray)
+{
+    JELOG2(EPim);
+    const TInt numElems = aJniEnv->GetArrayLength(aJavaArray);
+
+    CDesCArray* nativeArray = new(ELeave) CDesCArrayFlat(numElems + 1);  // ensure granularity of at least 1 (panics if 0)
+
+    CleanupStack::PushL(nativeArray);
+
+    for (TInt elemIndex = 0; elemIndex < numElems; elemIndex++)
+    {
+        // Creates a new local reference
+        jobject javaElemObject = aJniEnv->GetObjectArrayElement(aJavaArray,
+                                 elemIndex);
+
+        jstring javaElem = static_cast<jstring>(javaElemObject);
+
+        if (!javaElem)
+        {
+            nativeArray->AppendL(KPIMNullArrayElement);
+        }
+        else
+        {
+            // The value returned by GetObjectArrayElement is not really
+            // a pointer to the object, but it is a "local reference".
+            // In practice, it is a pointer to a pointer which points to the
+            // object. If the object is null, we get a pointer which points
+            // to a pointer which points to null.
+            void** objPointer = reinterpret_cast<void**>(javaElemObject);
+            void* obj = *objPointer;
+            if (!obj)
+            {
+                nativeArray->AppendL(KPIMNullArrayElement);
+            }
+            else
+            {
+                JStringUtils nativeElem(*aJniEnv, javaElem);
+                nativeArray->AppendL(nativeElem);
+            }
+        }
+        // The VM runs out of temporary local references, unless the
+        // elements are released here
+        aJniEnv->DeleteLocalRef(javaElemObject);
+    }
+
+    CleanupStack::Pop(nativeArray);
+    return nativeArray;
+}
+
+jobjectArray CreateJavaStringArray(JNIEnv* aJniEnv,
+                                   const CDesCArray& aNativeArray, TBool aConvertPIMNullArrayElements)
+{
+    JELOG2(EPim);
+    const TInt numElems = aNativeArray.Count();
+
+    // Initializes the array with NULLs
+    jobjectArray javaStringArray = aJniEnv->NewObjectArray(numElems,
+                                   aJniEnv->FindClass("java/lang/String"), NULL);
+
+    if (!javaStringArray)
+    {
+        return NULL;
+    }
+
+    for (TInt i = 0; i < numElems; i++)
+    {
+        TPtrC elem = aNativeArray[i];
+
+        if (aConvertPIMNullArrayElements && elem == KPIMNullArrayElement)
+        {
+            // The element is marked "null", skip and leave the element NULL
+            continue;
+        }
+
+        // Creates a new local reference
+        jstring javaElem = java::util::S60CommonUtils::NativeToJavaString(
+                               *aJniEnv, aNativeArray[i]);
+
+        if (!javaElem)
+        {
+            // javaStringArray is left for Garbage Collector
+            return NULL;
+        }
+
+        aJniEnv->SetObjectArrayElement(javaStringArray, i, javaElem);
+
+        // Avoid running out of local references
+        aJniEnv->DeleteLocalRef(javaElem);
+    }
+
+    return javaStringArray;
+}
+
+// End of File