Added code to use OJI on win nt.

Added methods of latest dom java-binding
Fixes to bugs 22192, 22193


git-svn-id: svn://10.0.0.236/trunk@59013 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
sdv%sparc.spb.su
2000-01-28 03:45:01 +00:00
parent cfcce1875f
commit 0ed196bba9
17 changed files with 320 additions and 100 deletions

View File

@@ -30,6 +30,11 @@
#include "nsIWebShell.h"
#include "nsJavaDOMImpl.h"
#ifndef JAVA_DOM_OJI_DISABLE
#include "ProxyJNI.h"
#include "nsIServiceManager.h"
#endif
#if defined(DEBUG)
#include <stdio.h>
#include "nsIDOMElement.h"
@@ -43,6 +48,9 @@ static char* strip_whitespace(const PRUnichar* input, int length);
static const char* describe_type(int type);
#endif
#ifndef JAVA_DOM_OJI_DISABLE
static NS_DEFINE_CID(kJVMManagerCID,NS_JVMMANAGER_CID);
#endif
static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIJavaDOMIID, NS_IJAVADOM_IID);
@@ -79,8 +87,12 @@ NS_IMETHODIMP nsJavaDOMImpl::QueryInterface(REFNSIID aIID, void** aInstance)
return NS_NOINTERFACE;
}
#ifndef JAVA_DOM_OJI_DISABLE
nsJVMManager* nsJavaDOMImpl::jvmManager = NULL;
JavaDOMSecurityContext* nsJavaDOMImpl::securityContext = NULL;
#else
JavaVM* nsJavaDOMImpl::jvm = NULL;
JNIEnv* nsJavaDOMImpl::env = NULL;
#endif
jclass nsJavaDOMImpl::domAccessorClass = NULL;
jclass nsJavaDOMImpl::documentClass = NULL;
@@ -91,6 +103,7 @@ jobject nsJavaDOMImpl::docListener = NULL;
jfieldID nsJavaDOMImpl::documentPtrFID = NULL;
jmethodID nsJavaDOMImpl::documentInitID = NULL;
jmethodID nsJavaDOMImpl::getInstanceMID = NULL;
jmethodID nsJavaDOMImpl::startURLLoadMID = NULL;
jmethodID nsJavaDOMImpl::endURLLoadMID = NULL;
@@ -105,38 +118,7 @@ nsJavaDOMImpl::nsJavaDOMImpl()
{
NS_INIT_ISUPPORTS();
if (jvm)
return;
JDK1_1InitArgs vm_args;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
vm_args.version = 0x00010001;
vm_args.verifyMode = JNI_TRUE;
#ifdef DEBUG
vm_args.verbose = JNI_TRUE;
vm_args.enableVerboseGC = JNI_TRUE;
#endif // DEBUG
char* cp = PR_GetEnv("CLASSPATH");
char* p = new char[strlen(cp) + strlen(vm_args.classpath) + 2];
strcpy(p, vm_args.classpath);
if (cp) {
#ifdef XP_PC
strcat(p, ";");
#else
strcat(p, ":");
#endif
strcat(p, cp);
vm_args.classpath = p;
}
#ifdef DEBUG
printf("classpath is \"%s\"\n", vm_args.classpath);
#endif // DEBUG
#ifdef XP_PC
JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
#else
JNI_CreateJavaVM(&jvm, &env, &vm_args);
#endif
delete[] p;
JNIEnv* env = GetJNIEnv();
gcClass = env->FindClass("org/mozilla/dom/DOMGarbageCollector");
if (!gcClass) return;
@@ -178,6 +160,10 @@ nsJavaDOMImpl::nsJavaDOMImpl()
documentClass = (jclass) env->NewGlobalRef(documentClass);
if (!documentClass) return;
documentInitID =
env->GetMethodID(documentClass, "<init>", "(J)V");
if (!documentInitID) return;
documentPtrFID =
env->GetFieldID(documentClass,
"p_nsIDOMNode",
@@ -220,14 +206,14 @@ nsJavaDOMImpl::nsJavaDOMImpl()
"(Ljava/lang/String;ILorg/w3c/dom/Document;)V");
if (!endDocumentLoadMID) return;
Cleanup();
Cleanup(env);
}
nsJavaDOMImpl::~nsJavaDOMImpl()
{
}
PRBool nsJavaDOMImpl::Cleanup()
PRBool nsJavaDOMImpl::Cleanup(JNIEnv* env)
{
if (env->ExceptionOccurred()) {
env->ExceptionDescribe();
@@ -284,11 +270,15 @@ nsIDOMDocument* nsJavaDOMImpl::GetDocument(nsIDocumentLoader* loader)
jobject nsJavaDOMImpl::CaffienateDOMDocument(nsIDOMDocument* domDoc)
{
if (!domDoc) return NULL;
JNIEnv* env = GetJNIEnv();
jobject jdoc = env->AllocObject(documentClass);
// jobject jdoc = env->AllocObject(documentClass);
jobject jdoc = env->NewObject(documentClass,
documentInitID,
(jlong) (void*) domDoc);
if (!jdoc) return NULL;
env->SetLongField(jdoc, documentPtrFID, (jlong) (void*) domDoc);
if (Cleanup() == PR_TRUE) return NULL;
// env->SetLongField(jdoc, documentPtrFID, (jlong) (void*) domDoc);
if (Cleanup(env) == PR_TRUE) return NULL;
return jdoc;
}
@@ -299,6 +289,7 @@ NS_IMETHODIMP nsJavaDOMImpl::OnStartDocumentLoad(nsIDocumentLoader* loader,
nsIURI* aURL,
const char* aCommand)
{
JNIEnv* env = GetJNIEnv();
char* urlSpec = (char*) "";
if (aURL)
aURL->GetSpec(&urlSpec);
@@ -308,10 +299,10 @@ NS_IMETHODIMP nsJavaDOMImpl::OnStartDocumentLoad(nsIDocumentLoader* loader,
env->CallVoidMethod(docListener,
startDocumentLoadMID,
jURL);
if (Cleanup() == PR_TRUE) return NS_ERROR_FAILURE;
if (Cleanup(env) == PR_TRUE) return NS_ERROR_FAILURE;
env->CallStaticVoidMethod(gcClass, gcMID);
Cleanup();
Cleanup(env);
return NS_OK;
}
@@ -319,6 +310,7 @@ NS_IMETHODIMP nsJavaDOMImpl::OnEndDocumentLoad(nsIDocumentLoader* loader,
nsIChannel* channel,
nsresult aStatus)
{
JNIEnv* env = GetJNIEnv();
char* urlSpec = (char*) "";
nsIURI* url = nsnull;
if (channel && NS_SUCCEEDED(channel->GetURI(&url)))
@@ -334,16 +326,17 @@ NS_IMETHODIMP nsJavaDOMImpl::OnEndDocumentLoad(nsIDocumentLoader* loader,
jURL,
(jint) aStatus,
jdoc);
if (Cleanup() == PR_TRUE) return NS_ERROR_FAILURE;
if (Cleanup(env) == PR_TRUE) return NS_ERROR_FAILURE;
env->CallStaticVoidMethod(gcClass, gcMID);
Cleanup();
Cleanup(env);
return NS_OK;
}
NS_IMETHODIMP nsJavaDOMImpl::OnStartURLLoad(nsIDocumentLoader* loader,
nsIChannel* channel)
{
JNIEnv* env = GetJNIEnv();
char* urlSpec = (char*) "";
nsIURI* url = nsnull;
if (channel && NS_SUCCEEDED(channel->GetURI(&url)))
@@ -365,10 +358,10 @@ NS_IMETHODIMP nsJavaDOMImpl::OnStartURLLoad(nsIDocumentLoader* loader,
jURL,
jContentType,
jdoc);
if (Cleanup() == PR_TRUE) return NS_ERROR_FAILURE;
if (Cleanup(env) == PR_TRUE) return NS_ERROR_FAILURE;
env->CallStaticVoidMethod(gcClass, gcMID);
Cleanup();
Cleanup(env);
return NS_OK;
}
@@ -377,6 +370,7 @@ NS_IMETHODIMP nsJavaDOMImpl::OnProgressURLLoad(nsIDocumentLoader* loader,
PRUint32 aProgress,
PRUint32 aProgressMax)
{
JNIEnv* env = GetJNIEnv();
char* urlSpec = (char*) "";
nsIURI* url = nsnull;
if (channel && NS_SUCCEEDED(channel->GetURI(&url)))
@@ -393,10 +387,10 @@ NS_IMETHODIMP nsJavaDOMImpl::OnProgressURLLoad(nsIDocumentLoader* loader,
(jint) aProgress,
(jint) aProgressMax,
jdoc);
if (Cleanup() == PR_TRUE) return NS_ERROR_FAILURE;
if (Cleanup(env) == PR_TRUE) return NS_ERROR_FAILURE;
env->CallStaticVoidMethod(gcClass, gcMID);
Cleanup();
Cleanup(env);
return NS_OK;
}
@@ -404,6 +398,7 @@ NS_IMETHODIMP nsJavaDOMImpl::OnStatusURLLoad(nsIDocumentLoader* loader,
nsIChannel* channel,
nsString& aMsg)
{
JNIEnv* env = GetJNIEnv();
char* urlSpec = (char*) "";
nsIURI* url = nsnull;
if (channel && NS_SUCCEEDED(channel->GetURI(&url)))
@@ -423,10 +418,10 @@ NS_IMETHODIMP nsJavaDOMImpl::OnStatusURLLoad(nsIDocumentLoader* loader,
jURL,
jMessage,
jdoc);
if (Cleanup() == PR_TRUE) return NS_ERROR_FAILURE;
if (Cleanup(env) == PR_TRUE) return NS_ERROR_FAILURE;
env->CallStaticVoidMethod(gcClass, gcMID);
Cleanup();
Cleanup(env);
return NS_OK;
}
@@ -434,6 +429,7 @@ NS_IMETHODIMP nsJavaDOMImpl::OnEndURLLoad(nsIDocumentLoader* loader,
nsIChannel* channel,
nsresult aStatus)
{
JNIEnv* env = GetJNIEnv();
char* urlSpec = (char*) "";
nsIURI* url = nsnull;
if (channel && NS_SUCCEEDED(channel->GetURI(&url)))
@@ -453,10 +449,10 @@ NS_IMETHODIMP nsJavaDOMImpl::OnEndURLLoad(nsIDocumentLoader* loader,
jURL,
(jint) aStatus,
jdoc);
if (Cleanup() == PR_TRUE) return NS_ERROR_FAILURE;
if (Cleanup(env) == PR_TRUE) return NS_ERROR_FAILURE;
env->CallStaticVoidMethod(gcClass, gcMID);
Cleanup();
Cleanup(env);
return NS_OK;
}
@@ -465,11 +461,86 @@ NS_IMETHODIMP nsJavaDOMImpl::HandleUnknownContentType(nsIDocumentLoader* loader,
const char *aContentType,
const char *aCommand)
{
JNIEnv* env = GetJNIEnv();
env->CallStaticVoidMethod(gcClass, gcMID);
Cleanup();
Cleanup(env);
return NS_OK;
}
JNIEnv* nsJavaDOMImpl::GetJNIEnv() {
JNIEnv* env;
#ifndef JAVA_DOM_OJI_DISABLE
nsresult result;
if (!jvmManager) {
NS_WITH_SERVICE(nsIJVMManager, _jvmManager, kJVMManagerCID, &result);
if (NS_SUCCEEDED(result)) {
jvmManager = (nsJVMManager*)((nsIJVMManager*)_jvmManager);
}
}
if (!jvmManager) {
return NULL;
}
jvmManager->CreateProxyJNI(NULL,&env);
// if (!securityContext) {
// securityContext = new JavaDOMSecurityContext();
// }
// SetSecurityContext(env,securityContext);
SetSecurityContext(env, new JavaDOMSecurityContext());
#else /* JAVA_DOM_OJI_DISABLE */
if (!jvm) {
StartJVM();
}
#ifdef XP_PC
jvm->AttachCurrentThread((void**)&env,NULL);
#else
jvm->AttachCurrentThread(&env,NULL);
#endif
#endif /* JAVA_DOM_OJI_DISABLE */
return env;
}
#ifdef JAVA_DOM_OJI_DISABLE
void nsJavaDOMImpl::StartJVM(void) {
JNIEnv *env = NULL;
JDK1_1InitArgs vm_args;
JNI_GetDefaultJavaVMInitArgs(&vm_args);
vm_args.version = 0x00010001;
vm_args.verifyMode = JNI_TRUE;
#ifdef DEBUG
vm_args.verbose = JNI_TRUE;
vm_args.enableVerboseGC = JNI_TRUE;
#endif // DEBUG
char* cp = PR_GetEnv("CLASSPATH");
char* p = new char[strlen(cp) + strlen(vm_args.classpath) + 2];
strcpy(p, vm_args.classpath);
if (cp) {
#ifdef XP_PC
strcat(p, ";");
#else
strcat(p, ":");
#endif
strcat(p, cp);
vm_args.classpath = p;
}
#ifdef DEBUG
printf("classpath is \"%s\"\n", vm_args.classpath);
#endif // DEBUG
#ifdef XP_PC
jint rv = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
#else
jint rv = JNI_CreateJavaVM(&jvm, &env, &vm_args);
#endif
if (rv < 0) {
printf("\n JAVA DOM: could not start jvm\n");
} else {
printf("\n JAVA DOM: successfully started jvm\n");
}
delete[] p;
}
#endif /* JAVA_DOM_OJI_DISABLE */
#if defined(DEBUG)
static void dump_document(nsIDOMDocument* domDoc, const char* urlSpec)
{