Bug 291512 - Generate Java interface files using nsIInterfaceInfoManager. Fix some type handling as a result of this change. r=biesi, sr=darin, a=asa

This commit is contained in:
pedemont%us.ibm.com 2005-05-02 16:30:03 +00:00
Родитель c9f68f0cbc
Коммит d75b5fa3eb
27 изменённых файлов: 1049 добавлений и 179 удалений

Просмотреть файл

@ -1384,7 +1384,7 @@ for extension in $MOZ_EXTENSIONS; do
extensions/java/xpcom/Makefile
extensions/java/xpcom/build/Makefile
extensions/java/xpcom/tests/Makefile
extensions/java/xpcom/tools/xpidl/Makefile
extensions/java/xpcom/tools/genifaces/Makefile
" ;;
typeaheadfind ) MAKEFILES_extensions="$MAKEFILES_extensions
$MAKEFILES_typeaheadfind"

Просмотреть файл

@ -533,10 +533,6 @@ XPIDL_COMPILE = $(CYGWIN_WRAPPER) $(topsrcdir)/../tools/xpidl.exe
XPIDL_LINK = $(CYGWIN_WRAPPER) $(topsrcdir)/../tools/xpt_link.exe
endif
# Java macros
JAVA_IDL_COMPILE = $(CYGWIN_WRAPPER) $(DIST)/bin/java_xpidl$(BIN_SUFFIX)
JAVA_DIST_DIR = $(DIST)/java
REQ_INCLUDES = $(foreach d,$(REQUIRES),-I$(DIST)/include/$d)
INCLUDES = $(LOCAL_INCLUDES) $(REQ_INCLUDES) -I$(PUBLIC) -I$(DIST)/include $(OS_INCLUDES)

Просмотреть файл

