diff -r f5050f1da672 -r 04becd199f91 javauis/m3g_qt/src/jni/loader.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/m3g_qt/src/jni/loader.inl Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,234 @@ +/* +* Copyright (c) 2009 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: +* +*/ +#include "javax_microedition_m3g_Loader.h" + +#include + +/*! + * \brief Symbian implementation of the block inflation function for + * the Loader class + */ +static M3Gsizei m3gSymbianInflateBlock1(M3Gsizei srcLength, + const M3Gubyte *src, + M3Gsizei dstLength, + M3Gubyte *dst) +{ + unsigned long len = (unsigned long) dstLength; + if (uncompress((Bytef *) dst, &len, + (const Bytef *) src, (uLong) srcLength) != Z_OK) + { + return 0; + } + return (M3Gsizei) len; +} + +JNIEXPORT jboolean JNICALL Java_javax_microedition_m3g_Loader__1inflate +(JNIEnv* aEnv, jclass, jbyteArray aCompressed, jbyteArray aInflated) +{ + M3Guint result; + + M3Gubyte *compressedData = (M3Gubyte *)aEnv->GetByteArrayElements(aCompressed, NULL); + if (compressedData == NULL) + { + M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError"); + return 0; + } + M3Gint compressedLength = aEnv->GetArrayLength(aCompressed); + M3Gubyte *inflatedData = (M3Gubyte *)aEnv->GetByteArrayElements(aInflated, NULL); + if (inflatedData == NULL) + { + if (compressedData) + aEnv->ReleaseByteArrayElements(aCompressed, (jbyte*)compressedData, JNI_ABORT); + M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError"); + return 0; + } + M3Gint inflatedLength = aEnv->GetArrayLength(aInflated); + + M3G_DO_LOCK + if (m3gSymbianInflateBlock1(compressedLength, compressedData, + inflatedLength, inflatedData)) + { + result = TRUE; + } + else + { + result = FALSE; + } + M3G_DO_UNLOCK(aEnv) + + if (aCompressed) + { + aEnv->ReleaseByteArrayElements(aCompressed, (jbyte*)compressedData, JNI_ABORT); + } + + if (aInflated) + { + aEnv->ReleaseByteArrayElements(aInflated, (jbyte*)inflatedData, 0); + } + + return result; +} + + +JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1ctor +(JNIEnv* aEnv, jclass, jint aM3g) +{ + M3G_DO_LOCK + M3GLoader loader = (M3GLoader)m3gCreateLoader((M3GInterface)aM3g); + M3G_DO_UNLOCK(aEnv) + return (M3Guint)loader; +} + +JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1decodeData +(JNIEnv* aEnv, jclass, jint aLoader, jint aOffset, jbyteArray aDataArray) +{ + /* null array is never passed */ + M3Gubyte *data = (M3Gubyte *)aEnv->GetByteArrayElements(aDataArray, NULL); + if (data == NULL) + { + M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError"); + return 0; + } + + M3Gint bytes = aEnv->GetArrayLength(aDataArray); + M3GLoader loader = (M3GLoader)aLoader; + + M3G_DO_LOCK + jint retVal = m3gDecodeData(loader, bytes, data + aOffset); + M3G_DO_UNLOCK(aEnv) + + if (aDataArray) + { + aEnv->ReleaseByteArrayElements(aDataArray, (jbyte*)data, JNI_ABORT); + } + + return retVal; +} + +JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getLoadedObjects +(JNIEnv* aEnv, jclass, jint aLoader, jintArray aObjectArray) +{ + M3GObject *objects = NULL; + if (aObjectArray) + { + objects = (M3GObject *)aEnv->GetIntArrayElements(aObjectArray, NULL); + if (objects == NULL) + { + M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError"); + return 0; + } + } + + M3GLoader loader = (M3GLoader)aLoader; + + M3G_DO_LOCK + jint retVal = m3gGetLoadedObjects(loader, objects); + M3G_DO_UNLOCK(aEnv) + + if (aObjectArray) + { + aEnv->ReleaseIntArrayElements(aObjectArray, (jint*)objects, 0); + } + + return retVal; +} + +JNIEXPORT void JNICALL Java_javax_microedition_m3g_Loader__1setExternalReferences +(JNIEnv* aEnv, jclass, jint aLoader, jintArray aObjectArray) +{ + /* null array is never passed */ + M3GObject *xRefs = (M3GObject *)aEnv->GetIntArrayElements(aObjectArray, NULL); + if (xRefs == NULL) + { + M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError"); + return; + } + + M3Gint numXRefs = aEnv->GetArrayLength(aObjectArray); + M3GLoader loader = (M3GLoader)aLoader; + + M3G_DO_LOCK + m3gImportObjects(loader, numXRefs, xRefs); + M3G_DO_UNLOCK(aEnv) + + aEnv->ReleaseIntArrayElements(aObjectArray, (jint*)xRefs, JNI_ABORT); +} + +JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getObjectsWithUserParameters +(JNIEnv* aEnv, jclass, jint aLoader, jintArray aObjectArray) +{ + M3GObject *objects = NULL; + if (aObjectArray) + { + objects = (M3GObject *)aEnv->GetIntArrayElements(aObjectArray, NULL); + if (objects == NULL) + { + M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError"); + return 0; + } + } + + M3GLoader loader = (M3GLoader)aLoader; + + M3G_DO_LOCK + jint retVal = m3gGetObjectsWithUserParameters(loader, objects); + M3G_DO_UNLOCK(aEnv) + + if (objects) + { + aEnv->ReleaseIntArrayElements(aObjectArray, (jint*)objects, 0); + } + + return retVal; +} + +JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getNumUserParameters +(JNIEnv* aEnv, jclass, jint aLoader, jint aObj) +{ + M3GLoader loader = (M3GLoader)aLoader; + M3G_DO_LOCK + jint numParams = (jint)m3gGetNumUserParameters(loader, aObj); + M3G_DO_UNLOCK(aEnv) + return numParams; +} + +JNIEXPORT jint JNICALL Java_javax_microedition_m3g_Loader__1getUserParameter +(JNIEnv* aEnv, jclass, jint aLoader, jint aObj, jint aIndex, jbyteArray aDataArray) +{ + M3Gbyte *data = NULL; + if (aDataArray) + { + data = (M3Gbyte *)aEnv->GetByteArrayElements(aDataArray, NULL); + if (data == NULL) + { + M3G_RAISE_EXCEPTION(aEnv, "java/lang/OutOfMemoryError"); + return 0; + } + } + + M3GLoader loader = (M3GLoader)aLoader; + M3G_DO_LOCK + jint retVal = m3gGetUserParameter(loader, aObj, aIndex, data); + M3G_DO_UNLOCK(aEnv) + + if (data) + { + aEnv->ReleaseByteArrayElements(aDataArray, (jbyte*)data, 0); + } + + return retVal; +}