Bug 270889 - Better error handling. r=darin

git-svn-id: svn://10.0.0.236/trunk@167603 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
pedemont%us.ibm.com
2005-01-12 17:59:01 +00:00
parent 01dbc3fead
commit b5d494f904
7 changed files with 713 additions and 252 deletions

View File

@@ -61,7 +61,11 @@ nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant,
{
// Setup params for calling Java function
jstring prop = mJavaEnv->NewStringUTF(aProp);
if (!prop)
return NS_ERROR_OUT_OF_MEMORY;
jbooleanArray persistant = mJavaEnv->NewBooleanArray(1);
if (!persistant)
return NS_ERROR_OUT_OF_MEMORY;
// Create method ID
jmethodID mid = nsnull;
@@ -70,23 +74,26 @@ nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant,
mid = mJavaEnv->GetMethodID(clazz, "getFile",
"(Ljava/lang/String;[Z)Ljava/io/File;");
}
if (!mid)
return NS_ERROR_FAILURE;
// Call Java function
jobject javaFile = nsnull;
if (mid) {
javaFile = mJavaEnv->CallObjectMethod(mJavaLocProvider, mid, prop,
persistant);
}
if (javaFile == nsnull) {
javaFile = mJavaEnv->CallObjectMethod(mJavaLocProvider, mid, prop,
persistant);
if (javaFile == nsnull || mJavaEnv->ExceptionCheck())
return NS_ERROR_FAILURE;
}
// Set boolean output value
jboolean isCopy = PR_FALSE;
jboolean* array = mJavaEnv->GetBooleanArrayElements(persistant, &isCopy);
*aIsPersistant = array[0];
if (isCopy) {
mJavaEnv->ReleaseBooleanArrayElements(persistant, array, JNI_ABORT);
if (!array) {
return NS_ERROR_OUT_OF_MEMORY;
} else {
*aIsPersistant = array[0];
if (isCopy) {
mJavaEnv->ReleaseBooleanArrayElements(persistant, array, JNI_ABORT);
}
}
// Set nsIFile result value
@@ -96,6 +103,7 @@ nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant,
if (NS_SUCCEEDED(rv)) {
return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)aResult);
}
return rv;
}

View File

