Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java590
1 files changed, 590 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java
new file mode 100644
index 0000000000..53ed58f3b7
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT Mozilla/common/org/eclipse/swt/browser/External.java
@@ -0,0 +1,590 @@
+/*******************************************************************************
+ * 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;
+}
+}

Back to the top