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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, ¶mInfo, &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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user