diff --git a/extensions/java/xpcom/src/nsJavaInterfaces.cpp b/extensions/java/xpcom/src/nsJavaInterfaces.cpp index 96962dfe9b1..d24bb55bc6b 100644 --- a/extensions/java/xpcom/src/nsJavaInterfaces.cpp +++ b/extensions/java/xpcom/src/nsJavaInterfaces.cpp @@ -47,48 +47,61 @@ #include "nsEnumeratorUtils.h" #include "nsArray.h" #include "nsAppFileLocProviderProxy.h" +#include "nsIEventQueueService.h" #define GECKO_NATIVE(func) Java_org_mozilla_xpcom_GeckoEmbed_##func #define XPCOM_NATIVE(func) Java_org_mozilla_xpcom_XPCOM_##func -#define XPCOMPRIVATE_NATIVE(func) Java_org_mozilla_xpcom_XPCOMPrivate_##func +nsresult +InitEmbedding_Impl(JNIEnv* env, jobject aMozBinDirectory, + jobject aAppFileLocProvider) +{ + nsresult rv; + if (!InitializeJavaGlobals(env)) + return NS_ERROR_FAILURE; + + // create an nsILocalFile from given java.io.File + nsCOMPtr directory; + if (aMozBinDirectory) { + rv = File_to_nsILocalFile(env, aMozBinDirectory, getter_AddRefs(directory)); + NS_ENSURE_SUCCESS(rv, rv); + } + + // create nsAppFileLocProviderProxy from given Java object + nsAppFileLocProviderProxy* provider = nsnull; + if (aAppFileLocProvider) { + provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider); + if (!provider) + return NS_ERROR_OUT_OF_MEMORY; + } + + // init Gecko + rv = NS_InitEmbedding(directory, provider); + if (provider) { + delete provider; + } + NS_ENSURE_SUCCESS(rv, rv); + + // init Event Queue + nsCOMPtr + eventQService(do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + rv = eventQService->CreateThreadEventQueue(); + + return rv; +} + extern "C" JX_EXPORT void JNICALL GECKO_NATIVE(initEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory, jobject aAppFileLocProvider) { - nsresult rv = NS_OK; - if (!InitializeJavaGlobals(env)) { - rv = NS_ERROR_FAILURE; - } else { - // Create an nsILocalFile from given java.io.File - nsCOMPtr directory; - if (aMozBinDirectory) { - rv = File_to_nsILocalFile(env, aMozBinDirectory, getter_AddRefs(directory)); - } + nsresult rv = InitEmbedding_Impl(env, aMozBinDirectory, aAppFileLocProvider); - if (NS_SUCCEEDED(rv)) { - nsAppFileLocProviderProxy* provider = nsnull; - if (aAppFileLocProvider) { - provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider); - if (!provider) - rv = NS_ERROR_OUT_OF_MEMORY; - } - - if (NS_SUCCEEDED(rv)) { - rv = NS_InitEmbedding(directory, provider); - if (provider) { - delete provider; - } - if (NS_SUCCEEDED(rv)) { - return; - } - } - } + if (NS_FAILED(rv)) { + ThrowException(env, rv, "Failure in initEmbedding"); + FreeJavaGlobals(env); } - - ThrowException(env, rv, "Failure in initEmbedding"); - FreeJavaGlobals(env); } extern "C" JX_EXPORT void JNICALL @@ -101,46 +114,61 @@ GECKO_NATIVE(termEmbedding) (JNIEnv *env, jclass) FreeJavaGlobals(env); } +nsresult +InitXPCOM_Impl(JNIEnv* env, jobject aMozBinDirectory, + jobject aAppFileLocProvider, jobject* aResult) +{ + nsresult rv; + if (!InitializeJavaGlobals(env)) + return NS_ERROR_FAILURE; + + // create an nsILocalFile from given java.io.File + nsCOMPtr directory; + if (aMozBinDirectory) { + rv = File_to_nsILocalFile(env, aMozBinDirectory, getter_AddRefs(directory)); + NS_ENSURE_SUCCESS(rv, rv); + } + + // create nsAppFileLocProviderProxy from given Java object + nsAppFileLocProviderProxy* provider = nsnull; + if (aAppFileLocProvider) { + provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider); + if (!provider) + return NS_ERROR_OUT_OF_MEMORY; + } + + // init XPCOM + nsIServiceManager* servMan = nsnull; + rv = NS_InitXPCOM2(&servMan, directory, provider); + if (provider) { + delete provider; + } + NS_ENSURE_SUCCESS(rv, rv); + + // init Event Queue + nsCOMPtr + eventQService(do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID, &rv)); + NS_ENSURE_SUCCESS(rv, rv); + rv = eventQService->CreateThreadEventQueue(); + NS_ENSURE_SUCCESS(rv, rv); + + // create Java proxy for service manager returned by NS_InitXPCOM2 + rv = CreateJavaProxy(env, servMan, NS_GET_IID(nsIServiceManager), + aResult); + NS_RELEASE(servMan); // Java proxy has owning ref + + return rv; +} + extern "C" JX_EXPORT jobject JNICALL XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jclass, jobject aMozBinDirectory, jobject aAppFileLocProvider) { - nsresult rv = NS_OK; - if (!InitializeJavaGlobals(env)) { - rv = NS_ERROR_FAILURE; - } else { - // Create an nsILocalFile from given java.io.File - nsCOMPtr directory; - if (aMozBinDirectory) { - rv = File_to_nsILocalFile(env, aMozBinDirectory, getter_AddRefs(directory)); - } - - if (NS_SUCCEEDED(rv)) { - nsAppFileLocProviderProxy* provider = nsnull; - if (aAppFileLocProvider) { - provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider); - if (!provider) - rv = NS_ERROR_OUT_OF_MEMORY; - } - - if (NS_SUCCEEDED(rv)) { - nsIServiceManager* servMan = nsnull; - rv = NS_InitXPCOM2(&servMan, directory, provider); - if (provider) { - delete provider; - } - - if (NS_SUCCEEDED(rv)) { - jobject javaProxy; - rv = CreateJavaProxy(env, servMan, NS_GET_IID(nsIServiceManager), - &javaProxy); - NS_RELEASE(servMan); // JavaXPCOMInstance has owning ref - if (NS_SUCCEEDED(rv)) - return javaProxy; - } - } - } - } + jobject servMan; + nsresult rv = InitXPCOM_Impl(env, aMozBinDirectory, aAppFileLocProvider, + &servMan); + if (NS_SUCCEEDED(rv)) + return servMan; ThrowException(env, rv, "Failure in initXPCOM"); FreeJavaGlobals(env); @@ -150,23 +178,24 @@ XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jclass, jobject aMozBinDirectory, extern "C" JX_EXPORT void JNICALL XPCOM_NATIVE(shutdownXPCOM) (JNIEnv *env, jclass, jobject aServMgr) { + nsresult rv; nsCOMPtr servMgr; if (aServMgr) { - // Find corresponding XPCOM object - void* xpcomObj = gBindings->GetXPCOMObject(env, aServMgr); - NS_ASSERTION(xpcomObj != nsnull, "Failed to get XPCOM obj for ServiceMgr."); + // Get native XPCOM instance + void* xpcom_obj; + rv = GetXPCOMInstFromProxy(env, aServMgr, &xpcom_obj); + NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to get XPCOM obj for ServiceMgr."); // Even if we failed to get the matching xpcom object, we don't abort this // function. Just call NS_ShutdownXPCOM with a null service manager. - if (xpcomObj) { - NS_ASSERTION(!IsXPTCStub(xpcomObj), - "Expected JavaXPCOMInstance, but got nsJavaXPTCStub"); - servMgr = do_QueryInterface(((JavaXPCOMInstance*) xpcomObj)->GetInstance()); + if (NS_SUCCEEDED(rv)) { + JavaXPCOMInstance* inst = NS_STATIC_CAST(JavaXPCOMInstance*, xpcom_obj); + servMgr = do_QueryInterface(inst->GetInstance()); } } - nsresult rv = NS_ShutdownXPCOM(servMgr); + rv = NS_ShutdownXPCOM(servMgr); if (NS_FAILED(rv)) ThrowException(env, rv, "NS_ShutdownXPCOM failed"); @@ -261,239 +290,3 @@ XPCOM_NATIVE(getServiceManager) (JNIEnv *env, jclass) return nsnull; } -extern "C" JX_EXPORT void JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodVoid) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); -} - -extern "C" JX_EXPORT jboolean JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodBool) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.z; -} - -extern "C" JX_EXPORT jbooleanArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodBoolA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jbooleanArray) rc.l; -} - -extern "C" JX_EXPORT jbyte JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodByte) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.b; -} - -extern "C" JX_EXPORT jbyteArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodByteA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jbyteArray) rc.l; -} - -extern "C" JX_EXPORT jchar JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodChar) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.c; -} - -extern "C" JX_EXPORT jcharArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodCharA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jcharArray) rc.l; -} - -extern "C" JX_EXPORT jshort JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodShort) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.s; -} - -extern "C" JX_EXPORT jshortArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodShortA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jshortArray) rc.l; -} - -extern "C" JX_EXPORT jint JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodInt) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.i; -} - -extern "C" JX_EXPORT jintArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodIntA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jintArray) rc.l; -} - -extern "C" JX_EXPORT jlong JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodLong) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.j; -} - -extern "C" JX_EXPORT jlongArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodLongA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jlongArray) rc.l; -} - -extern "C" JX_EXPORT jfloat JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloat) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.f; -} - -extern "C" JX_EXPORT jfloatArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloatA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jfloatArray) rc.l; -} - -extern "C" JX_EXPORT jdouble JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodDouble) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.d; -} - -extern "C" JX_EXPORT jdoubleArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodDoubleA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jdoubleArray) rc.l; -} - -extern "C" JX_EXPORT jobject JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodObj) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return rc.l; -} - -extern "C" JX_EXPORT jobjectArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodObjA) (JNIEnv *env, jclass that, - jobject aJavaObject, - jint aMethodIndex, - jobjectArray aParams) -{ - jvalue rc; - CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); - return (jobjectArray) rc.l; -} - -extern "C" JX_EXPORT void JNICALL -XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, - jobject aJavaObject) -{ -#ifdef DEBUG_pedemonte - jclass clazz = env->GetObjectClass(aJavaObject); - jstring name = (jstring) env->CallObjectMethod(clazz, getNameMID); - const char* javaObjectName = env->GetStringUTFChars(name, nsnull); - LOG(("*** Finalize(java_obj=%s)\n", javaObjectName)); - env->ReleaseStringUTFChars(name, javaObjectName); -#endif - - // Due to Java's garbage collection, this finalize statement may get called - // after FreeJavaGlobals(). So check to make sure that everything is still - // initialized. - if (gJavaXPCOMInitialized) { - void* obj = gBindings->GetXPCOMObject(env, aJavaObject); - NS_ASSERTION(obj != nsnull, "No matching XPCOM obj in FinalizeStub"); - - if (obj) { - NS_ASSERTION(!IsXPTCStub(obj), - "Expecting JavaXPCOMInstance, got nsJavaXPTCStub"); - gBindings->RemoveBinding(env, aJavaObject, nsnull); - delete (JavaXPCOMInstance*) obj; - } - } -} -