blob: 719e7100c191453f46728655a2c40a4857fd276c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2013 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;
XPCOMObject scriptObjectOwner;
int refCount = 0;
static Callback CallJavaProc;
static {
CallJavaProc = new Callback (External.class, "callJava", 3); //$NON-NLS-1$
if (CallJavaProc.getAddress () == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
}
External () {
createCOMInterfaces ();
}
/* external */
/*
* This is the BrowserFunction entry point for XULRunner releases >= 4 because
* QueryInterface answers an nsIScriptObjectOwner implementation (which points
* at this function) iff the detected XULRunner version is >= 4.
*/
static long /*int*/ callJava (long /*int*/ cx, long /*int*/ argc, long /*int*/ vp) {
int jsval_sizeof = 8;
long /*int*/ argsPtr = vp + 2 * jsval_sizeof;
nsIVariant resultVariant = null;
long /*int*/[] result = new long /*int*/[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;
rc = serviceManager.GetService (XPCOM.NS_IXPCONNECT_CID, nsIXPConnect.NS_IXPCONNECT_IID, result);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
if (result[0] == 0) Mozilla.error (XPCOM.NS_NOINTERFACE);
nsIXPConnect connect = new nsIXPConnect (result[0]);
result[0] = 0;
/* extract the first argument value (the function id) */
rc = connect.JSValToVariant (cx, argsPtr, result);
if (rc == XPCOM.NS_OK && result[0] != 0) {
nsIVariant idVariant = new nsIVariant (result[0]);
result[0] = 0;
short[] dataType = new short[1];
rc = idVariant.GetDataType (dataType);
if (rc == XPCOM.NS_OK && dataType[0] == nsIDataType.VTYPE_INT32) {
int[] intResult = new int[1];
rc = idVariant.GetAsInt32 (intResult); /* PRInt32 */
if (rc == XPCOM.NS_OK) {
int functionId = (int)intResult[0];
/* get the second argument variant (the token string) */
argsPtr += jsval_sizeof;
rc = connect.JSValToVariant (cx, argsPtr, result);
if (rc == XPCOM.NS_OK && result[0] != 0) {
long /*int*/ tokenVariant = result[0];
result[0] = 0;
/* get the third argument variant (the invocation args) */
argsPtr += jsval_sizeof;
rc = connect.JSValToVariant (cx, argsPtr, result);
if (rc == XPCOM.NS_OK && result[0] != 0) {
long /*int*/ argsVariant = result[0];
result[0] = 0;
/* invoke the BrowserFunction */
resultVariant = new nsIVariant (invokeFunction (functionId, tokenVariant, argsVariant));
new nsISupports (argsVariant).Release ();
}
new nsISupports (tokenVariant).Release ();
}
}
}
idVariant.Release ();
}
result[0] = 0;
/* if the BrowserFunction could not be invoked for some reason then return null to JS */
if (resultVariant == null) {
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;
resultVariant = convertToJS (null, componentManager);
componentManager.Release ();
}
/* convert the resulting variant to a jsval */
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;
long /*int*/ jsVal = memory.Alloc (jsval_sizeof);
C.memset (jsVal, 0, jsval_sizeof);
long /*int*/ globalObject = XPCOM.JS_GetGlobalObject (Mozilla.getJSLibPathBytes (), cx);
rc = connect.VariantToJS (cx, globalObject, resultVariant.getAddress (), jsVal);
resultVariant.Release ();
connect.Release ();
long /*int*/ returnValue = XPCOM.JS_FALSE;
if (rc == XPCOM.NS_OK) {
/* write the jsval to the return value slot */
C.memmove (vp, jsVal, jsval_sizeof);
returnValue = XPCOM.JS_TRUE;
}
memory.Free (jsVal);
memory.Release ();
return returnValue;
}
/* this is the BrowserFunction entry point when the detected XULRunner version is < 4 */
static int callJava (int functionId, long /*int*/ tokenVariant, long /*int*/ argsVariant, long /*int*/ returnPtr) {
long /*int*/ resultVariant = invokeFunction (functionId, tokenVariant, argsVariant);
C.memmove (returnPtr, new long /*int*/[] {resultVariant}, C.PTR_SIZEOF);
return XPCOM.NS_OK;
}
static 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:
long /*int*/ 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 */
long /*int*/[] wString = new long /*int*/[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];
long /*int*/ iid = C.malloc (nsID.sizeof);
C.memset (iid, 0, nsID.sizeof);
int[] count = new int[1]; /* PRUint32 */
short[] currentType = new short[1];
long /*int*/[] ptr = new long /*int*/[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);
long /*int*/[] result = new long /*int*/[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) || id.Equals (nsIVariant.NS_IVARIANT_10_IID)) {
arrayReturn = new Object[count[0]];
for (int i = 0; i < count[0]; i++) {
long /*int*/[] arrayPtr = new long /*int*/[1];
C.memmove (arrayPtr, ptr[0] + i * C.PTR_SIZEOF, C.PTR_SIZEOF);
nsISupports supports = new nsISupports (arrayPtr[0]);
rc = supports.QueryInterface (id, 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++) {
/* mozilla's representation of boolean changed from 4 bytes to 1 byte as of XULRunner 4.x */
if (nsISupports.IsXULRunner10 || nsISupports.IsXULRunner17) {
byte[] byteValue = new byte[1];
C.memmove (byteValue, ptr[0] + i, 1);
arrayReturn[i] = new Boolean (byteValue[0] != 0);
} else {
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++) {
long /*int*/ currentPtr = ptr[0] + i * C.PTR_SIZEOF;
long /*int*/[] stringPtr = new long /*int*/[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;
}
static nsIVariant convertToJS (Object value, nsIComponentManager componentManager) {
long /*int*/[] result = new long /*int*/[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.SetAsEmpty ();
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) {
rc = variant.SetAsEmptyArray ();
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
} else {
long /*int*/ 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 long /*int*/[] {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++) {
long /*int*/[] ptr = new long /*int*/[1];
C.memmove (ptr, arrayPtr + C.PTR_SIZEOF * j, C.PTR_SIZEOF);
new nsISupports (ptr[0]).Release ();
}
throw e;
}
}
long /*int*/ idPtr = C.malloc (nsID.sizeof);
XPCOM.memmove (idPtr, Mozilla.IsPre_4 ? nsIVariant.NS_IVARIANT_IID : nsIVariant.NS_IVARIANT_10_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;
}
static long /*int*/ invokeFunction (int functionId, long /*int*/ tokenVariant, long /*int*/ args) {
Object key = new Integer (functionId);
BrowserFunction function = (BrowserFunction)Mozilla.AllFunctions.get (key);
Object returnValue = null;
if (function != null) {
try {
short[] type = new short[1]; /* PRUint16 */
nsIVariant variant = new nsIVariant (tokenVariant);
int rc = variant.GetDataType (type);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
Object temp = convertToJava (variant, type[0]);
type[0] = 0;
if (temp instanceof String) {
String token = (String)temp;
if (token.equals (function.token)) {
variant = new nsIVariant (args);
rc = variant.GetDataType (type);
if (rc != XPCOM.NS_OK) Mozilla.error (rc);
temp = 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 ());
}
}
long /*int*/[] result = new long /*int*/[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 ();
return variant.getAddress ();
}
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 long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);}
public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();}
public long /*int*/ method2 (long /*int*/[] args) {return Release ();}
};
classInfo = new XPCOMObject (new int[] {2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1}) {
public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);}
public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();}
public long /*int*/ method2 (long /*int*/[] args) {return Release ();}
public long /*int*/ method3 (long /*int*/[] args) {return getInterfaces (args[0], args[1]);}
public long /*int*/ method4 (long /*int*/[] args) {return getHelperForLanguage ((int)/*64*/args[0], args[1]);}
public long /*int*/ method5 (long /*int*/[] args) {return getContractID (args[0]);}
public long /*int*/ method6 (long /*int*/[] args) {return getClassDescription (args[0]);}
public long /*int*/ method7 (long /*int*/[] args) {return getClassID (args[0]);}
public long /*int*/ method8 (long /*int*/[] args) {return getImplementationLanguage (args[0]);}
public long /*int*/ method9 (long /*int*/[] args) {return getFlags (args[0]);}
public long /*int*/ method10 (long /*int*/[] args) {return getClassIDNoAlloc (args[0]);}
};
securityCheckedComponent = new XPCOMObject (new int[] {2, 0, 0, 2, 3, 3, 3}) {
public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);}
public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();}
public long /*int*/ method2 (long /*int*/[] args) {return Release ();}
public long /*int*/ method3 (long /*int*/[] args) {return canCreateWrapper (args[0], args[1]);}
public long /*int*/ method4 (long /*int*/[] args) {return canCallMethod (args[0], args[1], args[2]);}
public long /*int*/ method5 (long /*int*/[] args) {return canGetProperty (args[0], args[1], args[2]);}
public long /*int*/ method6 (long /*int*/[] args) {return canSetProperty (args[0], args[1], args[2]);}
};
external = new XPCOMObject (new int[] {2, 0, 0, 4}) {
public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);}
public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();}
public long /*int*/ method2 (long /*int*/[] args) {return Release ();}
public long /*int*/ method3 (long /*int*/[] args) {return callJava ((int)/*64*/args[0], args[1], args[2], args[3]);}
};
scriptObjectOwner = new XPCOMObject (new int[] {2, 0, 0, 2, 1}) {
public long /*int*/ method0 (long /*int*/[] args) {return QueryInterface (args[0], args[1]);}
public long /*int*/ method1 (long /*int*/[] args) {return AddRef ();}
public long /*int*/ method2 (long /*int*/[] args) {return Release ();}
public long /*int*/ method3 (long /*int*/[] args) {return getScriptObject (args[0], args[1]);}
public long /*int*/ method4 (long /*int*/[] args) {return setScriptObject (args[0]);}
};
}
void disposeCOMInterfaces () {
if (supports != null) {
supports.dispose ();
supports = null;
}
if (classInfo != null) {
classInfo.dispose ();
classInfo = null;
}
if (securityCheckedComponent != null) {
securityCheckedComponent.dispose ();
securityCheckedComponent = null;
}
if (external != null) {
external.dispose ();
external = null;
}
if (scriptObjectOwner != null) {
scriptObjectOwner.dispose ();
scriptObjectOwner = null;
}
}
long /*int*/ getAddress () {
return external.getAddress ();
}
int QueryInterface (long /*int*/ riid, long /*int*/ 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 long /*int*/[] {supports.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
if (guid.Equals (nsIClassInfo.NS_ICLASSINFO_IID)) {
XPCOM.memmove (ppvObject, new long /*int*/[] {classInfo.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
if (guid.Equals (XPCOM.NS_ISECURITYCHECKEDCOMPONENT_IID)) {
XPCOM.memmove (ppvObject, new long /*int*/[] {securityCheckedComponent.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
if (guid.Equals (EXTERNAL_IID)) {
XPCOM.memmove (ppvObject, new long /*int*/[] {external.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
if (!Mozilla.IsPre_4) {
if (guid.Equals(XPCOM.NS_ISCRIPTOBJECTOWNER_IID)) {
XPCOM.memmove (ppvObject, new long /*int*/[] {scriptObjectOwner.getAddress ()}, C.PTR_SIZEOF);
AddRef();
return XPCOM.NS_OK;
}
}
XPCOM.memmove (ppvObject, new long /*int*/[] {0}, C.PTR_SIZEOF);
return XPCOM.NS_ERROR_NO_INTERFACE;
}
int Release () {
refCount--;
if (refCount == 0) disposeCOMInterfaces ();
return refCount;
}
/* nsIClassInfo */
int getClassDescription (long /*int*/ _retValue) {
long /*int*/[] result = new long /*int*/[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$
long /*int*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retValue, new long /*int*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int getClassID (long /*int*/ _retValue) {
return XPCOM.NS_OK;
}
int getClassIDNoAlloc (long /*int*/ _retValue) {
return XPCOM.NS_OK;
}
int getContractID (long /*int*/ _retValue) {
return XPCOM.NS_OK;
}
int getFlags (long /*int*/ flags) {
C.memmove (flags, new int[] {nsIClassInfo.MAIN_THREAD_ONLY}, 4); /* PRUint32 */
return XPCOM.NS_OK;
}
int getHelperForLanguage (int language, long /*int*/ _retValue) {
C.memmove (_retValue, new long /*int*/[] {0}, C.PTR_SIZEOF);
return XPCOM.NS_OK;
}
int getImplementationLanguage (long /*int*/ _retValue) {
C.memmove (_retValue, new int[] {5}, 4); /* nsIProgrammingLanguage.JAVA */ /* PRUint */
return XPCOM.NS_OK;
}
int getInterfaces (long /*int*/ count, long /*int*/ array) {
long /*int*/[] result = new long /*int*/[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;
long /*int*/ securityCheckedComponentIID = memory.Alloc (nsID.sizeof);
XPCOM.memmove (securityCheckedComponentIID, XPCOM.NS_ISECURITYCHECKEDCOMPONENT_IID, nsID.sizeof);
long /*int*/ externalIID = memory.Alloc (nsID.sizeof);
XPCOM.memmove (externalIID, EXTERNAL_IID, nsID.sizeof);
long /*int*/ ptrArray = memory.Alloc (3 * C.PTR_SIZEOF);
C.memmove (ptrArray, new long /*int*/[] {securityCheckedComponentIID}, C.PTR_SIZEOF);
C.memmove (ptrArray + C.PTR_SIZEOF, new long /*int*/[] {externalIID}, C.PTR_SIZEOF);
nsID NS_ASDF_IID = new nsID("a40ce52e-2d8c-400f-9af2-f8784a656070");
long /*int*/ asdfIID = memory.Alloc (nsID.sizeof);
XPCOM.memmove (asdfIID, NS_ASDF_IID, nsID.sizeof);
C.memmove (ptrArray + 2 * C.PTR_SIZEOF, new long /*int*/[] {asdfIID}, C.PTR_SIZEOF);
C.memmove (array, new long /*int*/[] {ptrArray}, C.PTR_SIZEOF);
memory.Release ();
C.memmove (count, new int[] {3}, 4); /* PRUint */
return XPCOM.NS_OK;
}
/* nsIScriptObjectOwner */
int getScriptObject (long /*int*/ aContext, long /*int*/ aScriptObject) {
byte[] jsLibPath = Mozilla.getJSLibPathBytes ();
long /*int*/ nativeContext = XPCOM.nsIScriptContext_GetNativeContext (aContext);
long /*int*/ globalJSObject = XPCOM.JS_GetGlobalObject (jsLibPath, nativeContext);
long /*int*/ newObject = XPCOM.JS_NewObject (jsLibPath, nativeContext, 0, 0, globalJSObject);
byte[] functionName = MozillaDelegate.wcsToMbcs (null, "callJava", true); //$NON-NLS-1$
int flags = XPCOM.JSPROP_ENUMERATE | XPCOM.JSPROP_READONLY | XPCOM.JSPROP_PERMANENT;
XPCOM.JS_DefineFunction (jsLibPath, nativeContext, newObject, functionName, XPCOM.CALLBACK_JSNative (CallJavaProc.getAddress ()), 3, flags);
XPCOM.memmove (aScriptObject, new long /*int*/[] {newObject}, C.PTR_SIZEOF);
return XPCOM.NS_OK;
}
int setScriptObject (long /*int*/ aScriptObject) {
return XPCOM.NS_COMFALSE;
}
/* nsISecurityCheckedComponent */
int canCreateWrapper (long /*int*/ iid, long /*int*/ _retVal) {
long /*int*/[] result = new long /*int*/[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$
long /*int*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int canCallMethod (long /*int*/ iid, long /*int*/ methodName, long /*int*/ _retVal) {
long /*int*/[] result = new long /*int*/[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$
}
long /*int*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int canGetProperty (long /*int*/ iid, long /*int*/ propertyName, long /*int*/ _retVal) {
long /*int*/[] result = new long /*int*/[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$
long /*int*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
int canSetProperty (long /*int*/ iid, long /*int*/ propertyName, long /*int*/ _retVal) {
long /*int*/[] result = new long /*int*/[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$
long /*int*/ ptr = memory.Alloc (bytes.length);
C.memmove (ptr, bytes, bytes.length);
C.memmove (_retVal, new long /*int*/[] {ptr}, C.PTR_SIZEOF);
memory.Release ();
return XPCOM.NS_OK;
}
}