Make GeckoEmbed functions more Java-like. Don't reflect NS_NewArray. Provide generic impl of QI.

This commit is contained in:
pedemont%us.ibm.com 2004-10-15 21:50:15 +00:00
parent 2bbc9ab377
commit 051fceec64
3 changed files with 24 additions and 105 deletions

View File

@ -39,12 +39,9 @@ package org.mozilla.xpcom;
public final class GeckoEmbed {
public static native void NS_InitEmbedding(nsILocalFile aMozBinDirectory, nsISupports aAppFileLocProvider);
public static native void NS_TermEmbedding();
public static native nsILocalFile NS_NewLocalFile(String aPath, boolean followLinks);
public static native nsIComponentManager NS_GetComponentManager();
public static native nsIServiceManager NS_GetServiceManager();
public static native nsISimpleEnumerator NS_NewSingletonEnumerator(nsISupports aSingleton);
public static native nsIMutableArray NS_NewArray();
public static native void initEmbedding(nsILocalFile aMozBinDirectory, nsISupports aAppFileLocProvider);
public static native void termEmbedding();
public static native nsILocalFile newLocalFile(String aPath, boolean followLinks);
public static native nsIComponentManager getComponentManager();
public static native nsIServiceManager getServiceManager();
}

View File

@ -70,6 +70,17 @@ public final class XPCOM {
/* Utility functions */
// Generic QueryInterface implementation
public static nsISupports queryInterface(nsISupports aObject, String aIID)
{
Class[] interfaces = aObject.getClass().getInterfaces();
for (int i = 0; i < interfaces.length; i++ ) {
if (aIID.equals(XPCOM.getInterfaceIID(interfaces[i])))
return aObject;
}
return null;
}
// Given an interface, this will construct the name of the IID field (such as
// NS_ISUPPORTS_IID) and return its value.
public static String getInterfaceIID(Class aInterface)

View File

@ -55,8 +55,8 @@ PRBool gEmbeddingInitialized = PR_FALSE;
extern "C" JNIEXPORT void JNICALL
GECKO_NATIVE(NS_1InitEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory,
jobject aAppFileLocProvider)
GECKO_NATIVE(initEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory,
jobject aAppFileLocProvider)
{
if (!InitializeJavaGlobals(env)) {
FreeJavaGlobals(env);
@ -98,7 +98,7 @@ GECKO_NATIVE(NS_1InitEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory,
}
extern "C" JNIEXPORT void JNICALL
GECKO_NATIVE(NS_1TermEmbedding) (JNIEnv *env, jclass)
GECKO_NATIVE(termEmbedding) (JNIEnv *env, jclass)
{
FreeJavaGlobals(env);
@ -115,8 +115,8 @@ GECKO_NATIVE(NS_1TermEmbedding) (JNIEnv *env, jclass)
* NULL and just create it lazily.
*/
extern "C" JNIEXPORT jobject JNICALL
GECKO_NATIVE(NS_1NewLocalFile) (JNIEnv *env, jclass, jstring aPath,
jboolean aFollowLinks)
GECKO_NATIVE(newLocalFile) (JNIEnv *env, jclass, jstring aPath,
jboolean aFollowLinks)
{
if (!InitializeJavaGlobals(env)) {
FreeJavaGlobals(env);
@ -165,7 +165,7 @@ GECKO_NATIVE(NS_1NewLocalFile) (JNIEnv *env, jclass, jstring aPath,
}
extern "C" JNIEXPORT jobject JNICALL
GECKO_NATIVE(NS_1GetComponentManager) (JNIEnv *env, jclass)
GECKO_NATIVE(getComponentManager) (JNIEnv *env, jclass)
{
jobject java_stub = nsnull;
@ -196,7 +196,7 @@ GECKO_NATIVE(NS_1GetComponentManager) (JNIEnv *env, jclass)
}
extern "C" JNIEXPORT jobject JNICALL
GECKO_NATIVE(NS_1GetServiceManager) (JNIEnv *env, jclass)
GECKO_NATIVE(getServiceManager) (JNIEnv *env, jclass)
{
jobject java_stub = nsnull;
@ -226,95 +226,6 @@ GECKO_NATIVE(NS_1GetServiceManager) (JNIEnv *env, jclass)
return java_stub;
}
extern "C" JNIEXPORT jobject JNICALL
GECKO_NATIVE(NS_1NewSingletonEnumerator) (JNIEnv *env, jclass, jobject aSingleton)
{
void* inst = GetMatchingXPCOMObject(env, aSingleton);
if (inst == nsnull) {
// If there is not corresponding XPCOM object, then that means that the
// parameter is non-generated class (that is, it is not one of our
// Java stubs that represent an exising XPCOM object). So we need to
// create an XPCOM stub, that can route any method calls to the class.
// Get interface info for class
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
nsCOMPtr<nsIInterfaceInfo> iinfo;
iim->GetInfoForIID(&NS_GET_IID(nsISupports), getter_AddRefs(iinfo));
// Create XPCOM stub
nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(env, aSingleton, iinfo);
NS_ADDREF(xpcomStub);
inst = SetAsXPTCStub(xpcomStub);
AddJavaXPCOMBinding(env, aSingleton, inst);
}
nsISupports* singleton;
if (IsXPTCStub(inst))
GetXPTCStubAddr(inst)->QueryInterface(NS_GET_IID(nsISupports),
(void**) &singleton);
else {
JavaXPCOMInstance* xpcomInst = (JavaXPCOMInstance*) inst;
singleton = xpcomInst->GetInstance();
}
// Call XPCOM method
jobject java_stub = nsnull;
nsISimpleEnumerator *enumerator = nsnull;
nsresult rv = NS_NewSingletonEnumerator(&enumerator, singleton);
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
inst = CreateJavaXPCOMInstance(enumerator, &NS_GET_IID(nsISimpleEnumerator));
if (inst) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsISimpleEnumerator");
if (java_stub) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(env, java_stub, inst);
}
}
}
if (java_stub == nsnull)
ThrowXPCOMException(env, 0);
return java_stub;
}
extern "C" JNIEXPORT jobject JNICALL
GECKO_NATIVE(NS_1NewArray) (JNIEnv *env, jclass)
{
jobject java_stub = nsnull;
// Call XPCOM method
nsCOMPtr<nsIMutableArray> array;
nsresult rv = NS_NewArray(getter_AddRefs(array));
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
inst = CreateJavaXPCOMInstance(array, &NS_GET_IID(nsIMutableArray));
if (inst) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsIMutableArray");
if (java_stub) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(env, java_stub, inst);
}
}
}
if (java_stub == nsnull)
ThrowXPCOMException(env, 0);
return java_stub;
}
// JNI wrapper for calling an nsWriteSegmentFun function
extern "C" JNIEXPORT jint JNICALL
XPCOM_NATIVE(nsWriteSegmentFun) (JNIEnv *env, jclass that, jint aWriterFunc,
@ -550,7 +461,7 @@ XPCOM_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, jobject aJavaObject)
jclass clazz = env->GetObjectClass(aJavaObject);
jstring name = (jstring) env->CallObjectMethod(clazz, getNameMID);
const char* javaObjectName = env->GetStringUTFChars(name, &isCopy);
fprintf(stderr, "*** Finalize(java_obj=%s)\n", javaObjectName);
LOG("*** Finalize(java_obj=%s)\n", javaObjectName);
if (isCopy)
env->ReleaseStringUTFChars(name, javaObjectName);
#endif