diff -r 2e8eeb919028 -r b538b70cbe51 configlib/dbmsjdbc/src/native/Utils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/configlib/dbmsjdbc/src/native/Utils.cpp Thu Mar 11 18:20:56 2010 +0200 @@ -0,0 +1,159 @@ +// Copyright (c) 1998-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 "Utils.h" +#include +#include +#include +#include + + +JavaVM* gJVM; +extern jclass gExcCls; + +jint JNI_OnLoad(JavaVM *vm, void *reserved) + { + gJVM = vm; + return JNI_VERSION_1_4; + } + +extern TPanicHandler gPanicHandler; + +/** + * Constuctor taking a Java JNI string and converting it to an EPOC TPtrC. + */ +RJString::RJString( JNIEnv& aJni, jstring aString ) +: iJni( aJni ), iString( aString ) + { + // Potential for a string to be NULL, but NULL cannot be passed into + // JNI methods, so must check. If string is NULL, will result in empty string + if ( iString != NULL ) + { + Set( aJni.GetStringChars( iString, NULL ), aJni.GetStringLength( iString ) ); + } + } + + + +/** + * Frees up the JNI string resources, if they need to be freed. + */ +RJString::~RJString() + { + if ( iString != NULL ) + { + iJni.ReleaseStringChars( iString, this->Ptr() ); + } + } + +//---------------------------------------------------------------------------- +/* Takes an EPOC string and returns a Java JNI string */ +jstring CreateJavaString( JNIEnv* aJni, const TDesC& aString ) + { + const jchar* stringPtr = aString.Ptr(); + const jsize stringLength = aString.Length(); + jstring jniString = aJni->NewString( stringPtr, stringLength ); + return jniString; + } + +void ThrowRtExc(JNIEnv* aJni, const TDesC8& aMessage ) + { + if ( gExcCls ==NULL ) + { + printf("Could not create exception class java/lang/RuntimeException, unable to throw\n"); + return; + } + aJni->ThrowNew(gExcCls, (const char*) aMessage.Ptr()); + } + +void ThrowExc(JNIEnv* aJni, const TDesC8& aException, const TDesC8& aMessage ) + { + jclass jc = aJni->FindClass((const char *)aException.Ptr()); + if ( jc == NULL ) { + jc = gExcCls; + } + aJni->ThrowNew(jc, (const char*) aMessage.Ptr()); + } + +void ThrowExc(JNIEnv* aJni, const TInt aErrorCode ) + { + TBuf8<256> exception; + TBuf8<256> message; + GetException(aErrorCode, exception, message); + exception.ZeroTerminate(); + message.ZeroTerminate(); + jclass jc = aJni->FindClass((const char *)exception.Ptr()); + if ( jc == NULL ) { + jc = gExcCls; + } + aJni->ThrowNew(jc, (const char*) message.Ptr()); + } + + +void SosPanicHandler(const TDesC& aCat, TInt aReason) + { + _LIT8(KPanicString, " [SOS Panic]"); + _LIT8(KSpace, " : "); + TBuf8<512> exceptionMessage; + exceptionMessage.Copy(aCat); + exceptionMessage.Append(KSpace); + exceptionMessage.AppendNum(aReason); + exceptionMessage.Append(KPanicString); + exceptionMessage.Append('\0'); + // Get the JNIEnv + JNIEnv* env; + int res = gJVM->GetEnv((void**)&env, JNI_VERSION_1_4); + + if ( res == JNI_EDETACHED ) + { + printf("Attaching to the current thread...\n"); + res = gJVM->AttachCurrentThread((void**)&env, NULL); + } + + if ( res < 0 ) + { + printf("Could not attach current thread while handling panic!"); + exit(-1); + } + ThrowRtExc(env, exceptionMessage); + //printf("SOS panic handled by JNI : %s\n", (const char*)exceptionMessage.Ptr()); + } + + + +const TInt KMaxExceptionClassNameLength = 200; +static const TText8 KExceptionClassNames[][KMaxExceptionClassNameLength+1]= + { +#define EXCEPTIONNAME(s) #s +#include "exceptionmappings.h" +#undef EXCEPTIONNAME + }; + + +void GetException(TInt aErrorCode, TDes8& aException, TDes8& aMessage) + { + _LIT8(KRuntimeException, "java/lang/RuntimeException"); + TranslateError(aErrorCode, aMessage); + aErrorCode = - aErrorCode; + if ( aErrorCode > 46 || aErrorCode < 0) + { + aException.Copy(KRuntimeException); + } + else + { + aException.Copy(KExceptionClassNames[aErrorCode]); + } + } +