@ -565,12 +565,6 @@ endif
endif
endif
ifdef MOZ_ENABLE_JAVAXPCOM
JAVA_XPIDLSRCS += $(SDK_XPIDLSRCS)
else
JAVA_XPIDLSRCS =
endif
################################################################################
# The root makefile doesn't want to do a plain export/libs, because
@ -1279,11 +1273,6 @@ $(SDK_PUBLIC) $(PUBLIC)::
@if test ! -d $@; then echo Creating $@; rm -rf $@; $(NSINSTALL) -D $@; else true; fi
endif
ifneq ($(JAVA_XPIDLSRCS),)
$(JAVA_DIST_DIR)::
@if test ! -d $@; then echo Creating $@; rm -rf $@; $(NSINSTALL) -D $@; else true; fi
endif
ifneq ($(XPI_NAME),)
export::
@if test ! -d $(FINAL_TARGET); then echo Creating $(FINAL_TARGET); rm -fr $(FINAL_TARGET); $(NSINSTALL) -D $(FINAL_TARGET); else true; fi
@ -1531,38 +1520,6 @@ endif
endif # SDK_XPIDLSRCS
ifneq ($(JAVA_XPIDLSRCS),)
# A single IDL file can contain multiple interfaces, which result in multiple
# Java interface files. So use hidden dependency files.
JAVADEPFILES = $(addprefix $(XPIDL_GEN_DIR)/org/mozilla/xpcom/.,$(JAVA_XPIDLSRCS:.idl=.java.pp))
# generate .java files into $(XPIDL_GEN_DIR)
$(XPIDL_GEN_DIR)/org/mozilla/xpcom/.done: $(XPIDL_GEN_DIR)/.done
@if test ! -d $(XPIDL_GEN_DIR)/org/mozilla/xpcom; then echo Creating $(XPIDL_GEN_DIR)/org/mozilla/xpcom/.done; rm -rf $(XPIDL_GEN_DIR)/org; mkdir $(XPIDL_GEN_DIR)/org; mkdir $(XPIDL_GEN_DIR)/org/mozilla; mkdir $(XPIDL_GEN_DIR)/org/mozilla/xpcom; fi
@touch $@
$(XPIDL_GEN_DIR)/org/mozilla/xpcom/.%.java.pp: %.idl $(JAVA_IDL_COMPILE) $(XPIDL_GEN_DIR)/org/mozilla/xpcom/.done
$(REPORT_BUILD)
$(ELOG) $(JAVA_IDL_COMPILE) -m java -p org.mozilla.xpcom -w -I$(srcdir) -I$(IDL_DIR) -o $(XPIDL_GEN_DIR)/org/mozilla/xpcom/$* $(_VPATH_SRCS)
@touch $@
export:: $(JAVA_DIST_DIR)
# Use a wildcard to install the generated Java files since there is no strict
# one-to-one mapping between IDL files and Java files (IDL files can have
# multiple interfaces).
export:: $(JAVADEPFILES)
ifndef NO_DIST_INSTALL
$(INSTALL) $(IFLAGS1) $(XPIDL_GEN_DIR)/org/mozilla/xpcom/*.java $(JAVA_DIST_DIR)/org/mozilla/xpcom/
endif
endif # JAVA_XPIDLSRCS
################################################################################
# Copy each element of EXTRA_COMPONENTS to $(FINAL_TARGET)/components
ifdef EXTRA_COMPONENTS

Просмотреть файл

@ -89,10 +89,6 @@ SDK_XPIDLSRCS = \
nsIGlobalHistory.idl \
$(NULL)
JAVA_XPIDLSRCS = \
nsIWebNavigation.idl \
$(NULL)
XPIDLSRCS = \
nsCDocShell.idl \
nsCDefaultURIFixup.idl \

Просмотреть файл

@ -54,7 +54,7 @@ interface nsIDOMNode;
*
* @status FROZEN
*/
[uuid(3478b6b0-3875-11d4-94ef-0020183bf181)]
[scriptable, uuid(3478b6b0-3875-11d4-94ef-0020183bf181)]
interface nsIContextMenuListener : nsISupports
{
/** Flag. No context. */

Просмотреть файл

@ -60,7 +60,7 @@ interface nsIContextMenuInfo;
* @status UNDER_REVIEW
*/
[uuid(7fb719b3-d804-4964-9596-77cf924ee314)]
[scriptable, uuid(7fb719b3-d804-4964-9596-77cf924ee314)]
interface nsIContextMenuListener2 : nsISupports
{
/** Flag. No context. */
@ -113,7 +113,7 @@ interface nsIContextMenuListener2 : nsISupports
* @status UNDER_REVIEW
*/
[uuid(2f977d56-5485-11d4-87e2-0010a4e75ef2)]
[scriptable, uuid(2f977d56-5485-11d4-87e2-0010a4e75ef2)]
interface nsIContextMenuInfo : nsISupports
{
/**

Просмотреть файл

@ -50,7 +50,7 @@
*
* @status FROZEN
*/
[uuid(44b78386-1dd2-11b2-9ad2-e4eee2ca1916)]
[scriptable, uuid(44b78386-1dd2-11b2-9ad2-e4eee2ca1916)]
interface nsITooltipListener : nsISupports
{
/**

Просмотреть файл

@ -61,7 +61,7 @@ interface nsIDOMNode;
*
* @status FROZEN
*/
[uuid(b128a1e6-44f3-4331-8fbe-5af360ff21ee)]
[scriptable, uuid(b128a1e6-44f3-4331-8fbe-5af360ff21ee)]
interface nsITooltipTextProvider : nsISupports
{
/**

Просмотреть файл

@ -45,10 +45,6 @@ include $(DEPTH)/config/autoconf.mk
MODULE = progressDlg
XPIDL_MODULE = progressDlg
JAVA_XPIDLSRCS = \
nsIProgressDialog.idl \
$(NULL)
XPIDLSRCS = \
nsIProgressDialog.idl \
$(NULL)

Просмотреть файл

@ -56,7 +56,7 @@ REQUIRES = xpcom \
embed_base \
$(NULL)
DIRS = build
DIRS = tools/genifaces build
CPPSRCS = \
nsAppFileLocProviderProxy.cpp \
@ -67,19 +67,6 @@ CPPSRCS = \
nsJavaXPCOMBindingUtils.cpp \
$(NULL)
JAVA_SRCS = \
XPCOM.java \
XPCOMJavaProxy.java \
XPCOMJavaProxyBase.java \
XPCOMException.java \
GeckoEmbed.java \
AppFileLocProvider.java \
$(NULL)
GEN_JAVA_SRCS = \
XPCOMError.java \
$(NULL)
LOCAL_INCLUDES = -I$(JAVA_INCLUDE_PATH)
ifeq ($(OS_ARCH),WINNT)
@ -103,7 +90,4 @@ include $(topsrcdir)/config/rules.mk
XPCOMError.java: $(topsrcdir)/xpcom/base/nsError.h gen-nsError.pl Makefile Makefile.in
$(PERL) $(srcdir)/gen-nsError.pl < $< > $@
export:: $(GEN_JAVA_SRCS)
@$(INSTALL) -m 644 $(addprefix $(srcdir)/,$(JAVA_SRCS)) $(JAVA_DIST_DIR)/org/mozilla/xpcom
@$(INSTALL) -m 644 $(GEN_JAVA_SRCS) $(JAVA_DIST_DIR)/org/mozilla/xpcom
export:: XPCOMError.java

Просмотреть файл

@ -47,7 +47,20 @@ JARFILE = mozjava.jar
JARFILE_SRC = $(patsubst %.jar,%-src.jar,$(JARFILE))
GARBAGE += $(JARFILE) $(JARFILE_SRC)
GARBAGE_DIRS += org
GARBAGE_DIRS += _javagen org
JAVA_SRCS = \
XPCOM.java \
XPCOMJavaProxy.java \
XPCOMJavaProxyBase.java \
XPCOMException.java \
GeckoEmbed.java \
AppFileLocProvider.java \
$(NULL)
GEN_JAVA_SRCS = \
XPCOMError.java \
$(NULL)
include $(topsrcdir)/config/rules.mk
@ -55,16 +68,31 @@ ifdef MOZ_DEBUG
JAVAC_FLAGS = -g
endif
org/mozilla/xpcom/.class_done:
_javagen/org/mozilla/xpcom/.iface_done:
@if test ! -d _javagen/org/mozilla/xpcom; then \
touch .done; \
$(INSTALL) -m 644 .done _javagen/org/mozilla/xpcom; \
fi
@echo Copying Java source files
@$(INSTALL) -m 644 $(addprefix $(srcdir)/../,$(JAVA_SRCS)) \
_javagen/org/mozilla/xpcom
@$(INSTALL) -m 644 $(addprefix ../,$(GEN_JAVA_SRCS)) \
_javagen/org/mozilla/xpcom
@echo Generating Java interface files
$(DIST)/bin/run-mozilla.sh $(DIST)/bin/GenerateJavaInterfaces$(BIN_SUFFIX) \
-d $(CURDIR)/_javagen/org/mozilla/xpcom
@touch $@
org/mozilla/xpcom/.class_done: _javagen/org/mozilla/xpcom/.iface_done
@echo Compiling Java interface classes
@$(JAVAC) $(JAVAC_FLAGS) -classpath . -d . $(JAVA_DIST_DIR)/org/mozilla/xpcom/*.java
@$(JAVAC) $(JAVAC_FLAGS) -classpath . -d . _javagen/org/mozilla/xpcom/*.java
@touch $@
$(JARFILE): org/mozilla/xpcom/.class_done Makefile
$(JAR) cf $@ org
$(JARFILE_SRC): $(JARFILE)
$(JAR) cf $@ -C $(JAVA_DIST_DIR) org
$(JAR) cf $@ -C _javagen org
libs:: $(JARFILE) $(JARFILE_SRC)
$(INSTALL) $(IFLAGS1) $^ $(DIST)/bin

Просмотреть файл

@ -1436,8 +1436,8 @@ JAVAPROXY_NATIVE(callXPCOMMethod) (JNIEnv *env, jclass that, jobject aJavaProxy,
PRUint8 type = params[i].type.TagPart();
// is paramater an array?
PRUint8 arrayType;
PRUint32 arraySize;
PRUint8 arrayType = 0;
PRUint32 arraySize = 0;
if (type == nsXPTType::T_ARRAY) {
// get array type
nsXPTType xpttype;
@ -1530,8 +1530,8 @@ JAVAPROXY_NATIVE(callXPCOMMethod) (JNIEnv *env, jclass that, jobject aJavaProxy,
PRUint8 type = paramInfo.GetType().TagPart();
// is paramater an array?
PRUint8 arrayType;
PRUint32 arraySize;
PRUint8 arrayType = 0;
PRUint32 arraySize = 0;
if (type == nsXPTType::T_ARRAY) {
// get array type
nsXPTType array_xpttype;

Просмотреть файл

@ -411,7 +411,8 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
methodSig.Append(')');
if (retvalInfo) {
nsCAutoString retvalSig;
rv = GetRetvalSig(retvalInfo, retvalSig);
rv = GetRetvalSig(retvalInfo, aMethodInfo, aMethodIndex, aParams,
retvalSig);
methodSig.Append(retvalSig);
} else {
methodSig.Append('V');
@ -885,15 +886,22 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
xpcom_obj = *variant;
}
nsID iid;
rv = GetIIDForMethodParam(mIInfo, aMethodInfo, aParamInfo,
aParamInfo.GetType().TagPart(), aMethodIndex,
aDispatchParams, PR_FALSE, iid);
if (NS_FAILED(rv))
break;
// get name of interface
char* iface_name = nsnull;
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
rv = iim->GetNameForIID(&iid, &iface_name);
if (NS_FAILED(rv) || !iface_name)
break;
jobject java_stub = nsnull;
if (xpcom_obj) {
nsID iid;
rv = GetIIDForMethodParam(mIInfo, aMethodInfo, aParamInfo,
aParamInfo.GetType().TagPart(), aMethodIndex,
aDispatchParams, PR_FALSE, iid);
if (NS_FAILED(rv))
break;
// Get matching Java object for given xpcom object
rv = GetNewOrUsedJavaObject(mJavaEnv, xpcom_obj, iid, &java_stub);
if (NS_FAILED(rv))
@ -902,7 +910,6 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
if (!aParamInfo.IsOut()) { // 'in'
aJValue.l = java_stub;
aMethodSig.AppendLiteral("Lorg/mozilla/xpcom/nsISupports;");
} else { // 'inout' & 'out'
if (aVariant.val.p) {
aJValue.l = mJavaEnv->NewObjectArray(1, nsISupportsClass, java_stub);
@ -913,8 +920,18 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
} else {
aJValue.l = nsnull;
}
aMethodSig.AppendLiteral("[Lorg/mozilla/xpcom/nsISupports;");
aMethodSig.Append('[');
}
if (tag != nsXPTType::T_INTERFACE_IS) {
aMethodSig.AppendLiteral("Lorg/mozilla/xpcom/");
aMethodSig.AppendASCII(iface_name);
aMethodSig.Append(';');
} else {
aMethodSig.AppendLiteral("Lorg/mozilla/xpcom/nsISupports;");
}
nsMemory::Free(iface_name);
}
break;
@ -1039,11 +1056,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
nsresult
nsJavaXPTCStub::GetRetvalSig(const nsXPTParamInfo* aParamInfo,
nsACString &aRetvalSig)
const nsXPTMethodInfo* aMethodInfo,
PRUint16 aMethodIndex,
nsXPTCMiniVariant* aDispatchParams,
nsACString &aRetvalSig)
{
const nsXPTType &type = aParamInfo->GetType();
PRUint8 tag = type.TagPart();
switch (tag)
PRUint8 type = aParamInfo->GetType().TagPart();
switch (type)
{
case nsXPTType::T_I8:
aRetvalSig.Append('B');
@ -1093,6 +1112,28 @@ nsJavaXPTCStub::GetRetvalSig(const nsXPTParamInfo* aParamInfo,
break;
case nsXPTType::T_INTERFACE:
{
nsID iid;
nsresult rv = GetIIDForMethodParam(mIInfo, aMethodInfo, *aParamInfo, type,
aMethodIndex, aDispatchParams,
PR_FALSE, iid);
if (NS_FAILED(rv))
break;
// get name of interface
char* iface_name = nsnull;
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
rv = iim->GetNameForIID(&iid, &iface_name);
if (NS_FAILED(rv) || !iface_name)
break;
aRetvalSig.AppendLiteral("Lorg/mozilla/xpcom/");
aRetvalSig.AppendASCII(iface_name);
aRetvalSig.Append(';');
nsMemory::Free(iface_name);
break;
}
case nsXPTType::T_INTERFACE_IS:
aRetvalSig.AppendLiteral("Lorg/mozilla/xpcom/nsISupports;");
break;

Просмотреть файл

@ -108,6 +108,9 @@ private:
nsXPTCMiniVariant &aVariant,
jvalue &aJValue, nsACString &aMethodSig);
nsresult GetRetvalSig(const nsXPTParamInfo* aParamInfo,
const nsXPTMethodInfo* aMethodInfo,
PRUint16 aMethodIndex,
nsXPTCMiniVariant* aDispatchParams,
nsACString &aRetvalSig);
nsresult FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
const nsXPTMethodInfo* aMethodInfo,

Просмотреть файл

@ -51,20 +51,8 @@ XPIDLSRCS = \
ITestParams.idl \
$(NULL)
# Since we are creating a component that implements the ITestParams interface
# (in the 'dll' directory), we need to add the Java interface to the
# org.mozilla.xpcom package.
JAVA_XPIDLSRCS += \
ITestParams.idl \
$(NULL)
# The IFoo interface is not part of the org.mozilla.xpcom package, but we need
# to create a Java version of it.
LOCAL_JAVA_XPIDLSRCS = \
IFoo.idl \
$(NULL)
JAVA_SRCS = \
Foo.java \
TestArray.java \
TestProps.java \
TestQI.java \
@ -80,28 +68,22 @@ else
SEP = :
endif
JAVA_CLASSPATH = ./../build$(SEP)$(XPIDL_GEN_DIR)
_JAVA_CLASSPATH = .$(SEP)./../build$(SEP)$(XPIDL_GEN_DIR)
GARBAGE += *.class
REBUILD_JAR = .rebuild_jar
GARBAGE += *.class $(REBUILD_JAR)
include $(topsrcdir)/config/rules.mk
$(XPIDL_GEN_DIR)/%.java: %.idl $(XPIDL_COMPILE) $(XPIDL_GEN_DIR)/.done
$(REPORT_BUILD)
$(ELOG) $(JAVA_IDL_COMPILE) -m java -w -I$(srcdir) -I$(IDL_DIR) \
-o $(XPIDL_GEN_DIR)/$* $(_VPATH_SRCS)
ifdef JAVA_CLASSPATH
_JAVA_CLASSPATH = .$(SEP)$(srcdir)$(SEP)$(JAVA_CLASSPATH)
else
_JAVA_CLASSPATH = .$(SEP)$(srcdir)
endif
%.class: %.java Makefile Makefile.in
$(REPORT_BUILD)
$(ELOG) $(CYGWIN_WRAPPER) $(JAVAC) -classpath $(_JAVA_CLASSPATH) -d . \
$(_VPATH_SRCS)
export:: $(patsubst %.idl,$(XPIDL_GEN_DIR)/%.java, $(LOCAL_JAVA_XPIDLSRCS))
# make sure to rebuild Java interfaces if our XPIDLSRCS change
$(REBUILD_JAR): $(XPIDLSRCS)
@cd ../build; make clean; make
@touch $@
libs:: $(JAVA_SRCS:.java=.class)
libs:: $(REBUILD_JAR) $(JAVA_SRCS:.java=.class)

Просмотреть файл

@ -108,7 +108,7 @@ public class TestArray {
// test IndexOf && LastIndexOf
int expectedIndex[] = {0, 4, 6, 12, -1};
int count = 0;
int index = array.indexOf(0, foo);
long index = array.indexOf(0, foo);
System.out.println("IndexOf(foo): " + index + "=" + expectedIndex[count] +
" " + assertEqual(index, expectedIndex[count]));
try {
@ -193,7 +193,7 @@ public class TestArray {
}
}
static String assertEqual(int aValue1, int aValue2)
static String assertEqual(long aValue1, long aValue2)
{
if (aValue1 == aValue2)
return "OK";
@ -203,7 +203,7 @@ public class TestArray {
static void dumpArray(nsIMutableArray aArray, int aExpectedCount,
int[] aElementIDs, int aExpectedTotal)
{
int count = 0;
long count = 0;
if (aArray != null)
count = aArray.getLength();
@ -214,17 +214,17 @@ public class TestArray {
for (int index = 0; (index < count) && (index < aExpectedCount); index++) {
IFoo foo = (IFoo) aArray.queryElementAt(index, IFoo.IFOO_IID);
System.out.println(index + ": " + aElementIDs[index] + "=" +
foo.getId() + " (" +
Integer.toHexString(foo.hashCode()) + ") " +
assertEqual(foo.getId(), aElementIDs[index]));
foo = null;
}
System.out.println(index + ": " + aElementIDs[index] + "=" +
foo.getId() + " (" +
Integer.toHexString(foo.hashCode()) + ") " +
assertEqual(foo.getId(), aElementIDs[index]));
foo = null;
}
}
static int lastIndexOf(nsIMutableArray aArray, nsISupports aElement)
static long lastIndexOf(nsIMutableArray aArray, nsISupports aElement)
{
for (int i = aArray.getLength() - 1; i >= 0; i--) {
for (long i = aArray.getLength() - 1; i >= 0; i--) {
IFoo foo = (IFoo) aArray.queryElementAt(i, IFoo.IFOO_IID);
if (foo == aElement)
return i;
@ -242,13 +242,13 @@ public class TestArray {
/* Removes first instance of given element */
static void removeElement(nsIMutableArray aArray, nsISupports aElement)
{
int index = aArray.indexOf(0, aElement);
long index = aArray.indexOf(0, aElement);
aArray.removeElementAt(index);
}
static void removeLastElement(nsIMutableArray aArray, nsISupports aElement)
{
int index = lastIndexOf(aArray, aElement);
long index = lastIndexOf(aArray, aElement);
aArray.removeElementAt(index);
}
}

Просмотреть файл

@ -80,8 +80,8 @@ public class TestParams
static void testArrayParamsIn(ITestParams p)
{
int count = 4;
byte[] byte_array = new byte[count];
for (byte i = 0; i < count; i++) {
short[] byte_array = new short[count];
for (short i = 0; i < count; i++) {
byte_array[i] = i;
}
p.testSimpleTypeArrayIn(count, byte_array);
@ -117,7 +117,7 @@ public class TestParams
static void testArrayParamsOut(ITestParams p)
{
int[] count = new int[1];
long[] count = new long[1];
char[][] char_array = new char[1][];
p.testSimpleTypeArrayOut(count, char_array);
for (int i = 0; i < count[0]; i++) {
@ -209,8 +209,8 @@ public class TestParams
static void testArrayParamsRetval(ITestParams p)
{
int[] count = new int[1];
int[] int_array = p.returnSimpleTypeArray(count);
long[] count = new long[1];
long[] int_array = p.returnSimpleTypeArray(count);
for (int i = 0; i < count[0]; i++) {
System.out.println("[" + i + "] " + int_array[i]);
}

Просмотреть файл

@ -111,7 +111,7 @@ public class TestProps {
throw new NoSuchElementException();
// test the "getKeys" method
int[] count = new int[1];
long[] count = new long[1];
String[] keys = props.getKeys(count);
if (keys == null || keys.length != 3) {
System.out.println("getKeys returned incorrect array.");

Просмотреть файл

@ -91,7 +91,7 @@ public class TestQI {
/**
* Dummy class that implements nsIFileUrl. The inheritance chaing for
* Dummy class that implements nsIFileUrl. The inheritance chain for
* nsIFileURL is as follows:
* <pre>
* nsIFileURL -> nsIURL -> nsIURI -> nsISupports
@ -109,11 +109,11 @@ class FooFile implements nsIFileURL {
return XPCOM.queryInterface(this, aIID);
}
public nsISupports getFile() {
public nsIFile getFile() {
return null;
}
public void setFile(nsISupports aFile) {
public void setFile(nsIFile aFile) {
}
public String getFilePath() {

Просмотреть файл

@ -0,0 +1,851 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Java XPCOM Bindings.
*
* The Initial Developer of the Original Code is
* IBM Corporation.
* Portions created by the Initial Developer are Copyright (C) 2005
* IBM Corporation. All Rights Reserved.
*
* Contributor(s):
* Javier Pedemonte (jhpedemonte@gmail.com)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsXPCOM.h"
#include "nsString.h"
#include "nsLocalFile.h"
#include "nsIInterfaceInfoManager.h"
#include "xptinfo.h"
#include "nsCOMPtr.h"
#include "prmem.h"
#include "xptcall.h"
#include "nsNetUtil.h"
#include "nsHashSets.h"
#include "nsIWeakReference.h"
#include <stdio.h>
#define WRITE_NOSCRIPT_METHODS
class TypeInfo
{
public:
static nsresult GetParentInfo(nsIInterfaceInfo* aIInfo,
nsIInterfaceInfo** aParentInfo,
PRUint16* aParentMethodCount,
PRUint16* aParentConstCount)
{
nsCOMPtr<nsIInterfaceInfo> parent;
nsresult rv = aIInfo->GetParent(getter_AddRefs(parent));
NS_ENSURE_SUCCESS(rv, rv);
if (!parent) {
*aParentInfo = nsnull;
*aParentMethodCount = 0;
return NS_OK;
}
rv = parent->GetMethodCount(aParentMethodCount);
NS_ENSURE_SUCCESS(rv, rv);
rv = parent->GetConstantCount(aParentConstCount);
NS_ENSURE_SUCCESS(rv, rv);
*aParentInfo = parent;
NS_ADDREF(*aParentInfo);
return rv;
}
static nsresult GetInterfaceName(nsIInterfaceInfo* aIInfo,
PRUint16 aMethodIndex,
const nsXPTParamInfo* aParamInfo,
char** aResult)
{
static const char isupp_str[] = "nsISupports";
nsIID* iid;
nsresult rv = aIInfo->GetIIDForParam(aMethodIndex, aParamInfo, &iid);
if (NS_FAILED(rv)) {
// GetIIDForParam will sometimes fail to find an interface, particularly
// if that interface is not defined in an IDL file. In those cases, just
// return |nsISupports|.
//
// For example, the |onStreamComplete| method for the interface
// |nsIUnicharStreamLoaderObserver| takes a param of
// |nsIUnicharInputStream|, which is defined in a simple header file, not
// an IDL file.
*aResult = (char*) nsMemory::Clone(isupp_str, sizeof(isupp_str));
rv = (*aResult == nsnull) ? NS_ERROR_OUT_OF_MEMORY : NS_OK;
} else {
// In Javaconnect, we handle weak references internally; no need for the
// |nsIWeakReference| interface. So just return |nsISupports|.
if (iid->Equals(NS_GET_IID(nsIWeakReference))) {
*aResult = (char*) nsMemory::Clone(isupp_str, sizeof(isupp_str));
rv = (*aResult == nsnull) ? NS_ERROR_OUT_OF_MEMORY : NS_OK;
} else {
// Some methods take parameters of non-scriptable interfaces. But we
// only output scriptable interfaces. So if one of the param types is
// a non-scriptable interface, output |nsISupports| instead of the
// interface name.
nsCOMPtr<nsIInterfaceInfo> info;
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
NS_ASSERTION(iim, "could not get interface info manager");
rv = iim->GetInfoForIID(iid, getter_AddRefs(info));
NS_ENSURE_SUCCESS(rv, rv);
PRBool scriptable;
if (NS_SUCCEEDED(rv)) {
info->IsScriptable(&scriptable);
}
if (NS_FAILED(rv) || !scriptable) {
*aResult = (char*) nsMemory::Clone(isupp_str, sizeof(isupp_str));
rv = (*aResult == nsnull) ? NS_ERROR_OUT_OF_MEMORY : NS_OK;
} else {
// If is scriptable, get name for given IID
rv = iim->GetNameForIID(iid, aResult);
}
}
nsMemory::Free(iid);
}
return rv;
}
};
static const char* kJavaKeywords[] = {
"abstract", "default", "if" , "private" , "this" ,
"boolean" , "do" , "implements", "protected" , "throw" ,
"break" , "double" , "import", "public" , "throws" ,
"byte" , "else" , "instanceof", "return" , "transient",
"case" , "extends", "int" , "short" , "try" ,
"catch" , "final" , "interface" , "static" , "void" ,
"char" , "finally", "long" , "strictfp" , "volatile" ,
"class" , "float" , "native" , "super" , "while" ,
"const" , "for" , "new" , "switch" ,
"continue", "goto" , "package" , "synchronized",
"assert" , /* added in Java 1.4 */
"enum" , /* added in Java 5.0 */
"clone" , /* clone is a member function of java.lang.Object */
"finalize" /* finalize is a member function of java.lang.Object */
};
#ifdef WRITE_NOSCRIPT_METHODS
// SWT uses [noscript] methods of the following interfaces, so we need to
// output the [noscript] methods for these interfaces.
static const char* kNoscriptMethodIfaces[] = {
"nsIBaseWindow", "nsIEmbeddingSiteWindow"
};
#endif
class Generate
{
nsILocalFile* mOutputDir;
nsCStringHashSet mIfaceTable;
nsCStringHashSet mJavaKeywords;
#ifdef WRITE_NOSCRIPT_METHODS
nsCStringHashSet mNoscriptMethodsTable;
#endif
public:
Generate(nsILocalFile* aOutputDir)
: mOutputDir(aOutputDir)
{
mIfaceTable.Init(100);
PRUint32 size = NS_ARRAY_LENGTH(kJavaKeywords);
mJavaKeywords.Init(size);
for (PRUint32 i = 0; i < size; i++) {
mJavaKeywords.Put(nsDependentCString(kJavaKeywords[i]));
}
#ifdef WRITE_NOSCRIPT_METHODS
size = NS_ARRAY_LENGTH(kNoscriptMethodIfaces);
mNoscriptMethodsTable.Init(size);
for (PRUint32 i = 0; i < size; i++) {
mNoscriptMethodsTable.Put(nsDependentCString(kNoscriptMethodIfaces[i]));
}
#endif
}
~Generate()
{
}
nsresult GenerateInterfaces()
{
nsresult rv;
nsCOMPtr<nsIInterfaceInfoManager> iim = XPTI_GetInterfaceInfoManager();
NS_ASSERTION(iim, "could not get interface info manager");
nsCOMPtr<nsIEnumerator> etor;
rv = iim->EnumerateInterfaces(getter_AddRefs(etor));
NS_ENSURE_SUCCESS(rv, rv);
// loop over interfaces
etor->First();
do {
// get current interface
nsCOMPtr<nsISupports> item;
rv = etor->CurrentItem(getter_AddRefs(item));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIInterfaceInfo> iface(do_QueryInterface(item));
if (!iface)
break;
// we only care about scriptable interfaces, so skip over those
// that aren't
PRBool scriptable;
iface->IsScriptable(&scriptable);
if (!scriptable) {
// XXX SWT uses non-scriptable interface 'nsIAppShell' (bug 270892), so
// include that one.
const char* iface_name;
iface->GetNameShared(&iface_name);
if (strcmp("nsIAppShell", iface_name) != 0)
continue;
}
rv = WriteOneInterface(iface);
NS_ENSURE_SUCCESS(rv, rv);
} while (NS_SUCCEEDED(etor->Next()));
return NS_OK;
}
nsresult WriteOneInterface(nsIInterfaceInfo* aIInfo)
{
nsresult rv;
// write each interface only once
const char* iface_name;
aIInfo->GetNameShared(&iface_name);
if (mIfaceTable.Contains(nsDependentCString(iface_name)))
return NS_OK;
// write any parent interface
nsCOMPtr<nsIInterfaceInfo> parentInfo;
PRUint16 parentMethodCount, parentConstCount;
rv = TypeInfo::GetParentInfo(aIInfo, getter_AddRefs(parentInfo),
&parentMethodCount, &parentConstCount);
NS_ENSURE_SUCCESS(rv, rv);
if (parentInfo)
WriteOneInterface(parentInfo);
mIfaceTable.Put(nsDependentCString(iface_name));
// create file for interface
nsCOMPtr<nsIOutputStream> out;
rv = OpenIfaceFileStream(iface_name, getter_AddRefs(out));
NS_ENSURE_SUCCESS(rv, rv);
// write contents to file
rv = WriteHeader(out);
NS_ENSURE_SUCCESS(rv, rv);
rv = WriteInterfaceStart(out, aIInfo, parentInfo);
NS_ENSURE_SUCCESS(rv, rv);
rv = WriteIID(out, aIInfo);
NS_ENSURE_SUCCESS(rv, rv);
rv = WriteConstants(out, aIInfo, parentConstCount);
NS_ENSURE_SUCCESS(rv, rv);
rv = WriteMethods(out, aIInfo, parentMethodCount);
NS_ENSURE_SUCCESS(rv, rv);
rv = WriteInterfaceEnd(out);
NS_ENSURE_SUCCESS(rv, rv);
rv = CloseIfaceFileStream(out);
return rv;
}
nsresult OpenIfaceFileStream(const char* aIfaceName,
nsIOutputStream** aResult)
{
nsresult rv;
// create interface file in output dir
nsCOMPtr<nsIFile> iface_file;
rv = mOutputDir->Clone(getter_AddRefs(iface_file));
NS_ENSURE_SUCCESS(rv, rv);
nsAutoString filename;
filename.AppendASCII(aIfaceName);
filename.AppendLiteral(".java");
rv = iface_file->Append(filename);
NS_ENSURE_SUCCESS(rv, rv);
// create interface file
PRBool exists;
iface_file->Exists(&exists);
if (exists)
iface_file->Remove(PR_FALSE);
rv = iface_file->Create(nsIFile::NORMAL_FILE_TYPE, 0644);
NS_ENSURE_SUCCESS(rv, rv);
// create output stream for writing to file
nsCOMPtr<nsIOutputStream> out;
rv = NS_NewLocalFileOutputStream(getter_AddRefs(out), iface_file);
NS_ENSURE_SUCCESS(rv, rv);
*aResult = out;
NS_ADDREF(*aResult);
return NS_OK;
}
nsresult CloseIfaceFileStream(nsIOutputStream* out)
{
return out->Close();
}
nsresult WriteHeader(nsIOutputStream* out)
{
static const char kHeader[] = "/**\n * NOTE: THIS IS A GENERATED FILE. "
"PLEASE CONSULT THE ORIGINAL IDL FILE FOR \n"
" * THE FULL DOCUMENTION AND LICENSE.\n **/\n\n";
static const char kPackage[] = "package org.mozilla.xpcom;\n\n";
PRUint32 count;
nsresult rv = out->Write(kHeader, sizeof(kHeader) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(kPackage, sizeof(kPackage) - 1, &count);
return rv;
}
nsresult WriteInterfaceStart(nsIOutputStream* out, nsIInterfaceInfo* aIInfo,
nsIInterfaceInfo* aParentInfo)
{
static const char kIfaceDecl1[] = "public interface ";
static const char kParentDecl[] = " extends ";
static const char kIfaceDecl2[] = "\n{\n";
const char* iface_name;
aIInfo->GetNameShared(&iface_name);
PRUint32 count;
nsresult rv = out->Write(kIfaceDecl1, sizeof(kIfaceDecl1) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(iface_name, strlen(iface_name), &count);
NS_ENSURE_SUCCESS(rv, rv);
if (aParentInfo) {
const char* parent_name;
aParentInfo->GetNameShared(&parent_name);
rv = out->Write(kParentDecl, sizeof(kParentDecl) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(parent_name, strlen(parent_name), &count);
NS_ENSURE_SUCCESS(rv, rv);
}
rv = out->Write(kIfaceDecl2, sizeof(kIfaceDecl2) - 1, &count);
return rv;
}
nsresult WriteInterfaceEnd(nsIOutputStream* out)
{
PRUint32 count;
return out->Write("}\n", 2, &count);
}
nsresult WriteIID(nsIOutputStream* out, nsIInterfaceInfo* aIInfo)
{
static const char kIIDDecl1[] = " public static final String ";
static const char kIIDDecl2[] = " =\n \"";
static const char kIIDDecl3[] = "\";\n\n";
nsIID* iid = nsnull;
aIInfo->GetInterfaceIID(&iid);
if (!iid)
return NS_ERROR_OUT_OF_MEMORY;
// create iid field name
nsCAutoString iid_name;
const char* iface_name;
aIInfo->GetNameShared(&iface_name);
if (strncmp("ns", iface_name, 2) == 0) {
iid_name.AppendLiteral("NS_");
iid_name.Append(iface_name + 2);
} else {
iid_name.Append(iface_name);
}
iid_name.AppendLiteral("_IID");
ToUpperCase(iid_name);
// get iid string
char* iid_str = iid->ToString();
if (!iid_str)
return NS_ERROR_OUT_OF_MEMORY;
PRUint32 count;
nsresult rv = out->Write(kIIDDecl1, sizeof(kIIDDecl1) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(iid_name.get(), iid_name.Length(), &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(kIIDDecl2, sizeof(kIIDDecl2) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(iid_str, strlen(iid_str), &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(kIIDDecl3, sizeof(kIIDDecl3) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
// cleanup
PR_Free(iid_str);
nsMemory::Free(iid);
return NS_OK;
}
nsresult WriteConstants(nsIOutputStream* out, nsIInterfaceInfo* aIInfo,
PRUint16 aParentConstCount)
{
static const char kConstDecl1[] = " public static final ";
static const char kConstDecl2[] = " = ";
static const char kConstDecl3[] = ";\n\n";
PRUint16 constCount;
nsresult rv = aIInfo->GetConstantCount(&constCount);
NS_ENSURE_SUCCESS(rv, rv);
for (PRUint16 i = aParentConstCount; i < constCount; i++) {
const nsXPTConstant* constInfo;
rv = aIInfo->GetConstant(i, &constInfo);
NS_ENSURE_SUCCESS(rv, rv);
PRUint32 count;
rv = out->Write(kConstDecl1, sizeof(kConstDecl1) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
const nsXPTType &type = constInfo->GetType();
rv = WriteType(out, &type, aIInfo, nsnull, nsnull);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(" ", 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
const char* name = constInfo->GetName();
rv = out->Write(name, strlen(name), &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(kConstDecl2, sizeof(kConstDecl2) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = WriteConstantValue(out, &type, constInfo->GetValue());
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(kConstDecl3, sizeof(kConstDecl3) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
}
return NS_OK;
}
nsresult WriteConstantValue(nsIOutputStream* out, const nsXPTType* aType,
const nsXPTCMiniVariant* aValue)
{
char buf[32];
switch (aType->TagPart()) {
case nsXPTType::T_I8:
snprintf(buf, sizeof(buf), "%d", aValue->val.i8);
break;
case nsXPTType::T_U8:
snprintf(buf, sizeof(buf), "%u", aValue->val.u8);
break;
case nsXPTType::T_I16:
snprintf(buf, sizeof(buf), "%d", aValue->val.i16);
break;
case nsXPTType::T_U16:
snprintf(buf, sizeof(buf), "%u", aValue->val.u16);
break;
case nsXPTType::T_I32:
snprintf(buf, sizeof(buf), "%d", aValue->val.i32);
break;
case nsXPTType::T_U32:
snprintf(buf, sizeof(buf), "%uL", aValue->val.u32);
break;
case nsXPTType::T_I64:
snprintf(buf, sizeof(buf), "%lldL", aValue->val.i64);
break;
case nsXPTType::T_U64:
snprintf(buf, sizeof(buf), "%lluL", aValue->val.u64);
break;
case nsXPTType::T_FLOAT:
snprintf(buf, sizeof(buf), "%f", aValue->val.f);
break;
case nsXPTType::T_DOUBLE:
snprintf(buf, sizeof(buf), "%f", aValue->val.d);
break;
case nsXPTType::T_BOOL:
if (aValue->val.b)
sprintf(buf, "true");
else
sprintf(buf, "false");
break;
case nsXPTType::T_CHAR:
snprintf(buf, sizeof(buf), "%c", aValue->val.c);
break;
case nsXPTType::T_WCHAR:
snprintf(buf, sizeof(buf), "%c", aValue->val.wc);
break;
default:
NS_WARNING("unexpected constant type");
return NS_ERROR_UNEXPECTED;
}
PRUint32 count;
return out->Write(buf, strlen(buf), &count);
}
nsresult WriteMethods(nsIOutputStream* out, nsIInterfaceInfo* aIInfo,
PRUint16 aParentMethodCount)
{
PRUint16 methodCount;
nsresult rv = aIInfo->GetMethodCount(&methodCount);
NS_ENSURE_SUCCESS(rv, rv);
for (PRUint16 i = aParentMethodCount; i < methodCount; i++) {
const nsXPTMethodInfo* methodInfo;
rv = aIInfo->GetMethodInfo(i, &methodInfo);
NS_ENSURE_SUCCESS(rv, rv);
#ifdef WRITE_NOSCRIPT_METHODS
// XXX
// SWT makes use of [noscript] methods in some classes, so output them
// for those classes.
// skip [notxpcom] methods
if (methodInfo->IsNotXPCOM())
continue;
// skip most hidden ([noscript]) methods
if (methodInfo->IsHidden()) {
const char* iface_name;
aIInfo->GetNameShared(&iface_name);
if (!mNoscriptMethodsTable.Contains(nsDependentCString(iface_name)))
continue;
}
#else
// skip hidden ([noscript]) or [notxpcom] methods
if (methodInfo->IsHidden() || methodInfo->IsNotXPCOM())
continue;
#endif
rv = WriteOneMethod(out, aIInfo, methodInfo, i);
NS_ENSURE_SUCCESS(rv, rv);
}
return NS_OK;
}
nsresult WriteOneMethod(nsIOutputStream* out, nsIInterfaceInfo* aIInfo,
const nsXPTMethodInfo* aMethodInfo,
PRUint16 aMethodIndex)
{
static const char kMethodDecl1[] = " public ";
static const char kVoidReturn[] = "void";
static const char kParamSeparator[] = ", ";
static const char kMethodDecl2[] = ");\n\n";
PRUint32 count;
nsresult rv = out->Write(kMethodDecl1, sizeof(kMethodDecl1) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
// write return type
PRUint8 paramCount = aMethodInfo->GetParamCount();
const nsXPTParamInfo* resultInfo = nsnull;
for (PRUint8 i = 0; i < paramCount; i++) {
const nsXPTParamInfo &paramInfo = aMethodInfo->GetParam(i);
if (paramInfo.IsRetval()) {
resultInfo = &paramInfo;
break;
}
}
if (resultInfo) {
rv = WriteParam(out, aIInfo, aMethodIndex, resultInfo, 0);
} else {
rv = out->Write(kVoidReturn, sizeof(kVoidReturn) - 1, &count);
}
NS_ENSURE_SUCCESS(rv, rv);
// write method name string
nsCAutoString method_name;
const char* name = aMethodInfo->GetName();
if (aMethodInfo->IsGetter() || aMethodInfo->IsSetter()) {
if (aMethodInfo->IsGetter())
method_name.AppendLiteral("get");
else
method_name.AppendLiteral("set");
method_name.Append(toupper(name[0]));
method_name.AppendASCII(name + 1);
} else {
method_name.Append(tolower(name[0]));
method_name.AppendASCII(name + 1);
// don't use Java keywords as method names
if (mJavaKeywords.Contains(method_name))
method_name.Append('_');
}
rv = out->Write(" ", 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write(method_name.get(), method_name.Length(), &count);
NS_ENSURE_SUCCESS(rv, rv);
rv = out->Write("(", 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
// write parameters
for (PRUint8 i = 0; i < paramCount; i++) {
const nsXPTParamInfo &paramInfo = aMethodInfo->GetParam(i);
if (paramInfo.IsRetval())
continue;
if (i != 0) {
rv = out->Write(kParamSeparator, sizeof(kParamSeparator) - 1, &count);
NS_ENSURE_SUCCESS(rv, rv);
}
rv = WriteParam(out, aIInfo, aMethodIndex, &paramInfo, i + 1);
NS_ENSURE_SUCCESS(rv, rv);
}
rv = out->Write(kMethodDecl2, sizeof(kMethodDecl2) - 1, &count);
return rv;
}
nsresult WriteParam(nsIOutputStream* out, nsIInterfaceInfo* aIInfo,
PRUint16 aMethodIndex, const nsXPTParamInfo* aParamInfo,
PRUint8 aIndex)
{
const nsXPTType &type = aParamInfo->GetType();
nsresult rv = WriteType(out, &type, aIInfo, aMethodIndex, aParamInfo);
NS_ENSURE_SUCCESS(rv, rv);
// if parameter is 'out' or 'inout', make it a Java array
PRUint32 count;
if (aParamInfo->IsOut() && !aParamInfo->IsRetval()) {
rv = out->Write("[]", 2, &count);
NS_ENSURE_SUCCESS(rv, rv);
}
// write name for parameter (but not for 'retval' param)
if (aIndex) {
char buf[10];
snprintf(buf, sizeof(buf), " arg%d", aIndex);
rv = out->Write(buf, strlen(buf), &count);
NS_ENSURE_SUCCESS(rv, rv);
}
return NS_OK;
}
/**
* Write out the Java type for the given XPIDL type.
*
* NOTE: Java doesn't support unsigned types. So for any unsigned XPIDL type,
* we move up to the next largest Java type. This way we ensure that we don't
* lose any info.
*/
nsresult WriteType(nsIOutputStream* out, const nsXPTType* aType,
nsIInterfaceInfo* aIInfo, PRUint16 aMethodIndex,
const nsXPTParamInfo* aParamInfo)
{
nsresult rv;
PRUint32 count;
switch (aType->TagPart()) {
case nsXPTType::T_I8:
rv = out->Write("byte", 4, &count);
break;
case nsXPTType::T_I16:
case nsXPTType::T_U8:
rv = out->Write("short", 5, &count);
break;
case nsXPTType::T_I32:
case nsXPTType::T_U16:
rv = out->Write("int", 3, &count);
break;
case nsXPTType::T_I64:
case nsXPTType::T_U32:
rv = out->Write("long", 4, &count);
break;
case nsXPTType::T_FLOAT:
rv = out->Write("float", 5, &count);
break;
// XXX how should we handle 64-bit values?
case nsXPTType::T_U64:
case nsXPTType::T_DOUBLE:
rv = out->Write("double", 6, &count);
break;
case nsXPTType::T_BOOL:
rv = out->Write("boolean", 7, &count);
break;
case nsXPTType::T_CHAR:
case nsXPTType::T_WCHAR:
rv = out->Write("char", 4, &count);
break;
case nsXPTType::T_CHAR_STR:
case nsXPTType::T_WCHAR_STR:
case nsXPTType::T_IID:
case nsXPTType::T_ASTRING:
case nsXPTType::T_DOMSTRING:
case nsXPTType::T_UTF8STRING:
case nsXPTType::T_CSTRING:
case nsXPTType::T_PSTRING_SIZE_IS:
case nsXPTType::T_PWSTRING_SIZE_IS:
rv = out->Write("String", 6, &count);
break;
case nsXPTType::T_INTERFACE:
{
char* iface_name = nsnull;
rv = TypeInfo::GetInterfaceName(aIInfo, aMethodIndex, aParamInfo,
&iface_name);
if (NS_FAILED(rv) || !iface_name) {
rv = NS_ERROR_FAILURE;
break;
}
rv = out->Write(iface_name, strlen(iface_name), &count);
nsMemory::Free(iface_name);
break;
}
case nsXPTType::T_INTERFACE_IS:
rv = out->Write("nsISupports", 11, &count);
break;
case nsXPTType::T_VOID:
rv = out->Write("int", 3, &count);
break;
case nsXPTType::T_ARRAY:
{
// get array type
nsXPTType xpttype;
rv = aIInfo->GetTypeForParam(aMethodIndex, aParamInfo, 1, &xpttype);
if (NS_FAILED(rv))
break;
rv = WriteType(out, &xpttype, aIInfo, aMethodIndex, aParamInfo);
if (NS_FAILED(rv))
break;
rv = out->Write("[]", 2, &count);
break;
}
default:
fprintf(stderr, "WARNING: unexpected parameter type %d\n",
aType->TagPart());
return NS_ERROR_UNEXPECTED;
}
return rv;
}
};
void PrintUsage(char** argv)
{
static const char usage_str[] =
"Usage: %s -d path\n"
" -d output directory for Java interface files\n";
fprintf(stderr, usage_str, argv[0]);
}
int main(int argc, char** argv)
{
nsresult rv = NS_OK;
nsCOMPtr<nsILocalFile> output_dir;
// handle command line arguments
for (int i = 1; i < argc; i++) {
if (argv[i][0] != '-') {
rv = NS_ERROR_FAILURE;
break;
}
switch (argv[i][1]) {
case 'd': {
if (i + 1 == argc) {
fprintf(stderr, "ERROR: missing output directory after -d\n");
rv = NS_ERROR_FAILURE;
break;
}
// see if given path exists
output_dir = new nsLocalFile();
rv = output_dir->InitWithNativePath(nsDependentCString(argv[++i]));
PRBool val;
if (NS_FAILED(rv) || NS_FAILED(output_dir->Exists(&val)) || !val ||
NS_FAILED(output_dir->IsDirectory(&val)) || !val)
{
fprintf(stderr,
"ERROR: output directory doesn't exist / isn't a directory\n");
rv = NS_ERROR_FAILURE;
break;
}
break;
}
default: {
fprintf(stderr, "ERROR: unknown option %s\n", argv[i]);
rv = NS_ERROR_FAILURE;
break;
}
}
}
if (NS_FAILED(rv)) {
PrintUsage(argv);
return 1;
}
rv = NS_InitXPCOM2(nsnull, nsnull, nsnull);
NS_ENSURE_SUCCESS(rv, rv);
Generate gen(output_dir);
rv = gen.GenerateInterfaces();
NS_ShutdownXPCOM(nsnull);
return rv;
}

Просмотреть файл

@ -0,0 +1,64 @@
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Java XPCOM Bindings.
#
# The Initial Developer of the Original Code is
# IBM Corporation.
# Portions created by the Initial Developer are Copyright (C) 2005
# IBM Corporation. All Rights Reserved.
#
# Contributor(s):
# Javier Pedemonte (jhpedemonte@gmail.com)
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
MODULE = javaxpcom
MOZILLA_INTERNAL_API=1
REQUIRES = \
xpcom \
string \
necko \
$(NULL)
CPPSRCS = GenerateJavaInterfaces.cpp
SIMPLE_PROGRAMS = GenerateJavaInterfaces$(BIN_SUFFIX)
LIBS += \
$(LIBS_DIR) \
$(MOZ_COMPONENT_LIBS) \
$(NULL)
include $(topsrcdir)/config/rules.mk

Просмотреть файл

@ -45,10 +45,6 @@ include $(DEPTH)/config/autoconf.mk
MODULE = mimetype
XPIDL_MODULE = mimetype
JAVA_XPIDLSRCS = \
nsIMIMEInfo.idl \
$(NULL)
XPIDLSRCS = \
nsIMIMEService.idl \
nsIMIMEInfo.idl \

Просмотреть файл

@ -76,12 +76,6 @@ SDK_XPIDLSRCS = \
nsIWebProgressListener.idl \
$(NULL)
JAVA_XPIDLSRCS = \
nsIDownload.idl \
nsITransfer.idl \
nsIWebProgressListener2.idl \
$(NULL)
XPIDLSRCS = \
nsIContentHandler.idl \
nsIURILoader.idl \

Просмотреть файл

@ -122,11 +122,6 @@ EXPORTS = \
$(OSDIR)/nsOSHelperAppService.h \
$(NULL)
JAVA_XPIDLSRCS = \
nsIExternalHelperAppService.idl \
nsIHelperAppLauncherDialog.idl \
$(NULL)
XPIDLSRCS = \
nsCExternalHandlerService.idl \
nsIExternalProtocolService.idl \

Просмотреть файл

@ -77,11 +77,6 @@ ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
EXPORTS += nsWidgetAtoms.h nsWidgetAtomList.h
endif
JAVA_XPIDLSRCS = \
nsIAppShell.idl \
nsIBaseWindow.idl \
$(NULL)
XPIDLSRCS = \
nsIAppShell.idl \
nsIFilePicker.idl \

Просмотреть файл

@ -164,10 +164,6 @@ SDK_XPIDLSRCS = \
nsISupportsPrimitives.idl \
$(NULL)
JAVA_XPIDLSRCS = \
nsIArray.idl \
$(NULL)
EXPORTS := $(addprefix $(srcdir)/, $(EXPORTS))
# we don't want the shared lib, but we want to force the creation of a static lib.

Просмотреть файл

@ -49,9 +49,5 @@ ifndef WINCE
DIRS += xpidl
endif
ifdef MOZ_ENABLE_JAVAXPCOM
DIRS += $(DEPTH)/extensions/java/xpcom/tools/xpidl
endif
include $(topsrcdir)/config/rules.mk