@@ -58,8 +58,9 @@ GECKO_NATIVE(initEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory,
jobject aAppFileLocProvider)
{
nsresult rv = NS_OK;
if (InitializeJavaGlobals(env))
{
if (!InitializeJavaGlobals(env)) {
rv = NS_ERROR_FAILURE;
} else {
// Create an nsILocalFile from given java.io.File
nsCOMPtr<nsILocalFile> directory;
if (aMozBinDirectory) {
@@ -70,19 +71,23 @@ GECKO_NATIVE(initEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory,
nsAppFileLocProviderProxy* provider = nsnull;
if (aAppFileLocProvider) {
provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider);
if (!provider)
rv = NS_ERROR_OUT_OF_MEMORY;
}
rv = NS_InitEmbedding(directory, provider);
if (provider) {
delete provider;
}
if (NS_SUCCEEDED(rv)) {
return;
rv = NS_InitEmbedding(directory, provider);
if (provider) {
delete provider;
}
if (NS_SUCCEEDED(rv)) {
return;
}
}
}
}
ThrowXPCOMException(env, rv, "Failure in initEmbedding");
ThrowException(env, rv, "Failure in initEmbedding");
FreeJavaGlobals(env);
}
@@ -91,7 +96,7 @@ GECKO_NATIVE(termEmbedding) (JNIEnv *env, jclass)
{
nsresult rv = NS_TermEmbedding();
if (NS_FAILED(rv))
ThrowXPCOMException(env, rv, "NS_TermEmbedding failed");
ThrowException(env, rv, "NS_TermEmbedding failed");
FreeJavaGlobals(env);
}
@@ -101,8 +106,9 @@ XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jclass, jobject aMozBinDirectory,
jobject aAppFileLocProvider)
{
nsresult rv = NS_OK;
if (InitializeJavaGlobals(env))
{
if (!InitializeJavaGlobals(env)) {
rv = NS_ERROR_FAILURE;
} else {
// Create an nsILocalFile from given java.io.File
nsCOMPtr<nsILocalFile> directory;
if (aMozBinDirectory) {
@@ -113,36 +119,41 @@ XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jclass, jobject aMozBinDirectory,
nsAppFileLocProviderProxy* provider = nsnull;
if (aAppFileLocProvider) {
provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider);
if (!provider)
rv = NS_ERROR_OUT_OF_MEMORY;
}
nsIServiceManager* servMan = nsnull;
rv = NS_InitXPCOM2(&servMan, directory, provider);
if (provider) {
delete provider;
}
jobject java_stub = nsnull;
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
inst = CreateJavaXPCOMInstance(servMan, &NS_GET_IID(nsIServiceManager));
NS_RELEASE(servMan); // JavaXPCOMInstance has owning ref
nsIServiceManager* servMan = nsnull;
rv = NS_InitXPCOM2(&servMan, directory, provider);
if (provider) {
delete provider;
}
if (inst) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsIServiceManager");
jobject java_stub = nsnull;
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
rv = CreateJavaXPCOMInstance(servMan, &NS_GET_IID(nsIServiceManager),
&inst);
NS_RELEASE(servMan); // JavaXPCOMInstance has owning ref
if (java_stub) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(env, java_stub, inst);
return java_stub;
if (NS_SUCCEEDED(rv)) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsIServiceManager");
if (java_stub) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(env, java_stub, inst);
return java_stub;
}
}
}
}
}
}
ThrowXPCOMException(env, rv, "Failure in initXPCOM");
ThrowException(env, rv, "Failure in initXPCOM");
FreeJavaGlobals(env);
return nsnull;
}
@@ -155,20 +166,20 @@ XPCOM_NATIVE(shutdownXPCOM) (JNIEnv *env, jclass, jobject aServMgr)
// Find corresponding XPCOM object
void* xpcomObj = GetMatchingXPCOMObject(env, aServMgr);
NS_ASSERTION(xpcomObj != nsnull, "Failed to get matching XPCOM object");
if (xpcomObj == nsnull) {
ThrowXPCOMException(env, 0,
"No matching XPCOM obj for service manager proxy");
return;
}
NS_ASSERTION(!IsXPTCStub(xpcomObj),
"Expected JavaXPCOMInstance, but got nsJavaXPTCStub");
servMgr = do_QueryInterface(((JavaXPCOMInstance*) xpcomObj)->GetInstance());
// 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());
}
}
nsresult rv = NS_ShutdownXPCOM(servMgr);
if (NS_FAILED(rv))
ThrowXPCOMException(env, rv, "NS_ShutdownXPCOM failed");
ThrowException(env, rv, "NS_ShutdownXPCOM failed");
FreeJavaGlobals(env);
}
@@ -184,6 +195,8 @@ XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jclass, jstring aPath,
const PRUnichar* buf = nsnull;
if (aPath) {
buf = env->GetStringChars(aPath, &isCopy);
if (!buf)
return nsnull; // exception already thrown
}
nsAutoString path_str(buf);
@@ -198,10 +211,10 @@ XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jclass, jstring aPath,
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
inst = CreateJavaXPCOMInstance(file, &NS_GET_IID(nsILocalFile));
rv = CreateJavaXPCOMInstance(file, &NS_GET_IID(nsILocalFile), &inst);
NS_RELEASE(file); // JavaXPCOMInstance has owning ref
if (inst) {
if (NS_SUCCEEDED(rv)) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsILocalFile");
@@ -213,7 +226,7 @@ XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jclass, jstring aPath,
}
if (java_stub == nsnull)
ThrowXPCOMException(env, rv, "Failure in newLocalFile");
ThrowException(env, rv, "Failure in newLocalFile");
return java_stub;
}
@@ -230,10 +243,10 @@ XPCOM_NATIVE(getComponentManager) (JNIEnv *env, jclass)
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
inst = CreateJavaXPCOMInstance(cm, &NS_GET_IID(nsIComponentManager));
rv = CreateJavaXPCOMInstance(cm, &NS_GET_IID(nsIComponentManager), &inst);
NS_RELEASE(cm); // JavaXPCOMInstance has owning ref
if (inst) {
if (NS_SUCCEEDED(rv)) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsIComponentManager");
@@ -245,7 +258,7 @@ XPCOM_NATIVE(getComponentManager) (JNIEnv *env, jclass)
}
if (java_stub == nsnull)
ThrowXPCOMException(env, rv, "Failure in getComponentManager");
ThrowException(env, rv, "Failure in getComponentManager");
return java_stub;
}
@@ -262,10 +275,10 @@ XPCOM_NATIVE(getComponentRegistrar) (JNIEnv *env, jclass)
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
inst = CreateJavaXPCOMInstance(cr, &NS_GET_IID(nsIComponentRegistrar));
rv = CreateJavaXPCOMInstance(cr, &NS_GET_IID(nsIComponentRegistrar), &inst);
NS_RELEASE(cr); // JavaXPCOMInstance has owning ref
if (inst) {
if (NS_SUCCEEDED(rv)) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsIComponentRegistrar");
@@ -277,7 +290,7 @@ XPCOM_NATIVE(getComponentRegistrar) (JNIEnv *env, jclass)
}
if (java_stub == nsnull)
ThrowXPCOMException(env, rv, "Failure in getComponentRegistrar");
ThrowException(env, rv, "Failure in getComponentRegistrar");
return java_stub;
}
@@ -294,10 +307,10 @@ XPCOM_NATIVE(getServiceManager) (JNIEnv *env, jclass)
if (NS_SUCCEEDED(rv)) {
// wrap xpcom instance
JavaXPCOMInstance* inst;
inst = CreateJavaXPCOMInstance(sm, &NS_GET_IID(nsIServiceManager));
rv = CreateJavaXPCOMInstance(sm, &NS_GET_IID(nsIServiceManager), &inst);
NS_RELEASE(sm); // JavaXPCOMInstance has owning ref
if (inst) {
if (NS_SUCCEEDED(rv)) {
// create java stub
java_stub = CreateJavaWrapper(env, "nsIServiceManager");
@@ -309,22 +322,26 @@ XPCOM_NATIVE(getServiceManager) (JNIEnv *env, jclass)
}
if (java_stub == nsnull)
ThrowXPCOMException(env, rv, "Failure in getServiceManager");
ThrowException(env, rv, "Failure in getServiceManager");
return java_stub;
}
extern "C" JNIEXPORT void JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodVoid) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodVoid) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
}
extern "C" JNIEXPORT jboolean JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodBool) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodBool) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -332,8 +349,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodBool) (JNIEnv *env, jclass that, jobject aJav
}
extern "C" JNIEXPORT jbooleanArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodBoolA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodBoolA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -341,8 +360,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodBoolA) (JNIEnv *env, jclass that, jobject aJa
}
extern "C" JNIEXPORT jbyte JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodByte) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodByte) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -350,8 +371,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodByte) (JNIEnv *env, jclass that, jobject aJav
}
extern "C" JNIEXPORT jbyteArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodByteA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodByteA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -359,8 +382,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodByteA) (JNIEnv *env, jclass that, jobject aJa
}
extern "C" JNIEXPORT jchar JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodChar) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodChar) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -368,8 +393,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodChar) (JNIEnv *env, jclass that, jobject aJav
}
extern "C" JNIEXPORT jcharArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodCharA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodCharA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -377,8 +404,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodCharA) (JNIEnv *env, jclass that, jobject aJa
}
extern "C" JNIEXPORT jshort JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodShort) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodShort) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -386,8 +415,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodShort) (JNIEnv *env, jclass that, jobject aJa
}
extern "C" JNIEXPORT jshortArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodShortA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodShortA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -395,8 +426,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodShortA) (JNIEnv *env, jclass that, jobject aJ
}
extern "C" JNIEXPORT jint JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodInt) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodInt) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -404,8 +437,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodInt) (JNIEnv *env, jclass that, jobject aJava
}
extern "C" JNIEXPORT jintArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodIntA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodIntA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -413,8 +448,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodIntA) (JNIEnv *env, jclass that, jobject aJav
}
extern "C" JNIEXPORT jlong JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodLong) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodLong) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -422,8 +459,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodLong) (JNIEnv *env, jclass that, jobject aJav
}
extern "C" JNIEXPORT jlongArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodLongA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodLongA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -431,8 +470,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodLongA) (JNIEnv *env, jclass that, jobject aJa
}
extern "C" JNIEXPORT jfloat JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloat) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloat) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -440,8 +481,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloat) (JNIEnv *env, jclass that, jobject aJa
}
extern "C" JNIEXPORT jfloatArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloatA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloatA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -449,8 +492,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloatA) (JNIEnv *env, jclass that, jobject aJ
}
extern "C" JNIEXPORT jdouble JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodDouble) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodDouble) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -458,8 +503,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodDouble) (JNIEnv *env, jclass that, jobject aJ
}
extern "C" JNIEXPORT jdoubleArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodDoubleA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodDoubleA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -467,8 +514,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodDoubleA) (JNIEnv *env, jclass that, jobject a
}
extern "C" JNIEXPORT jobject JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodObj) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodObj) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -476,8 +525,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodObj) (JNIEnv *env, jclass that, jobject aJava
}
extern "C" JNIEXPORT jobjectArray JNICALL
XPCOMPRIVATE_NATIVE(CallXPCOMMethodObjA) (JNIEnv *env, jclass that, jobject aJavaObject,
jint aMethodIndex, jobjectArray aParams)
XPCOMPRIVATE_NATIVE(CallXPCOMMethodObjA) (JNIEnv *env, jclass that,
jobject aJavaObject,
jint aMethodIndex,
jobjectArray aParams)
{
jvalue rc;
CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc);
@@ -485,7 +536,8 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodObjA) (JNIEnv *env, jclass that, jobject aJav
}
extern "C" JNIEXPORT void JNICALL
XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, jobject aJavaObject)
XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that,
jobject aJavaObject)
{
#ifdef DEBUG
jboolean isCopy;
@@ -498,7 +550,8 @@ XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, jobject aJavaObject
#endif
void* obj = GetMatchingXPCOMObject(env, aJavaObject);
NS_ASSERTION(!IsXPTCStub(obj), "Expecting JavaXPCOMInstance, got nsJavaXPTCStub");
NS_ASSERTION(!IsXPTCStub(obj),
"Expecting JavaXPCOMInstance, got nsJavaXPTCStub");
RemoveJavaXPCOMBinding(env, aJavaObject, nsnull);
delete (JavaXPCOMInstance*) obj;
}

