blob: 53ed58f3b7d101903769976e13085aa208549440 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.browser;
import org.eclipse.swt.*;
import org.eclipse.swt.internal.*;
import org.eclipse.swt.internal.mozilla.*;
class External {
public static final String EXTERNAL_IID_STR =
"ded01d20-ba6f-11dd-ad8b-0800200c9a66"; //$NON-NLS-1$
public static final nsID EXTERNAL_IID =
new nsID(EXTERNAL_IID_STR);
XPCOMObject supports;
XPCOMObject external;
XPCOMObject classInfo;
XPCOMObject securityCheckedComponent;
int refCount = 0;
External () {
createCOMInterfaces ();
}
int AddRef () {
refCount++;
return refCount;
}
void createCOMInterfaces () {
/* Create each of the interfaces that this object implements */
supports = new XPCOMObject (new int[] {2, 0, 0}) {
public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
};
classInfo = new XPCOMObject (new int[] {2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1}) {
public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
public int /*long*/ method3 (int /*long*/[] args) {return getInterfaces (args[0], args[1]);}
public int /*long*/ method4 (int /*long*/[] args) {return getHelperForLanguage ((int)/*64*/args[0], args[1]);}
public int /*long*/ method5 (int /*long*/[] args) {return getContractID (args[0]);}
public int /*long*/ method6 (int /*long*/[] args) {return getClassDescription (args[0]);}
public int /*long*/ method7 (int /*long*/[] args) {return getClassID (args[0]);}
public int /*long*/ method8 (int /*long*/[] args) {return getImplementationLanguage (args[0]);}
public int /*long*/ method9 (int /*long*/[] args) {return getFlags (args[0]);}
public int /*long*/ method10 (int /*long*/[] args) {return getClassIDNoAlloc (args[0]);}
};
securityCheckedComponent = new XPCOMObject (new int[] {2, 0, 0, 2, 3, 3, 3}) {
public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
public int /*long*/ method3 (int /*long*/[] args) {return canCreateWrapper (args[0], args[1]);}
public int /*long*/ method4 (int /*long*/[] args) {return canCallMethod (args[0], args[1], args[2]);}
public int /*long*/ method5 (int /*long*/[] args) {return canGetProperty (args[0], args[1], args[2]);}
public int /*long*/ method6 (int /*long*/[] args) {return canSetProperty (args[0], args[1], args[2]);}
};
external = new XPCOMObject (new int[] {2, 0, 0, 3}) {
public int /*long*/ method0 (int /*long*/[] args) {return QueryInterface (args[0], args[1]);}
public int /*long*/ method1 (int /*long*/[] args) {return AddRef ();}
public int /*long*/ method2 (int /*long*/[] args) {return Release ();}
public int /*long*/ method3 (int /*long*/[] args) {return callJava ((int)/*64*/args[0], args[1], args[2]);}
};
}
void disposeCOMInterfaces () {
if (supports != null) {
supports.dispose ();
supports = null;
}
if (external != null) {
external.dispose ();
external = null;
}
}
int /*long*/ getAddress () {
return external.getAddress ();
}
int QueryInterface (int /*long*/ riid, int /*long*/ ppvObject) {
if (riid == 0 || ppvObject == 0) return XPCOM.NS_ERROR_NO_INTERFACE;
nsID guid = new nsID ();
XPCOM.memmove (guid, riid, nsID.sizeof);
if (guid.Equals (nsISupports.NS_ISUPPORTS_IID)) {
XPCOM.memmove (ppvObject, new int /*long*/[] {supports.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
if (guid.Equals (nsIClassInfo.NS_ICLASSINFO_IID)) {
XPCOM.memmove (ppvObject, new int /*long*/[] {classInfo.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
if (guid.Equals (nsISecurityCheckedComponent.NS_ISECURITYCHECKEDCOMPONENT_IID)) {
XPCOM.memmove (ppvObject, new int /*long*/[] {securityCheckedComponent.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
if (guid.Equals (EXTERNAL_IID)) {
XPCOM.memmove (ppvObject, new int /*long*/[] {external.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
XPCOM.memmove (ppvObject, new int /*long*/[] {0}, C.PTR_SIZEOF);
return XPCOM.NS_ERROR_NO_INTERFACE;
}
int Release () {
refCount--;
if (refCount == 0) disposeCOMInterfaces ();
return refCount;
}
/* nsIClassInfo */
int getClassDescription (int /*long*/ _retValue) {
int /*long*/[] result = new int /*long*/[1];
int rc = XPCOM.NS_GetServiceManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
result[0] = 0;
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
serviceManager.Release ();
nsIMemory memory = new nsIMemory (result[0]);
result[0] = 0;
byte[] bytes = MozillaDelegate.wcsToMbcs (null, "external", true); //$NON-NLS-1$
int /*long*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retValue, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int getClassID (int /*long*/ _retValue) {
return XPCOM.NS_OK;
}
int getClassIDNoAlloc (int /*long*/ _retValue) {
return XPCOM.NS_OK;
}
int getContractID (int /*long*/ _retValue) {
return XPCOM.NS_OK;
}
int getFlags (int /*long*/ flags) {
C.memmove (flags, new int[] {nsIClassInfo.MAIN_THREAD_ONLY}, 4); /* PRUint32 */
return XPCOM.NS_OK;
}
int getHelperForLanguage (int language, int /*long*/ _retValue) {
C.memmove (_retValue, new int /*long*/[] {0}, C.PTR_SIZEOF);
return XPCOM.NS_OK;
}
int getImplementationLanguage (int /*long*/ _retValue) {
C.memmove (_retValue, new int[] {5}, 4); /* nsIProgrammingLanguage.JAVA */ /* PRUint */
return XPCOM.NS_OK;
}
int getInterfaces (int /*long*/ count, int /*long*/ array) {
int /*long*/[] result = new int /*long*/[1];
int rc = XPCOM.NS_GetServiceManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
result[0] = 0;
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
serviceManager.Release ();
nsIMemory memory = new nsIMemory (result[0]);
result[0] = 0;
int /*long*/ securityCheckedComponentIID = memory.Alloc (nsID.sizeof);
XPCOM.memmove (securityCheckedComponentIID, nsISecurityCheckedComponent.NS_ISECURITYCHECKEDCOMPONENT_IID, nsID.sizeof);
int /*long*/ externalIID = memory.Alloc (nsID.sizeof);
XPCOM.memmove (externalIID, EXTERNAL_IID, nsID.sizeof);
int /*long*/ ptrArray = memory.Alloc (2 * C.PTR_SIZEOF);
C.memmove (ptrArray, new int /*long*/[] {securityCheckedComponentIID}, C.PTR_SIZEOF);
C.memmove (ptrArray + C.PTR_SIZEOF, new int /*long*/[] {externalIID}, C.PTR_SIZEOF);
C.memmove (array, new int /*long*/[] {ptrArray}, C.PTR_SIZEOF);
memory.Release ();
C.memmove (count, new int[] {2}, 4); /* PRUint */
return XPCOM.NS_OK;
}
/* nsISecurityCheckedComponent */
int canCreateWrapper (int /*long*/ iid, int /*long*/ _retVal) {
int /*long*/[] result = new int /*long*/[1];
int rc = XPCOM.NS_GetServiceManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
result[0] = 0;
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
serviceManager.Release ();
nsIMemory memory = new nsIMemory (result[0]);
result[0] = 0;
byte[] bytes = MozillaDelegate.wcsToMbcs (null, "allAccess", true); //$NON-NLS-1$
int /*long*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int canCallMethod (int /*long*/ iid, int /*long*/ methodName, int /*long*/ _retVal) {
int /*long*/[] result = new int /*long*/[1];
int rc = XPCOM.NS_GetServiceManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
result[0] = 0;
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
serviceManager.Release ();
nsIMemory memory = new nsIMemory (result[0]);
result[0] = 0;
int length = XPCOM.strlen_PRUnichar (methodName);
char[] dest = new char[length];
XPCOM.memmove (dest, methodName, length * 2);
String string = new String (dest);
byte[] bytes;
if (string.equals("callJava")) { //$NON-NLS-1$
bytes = MozillaDelegate.wcsToMbcs (null, "allAccess", true); //$NON-NLS-1$
} else {
bytes = MozillaDelegate.wcsToMbcs (null, "noAccess", true); //$NON-NLS-1$
}
int /*long*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int canGetProperty (int /*long*/ iid, int /*long*/ propertyName, int /*long*/ _retVal) {
int /*long*/[] result = new int /*long*/[1];
int rc = XPCOM.NS_GetServiceManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
result[0] = 0;
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
serviceManager.Release ();
nsIMemory memory = new nsIMemory (result[0]);
result[0] = 0;
byte[] bytes = MozillaDelegate.wcsToMbcs (null, "noAccess", true); //$NON-NLS-1$
int /*long*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int canSetProperty (int /*long*/ iid, int /*long*/ propertyName, int /*long*/ _retVal) {
int /*long*/[] result = new int /*long*/[1];
int rc = XPCOM.NS_GetServiceManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
result[0] = 0;
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
serviceManager.Release ();
nsIMemory memory = new nsIMemory (result[0]);
result[0] = 0;
byte[] bytes = MozillaDelegate.wcsToMbcs (null, "noAccess", true); //$NON-NLS-1$
int /*long*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new int /*long*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
/* external */
Object convertToJava (nsIVariant variant, short type) {
switch (type) {
case nsIDataType.VTYPE_EMPTY:
case nsIDataType.VTYPE_VOID:
return null;
case nsIDataType.VTYPE_EMPTY_ARRAY:
return new Object[0];
case nsIDataType.VTYPE_BOOL:
int[] boolResult = new int[1]; /*PRInt32*/
int rc = variant.GetAsBool (boolResult);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
return new Boolean (boolResult[0] != 0);
case nsIDataType.VTYPE_INT32:
int[] intResult = new int[1]; /*PRInt32*/
rc = variant.GetAsInt32 (intResult);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
return new Double (intResult[0]);
case nsIDataType.VTYPE_DOUBLE:
int /*long*/ doubleReturn = C.malloc (8);
rc = variant.GetAsDouble (doubleReturn);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
double[] doubleResult = new double[1];
C.memmove (doubleResult, doubleReturn, 8);
C.free (doubleReturn);
return new Double (doubleResult[0]);
case nsIDataType.VTYPE_WSTRING_SIZE_IS:
int[] size = new int[1]; /* PRInt32 */
int /*long*/[] wString = new int /*long*/[1];
rc = variant.GetAsWStringWithSize (size, wString);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
char[] chars = new char[size[0]];
C.memmove (chars, wString[0], size[0] * 2);
return new String (chars);
case nsIDataType.VTYPE_ARRAY:
Object[] arrayReturn = new Object[0];
int /*long*/ iid = C.malloc (nsID.sizeof);
C.memset (iid, 0, nsID.sizeof);
int[] count = new int[1]; /* PRUint32 */
short[] currentType = new short[1];
int /*long*/[] ptr = new int /*long*/[1];
rc = variant.GetAsArray (currentType, iid, count, ptr);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (ptr[0] == 0) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER);
nsID id = new nsID ();
XPCOM.memmove (id, iid, nsID.sizeof);
C.free (iid);
int /*long*/[] result = new int /*long*/[1];
rc = XPCOM.NS_GetServiceManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
result[0] = 0;
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_MEMORY_CONTRACTID, true);
rc = serviceManager.GetServiceByContractID (aContractID, nsIMemory.NS_IMEMORY_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
serviceManager.Release ();
nsIMemory memory = new nsIMemory (result[0]);
result[0] = 0;
if (id.Equals (nsIVariant.NS_IVARIANT_IID)) {
arrayReturn = new Object[count[0]];
for (int i = 0; i < count[0]; i++) {
int /*long*/[] arrayPtr = new int /*long*/[1];
C.memmove (arrayPtr, ptr[0] + i * C.PTR_SIZEOF, C.PTR_SIZEOF);
nsISupports supports = new nsISupports (arrayPtr[0]);
rc = supports.QueryInterface (nsIVariant.NS_IVARIANT_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIVariant currentVariant = new nsIVariant (result[0]);
result[0] = 0;
currentType[0] = 0;
rc = currentVariant.GetDataType (currentType);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
try {
arrayReturn[i] = convertToJava (currentVariant, currentType[0]);
currentVariant.Release ();
} catch (IllegalArgumentException e) {
/* invalid argument value type */
currentVariant.Release ();
memory.Free (ptr[0]);
memory.Release ();
throw e;
}
}
} else {
switch (currentType[0]) {
case nsIDataType.VTYPE_DOUBLE:
arrayReturn = new Object[count[0]];
for (int i = 0; i < count[0]; i++) {
double[] doubleValue = new double[1];
C.memmove (doubleValue, ptr[0] + i * 8, 8);
arrayReturn[i] = new Double (doubleValue[0]);
}
break;
case nsIDataType.VTYPE_BOOL:
arrayReturn = new Object[count[0]];
for (int i = 0; i < count[0]; i++) {
int[] boolValue = new int[1]; /* PRUInt32 */
C.memmove (boolValue, ptr[0] + i * 4, 4);
arrayReturn[i] = new Boolean (boolValue[0] != 0);
}
break;
case nsIDataType.VTYPE_INT32:
arrayReturn = new Object[count[0]];
for (int i = 0; i < count[0]; i++) {
int[] intValue = new int[1]; /* PRInt32 */
C.memmove (intValue, ptr[0] + i * 4, 4);
arrayReturn[i] = new Double (intValue[0]);
}
break;
case nsIDataType.VTYPE_WCHAR_STR:
arrayReturn = new Object[count[0]];
for (int i = 0; i < count[0]; i++) {
int /*long*/ currentPtr = ptr[0] + i * C.PTR_SIZEOF;
int /*long*/[] stringPtr = new int /*long*/[1];
C.memmove (stringPtr, currentPtr, C.PTR_SIZEOF);
int length = XPCOM.strlen_PRUnichar (stringPtr[0]);
char[] dest = new char[length];
XPCOM.memmove (dest, stringPtr[0], length * 2);
arrayReturn[i] = new String (dest);
}
break;
default:
memory.Free (ptr[0]);
memory.Release ();
SWT.error (SWT.ERROR_INVALID_ARGUMENT);
}
}
memory.Free (ptr[0]);
memory.Release ();
return arrayReturn;
}
SWT.error (SWT.ERROR_INVALID_ARGUMENT);
return null;
}
nsIVariant convertToJS (Object value, nsIComponentManager componentManager) {
int /*long*/[] result = new int /*long*/[1];
byte[] aContractID = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_VARIANT_CONTRACTID, true);
int rc = componentManager.CreateInstanceByContractID (aContractID, 0, nsIWritableVariant.NS_IWRITABLEVARIANT_IID, result);
nsIWritableVariant variant = new nsIWritableVariant (result[0]);
result[0] = 0;
if (value == null) {
rc = variant.SetAsVoid ();
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
return variant;
}
if (value instanceof String) {
String stringValue = (String)value;
int length = stringValue.length ();
char[] chars = new char[length];
stringValue.getChars (0, length, chars, 0);
rc = variant.SetAsWStringWithSize (length, chars);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
return variant;
}
if (value instanceof Boolean) {
Boolean booleanValue = (Boolean)value;
rc = variant.SetAsBool (booleanValue.booleanValue () ? 1 : 0);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
return variant;
}
if (value instanceof Number) {
Number numberValue = (Number)value;
rc = variant.SetAsDouble (numberValue.doubleValue ());
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
return variant;
}
if (value instanceof Object[]) {
Object[] arrayValue = (Object[])value;
int length = arrayValue.length;
if (length > 0) {
int /*long*/ arrayPtr = C.malloc (C.PTR_SIZEOF * length);
for (int i = 0; i < length; i++) {
Object currentObject = arrayValue[i];
try {
nsIVariant currentVariant = convertToJS (currentObject, componentManager);
C.memmove (arrayPtr + C.PTR_SIZEOF * i, new int /*long*/[] {currentVariant.getAddress ()}, C.PTR_SIZEOF);
} catch (SWTException e) {
/* invalid return value type */
C.free (arrayPtr);
variant.Release ();
/* release the variants that had previously been added to the array */
for (int j = 0; j < i; j++) {
int /*long*/[] ptr = new int /*long*/[1];
C.memmove (ptr, arrayPtr + C.PTR_SIZEOF * j, C.PTR_SIZEOF);
new nsISupports (ptr[0]).Release ();
}
throw e;
}
}
int /*long*/ idPtr = C.malloc (nsID.sizeof);
XPCOM.memmove (idPtr, nsIVariant.NS_IVARIANT_IID, nsID.sizeof);
rc = variant.SetAsArray (nsIDataType.VTYPE_INTERFACE_IS, idPtr, length, arrayPtr);
C.free (idPtr);
C.free (arrayPtr);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
return variant;
}
}
variant.Release ();
SWT.error (SWT.ERROR_INVALID_RETURN_VALUE);
return null;
}
int callJava (int functionId, int /*long*/ args, int /*long*/ returnPtr) {
Object key = new Integer (functionId);
BrowserFunction function = (BrowserFunction)Mozilla.AllFunctions.get (key);
Object returnValue = null;
if (function != null) {
short[] type = new short[1]; /* PRUint16 */
nsIVariant variant = new nsIVariant (args);
int rc = variant.GetDataType (type);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
try {
Object temp = (Object[])convertToJava (variant, type[0]);
if (temp instanceof Object[]) {
Object[] arguments = (Object[])temp;
try {
returnValue = function.function (arguments);
} catch (Exception e) {
/* exception during function invocation */
returnValue = WebBrowser.CreateErrorString (e.getLocalizedMessage ());
}
}
} catch (IllegalArgumentException e) {
/* invalid argument value type */
if (function.isEvaluate) {
/* notify the evaluate function so that a java exception can be thrown */
function.function (new String[] {WebBrowser.CreateErrorString (new SWTException (SWT.ERROR_INVALID_RETURN_VALUE).getLocalizedMessage ())});
}
returnValue = WebBrowser.CreateErrorString (e.getLocalizedMessage ());
}
}
int /*long*/[] result = new int /*long*/[1];
int rc = XPCOM.NS_GetComponentManager (result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIComponentManager componentManager = new nsIComponentManager (result[0]);
result[0] = 0;
nsIVariant variant;
try {
variant = convertToJS (returnValue, componentManager);
} catch (SWTException e) {
/* invalid return value type */
variant = convertToJS (WebBrowser.CreateErrorString (e.getLocalizedMessage ()), componentManager);
}
componentManager.Release ();
C.memmove (returnPtr, new int /*long*/[] {variant.getAddress ()}, C.PTR_SIZEOF);
return XPCOM.NS_OK;
}
}