configlib/dbmsjdbc/src/native/Utils.cpp
changeset 1 b538b70cbe51
--- /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 <utf.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errortranslator.h>
+
+
+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]);
+		}
+	}
+