diff -r f5050f1da672 -r 04becd199f91 javaextensions/pim/framework/src.s60/pimjnitools.cpp --- /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 +#include "cpimitem.h" +#include "pimpanics.h" +#include "s60commonutils.h" +#include "jstringutils.h" +#include "logger.h" + + +jintArray ConvertToJavaIntArray(JNIEnv& aJniEnv, + const CArrayFix& 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(aSourceArray.Back(0))); + } + + return targetArray; +} + +jintArray GetJavaItemHandles(JNIEnv& aJniEnv, + const RPointerArray& 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(item); + } + + aJniEnv.ReleaseIntArrayElements(itemHandles, elems, 0); + } + + return itemHandles; +} + +jintArray NativeDatesToJavaInts(JNIEnv& aJniEnv, + const CArrayFix& 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(&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(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(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