View File

@@ -76,6 +76,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jbyte* buf = nsnull;
if (aParam) {
buf = env->GetByteArrayElements((jbyteArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -98,6 +102,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jshort* buf = nsnull;
if (aParam) {
buf = env->GetShortArrayElements((jshortArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -120,6 +128,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jint* buf = nsnull;
if (aParam) {
buf = env->GetIntArrayElements((jintArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -142,6 +154,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jlong* buf = nsnull;
if (aParam) {
buf = env->GetLongArrayElements((jlongArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -163,6 +179,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jfloat* buf = nsnull;
if (aParam) {
buf = env->GetFloatArrayElements((jfloatArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -184,6 +204,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jdouble* buf = nsnull;
if (aParam) {
buf = env->GetDoubleArrayElements((jdoubleArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -205,6 +229,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jboolean* buf = nsnull;
if (aParam) {
buf = env->GetBooleanArrayElements((jbooleanArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -230,6 +258,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jchar* buf = nsnull;
if (aParam) {
buf = env->GetCharArrayElements((jcharArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -261,6 +293,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
} else {
buf = env->GetStringChars(data, &isCopy);
}
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.val.p = aVariant.ptr = NS_CONST_CAST(void*, buf);
@@ -283,10 +319,19 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
}
nsID* iid = new nsID;
if (!iid) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
if (data) {
jboolean isCopy;
const char* str = nsnull;
str = env->GetStringUTFChars(data, &isCopy);
if (!str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
iid->Parse(str);
if (isCopy) {
env->ReleaseStringUTFChars(data, str);
@@ -322,7 +367,7 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
aMethodIndex, aDispatchParams, PR_TRUE,
iid);
if (NS_FAILED(rv))
return rv;
break;
PRBool isWeakRef = iid.Equals(NS_GET_IID(nsIWeakReference));
@@ -335,10 +380,16 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
// Get interface info for class
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
nsCOMPtr<nsIInterfaceInfo> iinfo;
iim->GetInfoForIID(&iid, getter_AddRefs(iinfo));
rv = iim->GetInfoForIID(&iid, getter_AddRefs(iinfo));
if (NS_FAILED(rv))
break;
// Create XPCOM stub
nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(env, java_obj, iinfo);
if (!xpcomStub) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
inst = SetAsXPTCStub(xpcomStub);
AddJavaXPCOMBinding(env, java_obj, inst);
}
@@ -348,14 +399,20 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
// create it here.
nsJavaXPTCStubWeakRef* weakref =
new nsJavaXPTCStubWeakRef(env, java_obj);
if (!weakref) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
NS_ADDREF(weakref);
aVariant.flags |= nsXPTCVariant::VAL_IS_ALLOCD;
aVariant.val.p = aVariant.ptr = (void*) weakref;
} else if (IsXPTCStub(inst)) {
nsJavaXPTCStub* xpcomStub = GetXPTCStubAddr(inst);
NS_ADDREF(xpcomStub);
aVariant.flags |= nsXPTCVariant::VAL_IS_ALLOCD;
aVariant.val.p = aVariant.ptr = (void*) xpcomStub;
} else {
JavaXPCOMInstance* xpcomInst = (JavaXPCOMInstance*) inst;
aVariant.val.p = aVariant.ptr = (void*) xpcomInst->GetInstance();
@@ -382,6 +439,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
}
nsAString* str = jstring_to_nsAString(env, data);
if (!str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aVariant.val.p = aVariant.ptr = str;
aVariant.flags = nsXPTCVariant::PTR_IS_DATA | nsXPTCVariant::VAL_IS_DOMSTR;
@@ -401,6 +462,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
}
nsACString* str = jstring_to_nsACString(env, data);
if (!str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aVariant.val.p = aVariant.ptr = str;
aVariant.flags = nsXPTCVariant::PTR_IS_DATA;
@@ -424,6 +489,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
jint* buf = nsnull;
if (aParam) {
buf = env->GetIntArrayElements((jintArray) aParam, &isCopy);
if (!buf) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
aVariant.ptr = buf;
@@ -433,7 +502,8 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo,
}
} else {
LOG(("int (void*)\n"));
NS_ASSERTION(type.IsPointer(), "T_VOID 'int' handler received non-pointer type");
NS_ASSERTION(type.IsPointer(),
"T_VOID 'int' handler received non-pointer type");
aVariant.val.p = (void*) env->CallIntMethod(aParam, intValueMID);
}
} else {
@@ -569,6 +639,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam,
// If this is an output parameter, then create the string to return
if (aParam && aParamInfo.IsOut()) {
jstring str = env->NewStringUTF((const char*) aVariant.val.p);
if (!str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
env->SetObjectArrayElement((jobjectArray) aParam, 0, str);
}
}
@@ -591,6 +665,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam,
if (aParam && aParamInfo.IsOut()) {
PRUint32 length = nsCRT::strlen((const PRUnichar*) aVariant.val.p);
jstring str = env->NewString((const jchar*) aVariant.val.p, length);
if (!str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
env->SetObjectArrayElement((jobjectArray) aParam, 0, str);
}
}
@@ -604,6 +682,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam,
if (iid && aParamInfo.IsOut()) {
char* iid_str = iid->ToString();
jstring str = env->NewStringUTF(iid_str);
if (!iid_str || !str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
PR_Free(iid_str);
env->SetObjectArrayElement((jobjectArray) aParam, 0, str);
}
@@ -628,21 +710,23 @@ FinalizeParams(JNIEnv *env, const jobject aParam,
if (NS_FAILED(rv))
return rv;
nsISupports* variant =
NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p);
inst = CreateJavaXPCOMInstance(variant, &iid);
nsISupports* variant;
variant = NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p);
rv = CreateJavaXPCOMInstance(variant, &iid, &inst);
if (NS_FAILED(rv))
break;
NS_RELEASE(variant); // JavaXPCOMInstance has owning ref
if (inst) {
// create java stub
char* iface_name;
inst->InterfaceInfo()->GetName(&iface_name);
java_obj = CreateJavaWrapper(env, iface_name);
// create java stub
char* iface_name;
rv = inst->InterfaceInfo()->GetName(&iface_name);
if (NS_FAILED(rv))
break;
java_obj = CreateJavaWrapper(env, iface_name);
if (java_obj) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(env, java_obj, inst);
}
if (java_obj) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(env, java_obj, inst);
}
}
@@ -666,7 +750,12 @@ FinalizeParams(JNIEnv *env, const jobject aParam,
if (str) {
if (aParamInfo.IsOut()) {
jstring jstr = env->NewString((const jchar*) str->get(), str->Length());
jstring jstr;
jstr = env->NewString((const jchar*) str->get(), str->Length());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
env->SetObjectArrayElement((jobjectArray) aParam, 0, jstr);
}
delete str;
@@ -682,6 +771,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam,
if (str) {
if (aParamInfo.IsOut()) {
jstring jstr = env->NewStringUTF((const char*) str->get());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
env->SetObjectArrayElement((jobjectArray) aParam, 0, jstr);
}
delete str;
@@ -755,10 +848,15 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo,
case nsXPTType::T_CHAR_STR:
{
if (aVariant.ptr)
if (aVariant.ptr) {
aResult.l = env->NewStringUTF((const char*) aVariant.ptr);
else
if (aResult.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
} else {
aResult.l = nsnull;
}
}
break;
@@ -767,6 +865,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo,
if (aVariant.ptr) {
PRUint32 length = nsCRT::strlen((const PRUnichar*) aVariant.ptr);
aResult.l = env->NewString((const jchar*) aVariant.ptr, length);
if (aResult.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
} else {
aResult.l = nsnull;
}
@@ -779,6 +881,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo,
nsID* iid = (nsID*) aVariant.ptr;
char* iid_str = iid->ToString();
aResult.l = env->NewStringUTF(iid_str);
if (iid_str == nsnull || aResult.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
PR_Free(iid_str);
} else {
aResult.l = nsnull;
@@ -800,20 +906,22 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo,
if (NS_FAILED(rv))
return rv;
nsISupports* variant =
NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p);
inst = CreateJavaXPCOMInstance(variant, &iid);
nsISupports* variant;
variant = NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p);
rv = CreateJavaXPCOMInstance(variant, &iid, &inst);
if (NS_FAILED(rv))
break;
NS_RELEASE(variant); // JavaXPCOMInstance has owning ref
if (inst) {
// create java stub
char* iface_name;
inst->InterfaceInfo()->GetName(&iface_name);
java_obj = CreateJavaWrapper(env, iface_name);
// create java stub
char* iface_name;
rv = inst->InterfaceInfo()->GetName(&iface_name);
if (NS_FAILED(rv))
break;
java_obj = CreateJavaWrapper(env, iface_name);
if (java_obj)
AddJavaXPCOMBinding(env, java_obj, inst);
}
if (java_obj)
AddJavaXPCOMBinding(env, java_obj, inst);
}
// XXX not sure if this is necessary
@@ -839,6 +947,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo,
if (aVariant.ptr) {
nsString* str = (nsString*) aVariant.ptr;
aResult.l = env->NewString(str->get(), str->Length());
if (aResult.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
} else {
aResult.l = nsnull;
}
@@ -851,6 +963,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo,
if (aVariant.ptr) {
nsCString* str = (nsCString*) aVariant.ptr;
aResult.l = env->NewStringUTF(str->get());
if (aResult.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
} else {
aResult.l = nsnull;
}
@@ -882,7 +998,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
// Find corresponding XPCOM object
void* xpcomObj = GetMatchingXPCOMObject(env, aJavaObject);
if (xpcomObj == nsnull) {
ThrowXPCOMException(env, 0, "Failed to get matching XPCOM object");
ThrowException(env, 0, "Failed to get matching XPCOM object");
return;
}
@@ -895,7 +1011,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
nsIInterfaceInfo* iinfo = inst->InterfaceInfo();
nsresult rv = iinfo->GetMethodInfo(aMethodIndex, &methodInfo);
if (NS_FAILED(rv)) {
ThrowXPCOMException(env, rv, "GetMethodInfo failed");
ThrowException(env, rv, "GetMethodInfo failed");
return;
}
@@ -911,6 +1027,10 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
if (paramCount)
{
params = new nsXPTCVariant[paramCount];
if (!params) {
ThrowException(env, NS_ERROR_OUT_OF_MEMORY, "Can't create params array");
return;
}
for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++)
{
@@ -928,6 +1048,10 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
case nsXPTType::T_ASTRING:
case nsXPTType::T_DOMSTRING:
params[i].val.p = params[i].ptr = new nsString();
if (params[i].val.p == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
params[i].type = type;
params[i].flags = nsXPTCVariant::PTR_IS_DATA |
nsXPTCVariant::VAL_IS_DOMSTR;
@@ -936,6 +1060,10 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
case nsXPTType::T_UTF8STRING:
case nsXPTType::T_CSTRING:
params[i].val.p = params[i].ptr = new nsCString();
if (params[i].val.p == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
params[i].type = type;
params[i].flags = nsXPTCVariant::PTR_IS_DATA |
nsXPTCVariant::VAL_IS_CSTR;
@@ -953,7 +1081,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
}
}
if (NS_FAILED(rv)) {
ThrowXPCOMException(env, rv, "SetupParams failed");
ThrowException(env, rv, "SetupParams failed");
return;
}
}
@@ -978,7 +1106,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
}
}
if (NS_FAILED(rv)) {
ThrowXPCOMException(env, rv, "FinalizeParams failed");
ThrowException(env, rv, "FinalizeParams/SetRetval failed");
return;
}
@@ -1006,7 +1134,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject,
nsCAutoString message("The function \"");
message.AppendASCII(methodInfo->GetName());
message.AppendLiteral("\" returned an error condition");
ThrowXPCOMException(env, invokeResult, message.get());
ThrowException(env, invokeResult, message.get());
}
return;

View File

@@ -457,23 +457,26 @@ JavaXPCOMInstance::~JavaXPCOMInstance()
NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to release using NS_ProxyRelease");
}
JavaXPCOMInstance*
CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, const nsIID* aIID)
nsresult
CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, const nsIID* aIID,
JavaXPCOMInstance** aResult)
{
JavaXPCOMInstance* inst = nsnull;
// Get interface info for class
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
NS_ASSERTION(iim != nsnull, "Failed to get InterfaceInfoManager");
if (iim) {
nsCOMPtr<nsIInterfaceInfo> info;
iim->GetInfoForIID(aIID, getter_AddRefs(info));
if (!iim)
return NS_ERROR_FAILURE;
// Wrap XPCOM object
inst = new JavaXPCOMInstance(aXPCOMObject, info);
// Get interface info for class
nsCOMPtr<nsIInterfaceInfo> info;
nsresult rv = iim->GetInfoForIID(aIID, getter_AddRefs(info));
// Wrap XPCOM object
if (NS_SUCCEEDED(rv)) {
*aResult = new JavaXPCOMInstance(aXPCOMObject, info);
if (!*aResult)
rv = NS_ERROR_OUT_OF_MEMORY;
}
return inst;
return rv;
}
@@ -496,14 +499,16 @@ GetIIDForMethodParam(nsIInterfaceInfo *iinfo, const nsXPTMethodInfo *methodInfo,
PRUint8 argnum;
rv = iinfo->GetInterfaceIsArgNumberForParam(methodIndex, &paramInfo, &argnum);
if (NS_FAILED(rv))
return rv;
break;
const nsXPTParamInfo& arg_param = methodInfo->GetParam(argnum);
const nsXPTType& arg_type = arg_param.GetType();
// The xpidl compiler ensures this. We reaffirm it for safety.
if (!arg_type.IsPointer() || arg_type.TagPart() != nsXPTType::T_IID)
return NS_ERROR_UNEXPECTED;
if (!arg_type.IsPointer() || arg_type.TagPart() != nsXPTType::T_IID) {
rv = NS_ERROR_UNEXPECTED;
break;
}
nsID *p = nsnull;
if (isFullVariantArray) {
@@ -530,18 +535,37 @@ GetIIDForMethodParam(nsIInterfaceInfo *iinfo, const nsXPTMethodInfo *methodInfo,
*******************************/
void
ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode,
const char* aMessage)
ThrowException(JNIEnv* env, const nsresult aErrorCode, const char* aMessage)
{
// Only throw this exception if one hasn't already been thrown, so we don't
// mask a previous exception/error.
if (env->ExceptionCheck())
return;
// If the error code we get is for an Out Of Memory error, try to throw an
// OutOfMemoryError. The JVM may have enough memory to create this error.
if (aErrorCode == NS_ERROR_OUT_OF_MEMORY) {
jclass clazz = env->FindClass("java/lang/OutOfMemoryError");
if (clazz) {
env->ThrowNew(clazz, aMessage);
}
env->DeleteLocalRef(clazz);
return;
}
// If the error was not handled above, then create an XPCOMException with the
// given error code and message.
// Create parameters and method signature. Max of 2 params. The error code
// comes before the message string.
PRUint32 index = 0;
jvalue* args = new jvalue[2];
if (!args) {
ThrowException(env, NS_ERROR_OUT_OF_MEMORY,
"Out of memory while throwing another exception");
return;
}
nsCAutoString methodSig("(");
if (aErrorCode) {
args[index++].j = aErrorCode;
@@ -549,6 +573,10 @@ ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode,
}
if (aMessage) {
args[index].l = env->NewStringUTF(aMessage);
if (args[index].l == nsnull) {
delete[] args;
return;
}
methodSig.AppendLiteral("Ljava/lang/String;");
}
methodSig.AppendLiteral(")V");
@@ -578,6 +606,8 @@ jstring_to_nsAString(JNIEnv* env, jstring aString)
const PRUnichar* buf = nsnull;
if (aString) {
buf = env->GetStringChars(aString, &isCopy);
if (!buf)
return nsnull; // exception already thrown
}
nsString* str = new nsString(buf);
@@ -585,6 +615,7 @@ jstring_to_nsAString(JNIEnv* env, jstring aString)
env->ReleaseStringChars(aString, buf);
}
// returns string, or nsnull if 'new' failed
return str;
}
@@ -595,6 +626,8 @@ jstring_to_nsACString(JNIEnv* env, jstring aString)
const char* buf = nsnull;
if (aString) {
buf = env->GetStringUTFChars(aString, &isCopy);
if (!buf)
return nsnull; // exception already thrown
}
nsCString* str = new nsCString(buf);
@@ -602,12 +635,14 @@ jstring_to_nsACString(JNIEnv* env, jstring aString)
env->ReleaseStringUTFChars(aString, buf);
}
// returns string, or nsnull if 'new' failed
return str;
}
nsresult
File_to_nsILocalFile(JNIEnv* env, jobject aFile, nsILocalFile** aLocalFile)
{
nsresult rv = NS_ERROR_FAILURE;
jstring pathName = nsnull;
jclass clazz = env->FindClass("java/io/File");
if (clazz) {
@@ -615,16 +650,22 @@ File_to_nsILocalFile(JNIEnv* env, jobject aFile, nsILocalFile** aLocalFile)
"()Ljava/lang/String;");
if (pathMID) {
pathName = (jstring) env->CallObjectMethod(aFile, pathMID);
if (pathName != nsnull && !env->ExceptionCheck())
rv = NS_OK;
}
}
if (pathName) {
if (NS_SUCCEEDED(rv)) {
nsAString* path = jstring_to_nsAString(env, pathName);
nsresult rv = NS_NewLocalFile(*path, false, aLocalFile);
delete path;
return rv;
if (!path)
rv = NS_ERROR_OUT_OF_MEMORY;
if (NS_SUCCEEDED(rv)) {
rv = NS_NewLocalFile(*path, false, aLocalFile);
delete path;
}
}
return NS_ERROR_FAILURE;
return rv;
}

View File

@@ -80,6 +80,7 @@ void FreeJavaGlobals(JNIEnv* env);
/*************************
* JavaXPCOMInstance
*************************/
class JavaXPCOMInstance
{
public:
@@ -94,8 +95,19 @@ private:
nsCOMPtr<nsIInterfaceInfo> mIInfo;
};
JavaXPCOMInstance* CreateJavaXPCOMInstance(nsISupports* aXPCOMObject,
const nsIID* aIID);
/**
* Creates a new JavaXPCOMInstance which holds the xpcom object and its
* interface info based on the given IID.
*
* @param aXPCOMObject xpcom object to wrap
* @param aIID interface IID for aXPCOMObject
* @param aResult pointer that will hold new JavaXPCOMInstance
*
* @return NS_ERROR_OUT_OF_MEMORY if out of memory;
* NS_ERROR_FAILURE for any other error condition
*/
nsresult CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, const nsIID* aIID,
JavaXPCOMInstance** aResult);
/**************************************
@@ -123,7 +135,10 @@ nsresult GetIIDForMethodParam(nsIInterfaceInfo *iinfo,
*******************************/
/**
* Constructs and throws an XPCOMException.
* Constructs and throws an exception. Some error codes (such as
* NS_ERROR_OUT_OF_MEMORY) are handled by the appropriate Java exception/error.
* Otherwise, an instance of XPCOMException is created with the given error
* code and message.
*
* @param env Java environment pointer
* @param aErrorCode The error code returned by an XPCOM/Gecko function. Pass
@@ -131,9 +146,12 @@ nsresult GetIIDForMethodParam(nsIInterfaceInfo *iinfo,
* @param aMessage A string that provides details for throwing this
* exception. Pass in <code>nsnull</code> for the default
* behaviour.
*
* @throws OutOfMemoryError if aErrorCode == NS_ERROR_OUT_OF_MEMORY
* XPCOMException for all other error codes
*/
void ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode,
const char* aMessage);
void ThrowException(JNIEnv* env, const nsresult aErrorCode,
const char* aMessage);
/**
* Helper functions for converting from java.lang.String to
@@ -142,7 +160,8 @@ void ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode,
* @param env Java environment pointer
* @param aString Java string to convert
*
* @return nsAString/nsACString with same content as given Java string
* @return nsAString/nsACString with same content as given Java string; or
* <code>nsnull</code> if out of memory
*/
nsAString* jstring_to_nsAString(JNIEnv* env, jstring aString);
nsACString* jstring_to_nsACString(JNIEnv* env, jstring aString);

View File

@@ -54,22 +54,28 @@ nsJavaXPTCStub::nsJavaXPTCStub(JNIEnv* aJavaEnv, jobject aJavaObject,
mJavaObject = aJavaEnv->NewGlobalRef(aJavaObject);
#ifdef DEBUG
jboolean isCopy;
jboolean isCopy = PR_FALSE;
jstring name;
const char* javaObjectName = nsnull;
jclass clazz = mJavaEnv->GetObjectClass(mJavaObject);
if (clazz) {
name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID);
javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy);
}
nsID* iid = nsnull;
char* iid_str = nsnull;
jclass clazz = mJavaEnv->GetObjectClass(mJavaObject);
jstring name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID);
const char* javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy);
if (mIInfo) {
mIInfo->GetInterfaceIID(&iid);
if (iid) {
nsresult rv = mIInfo->GetInterfaceIID(&iid);
if (NS_SUCCEEDED(rv)) {
iid_str = iid->ToString();
nsMemory::Free(iid);
}
}
LOG(("+++ nsJavaXPTCStub(this=0x%08x java_obj=0x%08x %s iid=%s)\n", (int) this,
mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID), javaObjectName,
iid_str ? iid_str : "NULL"));
mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID),
javaObjectName ? javaObjectName : "<-->", iid_str ? iid_str : "NULL"));
if (isCopy)
mJavaEnv->ReleaseStringUTFChars(name, javaObjectName);
if (iid_str)
@@ -80,12 +86,18 @@ nsJavaXPTCStub::nsJavaXPTCStub(JNIEnv* aJavaEnv, jobject aJavaObject,
nsJavaXPTCStub::~nsJavaXPTCStub()
{
#ifdef DEBUG
jboolean isCopy;
jboolean isCopy = PR_FALSE;
jstring name;
const char* javaObjectName = nsnull;
jclass clazz = mJavaEnv->GetObjectClass(mJavaObject);
jstring name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID);
const char* javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy);
if (clazz) {
name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID);
javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy);
}
LOG(("--- ~nsJavaXPTCStub(this=0x%08x java_obj=0x%08x %s)\n", (int) this,
mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID), javaObjectName));
mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID),
javaObjectName ? javaObjectName : "<-->"));
if (isCopy)
mJavaEnv->ReleaseStringUTFChars(name, javaObjectName);
#endif
@@ -140,6 +152,7 @@ NS_IMETHODIMP
nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
{
LOG(("JavaStub::QueryInterface()\n"));
*aInstancePtr = nsnull;
nsJavaXPTCStub *master = mMaster ? mMaster : this;
// This helps us differentiate between the help classes.
@@ -178,55 +191,75 @@ nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
// Query Java object
LOG(("\tCalling Java object queryInterface\n"));
jmethodID qiMID = 0;
jclass clazz = mJavaEnv->GetObjectClass(mJavaObject);
char* sig = "(Ljava/lang/String;)Lorg/mozilla/xpcom/nsISupports;";
jmethodID qiMID = mJavaEnv->GetMethodID(clazz, "queryInterface", sig);
NS_ASSERTION(qiMID, "Failed to get queryInterface method ID");
char* iid_str = aIID.ToString();
jstring iid_jstr = mJavaEnv->NewStringUTF(iid_str);
PR_Free(iid_str);
jobject obj = mJavaEnv->CallObjectMethod(mJavaObject, qiMID, iid_jstr);
if (obj) {
// Get interface info for new java object
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
nsCOMPtr<nsIInterfaceInfo> iinfo;
iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo));
nsJavaXPTCStub* stub = new nsJavaXPTCStub(mJavaEnv, obj, iinfo);
// add stub to the master's list of children, so we can preserve
// symmetry in future QI calls. the master will delete each child
// when it is destroyed. the refcount of each child is bound to
// the refcount of the master. this is done to deal with code
// like this:
//
// nsCOMPtr<nsIBar> bar = ...;
// nsIFoo *foo;
// {
// nsCOMPtr<nsIFoo> temp = do_QueryInterface(bar);
// foo = temp;
// }
// foo->DoStuff();
//
// while this code is not valid XPCOM (since it is using |foo|
// after having called Release on it), such code is unfortunately
// very common in the mozilla codebase. the assumption this code
// is making is that so long as |bar| is alive, it should be valid
// to access |foo| even if the code doesn't own a strong reference
// to |foo|! clearly wrong, but we need to support it anyways.
stub->mMaster = master;
master->mChildren.AppendElement(stub);
*aInstancePtr = stub;
NS_ADDREF(stub);
return NS_OK;
if (clazz) {
char* sig = "(Ljava/lang/String;)Lorg/mozilla/xpcom/nsISupports;";
qiMID = mJavaEnv->GetMethodID(clazz, "queryInterface", sig);
NS_ASSERTION(qiMID, "Failed to get queryInterface method ID");
}
*aInstancePtr = nsnull;
return NS_NOINTERFACE;
if (qiMID == nsnull) {
mJavaEnv->ExceptionClear();
return NS_NOINTERFACE;
}
// construct IID string
char* iid_str = aIID.ToString();
jstring iid_jstr = mJavaEnv->NewStringUTF(iid_str);
if (!iid_str || !iid_jstr) {
mJavaEnv->ExceptionClear();
return NS_ERROR_OUT_OF_MEMORY;
}
PR_Free(iid_str);
// call queryInterface method
jobject obj = mJavaEnv->CallObjectMethod(mJavaObject, qiMID, iid_jstr);
if (mJavaEnv->ExceptionCheck()) {
mJavaEnv->ExceptionClear();
return NS_ERROR_FAILURE;
}
if (!obj)
return NS_NOINTERFACE;
// Get interface info for new java object
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
nsCOMPtr<nsIInterfaceInfo> iinfo;
nsresult rv = iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo));
if (NS_FAILED(rv))
return rv;
stub = new nsJavaXPTCStub(mJavaEnv, obj, iinfo);
if (!stub)
return NS_ERROR_OUT_OF_MEMORY;
// add stub to the master's list of children, so we can preserve
// symmetry in future QI calls. the master will delete each child
// when it is destroyed. the refcount of each child is bound to
// the refcount of the master. this is done to deal with code
// like this:
//
// nsCOMPtr<nsIBar> bar = ...;
// nsIFoo *foo;
// {
// nsCOMPtr<nsIFoo> temp = do_QueryInterface(bar);
// foo = temp;
// }
// foo->DoStuff();
//
// while this code is not valid XPCOM (since it is using |foo|
// after having called Release on it), such code is unfortunately
// very common in the mozilla codebase. the assumption this code
// is making is that so long as |bar| is alive, it should be valid
// to access |foo| even if the code doesn't own a strong reference
// to |foo|! clearly wrong, but we need to support it anyways.
stub->mMaster = master;
master->mChildren.AppendElement(stub);
*aInstancePtr = stub;
NS_ADDREF(stub);
return NS_OK;
}
PRBool
@@ -293,6 +326,8 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
const nsXPTParamInfo* retvalInfo = nsnull;
if (paramCount) {
java_params = new jvalue[paramCount];
if (!java_params)
return NS_ERROR_OUT_OF_MEMORY;
for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++)
{
@@ -341,11 +376,13 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
if (clazz)
mid = mJavaEnv->GetMethodID(clazz, methodName.get(), methodSig.get());
NS_ASSERTION(mid, "Failed to get requested method for Java object");
if (!mid)
rv = NS_ERROR_FAILURE;
}
// Call method
jvalue retval;
if (mid) {
if (NS_SUCCEEDED(rv)) {
if (!retvalInfo) {
mJavaEnv->CallVoidMethodA(mJavaObject, mid, java_params);
} else {
@@ -415,12 +452,27 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
}
// Check for exception from called Java function
if (mJavaEnv->ExceptionCheck()) {
jthrowable exp = mJavaEnv->ExceptionOccurred();
if (exp) {
#ifdef DEBUG
mJavaEnv->ExceptionDescribe();
#endif
mJavaEnv->ExceptionClear();
rv = NS_ERROR_FAILURE;
// If the exception is an instance of XPCOMException, then get the
// nsresult from the exception instance. Else, default to
// NS_ERROR_FAILURE.
if (mJavaEnv->IsInstanceOf(exp, xpcomExceptionClass)) {
jfieldID fid;
fid = mJavaEnv->GetFieldID(xpcomExceptionClass, "errorcode", "J");
if (fid) {
rv = mJavaEnv->GetLongField(exp, fid);
} else {
rv = NS_ERROR_FAILURE;
}
NS_ASSERTION(fid, "Couldn't get 'errorcode' field of XPCOMException");
} else {
rv = NS_ERROR_FAILURE;
}
}
}
@@ -443,6 +495,7 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
if (java_params)
delete [] java_params;
mJavaEnv->ExceptionClear();
return rv;
}
@@ -454,7 +507,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
nsXPTCMiniVariant &aVariant, jvalue &aJValue,
nsACString &aMethodSig)
{
nsresult rv;
nsresult rv = NS_OK;
const nsXPTType &type = aParamInfo.GetType();
PRUint8 tag = type.TagPart();
switch (tag)
@@ -467,6 +520,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('B');
} else {
jbyteArray array = mJavaEnv->NewByteArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetByteArrayRegion(array, 0, 1, (jbyte*) &(aVariant.val.u8));
aJValue.l = array;
aMethodSig.AppendLiteral("[B");
@@ -482,6 +539,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('S');
} else {
jshortArray array = mJavaEnv->NewShortArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetShortArrayRegion(array, 0, 1,
(jshort*) &(aVariant.val.u16));
aJValue.l = array;
@@ -498,6 +559,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('I');
} else {
jintArray array = mJavaEnv->NewIntArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetIntArrayRegion(array, 0, 1, (jint*) &(aVariant.val.u32));
aJValue.l = array;
aMethodSig.AppendLiteral("[I");
@@ -513,6 +578,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('J');
} else {
jlongArray array = mJavaEnv->NewLongArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetLongArrayRegion(array, 0, 1, (jlong*) &(aVariant.val.u64));
aJValue.l = array;
aMethodSig.AppendLiteral("[J");
@@ -527,6 +596,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('F');
} else {
jfloatArray array = mJavaEnv->NewFloatArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetFloatArrayRegion(array, 0, 1, (jfloat*) &(aVariant.val.f));
aJValue.l = array;
aMethodSig.AppendLiteral("[F");
@@ -541,6 +614,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('D');
} else {
jdoubleArray array = mJavaEnv->NewDoubleArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetDoubleArrayRegion(array, 0, 1,
(jdouble*) &(aVariant.val.d));
aJValue.l = array;
@@ -556,6 +633,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('Z');
} else {
jbooleanArray array = mJavaEnv->NewBooleanArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetBooleanArrayRegion(array, 0, 1,
(jboolean*) &(aVariant.val.b));
aJValue.l = array;
@@ -572,6 +653,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('C');
} else {
jcharArray array = mJavaEnv->NewCharArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetCharArrayRegion(array, 0, 1, (jchar*) &(aVariant.val.wc));
aJValue.l = array;
aMethodSig.AppendLiteral("[C");
@@ -590,7 +675,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
ptr = *variant;
}
jobject str = nsnull;
jobject str;
if (ptr) {
if (tag == nsXPTType::T_CHAR_STR) {
str = mJavaEnv->NewStringUTF((const char*) ptr);
@@ -598,16 +683,23 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
const PRUnichar* buf = (const PRUnichar*) ptr;
str = mJavaEnv->NewString(buf, nsCRT::strlen(buf));
}
}
if (str == nsnull) {
} else {
str = mJavaEnv->NewStringUTF((const char*)"");
}
if (!str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
if (!aParamInfo.IsOut()) {
aJValue.l = str;
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, str);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aMethodSig.AppendLiteral("[Ljava/lang/String;");
}
}
@@ -620,6 +712,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
if (iid) {
char* iid_str = iid->ToString();
str = mJavaEnv->NewStringUTF(iid_str);
if (!iid_str || !str) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
PR_Free(iid_str);
}
@@ -628,6 +724,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, str);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aMethodSig.AppendLiteral("[Ljava/lang/String;");
}
}
@@ -648,20 +748,23 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodIndex, aDispatchParams,
PR_FALSE, iid);
if (NS_FAILED(rv))
return rv;
break;
inst = CreateJavaXPCOMInstance((nsISupports*) aVariant.val.p, &iid);
rv = CreateJavaXPCOMInstance((nsISupports*) aVariant.val.p, &iid,
&inst);
if (NS_FAILED(rv))
break;
if (inst) {
// create java stub
char* iface_name;
inst->InterfaceInfo()->GetName(&iface_name);
java_stub = CreateJavaWrapper(mJavaEnv, iface_name);
// create java stub
char* iface_name;
rv = inst->InterfaceInfo()->GetName(&iface_name);
if (NS_FAILED(rv))
break;
java_stub = CreateJavaWrapper(mJavaEnv, iface_name);
if (java_stub) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(mJavaEnv, java_stub, inst);
}
if (java_stub) {
// Associate XPCOM object w/ Java stub
AddJavaXPCOMBinding(mJavaEnv, java_stub, inst);
}
}
}
@@ -671,6 +774,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Lorg/mozilla/xpcom/nsISupports;");
} else {
aJValue.l = mJavaEnv->NewObjectArray(1, nsISupportsClass, java_stub);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aMethodSig.AppendLiteral("[Lorg/mozilla/xpcom/nsISupports;");
}
}
@@ -683,6 +790,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
nsString* str = (nsString*) aVariant.val.p;
if (str) {
jstr = mJavaEnv->NewString(str->get(), str->Length());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
if (!aParamInfo.IsOut()) {
@@ -690,6 +801,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, jstr);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aMethodSig.AppendLiteral("[Ljava/lang/String;");
}
}
@@ -702,6 +817,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
nsCString* str = (nsCString*) aVariant.val.p;
if (str) {
jstr = mJavaEnv->NewStringUTF(str->get());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
}
if (!aParamInfo.IsOut()) {
@@ -709,6 +828,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, jstr);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aMethodSig.AppendLiteral("[Ljava/lang/String;");
}
}
@@ -722,6 +845,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('I');
} else {
jintArray array = mJavaEnv->NewIntArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetIntArrayRegion(array, 0, 1, (jint*) &(aVariant.val.p));
aJValue.l = array;
aMethodSig.AppendLiteral("[I");
@@ -741,7 +868,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
return NS_ERROR_UNEXPECTED;
}
return NS_OK;
return rv;
}
nsresult
@@ -830,7 +957,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
nsXPTCMiniVariant* aDispatchParams,
nsXPTCMiniVariant &aVariant, jvalue &aJValue)
{
nsresult rv;
nsresult rv = NS_OK;
const nsXPTType &type = aParamInfo.GetType();
switch (type.TagPart())
@@ -846,6 +973,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jboolean isCopy = PR_FALSE;
jbyte* array = mJavaEnv->GetByteArrayElements((jbyteArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((PRUint8 *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseByteArrayElements((jbyteArray) aJValue.l, array,
@@ -869,6 +1000,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jshort* array =
mJavaEnv->GetShortArrayElements((jshortArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((PRUint16 *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseShortArrayElements((jshortArray) aJValue.l, array,
@@ -891,6 +1026,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jboolean isCopy = PR_FALSE;
jint* array = mJavaEnv->GetIntArrayElements((jintArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((PRUint32 *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseIntArrayElements((jintArray) aJValue.l, array,
@@ -913,6 +1052,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jboolean isCopy = PR_FALSE;
jlong* array = mJavaEnv->GetLongArrayElements((jlongArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((PRUint64 *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseLongArrayElements((jlongArray) aJValue.l, array,
@@ -935,6 +1078,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jfloat* array =
mJavaEnv->GetFloatArrayElements((jfloatArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((float *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseFloatArrayElements((jfloatArray) aJValue.l, array,
@@ -957,6 +1104,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jdouble* array =
mJavaEnv->GetDoubleArrayElements((jdoubleArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((double *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseDoubleArrayElements((jdoubleArray) aJValue.l,
@@ -979,6 +1130,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jboolean* array =
mJavaEnv->GetBooleanArrayElements((jbooleanArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((PRBool *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseBooleanArrayElements((jbooleanArray) aJValue.l,
@@ -1004,6 +1159,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jboolean isCopy = PR_FALSE;
jchar* array = mJavaEnv->GetCharArrayElements((jcharArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
if (type.TagPart() == nsXPTType::T_CHAR)
*((char *) aVariant.val.p) = array[0];
else
@@ -1026,12 +1185,16 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
str = (jstring) aJValue.l;
} else if (aParamInfo.IsOut()) {
str = (jstring)
mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
}
if (str) {
jboolean isCopy;
const char* char_ptr = mJavaEnv->GetStringUTFChars(str, &isCopy);
if (!char_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((char **) aVariant.val.p) = strdup(char_ptr);
if (isCopy) {
mJavaEnv->ReleaseStringUTFChars(str, char_ptr);
@@ -1057,10 +1220,18 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (str) {
jboolean isCopy;
const jchar* wchar_ptr = mJavaEnv->GetStringChars(str, &isCopy);
if (!wchar_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
PRUint32 length = nsCRT::strlen(wchar_ptr);
PRUnichar* string = (PRUnichar*)
nsMemory::Alloc((length + 1) * sizeof(PRUnichar));
if (!string) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
memcpy(string, wchar_ptr, length * sizeof(PRUnichar));
string[length] = 0;
*((PRUnichar **) aVariant.val.p) = string;
@@ -1089,6 +1260,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (str) {
jboolean isCopy;
const char* char_ptr = mJavaEnv->GetStringUTFChars(str, &isCopy);
if (!char_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
if (aVariant.val.p) {
// If not null, then we just put in the new value.
@@ -1133,7 +1308,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodIndex, aDispatchParams,
PR_FALSE, iid);
if (NS_FAILED(rv))
return rv;
break;
PRBool isWeakRef = iid.Equals(NS_GET_IID(nsIWeakReference));
@@ -1141,11 +1316,17 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
// Get interface info for class
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
nsCOMPtr<nsIInterfaceInfo> iinfo;
iim->GetInfoForIID(&iid, getter_AddRefs(iinfo));
rv = iim->GetInfoForIID(&iid, getter_AddRefs(iinfo));
if (NS_FAILED(rv))
break;
// Create XPCOM stub
nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(mJavaEnv, java_obj,
iinfo);
nsJavaXPTCStub* xpcomStub;
xpcomStub = new nsJavaXPTCStub(mJavaEnv, java_obj, iinfo);
if (!xpcomStub) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
inst = SetAsXPTCStub(xpcomStub);
AddJavaXPCOMBinding(mJavaEnv, java_obj, inst);
}
@@ -1153,8 +1334,12 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (isWeakRef) {
// If the function expects an weak reference, then we need to
// create it here.
nsJavaXPTCStubWeakRef* weakref =
new nsJavaXPTCStubWeakRef(mJavaEnv, java_obj);
nsJavaXPTCStubWeakRef* weakref;
weakref = new nsJavaXPTCStubWeakRef(mJavaEnv, java_obj);
if (!weakref) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
NS_ADDREF(weakref);
*((void **) aVariant.val.p) = (void*) weakref;
} else if (IsXPTCStub(inst)) {
@@ -1187,11 +1372,19 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (str) {
jboolean isCopy;
const jchar* wchar_ptr = mJavaEnv->GetStringChars(str, &isCopy);
if (!wchar_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
if (aVariant.val.p) {
((nsString*) aVariant.val.p)->Assign(wchar_ptr);
} else {
nsString* embedStr = new nsString(wchar_ptr);
if (!embedStr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aVariant.val.p = embedStr;
}
@@ -1218,11 +1411,19 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (str) {
jboolean isCopy;
const char* char_ptr = mJavaEnv->GetStringUTFChars(str, &isCopy);
if (!char_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
if (aVariant.val.p) {
((nsCString*) aVariant.val.p)->Assign(char_ptr);
} else {
nsCString* embedStr = new nsCString(char_ptr);
if (!embedStr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
aVariant.val.p = embedStr;
}
@@ -1244,6 +1445,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
jboolean isCopy = PR_FALSE;
jint* array = mJavaEnv->GetIntArrayElements((jintArray) aJValue.l,
&isCopy);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
*((PRUint32 *) aVariant.val.p) = array[0];
if (isCopy) {
mJavaEnv->ReleaseIntArrayElements((jintArray) aJValue.l, array,
@@ -1260,7 +1465,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
return NS_ERROR_UNEXPECTED;
}
return NS_OK;
return rv;
}
NS_IMETHODIMP
@@ -1274,8 +1479,11 @@ nsJavaXPTCStub::GetWeakReference(nsIWeakReference** aInstancePtr)
if (!aInstancePtr)
return NS_ERROR_NULL_POINTER;
nsJavaXPTCStubWeakRef* weakref =
new nsJavaXPTCStubWeakRef(mJavaEnv, mJavaObject);
nsJavaXPTCStubWeakRef* weakref;
weakref = new nsJavaXPTCStubWeakRef(mJavaEnv, mJavaObject);
if (!weakref)
return NS_ERROR_OUT_OF_MEMORY;
*aInstancePtr = weakref;
NS_ADDREF(*aInstancePtr);

View File

@@ -78,10 +78,14 @@ nsJavaXPTCStubWeakRef::QueryReferent(const nsIID& aIID, void** aInstancePtr)
// Get interface info for class
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
nsCOMPtr<nsIInterfaceInfo> iinfo;
iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo));
nsresult rv = iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo));
if (NS_FAILED(rv))
return rv;
// Create XPCOM stub
nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(mJavaEnv, javaObject, iinfo);
if (!xpcomStub)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(xpcomStub);
AddJavaXPCOMBinding(mJavaEnv, javaObject, SetAsXPTCStub(xpcomStub));