зеркало из https://github.com/mozilla/pjs.git
Some cleanup, and update to new mozilla source. In particular:
- Removed #if 0 code in genproxy.c and elsewhere. - Used jlong_* macros for portability (and defined in xpjava.h if not elsewhere) - Commented out calls to PR_Atomic{In,De}crement in JSSample.cpp, and began to use "official" XPCOM macros. - Removed Java interfaces for test components; will be autogenerated by xpidl and/or genproxy. - Extend genproxy to generate interfaces. - Updated README with note on the jni.h problem
This commit is contained in:
Родитель
83853d3743
Коммит
566bb91973
|
@ -33,6 +33,10 @@ difficult, and
|
|||
1. Make sure MOZILLA_FIVE_HOME is set correctly, and that JDKHOME indicates
|
||||
a valid JDK 1.2 installation.
|
||||
|
||||
*IMPORTANT*: remove the jni.h, jni_md.h, and jri.h in mozilla/dist/bin,
|
||||
before compiling native code. Otherwise, the header
|
||||
mismatch will cause crashes in JNI code.
|
||||
|
||||
2. Insure that the following are in your LD_LIBRARY_PATH:
|
||||
|
||||
$MOZILLA_FIVE_HOME
|
||||
|
|
|
@ -1,90 +0,0 @@
|
|||
TODO
|
||||
====
|
||||
|
||||
(By no means complete ...)
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
-- *GET XPCTest WORKING*. For some reason, the JDK 1.2 JVM on Solaris
|
||||
won't load libxpcom.so correctly, even if it's on LD_LIBRARY_PATH. I
|
||||
have yet to confirm whether this is a problem on Linux or NT.
|
||||
[Done 13 Aug 1999]
|
||||
|
||||
-- Make Java compilation work correctly on Unix/Linux.
|
||||
|
||||
-- Better integration with Mozilla makefile/autoconf system.
|
||||
|
||||
-- Move XPCOM startup code to test programs.
|
||||
|
||||
-- Integrate into Java Plugin and test.
|
||||
|
||||
-- File and function renaming, to prevent conflicts and increase modularity.
|
||||
|
||||
|
||||
Registration and Activation
|
||||
---------------------------
|
||||
|
||||
-- Insure JNI libraries load and unload, even within JNI plugin
|
||||
|
||||
-- Derive proxy class from IID, and vice-versa
|
||||
|
||||
-- Generate static proxies (using genproxy)
|
||||
|
||||
-- Generate and load "on-the-fly" bytecode for proxy classes.
|
||||
|
||||
|
||||
Marshalling
|
||||
-----------
|
||||
|
||||
-- Verify nsID parameters are marshalled correctly.
|
||||
|
||||
-- Unwrap proxies used as "in" parameters.
|
||||
|
||||
-- Wrap "out" XPCOM objects in correct wrapper class. [dep: Proxy Generation]
|
||||
|
||||
-- Build C++ stubs for Java-implemented XPCOM objects. [big task?]
|
||||
|
||||
-- [Future] Allow mapping from native concrete type to Java types
|
||||
|
||||
-- [Future] Efficient handling of attributes and 0- or 1-arg methods.
|
||||
|
||||
-- [Future] Reflection API (if Java's is insufficient)
|
||||
|
||||
|
||||
NSRESULTs
|
||||
---------
|
||||
|
||||
-- Throw exceptions for error codes
|
||||
|
||||
-- Design and implement "success code mechanism", for single-threaded case
|
||||
|
||||
-- Store success codes per thread, and retrieve for current threads.
|
||||
|
||||
|
||||
API
|
||||
---
|
||||
|
||||
-- Write proxy for ns[I]ComponentManager, by hand. (For performance,
|
||||
and because of the overloaded methods and lack of XPT.)
|
||||
|
||||
-- Write proxy for ns[I]ServiceManager, similar to above.
|
||||
|
||||
-- Throw exceptions for unknown or missing proxy classes (and other errors).
|
||||
|
||||
-- Implement XPCOM identity rules
|
||||
|
||||
-- Document (including Javadoc)
|
||||
|
||||
|
||||
Memory Management
|
||||
-----------------
|
||||
|
||||
-- Insure that temporary heap memory (esp. strings and nsIDs) is
|
||||
recycled.
|
||||
|
||||
-- Insure reference-counting rules aren't violated.
|
||||
|
||||
-- Cache previously allocated wrapper objects, to prevent unnecessary
|
||||
allocation.
|
||||
|
|
@ -59,6 +59,28 @@ static inline void* ToPtr(jlong l) {
|
|||
return (void *)result;
|
||||
}
|
||||
|
||||
#undef DEBUG_GETSET_ID
|
||||
|
||||
#ifdef DEBUG_GETSET_ID
|
||||
static void GetClassName(char *namebuf, JNIEnv *env, jobject self, int len) {
|
||||
jclass clazz = env->GetObjectClass(self);
|
||||
jclass clazz_clazz = env->GetObjectClass(clazz);
|
||||
jmethodID nameID = env->GetMethodID(clazz_clazz, "getName", "()Ljava/lang/String;");
|
||||
jstring string = (jstring)env->CallObjectMethod(clazz, nameID);
|
||||
|
||||
jsize jstrlen = env->GetStringUTFLength(string);
|
||||
const char *utf = env->GetStringUTFChars(string, NULL);
|
||||
|
||||
if (jstrlen >= len) {
|
||||
jstrlen = len;
|
||||
}
|
||||
strncpy(namebuf, utf, jstrlen);
|
||||
namebuf[jstrlen] = '\0';
|
||||
|
||||
env->ReleaseStringUTFChars(string, utf);
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************** ID **************************/
|
||||
|
||||
jobject ID_NewJavaID(JNIEnv *env, const nsIID* iid) {
|
||||
|
@ -78,6 +100,14 @@ nsID *ID_GetNative(JNIEnv *env, jobject self) {
|
|||
jclass clazz = env->FindClass(ID_CLASS_NAME);
|
||||
jfieldID nsidptrID = env->GetFieldID(clazz, ID_FIELD_NAME, ID_FIELD_TYPE);
|
||||
|
||||
#ifdef DEBUG_GETSET_ID
|
||||
char classname[128];
|
||||
|
||||
GetClassName(classname, env, self, sizeof(classname));
|
||||
fprintf(stderr, "ID_GetNative: self instanceof %s\n", classname);
|
||||
fflush(stderr);
|
||||
#endif
|
||||
|
||||
assert(env->IsInstanceOf(self, clazz));
|
||||
|
||||
jlong nsidptr = env->GetLongField(self, nsidptrID);
|
||||
|
@ -89,6 +119,14 @@ void ID_SetNative(JNIEnv *env, jobject self, nsID *id) {
|
|||
jclass clazz = env->FindClass(ID_CLASS_NAME);
|
||||
jfieldID nsidptrID = env->GetFieldID(clazz, ID_FIELD_NAME, ID_FIELD_TYPE);
|
||||
|
||||
#ifdef DEBUG_GETSET_ID
|
||||
char classname[128];
|
||||
|
||||
GetClassName(classname, env, self, sizeof(classname));
|
||||
fprintf(stderr, "ID_SetNative: self instanceof %s\n", classname);
|
||||
fflush(stderr);
|
||||
#endif
|
||||
|
||||
assert(env->IsInstanceOf(self, clazz));
|
||||
|
||||
jlong nsidptr = ToJLong(id);
|
||||
|
@ -101,6 +139,17 @@ jboolean ID_IsEqual(JNIEnv *env, jobject self, jobject other) {
|
|||
jclass clazz = env->FindClass(ID_CLASS_NAME);
|
||||
jfieldID nsidptrID = env->GetFieldID(clazz, ID_FIELD_NAME, ID_FIELD_TYPE);
|
||||
|
||||
#ifdef DEBUG_GETSET_ID
|
||||
char classname[128];
|
||||
|
||||
GetClassName(classname, env, self, sizeof(classname));
|
||||
fprintf(stderr, "ID_IsEqual: self instanceof %s\n", classname);
|
||||
|
||||
GetClassName(classname, env, other, sizeof(classname));
|
||||
fprintf(stderr, "ID_IsEqual: other instanceof %s\n", classname);
|
||||
fflush(stderr);
|
||||
#endif
|
||||
|
||||
assert(env->IsInstanceOf(self, clazz));
|
||||
|
||||
if (other != NULL && env->IsInstanceOf(other, clazz)) {
|
||||
|
|
|
@ -720,10 +720,11 @@ extern jobject VariantToJObject(JNIEnv *env, const nsXPTCVariant *current) {
|
|||
nsresult InitXPCOM() {
|
||||
nsresult res;
|
||||
|
||||
#ifdef DEBUG_frankm
|
||||
cerr << "Initializing XPCOM" << endl;
|
||||
#endif
|
||||
|
||||
// Autoregistration happens here. The rest of RegisterComponent() calls should happen
|
||||
// only for dlls not in the components directory.
|
||||
// Autoregistration magic. Boogeda boogeda.
|
||||
|
||||
nsComponentManager::AutoRegister(nsIComponentManager::NS_Startup, nsnull);
|
||||
|
||||
|
@ -746,7 +747,9 @@ nsresult InitXPCOM() {
|
|||
|
||||
// Get InterfaceInfoManager
|
||||
|
||||
#ifdef DEBUG_frankm
|
||||
cerr << "Getting InterfaceInfoManager" << endl;
|
||||
#endif
|
||||
|
||||
interfaceInfoManager = XPTI_GetInterfaceInfoManager();
|
||||
|
||||
|
@ -755,6 +758,10 @@ nsresult InitXPCOM() {
|
|||
return res;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_frankm
|
||||
cerr << "XPCOM Initialized" << endl;
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,6 +71,11 @@ extern nsID* ID_GetNative(JNIEnv *env, jobject self);
|
|||
extern void ID_SetNative(JNIEnv *env, jobject self, nsID* id);
|
||||
extern jboolean ID_IsEqual(JNIEnv *env, jobject self, jobject other);
|
||||
|
||||
#ifndef jlong_L2I
|
||||
# define jlong_L2I(_i, _l) ((_i) = (_l))
|
||||
# define jlong_I2L(_l, _i) ((_l) = (_i))
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -30,67 +30,8 @@ public:
|
|||
// nsISupports methods
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
/* void PrintStats (); */
|
||||
NS_IMETHOD PrintStats();
|
||||
|
||||
/* attribute long someInt; */
|
||||
NS_IMETHOD GetSomeInt(PRInt32 *aSomeInt);
|
||||
NS_IMETHOD SetSomeInt(PRInt32 aSomeInt);
|
||||
|
||||
/* attribute boolean someBool; */
|
||||
NS_IMETHOD GetSomeBool(PRBool *aSomeBool);
|
||||
NS_IMETHOD SetSomeBool(PRBool aSomeBool);
|
||||
|
||||
/* readonly attribute long roInt; */
|
||||
NS_IMETHOD GetRoInt(PRInt32 *aRoInt);
|
||||
|
||||
/* attribute double someDouble; */
|
||||
NS_IMETHOD GetSomeDouble(double *aSomeDouble);
|
||||
NS_IMETHOD SetSomeDouble(double aSomeDouble);
|
||||
|
||||
/* attribute string someName; */
|
||||
NS_IMETHOD GetSomeName(char * *aSomeName);
|
||||
NS_IMETHOD SetSomeName(char * aSomeName);
|
||||
|
||||
/* readonly attribute string roString; */
|
||||
NS_IMETHOD GetRoString(char * *aRoString);
|
||||
|
||||
/* void TakeInt (in long anInt); */
|
||||
NS_IMETHOD TakeInt(PRInt32 anInt);
|
||||
|
||||
/* long GiveInt (); */
|
||||
NS_IMETHOD GiveInt(PRInt32 *_retval);
|
||||
|
||||
/* long GiveAndTake (inout long anInt); */
|
||||
NS_IMETHOD GiveAndTake(PRInt32 *anInt, PRInt32 *_retval);
|
||||
|
||||
/* string TooManyArgs (in short oneInt, in short twoInt, inout long redInt, out short blueInt, in double orNothing, in long johnSilver, in boolean algebra); */
|
||||
NS_IMETHOD TooManyArgs(PRInt16 oneInt,
|
||||
PRInt16 twoInt,
|
||||
PRInt32 *redInt,
|
||||
PRInt16 *blueInt,
|
||||
double orNothing,
|
||||
PRInt64 johnSilver,
|
||||
PRBool algebra,
|
||||
char **_retval);
|
||||
|
||||
/* string CatStrings (in string str1, in string str2); */
|
||||
NS_IMETHOD CatStrings(const char *str1, const char *str2, char **_retval);
|
||||
|
||||
/* void AppendString (inout string str1, in string str2); */
|
||||
NS_IMETHOD AppendString(char **str1, const char *str2);
|
||||
|
||||
/* JSIComplex NewComplex (in long complex1, in long complex2); */
|
||||
NS_IMETHOD NewComplex(PRInt32 aReal, PRInt32 aImaginary, JSIComplex **_retval);
|
||||
|
||||
/* JSIComplex AddComplex (in JSIComplex complex1, in JSIComplex complex2); */
|
||||
NS_IMETHOD AddComplex(JSIComplex *complex1, JSIComplex *complex2, JSIComplex **_retval);
|
||||
|
||||
/* void AddInPlace (inout JSIComplex complex1, in JSIComplex complex2); */
|
||||
NS_IMETHOD AddInPlace(JSIComplex **complex1, JSIComplex *complex2);
|
||||
|
||||
/* long AddTwoInts(int long complex1, in JSIComplex complex2); */
|
||||
NS_IMETHOD AddTwoInts(PRInt32 int1, PRInt32 int2, PRInt32 *_retval);
|
||||
// JSISample methods
|
||||
NS_DECL_JSISAMPLE
|
||||
|
||||
private:
|
||||
/* attribute long someInt; */
|
||||
|
@ -113,14 +54,8 @@ private:
|
|||
};
|
||||
|
||||
// Globals, need to check if safe to unload module
|
||||
static PRInt32 gLockCnt = 0;
|
||||
static PRInt32 gInstanceCnt = 0;
|
||||
|
||||
// Define constants for easy use
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIFactoryIID, NS_IFACTORY_IID);
|
||||
static NS_DEFINE_IID(kISampleIID, JSISAMPLE_IID);
|
||||
static NS_DEFINE_IID(kIComplexIID, JSICOMPLEX_IID);
|
||||
//static PRInt32 gLockCnt = 0;
|
||||
// static PRInt32 gInstanceCnt = 0;
|
||||
|
||||
static NS_DEFINE_CID(kSampleCID, JS_SAMPLE_CID);
|
||||
|
||||
|
@ -141,13 +76,8 @@ public:
|
|||
// nsISupports methods
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
/* attribute long real; */
|
||||
NS_IMETHOD GetReal(PRInt32 *aReal);
|
||||
NS_IMETHOD SetReal(PRInt32 aReal);
|
||||
|
||||
/* attribute long imaginary; */
|
||||
NS_IMETHOD GetImaginary(PRInt32 *aImaginary);
|
||||
NS_IMETHOD SetImaginary(PRInt32 aImaginary);
|
||||
// nsISupports methods
|
||||
NS_DECL_JSICOMPLEX
|
||||
|
||||
private:
|
||||
PRInt32 real_;
|
||||
|
@ -182,7 +112,7 @@ JSSample::JSSample()
|
|||
{
|
||||
// Zero reference counter
|
||||
NS_INIT_ISUPPORTS();
|
||||
PR_AtomicIncrement(&gInstanceCnt);
|
||||
// PR_AtomicIncrement(&gInstanceCnt);
|
||||
}
|
||||
|
||||
JSSample::~JSSample()
|
||||
|
@ -190,40 +120,13 @@ JSSample::~JSSample()
|
|||
// Make sure there are no dangling pointers to us,
|
||||
// debug only
|
||||
NS_ASSERTION(mRefCnt == 0,"Wrong ref count");
|
||||
PR_AtomicDecrement(&gInstanceCnt);
|
||||
// PR_AtomicDecrement(&gInstanceCnt);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP JSSample::QueryInterface(const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
if (aResult == NULL) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aResult = NULL;
|
||||
// Use the official macros to implement nsISupports
|
||||
NS_IMPL_ISUPPORTS1(JSSample, JSISample)
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aResult = NS_STATIC_CAST(nsISupports*, this);
|
||||
} else if (aIID.Equals(kISampleIID)) {
|
||||
*aResult = NS_STATIC_CAST(JSISample*, this);
|
||||
}
|
||||
else {
|
||||
*aResult = nsnull;
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
|
||||
// Add reference counter for outgoing pointer
|
||||
NS_ADDREF(NS_REINTERPRET_CAST(nsISupports*,*aResult));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Use the convenience macros to implement reference counting.
|
||||
// They simply add or decrement the reference counter variable,
|
||||
// Release also deletes this object if the counter reaches zero.
|
||||
NS_IMPL_ADDREF(JSSample)
|
||||
NS_IMPL_RELEASE(JSSample)
|
||||
|
||||
NS_IMETHODIMP JSSample::PrintStats()
|
||||
{
|
||||
|
@ -452,7 +355,7 @@ JSComplex::JSComplex()
|
|||
{
|
||||
// Zero reference counter
|
||||
NS_INIT_ISUPPORTS();
|
||||
PR_AtomicIncrement(&gInstanceCnt);
|
||||
// PR_AtomicIncrement(&gInstanceCnt);
|
||||
}
|
||||
|
||||
JSComplex::JSComplex(int aReal, int aImaginary) :
|
||||
|
@ -460,7 +363,7 @@ JSComplex::JSComplex(int aReal, int aImaginary) :
|
|||
{
|
||||
// Zero reference counter
|
||||
NS_INIT_ISUPPORTS();
|
||||
PR_AtomicIncrement(&gInstanceCnt);
|
||||
// PR_AtomicIncrement(&gInstanceCnt);
|
||||
}
|
||||
|
||||
JSComplex::~JSComplex()
|
||||
|
@ -468,40 +371,13 @@ JSComplex::~JSComplex()
|
|||
// Make sure there are no dangling pointers to us,
|
||||
// debug only
|
||||
NS_ASSERTION(mRefCnt == 0,"Wrong ref count");
|
||||
PR_AtomicDecrement(&gInstanceCnt);
|
||||
// PR_AtomicDecrement(&gInstanceCnt);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP JSComplex::QueryInterface(const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
if (aResult == NULL) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aResult = NULL;
|
||||
// Use the official macros to implement nsISupports
|
||||
NS_IMPL_ISUPPORTS1(JSComplex, JSIComplex)
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
*aResult = NS_STATIC_CAST(nsISupports*, this);
|
||||
} else if (aIID.Equals(kIComplexIID)) {
|
||||
*aResult = NS_STATIC_CAST(JSIComplex*, this);
|
||||
}
|
||||
else {
|
||||
*aResult = nsnull;
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
|
||||
// Add reference counter for outgoing pointer
|
||||
NS_ADDREF(NS_REINTERPRET_CAST(nsISupports*,*aResult));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Use the convenience macros to implement reference counting.
|
||||
// They simply add or decrement the reference counter variable,
|
||||
// Release also deletes this object if the counter reaches zero.
|
||||
NS_IMPL_ADDREF(JSComplex)
|
||||
NS_IMPL_RELEASE(JSComplex)
|
||||
|
||||
/* attribute long real; */
|
||||
NS_IMETHODIMP JSComplex::GetReal(PRInt32 *aReal) {
|
||||
|
@ -539,7 +415,7 @@ JSSampleFactory::JSSampleFactory()
|
|||
{
|
||||
// Zero reference counter
|
||||
NS_INIT_ISUPPORTS();
|
||||
PR_AtomicIncrement(&gInstanceCnt);
|
||||
// PR_AtomicIncrement(&gInstanceCnt);
|
||||
}
|
||||
|
||||
JSSampleFactory::~JSSampleFactory()
|
||||
|
@ -547,42 +423,12 @@ JSSampleFactory::~JSSampleFactory()
|
|||
// Make sure there are no dangling pointers to us,
|
||||
// debug only
|
||||
NS_ASSERTION(mRefCnt == 0,"Wrong ref count");
|
||||
PR_AtomicDecrement(&gInstanceCnt);
|
||||
// PR_AtomicDecrement(&gInstanceCnt);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP JSSampleFactory::QueryInterface(const nsIID &aIID,
|
||||
void **aResult)
|
||||
{
|
||||
if (!aResult) {
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
}
|
||||
|
||||
// Always NULL result, in case of failure
|
||||
*aResult = nsnull;
|
||||
|
||||
if (aIID.Equals(kISupportsIID)) {
|
||||
// Every interface supports nsISupports
|
||||
*aResult = NS_STATIC_CAST(nsISupports*,this);
|
||||
} else if (aIID.Equals(kIFactoryIID)) {
|
||||
*aResult = NS_STATIC_CAST(nsIFactory*,this);
|
||||
} else {
|
||||
// We do not support this interface.
|
||||
// Null result, and return error.
|
||||
*aResult = nsnull;
|
||||
return NS_ERROR_NO_INTERFACE;
|
||||
}
|
||||
|
||||
// Add reference counter for outgoing pointer
|
||||
NS_ADDREF(NS_REINTERPRET_CAST(nsISupports*,*aResult));
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// Use the convenience macros to implement reference counting.
|
||||
// They simply add or decrement the reference counter variable,
|
||||
// Release also deletes this object if the counter reaches zero.
|
||||
NS_IMPL_ADDREF(JSSampleFactory)
|
||||
NS_IMPL_RELEASE(JSSampleFactory)
|
||||
// Use the official macros to implement nsISupports
|
||||
NS_IMPL_ISUPPORTS1(JSSampleFactory, nsIFactory)
|
||||
|
||||
|
||||
NS_IMETHODIMP JSSampleFactory::CreateInstance(nsISupports *aOuter,
|
||||
|
@ -614,9 +460,9 @@ NS_IMETHODIMP JSSampleFactory::CreateInstance(nsISupports *aOuter,
|
|||
NS_IMETHODIMP JSSampleFactory::LockFactory(PRBool aLock)
|
||||
{
|
||||
if (aLock) {
|
||||
PR_AtomicIncrement(&gLockCnt);
|
||||
// PR_AtomicIncrement(&gLockCnt);
|
||||
} else {
|
||||
PR_AtomicDecrement(&gLockCnt);
|
||||
// PR_AtomicDecrement(&gLockCnt);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
@ -654,7 +500,7 @@ extern "C" {
|
|||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
nsresult rv = inst->QueryInterface(kIFactoryIID,
|
||||
nsresult rv = inst->QueryInterface(NS_GET_IID(nsIFactory),
|
||||
(void **) aResult);
|
||||
|
||||
if (NS_FAILED(rv)) {
|
||||
|
@ -665,7 +511,8 @@ extern "C" {
|
|||
}
|
||||
|
||||
NS_EXPORT PRBool NSCanUnload(nsISupports* serviceMgr) {
|
||||
return PRBool(gInstanceCnt == 0 && gLockCnt == 0);
|
||||
return PR_FALSE;
|
||||
// return PRBool(gInstanceCnt == 0 && gLockCnt == 0);
|
||||
}
|
||||
|
||||
NS_EXPORT nsresult NSRegisterSelf(nsISupports* serviceMgr,
|
||||
|
|
|
@ -10,9 +10,9 @@ SHLIB_FLAGS=-fpic
|
|||
SHLIB_LDFLAGS=-shared
|
||||
DEFINES=-DXP_UNIX
|
||||
INCLUDE=-I$(MOZILLA)/dist/include -I$(MOZILLA)/xpcom/public -I../src -I$(JDKHOME)/include -I$(JDKHOME)/include/solaris -I$(JDKHOME)/include/linux
|
||||
#LIBS=-L$(MOZILLA)/dist/lib -lxptinfo -lxptcmd -lxptcall -lxpt -lxpcom -lxp -lreg -lplds3 -lplc3 -lnspr3 -lstdc++
|
||||
LIBS=-L$(MOZILLA)/dist/lib -lxptinfo -lxptcmd -lxptcall -lxpt -lxpcom -lxp -lplds3 -lplc3 -lnspr3 -lstdc++
|
||||
XPTDIR=$(MOZILLA)/dist/bin/components
|
||||
LIBS=-L$(MOZILLA)/dist/lib -lxptinfo -lxptcmd -lxptcall -lxpt -lxpcom -lplds3 -lplc3 -lnspr3
|
||||
|
||||
COMPDIR=$(MOZILLA)/dist/bin/components
|
||||
|
||||
XPIDL=$(MOZILLA)/dist/bin/xpidl
|
||||
|
||||
|
@ -25,16 +25,13 @@ CLASSDIR=$(MOZILLA)/dist/classes
|
|||
|
||||
TEST_CLASSES=XPCTest.class
|
||||
|
||||
PROXY_CLASSES=org/mozilla/xpcom/JSISample__Proxy.class \
|
||||
org/mozilla/xpcom/JSIComplex__Proxy.class
|
||||
|
||||
PROXY_SRCS=JSISample__Proxy.java \
|
||||
JSIComplex__Proxy.java
|
||||
PROXY_JAR=sample.jar
|
||||
PROXY_DIR=_genproxy
|
||||
|
||||
|
||||
.SUFFIXES: .java .class .cpp .o
|
||||
|
||||
all: sample xptest $(TEST_CLASSES)
|
||||
all: sample xptest $(TEST_CLASSES) $(PROXY_JAR)
|
||||
|
||||
#
|
||||
# Build class files.
|
||||
|
@ -52,7 +49,7 @@ all: sample xptest $(TEST_CLASSES)
|
|||
#
|
||||
# Sample XPCOM module.
|
||||
#
|
||||
sample: JSISample.h libsample.so $(XPTDIR)/JSISample.xpt
|
||||
sample: JSISample.h $(COMPDIR)/libxpjtest.so $(COMPDIR)/xpjtest.xpt
|
||||
|
||||
#
|
||||
# Build sample header & typelib
|
||||
|
@ -62,15 +59,18 @@ JSISample.cpp: JSISample.h
|
|||
JSISample.h: JSISample.idl
|
||||
$(XPIDL) -w -v -m header -I $(MOZILLA)/dist/idl JSISample.idl
|
||||
|
||||
$(XPTDIR)/JSISample.xpt: JSISample.idl
|
||||
$(XPIDL) -w -v -m typelib -o $(XPTDIR)/JSISample -I $(MOZILLA)/dist/idl JSISample.idl
|
||||
$(COMPDIR)/xpjtest.xpt: JSISample.idl
|
||||
$(XPIDL) -w -v -m typelib -o $(COMPDIR)/xpjtest -I $(MOZILLA)/dist/idl JSISample.idl
|
||||
|
||||
#
|
||||
# Sample object shared library
|
||||
#
|
||||
libsample.so: JSISample.h JSSample.o
|
||||
$(CPP) $(SHLIB_LDFLAGS) $(LIBS) -o libsample.so JSSample.o
|
||||
chmod +x libsample.so
|
||||
libxpjtest.so: JSISample.h JSSample.o
|
||||
$(CPP) $(SHLIB_LDFLAGS) -L$(MOZILLA)/dist/lib -lxpcom -o libxpjtest.so JSSample.o
|
||||
chmod +x libxpjtest.so
|
||||
|
||||
$(COMPDIR)/libxpjtest.so: libxpjtest.so
|
||||
../../../config/nsinstall -R -m 555 libxpjtest.so $(COMPDIR)
|
||||
|
||||
#
|
||||
# C++ test program
|
||||
|
@ -80,9 +80,12 @@ xptest: xptest.o ../src/libxpjava.so
|
|||
|
||||
xptest.cpp: ../src/xpjava.h
|
||||
|
||||
#$(PROXY_CLASSES): $(GENPROXY) $(XPTDIR)/JSISample.xpt
|
||||
# genproxy $(XPTDIR)/JSISample.xpt
|
||||
# $(JAVAC) -g -d . -classpath $(CLASSDIR):. *.java
|
||||
$(PROXY_JAR): $(GENPROXY) $(COMPDIR)/xpjtest.xpt
|
||||
- mkdir $(PROXY_DIR)
|
||||
$(GENPROXY) -d $(PROXY_DIR) $(COMPDIR)/xpjtest.xpt
|
||||
$(GENPROXY) -i -d $(PROXY_DIR) $(COMPDIR)/xpjtest.xpt
|
||||
$(JAVAC) -g -d $(PROXY_DIR) -classpath $(CLASSDIR):. $(PROXY_DIR)/*.java
|
||||
(cd $(PROXY_DIR); jar cf ../$(PROXY_JAR) org)
|
||||
|
||||
clean:
|
||||
$(RM) *.o *.so core xptest $(XPTDIR)/JSISample.xpt JSISample.h $(TEST_CLASSES) $(PROXY_SRCS) $(PROXY_CLASSES)
|
||||
$(RM) -r *.o *.so core xptest $(COMPDIR)/libxpjtest.so $(COMPDIR)/xpjtest.xpt JSISample.h $(TEST_CLASSES) $(PROXY_JAR) $(PROXY_DIR)
|
||||
|
|
|
@ -13,11 +13,10 @@
|
|||
*/
|
||||
|
||||
import java.util.Vector;
|
||||
import java.lang.reflect.Method;
|
||||
import org.mozilla.xpcom.*;
|
||||
|
||||
public class XPCTest {
|
||||
private static boolean didRegister = false;
|
||||
|
||||
static ComObject CreateSampleInstance() {
|
||||
nsID kSampleCID =
|
||||
new nsID("d3944dd0-ae1a-11d1-b66c-00805f8a2676");
|
||||
|
@ -26,16 +25,7 @@ public class XPCTest {
|
|||
new nsID("57ecad90-ae1a-11d1-b66c-00805f8a2676");
|
||||
|
||||
|
||||
if (!didRegister) {
|
||||
XPComUtilities.RegisterComponent(kSampleCID,
|
||||
"JSSample",
|
||||
"component://javasoft/sample",
|
||||
"libsample.so",
|
||||
false,
|
||||
false);
|
||||
didRegister = true;
|
||||
}
|
||||
|
||||
// XXX: convert to nsIComponentManager calls
|
||||
return (ComObject)XPComUtilities.CreateInstance(kSampleCID,
|
||||
null,
|
||||
kISampleIID);
|
||||
|
@ -44,13 +34,9 @@ public class XPCTest {
|
|||
public static void main(String[] argv) {
|
||||
String command = "PrintStats";
|
||||
int cmdOffset = -1;
|
||||
boolean useXPCMethod = true;
|
||||
|
||||
try {
|
||||
// KLUDGE: load libraries
|
||||
//System.out.println(System.getProperty("java.library.path"));
|
||||
//System.loadLibrary("plds3");
|
||||
//System.loadLibrary("xpcom");
|
||||
|
||||
Object[] params = null;
|
||||
|
||||
// Process arguments
|
||||
|
@ -58,12 +44,25 @@ public class XPCTest {
|
|||
params = new Object[0];
|
||||
}
|
||||
else {
|
||||
command = argv[0];
|
||||
int argi = 0;
|
||||
while (argv[argi].charAt(0) == '-') {
|
||||
switch(argv[argi].charAt(1)) {
|
||||
case 'r':
|
||||
useXPCMethod = false;
|
||||
break;
|
||||
case 'x':
|
||||
useXPCMethod = true;
|
||||
break;
|
||||
}
|
||||
argi++;
|
||||
}
|
||||
|
||||
command = argv[argi++];
|
||||
if (Character.isDigit(command.charAt(0))) {
|
||||
cmdOffset = Integer.parseInt(command);
|
||||
}
|
||||
|
||||
params = paramArray(argv, 1);
|
||||
params = paramArray(argv, argi);
|
||||
}
|
||||
|
||||
ComObject sample = CreateSampleInstance();
|
||||
|
@ -83,11 +82,24 @@ public class XPCTest {
|
|||
cmdOffset,
|
||||
params);
|
||||
}
|
||||
else {
|
||||
else if (useXPCMethod) {
|
||||
XPCMethod method = new XPCMethod(kISampleIID, command);
|
||||
|
||||
method.invoke(sample, params);
|
||||
}
|
||||
else {
|
||||
Method[] methods = sample.getClass().getMethods();
|
||||
|
||||
for (int i = 0; i < methods.length; i++) {
|
||||
if (methods[i].getName().equals(command)) {
|
||||
Object retval =
|
||||
methods[i].invoke(sample, params);
|
||||
System.out.print("Retval: "); // DEBUG
|
||||
System.out.println(retval); // DEBUG
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get "out" parameters and return value
|
||||
System.out.print("Results: "); // DEBUG
|
||||
|
@ -160,6 +172,10 @@ public class XPCTest {
|
|||
case '0':
|
||||
vector.addElement(null);
|
||||
break;
|
||||
case '@':
|
||||
argi++;
|
||||
vector.addElement(new nsID(argv[argi]));
|
||||
break;
|
||||
case 'z':
|
||||
argi++;
|
||||
vector.addElement(Boolean.valueOf(argv[argi]));
|
||||
|
|
|
@ -38,24 +38,25 @@ static NS_DEFINE_CID(kSampleCID, JS_SAMPLE_CID);
|
|||
static NS_DEFINE_IID(kAllocatorCID, NS_ALLOCATOR_CID);
|
||||
|
||||
#ifdef XP_PC
|
||||
#define XPCOM_DLL "xpcom32.dll"
|
||||
#define SAMPLE_DLL "sampl32.dll"
|
||||
#define XPCOM_DLL "xpcom.dll"
|
||||
#define SAMPLE_DLL "xpjtest.dll"
|
||||
#else
|
||||
#ifdef XP_MAC
|
||||
#define XPCOM_DLL "XPCOM_DLL"
|
||||
#define SAMPLE_DLL "SAMPL_DLL"
|
||||
#define SAMPLE_DLL "XPJTEST_DLL"
|
||||
#else
|
||||
#define XPCOM_DLL "libxpcom.so"
|
||||
#define SAMPLE_DLL "libsample.so"
|
||||
#define SAMPLE_DLL "libxpjtest.so"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
nsXPTCVariant *ParamsFromArgv(const nsXPTMethodInfo *mi,
|
||||
void ParamsFromArgv(nsXPTCVariant *result,
|
||||
const nsXPTMethodInfo *mi,
|
||||
int argi, int argc, char **argv) {
|
||||
uint8 paramcount = mi->GetParamCount();
|
||||
|
||||
nsXPTCVariant *result = new nsXPTCVariant[paramcount];
|
||||
memset(result, 0, sizeof(nsXPTCVariant) * paramcount);
|
||||
|
||||
for (int i = 0; i < paramcount; i++) {
|
||||
nsXPTParamInfo param = mi->GetParam(i);
|
||||
|
@ -120,7 +121,6 @@ nsXPTCVariant *ParamsFromArgv(const nsXPTMethodInfo *mi,
|
|||
break;
|
||||
case nsXPTType::T_CHAR_STR:
|
||||
result[i].val.p = argv[argi];
|
||||
#if 0
|
||||
// Copying every time would be wasteful
|
||||
if (param.IsOut()) {
|
||||
char *tmpstr = new char[strlen(argv[argi]) + 1];
|
||||
|
@ -128,7 +128,6 @@ nsXPTCVariant *ParamsFromArgv(const nsXPTMethodInfo *mi,
|
|||
result[i].val.p = tmpstr;
|
||||
result[i].flags |= nsXPTCVariant::VAL_IS_OWNED;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case nsXPTType::T_VOID:
|
||||
case nsXPTType::T_IID:
|
||||
|
@ -220,21 +219,6 @@ int main(int argc, char **argv)
|
|||
// Initialize XPCOM
|
||||
InitXPCOM();
|
||||
|
||||
// Register Factory
|
||||
cerr << "Registering Sample Factory" << endl;
|
||||
|
||||
res = nsComponentManager::RegisterComponent(kSampleCID,
|
||||
"JSSample",
|
||||
"component://javasoft/sample",
|
||||
SAMPLE_DLL,
|
||||
PR_FALSE,
|
||||
PR_FALSE);
|
||||
|
||||
if (NS_FAILED(res)) {
|
||||
cerr << "Failed to register factory" << endl;
|
||||
return res;
|
||||
}
|
||||
|
||||
// Create Instance
|
||||
res = nsComponentManager::CreateInstance(kSampleCID,
|
||||
nsnull,
|
||||
|
@ -280,7 +264,14 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
// Translate and marshall arguments
|
||||
nsXPTCVariant *params = ParamsFromArgv(mi, 2, argc, argv);
|
||||
nsXPTCVariant params[32];
|
||||
|
||||
if (paramcount > (sizeof(params)/sizeof(nsXPTCVariant))) {
|
||||
cerr << "Too Many Params" << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
ParamsFromArgv(params, mi, 2, argc, argv);
|
||||
|
||||
cerr << "Arguments are: " << endl;
|
||||
|
||||
|
|
|
@ -51,7 +51,8 @@ PRBool
|
|||
GenproxyClass(FILE *out,
|
||||
XPTCursor *cursor,
|
||||
XPTInterfaceDirectoryEntry *ide,
|
||||
XPTHeader *header);
|
||||
XPTHeader *header,
|
||||
PRBool iface);
|
||||
|
||||
PRBool GenproxyMethodPrototype(FILE *out,
|
||||
XPTHeader *header,
|
||||
|
@ -73,7 +74,7 @@ GenproxyGetStringForRefType(XPTHeader *header, XPTTypeDescriptor *td,
|
|||
|
||||
static void
|
||||
genproxy_usage(char *argv[]) {
|
||||
fprintf(stdout, "Usage: %s [-v] <filename.xpt>\n"
|
||||
fprintf(stdout, "Usage: %s [-v] [-i] <filename.xpt>\n"
|
||||
" -v verbose mode\n", argv[0]);
|
||||
}
|
||||
|
||||
|
@ -86,7 +87,7 @@ static int mac_get_args(char*** argv)
|
|||
|
||||
*argv = args;
|
||||
|
||||
printf("choose an .xpt file to dump.\n");
|
||||
printf("choose an .xpt file to parse.\n");
|
||||
|
||||
StandardGetFile(NULL, 0, NULL, &reply);
|
||||
if (reply.sfGood && !reply.sfIsFolder) {
|
||||
|
@ -135,45 +136,48 @@ int
|
|||
main(int argc, char **argv)
|
||||
{
|
||||
PRBool verbose_mode = PR_FALSE;
|
||||
PRBool interface_mode = PR_FALSE;
|
||||
PRBool bytecode_mode = PR_FALSE;
|
||||
XPTState *state;
|
||||
XPTCursor curs, *cursor = &curs;
|
||||
XPTHeader *header;
|
||||
size_t flen;
|
||||
char *name;
|
||||
const char *dirname = NULL;
|
||||
char *whole;
|
||||
FILE *in;
|
||||
FILE *out;
|
||||
int i;
|
||||
int c;
|
||||
|
||||
#ifdef XP_MAC
|
||||
if (argc == 0 || argv == NULL)
|
||||
argc = mac_get_args(&argv);
|
||||
#endif
|
||||
|
||||
switch (argc) {
|
||||
case 2:
|
||||
if (argv[1][0] == '-') {
|
||||
genproxy_usage(argv);
|
||||
return 1;
|
||||
}
|
||||
name = argv[1];
|
||||
flen = get_file_length(name);
|
||||
in = fopen(name, "rb");
|
||||
break;
|
||||
case 3:
|
||||
while ((c = getopt(argc, argv, "vibd:")) != EOF) {
|
||||
switch (c) {
|
||||
case 'v':
|
||||
verbose_mode = PR_TRUE;
|
||||
if (argv[1][0] != '-' || argv[1][1] != 'v') {
|
||||
break;
|
||||
case 'i':
|
||||
interface_mode = PR_TRUE;
|
||||
break;
|
||||
case 'b':
|
||||
bytecode_mode = PR_TRUE;
|
||||
break;
|
||||
case 'd':
|
||||
dirname = optarg;
|
||||
break;
|
||||
case '?':
|
||||
genproxy_usage(argv);
|
||||
return 1;
|
||||
}
|
||||
name = argv[2];
|
||||
}
|
||||
|
||||
name = argv[optind];
|
||||
flen = get_file_length(name);
|
||||
in = fopen(name, "rb");
|
||||
break;
|
||||
default:
|
||||
genproxy_usage(argv);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!in) {
|
||||
perror("FAILED: fopen");
|
||||
|
@ -215,12 +219,29 @@ main(int argc, char **argv)
|
|||
XPTInterfaceDirectoryEntry *ide = &header->interface_directory[i];
|
||||
char javaname[256];
|
||||
|
||||
javaname[0] = 0;
|
||||
|
||||
if (ide->interface_descriptor == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
strcpy(javaname, ide->name);
|
||||
/* XXX: is this XP? */
|
||||
if (dirname != NULL) {
|
||||
int len;
|
||||
strcpy(javaname, dirname);
|
||||
len = strlen(javaname);
|
||||
if (javaname[len - 1] != '/') {
|
||||
javaname[len] = '/';
|
||||
javaname[len+1] = 0;
|
||||
}
|
||||
}
|
||||
strcat(javaname, ide->name);
|
||||
if (interface_mode) {
|
||||
strcat(javaname, ".java");
|
||||
}
|
||||
else {
|
||||
strcat(javaname, "__Proxy.java");
|
||||
}
|
||||
|
||||
out = fopen(javaname, "w");
|
||||
|
||||
|
@ -229,7 +250,7 @@ main(int argc, char **argv)
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (!GenproxyClass(out, cursor, ide, header)) {
|
||||
if (!GenproxyClass(out, cursor, ide, header, interface_mode)) {
|
||||
return PR_FALSE;
|
||||
perror("FAILED: Cannot print interface");
|
||||
return 1;
|
||||
|
@ -272,15 +293,28 @@ classname_iid_define(const char *className)
|
|||
return result;
|
||||
}
|
||||
|
||||
static void
|
||||
print_IID(struct nsID *iid, FILE *file)
|
||||
{
|
||||
fprintf(file, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
(PRUint32) iid->m0, (PRUint32) iid->m1,(PRUint32) iid->m2,
|
||||
(PRUint32) iid->m3[0], (PRUint32) iid->m3[1],
|
||||
(PRUint32) iid->m3[2], (PRUint32) iid->m3[3],
|
||||
(PRUint32) iid->m3[4], (PRUint32) iid->m3[5],
|
||||
(PRUint32) iid->m3[6], (PRUint32) iid->m3[7]);
|
||||
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyClass(FILE *out,
|
||||
XPTCursor *cursor,
|
||||
XPTInterfaceDirectoryEntry *ide,
|
||||
XPTHeader *header) {
|
||||
XPTHeader *header,
|
||||
PRBool iface) {
|
||||
int i;
|
||||
XPTInterfaceDescriptor *id = ide->interface_descriptor;
|
||||
XPTInterfaceDirectoryEntry *parent_ide = NULL;
|
||||
const char *iidName = classname_iid_define(ide->name); /* XXX: Leak */
|
||||
const char *iidName = classname_iid_define(ide->name);
|
||||
|
||||
if (id->parent_interface) {
|
||||
parent_ide = &header->interface_directory[id->parent_interface - 1];
|
||||
|
@ -303,30 +337,63 @@ GenproxyClass(FILE *out,
|
|||
parent_ide->name_space ? parent_ide->name_space : "org.mozilla.xpcom",
|
||||
parent_ide->name);
|
||||
}
|
||||
else {
|
||||
else if (!iface) {
|
||||
fprintf(out, "import org.mozilla.xpcom.XPComUtilities;\n");
|
||||
fprintf(out, "import org.mozilla.xpcom.ComObject;\n");
|
||||
}
|
||||
fprintf(out, "import org.mozilla.xpcom.nsID;\n");
|
||||
|
||||
if (iface) {
|
||||
fprintf(out, "\npublic interface %s", ide->name);
|
||||
|
||||
if (parent_ide) {
|
||||
fprintf(out, " extends %s", parent_ide->name);
|
||||
}
|
||||
fprintf(out, " {\n", ide->name);
|
||||
|
||||
fprintf(out,
|
||||
"\n public static final String %s_STRING = \"", iidName);
|
||||
|
||||
print_IID(&ide->iid, out);
|
||||
|
||||
fprintf(out, "\";\n\n");
|
||||
|
||||
fprintf(out,
|
||||
" public static final nsID %s = new nsID(%s_STRING);\n",
|
||||
iidName, iidName);
|
||||
}
|
||||
else {
|
||||
fprintf(out, "\nclass %s__Proxy", ide->name);
|
||||
|
||||
if (parent_ide) {
|
||||
fprintf(out, " extends %s__Proxy", parent_ide->name);
|
||||
}
|
||||
|
||||
fprintf(out, " implements %s {\n", ide->name);
|
||||
}
|
||||
|
||||
for (i = 0; i < id->num_methods; i++) {
|
||||
if (!GenproxyMethodPrototype(out, header, &id->method_descriptors[i])) {
|
||||
XPTMethodDescriptor *md = &id->method_descriptors[i];
|
||||
|
||||
if (XPT_MD_IS_HIDDEN(md->flags)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!GenproxyMethodPrototype(out, header, md)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
if (iface) {
|
||||
fprintf(out, ";\n");
|
||||
}
|
||||
else {
|
||||
/* XXX: KLUDGE method index for now */
|
||||
if (!GenproxyMethodBody(out, header,
|
||||
&id->method_descriptors[i], i+3, iidName)) {
|
||||
if (!GenproxyMethodBody(out, header, md, i+3, iidName)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
fprintf(out, "\n");
|
||||
}
|
||||
fprintf(out, "}\n");
|
||||
free((void *)iidName);
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
|
@ -337,10 +404,6 @@ GenproxyMethodPrototype(FILE *out, XPTHeader *header, XPTMethodDescriptor *md) {
|
|||
int retval_ind = -1;
|
||||
XPTParamDescriptor *pd;
|
||||
|
||||
if (XPT_MD_IS_HIDDEN(md->flags)) {
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
/* Find index of retval */
|
||||
for (i = 0; i < md->num_args; i++) {
|
||||
pd = &md->params[i];
|
||||
|
@ -350,13 +413,21 @@ GenproxyMethodPrototype(FILE *out, XPTHeader *header, XPTMethodDescriptor *md) {
|
|||
}
|
||||
}
|
||||
|
||||
/* "Hidden" methods are protected (if reflected at all) */
|
||||
if (XPT_MD_IS_HIDDEN(md->flags)) {
|
||||
fprintf(out, " protected ");
|
||||
}
|
||||
else {
|
||||
fprintf(out, " public ");
|
||||
}
|
||||
|
||||
if (XPT_MD_IS_GETTER(md->flags)) {
|
||||
pd = &md->params[0];
|
||||
|
||||
if (!GenproxyGetStringForType(header, &pd->type, ¶m_type)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
fprintf(out, " public %s get%c%s()",
|
||||
fprintf(out, "%s get%c%s()",
|
||||
param_type,
|
||||
toupper(md->name[0]),
|
||||
(md->name)+1);
|
||||
|
@ -367,7 +438,7 @@ GenproxyMethodPrototype(FILE *out, XPTHeader *header, XPTMethodDescriptor *md) {
|
|||
if (!GenproxyGetStringForType(header, &pd->type, ¶m_type)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
fprintf(out, " public void set%c%s(%s p0)",
|
||||
fprintf(out, "void set%c%s(%s p0)",
|
||||
toupper(md->name[0]),
|
||||
(md->name)+1,
|
||||
param_type);
|
||||
|
@ -384,7 +455,7 @@ GenproxyMethodPrototype(FILE *out, XPTHeader *header, XPTMethodDescriptor *md) {
|
|||
}
|
||||
}
|
||||
|
||||
fprintf(out, " public %s %s(", param_type, md->name);
|
||||
fprintf(out, "%s %s(", param_type, md->name);
|
||||
|
||||
for (i = 0; i < md->num_args; i++) {
|
||||
pd = &md->params[i];
|
||||
|
@ -402,11 +473,6 @@ GenproxyMethodPrototype(FILE *out, XPTHeader *header, XPTMethodDescriptor *md) {
|
|||
fprintf(out, "%s", param_type);
|
||||
if (XPT_PD_IS_OUT(pd->flags)) {
|
||||
fprintf(out, "[]");
|
||||
/*
|
||||
if (XPT_PD_IS_SHARED(pd->flags)) {
|
||||
fprintf(out, "shared ");
|
||||
}
|
||||
*/
|
||||
}
|
||||
fprintf(out, " p%d", i);
|
||||
}
|
||||
|
@ -574,597 +640,4 @@ GenproxyXPTString(FILE *out, XPTString *str)
|
|||
return PR_TRUE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
PRBool
|
||||
GenproxyHeader(XPTCursor *cursor, XPTHeader *header,
|
||||
const int indent, PRBool verbose_mode)
|
||||
{
|
||||
int i;
|
||||
|
||||
fprintf(stdout, "Header:\n");
|
||||
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sMagic beans: ", indent, " ");
|
||||
for (i=0; i<16; i++) {
|
||||
fprintf(stdout, "%02x", header->magic[i]);
|
||||
}
|
||||
fprintf(stdout, "\n");
|
||||
if (strncmp((const char*)header->magic, XPT_MAGIC, 16) == 0)
|
||||
fprintf(stdout, "%*s PASSED\n", indent, " ");
|
||||
else
|
||||
fprintf(stdout, "%*s FAILED\n", indent, " ");
|
||||
}
|
||||
fprintf(stdout, "%*sMajor version: %d\n", indent, " ",
|
||||
header->major_version);
|
||||
fprintf(stdout, "%*sMinor version: %d\n", indent, " ",
|
||||
header->minor_version);
|
||||
fprintf(stdout, "%*sNumber of interfaces: %d\n", indent, " ",
|
||||
header->num_interfaces);
|
||||
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sFile length: %d\n", indent, " ",
|
||||
header->file_length);
|
||||
fprintf(stdout, "%*sData pool offset: %d\n\n", indent, " ",
|
||||
header->data_pool);
|
||||
}
|
||||
|
||||
fprintf(stdout, "%*sAnnotations:\n", indent, " ");
|
||||
if (!GenproxyAnnotations(header->annotations, indent*2, verbose_mode))
|
||||
return PR_FALSE;
|
||||
|
||||
fprintf(stdout, "\nInterface Directory:\n");
|
||||
for (i=0; i<header->num_interfaces; i++) {
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sInterface #%d:\n", indent, " ", i);
|
||||
if (!GenproxyInterfaceDirectoryEntry(cursor,
|
||||
&header->interface_directory[i],
|
||||
header, indent*2,
|
||||
verbose_mode)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
} else {
|
||||
if (!GenproxyInterfaceDirectoryEntry(cursor,
|
||||
&header->interface_directory[i],
|
||||
header, indent,
|
||||
verbose_mode)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyAnnotations(XPTAnnotation *ann, const int indent, PRBool verbose_mode)
|
||||
{
|
||||
int i = -1;
|
||||
XPTAnnotation *last;
|
||||
int new_indent = indent + BASE_INDENT;
|
||||
|
||||
do {
|
||||
i++;
|
||||
if (XPT_ANN_IS_PRIVATE(ann->flags)) {
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sAnnotation #%d is private.\n",
|
||||
indent, " ", i);
|
||||
} else {
|
||||
fprintf(stdout, "%*sAnnotation #%d:\n",
|
||||
indent, " ", i);
|
||||
}
|
||||
fprintf(stdout, "%*sCreator: ", new_indent, " ");
|
||||
if (!GenproxyXPTString(ann->creator))
|
||||
return PR_FALSE;
|
||||
fprintf(stdout, "\n");
|
||||
fprintf(stdout, "%*sPrivate Data: ", new_indent, " ");
|
||||
if (!GenproxyXPTString(ann->private_data))
|
||||
return PR_FALSE;
|
||||
fprintf(stdout, "\n");
|
||||
} else {
|
||||
fprintf(stdout, "%*sAnnotation #%d is empty.\n",
|
||||
indent, " ", i);
|
||||
}
|
||||
last = ann;
|
||||
ann = ann->next;
|
||||
} while (!XPT_ANN_IS_LAST(last->flags));
|
||||
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sAnnotation #%d is the last annotation.\n",
|
||||
indent, " ", i);
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
print_IID(struct nsID *iid, FILE *file)
|
||||
{
|
||||
fprintf(file, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
||||
(PRUint32) iid->m0, (PRUint32) iid->m1,(PRUint32) iid->m2,
|
||||
(PRUint32) iid->m3[0], (PRUint32) iid->m3[1],
|
||||
(PRUint32) iid->m3[2], (PRUint32) iid->m3[3],
|
||||
(PRUint32) iid->m3[4], (PRUint32) iid->m3[5],
|
||||
(PRUint32) iid->m3[6], (PRUint32) iid->m3[7]);
|
||||
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyInterfaceDirectoryEntry(XPTCursor *cursor,
|
||||
XPTInterfaceDirectoryEntry *ide,
|
||||
XPTHeader *header, const int indent,
|
||||
PRBool verbose_mode)
|
||||
{
|
||||
int new_indent = indent + BASE_INDENT;
|
||||
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sIID: ", indent, " ");
|
||||
print_IID(&ide->iid, stdout);
|
||||
fprintf(stdout, "\n");
|
||||
|
||||
fprintf(stdout, "%*sName: %s\n",
|
||||
indent, " ", ide->name);
|
||||
fprintf(stdout, "%*sNamespace: %s\n",
|
||||
indent, " ", ide->name_space ? ide->name_space : "none");
|
||||
fprintf(stdout, "%*sAddress of interface descriptor: %p\n",
|
||||
indent, " ", ide->interface_descriptor);
|
||||
|
||||
fprintf(stdout, "%*sDescriptor:\n", indent, " ");
|
||||
|
||||
if (!GenproxyInterfaceDescriptor(cursor, ide->interface_descriptor,
|
||||
header, new_indent, verbose_mode)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
} else {
|
||||
fprintf(stdout, "%*s- %s::%s (", indent, " ",
|
||||
ide->name_space ? ide->name_space : "", ide->name);
|
||||
print_IID(&ide->iid, stdout);
|
||||
fprintf(stdout, "):\n");
|
||||
if (!GenproxyInterfaceDescriptor(cursor, ide->interface_descriptor,
|
||||
header, new_indent, verbose_mode)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyInterfaceDescriptor(XPTCursor *cursor, XPTInterfaceDescriptor *id,
|
||||
XPTHeader *header, const int indent,
|
||||
PRBool verbose_mode)
|
||||
{
|
||||
XPTInterfaceDirectoryEntry *parent_ide;
|
||||
int i;
|
||||
int new_indent = indent + BASE_INDENT;
|
||||
int more_indent = new_indent + BASE_INDENT;
|
||||
|
||||
if (!id) {
|
||||
fprintf(stdout, "%*s[Unresolved]\n", indent, " ");
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
if (id->parent_interface) {
|
||||
|
||||
parent_ide = &header->interface_directory[id->parent_interface - 1];
|
||||
|
||||
fprintf(stdout, "%*sParent: %s::%s\n", indent, " ",
|
||||
parent_ide->name_space ?
|
||||
parent_ide->name_space : "",
|
||||
parent_ide->name);
|
||||
}
|
||||
|
||||
fprintf(stdout, "%*sFlags:\n", indent, " ");
|
||||
|
||||
fprintf(stdout, "%*sScriptable: %s\n", new_indent, " ",
|
||||
XPT_ID_IS_SCRIPTABLE(id->flags) ? "TRUE" : "FALSE");
|
||||
|
||||
if (verbose_mode) {
|
||||
if (id->parent_interface) {
|
||||
fprintf(stdout,
|
||||
"%*sIndex of parent interface (in data pool): %d\n",
|
||||
indent, " ", id->parent_interface);
|
||||
|
||||
}
|
||||
} else {
|
||||
}
|
||||
|
||||
if (id->num_methods > 0) {
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout,
|
||||
"%*s# of Method Descriptors: %d\n",
|
||||
indent, " ", id->num_methods);
|
||||
} else {
|
||||
fprintf(stdout, "%*sMethods:\n", indent, " ");
|
||||
}
|
||||
|
||||
for (i=0; i<id->num_methods; i++) {
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sMethod #%d:\n", new_indent, " ", i);
|
||||
if (!GenproxyMethodDescriptor(header,
|
||||
&id->method_descriptors[i],
|
||||
more_indent, verbose_mode)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
} else {
|
||||
if (!GenproxyMethodDescriptor(header,
|
||||
&id->method_descriptors[i],
|
||||
new_indent, verbose_mode)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fprintf(stdout, "%*sMethods:\n", indent, " ");
|
||||
fprintf(stdout, "%*sNo Methods\n", new_indent, " ");
|
||||
}
|
||||
|
||||
if (id->num_constants > 0) {
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout,
|
||||
"%*s# of Constant Descriptors: %d\n",
|
||||
indent, " ", id->num_constants);
|
||||
} else {
|
||||
fprintf(stdout, "%*sConstants:\n", indent, " ");
|
||||
}
|
||||
|
||||
for (i=0; i<id->num_constants; i++) {
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sConstant #%d:\n", new_indent, " ", i);
|
||||
if (!GenproxyConstDescriptor(header,
|
||||
&id->const_descriptors[i],
|
||||
more_indent, verbose_mode))
|
||||
return PR_FALSE;
|
||||
} else {
|
||||
if (!GenproxyConstDescriptor(header,
|
||||
&id->const_descriptors[i],
|
||||
new_indent, verbose_mode)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fprintf(stdout, "%*sConstants:\n", indent, " ");
|
||||
fprintf(stdout, "%*sNo Constants\n", new_indent, " ");
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyMethodDescriptor(XPTHeader *header, XPTMethodDescriptor *md,
|
||||
const int indent, PRBool verbose_mode)
|
||||
{
|
||||
int i;
|
||||
int new_indent = indent + BASE_INDENT;
|
||||
int more_indent = new_indent + BASE_INDENT;
|
||||
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sName: %s\n", indent, " ", md->name);
|
||||
fprintf(stdout, "%*sIs Getter? ", indent, " ");
|
||||
if (XPT_MD_IS_GETTER(md->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sIs Setter? ", indent, " ");
|
||||
if (XPT_MD_IS_SETTER(md->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sIs Varargs? ", indent, " ");
|
||||
if (XPT_MD_IS_VARARGS(md->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sIs Constructor? ", indent, " ");
|
||||
if (XPT_MD_IS_CTOR(md->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sIs Hidden? ", indent, " ");
|
||||
if (XPT_MD_IS_HIDDEN(md->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*s# of arguments: %d\n", indent, " ", md->num_args);
|
||||
fprintf(stdout, "%*sParameter Descriptors:\n", indent, " ");
|
||||
|
||||
for (i=0; i<md->num_args; i++) {
|
||||
fprintf(stdout, "%*sParameter #%d:\n", new_indent, " ", i);
|
||||
|
||||
if (!GenproxyParamDescriptor(header, &md->params[i], more_indent,
|
||||
verbose_mode, PR_FALSE))
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
fprintf(stdout, "%*sResult:\n", indent, " ");
|
||||
if (!GenproxyParamDescriptor(header, md->result, new_indent,
|
||||
verbose_mode, PR_TRUE)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
} else {
|
||||
char *param_type;
|
||||
XPTParamDescriptor *pd;
|
||||
|
||||
if (!GenproxyGetStringForType(header, &md->result->type, ¶m_type)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
fprintf(stdout, "%*s%c%c%c%c%c %s %s(", indent - 6, " ",
|
||||
XPT_MD_IS_GETTER(md->flags) ? 'G' : ' ',
|
||||
XPT_MD_IS_SETTER(md->flags) ? 'S' : ' ',
|
||||
XPT_MD_IS_HIDDEN(md->flags) ? 'H' : ' ',
|
||||
XPT_MD_IS_VARARGS(md->flags) ? 'V' : ' ',
|
||||
XPT_MD_IS_CTOR(md->flags) ? 'C' : ' ',
|
||||
param_type, md->name);
|
||||
for (i=0; i<md->num_args; i++) {
|
||||
if (i!=0) {
|
||||
fprintf(stdout, ", ");
|
||||
}
|
||||
pd = &md->params[i];
|
||||
if (XPT_PD_IS_IN(pd->flags)) {
|
||||
fprintf(stdout, "in");
|
||||
if (XPT_PD_IS_OUT(pd->flags)) {
|
||||
fprintf(stdout, "/out ");
|
||||
if (XPT_PD_IS_RETVAL(pd->flags)) {
|
||||
fprintf(stdout, "retval ");
|
||||
}
|
||||
if (XPT_PD_IS_SHARED(pd->flags)) {
|
||||
fprintf(stdout, "shared ");
|
||||
}
|
||||
} else {
|
||||
fprintf(stdout, " ");
|
||||
}
|
||||
} else {
|
||||
if (XPT_PD_IS_OUT(pd->flags)) {
|
||||
fprintf(stdout, "out ");
|
||||
if (XPT_PD_IS_RETVAL(pd->flags)) {
|
||||
fprintf(stdout, "retval ");
|
||||
}
|
||||
if (XPT_PD_IS_SHARED(pd->flags)) {
|
||||
fprintf(stdout, "shared ");
|
||||
}
|
||||
} else {
|
||||
param_problems = PR_TRUE;
|
||||
fprintf(stdout, "XXX ");
|
||||
}
|
||||
}
|
||||
if (!GenproxyGetStringForType(header, &pd->type, ¶m_type)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
fprintf(stdout, "%s", param_type);
|
||||
}
|
||||
fprintf(stdout, ");\n");
|
||||
}
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyParamDescriptor(XPTHeader *header, XPTParamDescriptor *pd,
|
||||
const int indent, PRBool verbose_mode,
|
||||
PRBool is_result)
|
||||
{
|
||||
int new_indent = indent + BASE_INDENT;
|
||||
|
||||
if (!XPT_PD_IS_IN(pd->flags) &&
|
||||
!XPT_PD_IS_OUT(pd->flags) &&
|
||||
(XPT_PD_IS_RETVAL(pd->flags) ||
|
||||
XPT_PD_IS_SHARED(pd->flags))) {
|
||||
param_problems = PR_TRUE;
|
||||
fprintf(stdout, "XXX\n");
|
||||
} else {
|
||||
if (!XPT_PD_IS_IN(pd->flags) && !XPT_PD_IS_OUT(pd->flags)) {
|
||||
if (is_result) {
|
||||
if (XPT_TDP_TAG(pd->type.prefix) != TD_UINT32 &&
|
||||
XPT_TDP_TAG(pd->type.prefix) != TD_VOID) {
|
||||
param_problems = PR_TRUE;
|
||||
fprintf(stdout, "XXX\n");
|
||||
}
|
||||
} else {
|
||||
param_problems = PR_TRUE;
|
||||
fprintf(stdout, "XXX\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fprintf(stdout, "%*sIn Param? ", indent, " ");
|
||||
if (XPT_PD_IS_IN(pd->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sOut Param? ", indent, " ");
|
||||
if (XPT_PD_IS_OUT(pd->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sRetval? ", indent, " ");
|
||||
if (XPT_PD_IS_RETVAL(pd->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sShared? ", indent, " ");
|
||||
if (XPT_PD_IS_SHARED(pd->flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sType Descriptor:\n", indent, " ");
|
||||
if (!GenproxyTypeDescriptor(&pd->type, new_indent, verbose_mode))
|
||||
return PR_FALSE;
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyTypeDescriptor(XPTTypeDescriptor *td, int indent, PRBool verbose_mode)
|
||||
{
|
||||
int new_indent = indent + BASE_INDENT;
|
||||
|
||||
fprintf(stdout, "%*sIs Pointer? ", indent, " ");
|
||||
if (XPT_TDP_IS_POINTER(td->prefix.flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sIs Unique Pointer? ", indent, " ");
|
||||
if (XPT_TDP_IS_UNIQUE_POINTER(td->prefix.flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sIs Reference? ", indent, " ");
|
||||
if (XPT_TDP_IS_REFERENCE(td->prefix.flags))
|
||||
fprintf(stdout, "TRUE\n");
|
||||
else
|
||||
fprintf(stdout, "FALSE\n");
|
||||
|
||||
fprintf(stdout, "%*sTag: %d\n", indent, " ",
|
||||
XPT_TDP_TAG(td->prefix));
|
||||
|
||||
if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_TYPE) {
|
||||
fprintf(stdout, "%*sInterfaceTypeDescriptor:\n", indent, " ");
|
||||
fprintf(stdout, "%*sIndex of IDE: %d\n", new_indent, " ",
|
||||
td->type.interface);
|
||||
}
|
||||
|
||||
if (XPT_TDP_TAG(td->prefix) == TD_INTERFACE_IS_TYPE) {
|
||||
fprintf(stdout, "%*sInterfaceTypeDescriptor:\n", indent, " ");
|
||||
fprintf(stdout, "%*sIndex of Method Argument: %d\n", new_indent, " ",
|
||||
td->type.argnum);
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
PRBool
|
||||
GenproxyConstDescriptor(XPTHeader *header, XPTConstDescriptor *cd,
|
||||
const int indent, PRBool verbose_mode)
|
||||
{
|
||||
int new_indent = indent + BASE_INDENT;
|
||||
char *const_type;
|
||||
/* char *out; */
|
||||
PRUint32 uintout;
|
||||
PRInt32 intout;
|
||||
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "%*sName: %s\n", indent, " ", cd->name);
|
||||
fprintf(stdout, "%*sType Descriptor: \n", indent, " ");
|
||||
if (!GenproxyTypeDescriptor(&cd->type, new_indent, verbose_mode))
|
||||
return PR_FALSE;
|
||||
fprintf(stdout, "%*sValue: ", indent, " ");
|
||||
} else {
|
||||
if (!GenproxyGetStringForType(header, &cd->type, &const_type)) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
fprintf(stdout, "%*s%s %s = ", indent, " ", const_type, cd->name);
|
||||
}
|
||||
|
||||
switch(XPT_TDP_TAG(cd->type.prefix)) {
|
||||
case TD_INT8:
|
||||
fprintf(stdout, "%d", cd->value.i8);
|
||||
break;
|
||||
case TD_INT16:
|
||||
fprintf(stdout, "%d", cd->value.i16);
|
||||
break;
|
||||
case TD_INT64:
|
||||
/* XXX punt for now to remove NSPR linkage...
|
||||
* borrow from mozilla/nsprpub/pr/src/io/prprf.c::cvt_ll? */
|
||||
|
||||
/* out = PR_smprintf("%lld", cd->value.i64); */
|
||||
/* fputs(out, stdout); */
|
||||
/* PR_smprintf_free(out); */
|
||||
LL_L2I(intout, cd->value.i64);
|
||||
fprintf(stdout, "%d", intout);
|
||||
break;
|
||||
case TD_INT32:
|
||||
fprintf(stdout, "%d", cd->value.i32);
|
||||
break;
|
||||
case TD_UINT8:
|
||||
fprintf(stdout, "%d", cd->value.ui8);
|
||||
break;
|
||||
case TD_UINT16:
|
||||
fprintf(stdout, "%d", cd->value.ui16);
|
||||
break;
|
||||
case TD_UINT64:
|
||||
/* out = PR_smprintf("%lld", cd->value.ui64); */
|
||||
/* fputs(out, stdout); */
|
||||
/* PR_smprintf_free(out); */
|
||||
/* XXX punt for now to remove NSPR linkage. */
|
||||
LL_L2UI(uintout, cd->value.ui64);
|
||||
fprintf(stdout, "%d", uintout);
|
||||
break;
|
||||
case TD_UINT32:
|
||||
fprintf(stdout, "%d", cd->value.ui32);
|
||||
break;
|
||||
case TD_FLOAT:
|
||||
fprintf(stdout, "%f", cd->value.flt);
|
||||
break;
|
||||
case TD_DOUBLE:
|
||||
fprintf(stdout, "%g", cd->value.dbl);
|
||||
break;
|
||||
case TD_BOOL:
|
||||
if (cd->value.bul)
|
||||
fprintf(stdout, "TRUE");
|
||||
else
|
||||
fprintf(stdout, "FALSE");
|
||||
break;
|
||||
case TD_CHAR:
|
||||
fprintf(stdout, "%c", cd->value.ch);
|
||||
break;
|
||||
case TD_WCHAR:
|
||||
fprintf(stdout, "%c", cd->value.wch & 0xff);
|
||||
break;
|
||||
case TD_VOID:
|
||||
fprintf(stdout, "VOID");
|
||||
break;
|
||||
case TD_PNSIID:
|
||||
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
|
||||
print_IID(cd->value.iid, stdout);
|
||||
} else
|
||||
return PR_FALSE;
|
||||
break;
|
||||
case TD_PBSTR:
|
||||
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
|
||||
if (!GenproxyXPTString(cd->value.string))
|
||||
return PR_FALSE;
|
||||
} else
|
||||
return PR_FALSE;
|
||||
break;
|
||||
case TD_PSTRING:
|
||||
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
|
||||
fprintf(stdout, "%s", cd->value.str);
|
||||
} else
|
||||
return PR_FALSE;
|
||||
break;
|
||||
case TD_PWSTRING:
|
||||
if (XPT_TDP_IS_POINTER(cd->type.prefix.flags)) {
|
||||
PRUint16 *ch = cd->value.wstr;
|
||||
while (*ch) {
|
||||
fprintf(stdout, "%c", *ch & 0xff);
|
||||
ch++;
|
||||
}
|
||||
} else
|
||||
return PR_FALSE;
|
||||
break;
|
||||
default:
|
||||
perror("Unrecognized type");
|
||||
return PR_FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (verbose_mode) {
|
||||
fprintf(stdout, "\n");
|
||||
} else {
|
||||
fprintf(stdout, ";\n");
|
||||
}
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Загрузка…
Ссылка в новой задаче