diff options
Diffstat (limited to '')
-rw-r--r-- | src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h b/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h new file mode 100644 index 00000000..894a8cb8 --- /dev/null +++ b/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h @@ -0,0 +1,392 @@ +/* ***** 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 ***** */ + +#ifndef _nsJavaXPCOMBindingUtils_h_ +#define _nsJavaXPCOMBindingUtils_h_ + +#include "jni.h" +#include "xptcall.h" +#include "nsCOMPtr.h" +#include "nsString.h" +#include "pldhash.h" +#include "nsJavaXPTCStub.h" +#include "nsAutoLock.h" +#include "nsTHashtable.h" +#include "nsHashKeys.h" +#include "nsILocalFile.h" + +//#define DEBUG_JAVAXPCOM +//#define DEBUG_JAVAXPCOM_REFCNT + +#ifdef DEBUG_JAVAXPCOM +#define LOG(x) printf x +#else +#define LOG(x) /* nothing */ +#endif + + +/********************* + * Java JNI globals + *********************/ + +extern jclass systemClass; +extern jclass booleanClass; +extern jclass charClass; +extern jclass byteClass; +extern jclass shortClass; +extern jclass intClass; +extern jclass longClass; +extern jclass floatClass; +extern jclass doubleClass; +extern jclass stringClass; +extern jclass nsISupportsClass; +extern jclass xpcomExceptionClass; +extern jclass xpcomJavaProxyClass; +extern jclass weakReferenceClass; +extern jclass javaXPCOMUtilsClass; + +extern jmethodID hashCodeMID; +extern jmethodID booleanValueMID; +extern jmethodID booleanInitMID; +extern jmethodID charValueMID; +extern jmethodID charInitMID; +extern jmethodID byteValueMID; +extern jmethodID byteInitMID; +extern jmethodID shortValueMID; +extern jmethodID shortInitMID; +extern jmethodID intValueMID; +extern jmethodID intInitMID; +extern jmethodID longValueMID; +extern jmethodID longInitMID; +extern jmethodID floatValueMID; +extern jmethodID floatInitMID; +extern jmethodID doubleValueMID; +extern jmethodID doubleInitMID; +extern jmethodID createProxyMID; +extern jmethodID isXPCOMJavaProxyMID; +extern jmethodID getNativeXPCOMInstMID; +extern jmethodID weakReferenceConstructorMID; +extern jmethodID getReferentMID; +extern jmethodID clearReferentMID; +extern jmethodID findClassInLoaderMID; + +#ifdef DEBUG_JAVAXPCOM +extern jmethodID getNameMID; +extern jmethodID proxyToStringMID; +#endif + +class NativeToJavaProxyMap; +extern NativeToJavaProxyMap* gNativeToJavaProxyMap; +class JavaToXPTCStubMap; +extern JavaToXPTCStubMap* gJavaToXPTCStubMap; + +extern nsTHashtable<nsDepCharHashKey>* gJavaKeywords; + +// The Java garbage collector runs in a separate thread. Since it calls the +// finalizeProxy() function in nsJavaWrapper.cpp, we need to make sure that +// all the structures touched by finalizeProxy() are multithread aware. +extern PRLock* gJavaXPCOMLock; + +extern PRBool gJavaXPCOMInitialized; + +/** + * Initialize global structures used by JavaXPCOM. + * @param env Java environment pointer + * @return PR_TRUE if JavaXPCOM is initialized; PR_FALSE if an error occurred + */ +PRBool InitializeJavaGlobals(JNIEnv *env); + +/** + * Frees global structures that were allocated by InitializeJavaGlobals(). + * @param env Java environment pointer + */ +void FreeJavaGlobals(JNIEnv* env); + + +/************************* + * JavaXPCOMInstance + *************************/ + +class JavaXPCOMInstance +{ +public: + JavaXPCOMInstance(nsISupports* aInstance, nsIInterfaceInfo* aIInfo); + ~JavaXPCOMInstance(); + + nsISupports* GetInstance() { return mInstance; } + nsIInterfaceInfo* InterfaceInfo() { return mIInfo; } + +private: + nsISupports* mInstance; + nsIInterfaceInfo* mIInfo; +}; + + +/************************************** + * Java<->XPCOM object mappings + **************************************/ + +/** + * Maps native XPCOM objects to their associated Java proxy object. + */ +class NativeToJavaProxyMap +{ + friend PLDHashOperator DestroyJavaProxyMappingEnum(PLDHashTable* aTable, + PLDHashEntryHdr* aHeader, + PRUint32 aNumber, + void* aData); + +protected: + struct ProxyList + { + ProxyList(const jobject aRef, const nsIID& aIID, ProxyList* aList) + : javaObject(aRef) + , iid(aIID) + , next(aList) + { } + + const jobject javaObject; + const nsIID iid; + ProxyList* next; + }; + + struct Entry : public PLDHashEntryHdr + { + nsISupports* key; + ProxyList* list; + }; + +public: + NativeToJavaProxyMap() + : mHashTable(nsnull) + { } + + ~NativeToJavaProxyMap() + { + NS_ASSERTION(mHashTable == nsnull, + "MUST call Destroy() before deleting object"); + } + + nsresult Init(); + + nsresult Destroy(JNIEnv* env); + + nsresult Add(JNIEnv* env, nsISupports* aXPCOMObject, const nsIID& aIID, + jobject aProxy); + + nsresult Find(JNIEnv* env, nsISupports* aNativeObject, const nsIID& aIID, + jobject* aResult); + + nsresult Remove(JNIEnv* env, nsISupports* aNativeObject, const nsIID& aIID); + +protected: + PLDHashTable* mHashTable; +}; + +/** + * Maps Java objects to their associated nsJavaXPTCStub. + */ +class JavaToXPTCStubMap +{ + friend PLDHashOperator DestroyXPTCMappingEnum(PLDHashTable* aTable, + PLDHashEntryHdr* aHeader, + PRUint32 aNumber, void* aData); + +protected: + struct Entry : public PLDHashEntryHdr + { + jint key; + nsJavaXPTCStub* xptcstub; + }; + +public: + JavaToXPTCStubMap() + : mHashTable(nsnull) + { } + + ~JavaToXPTCStubMap() + { + NS_ASSERTION(mHashTable == nsnull, + "MUST call Destroy() before deleting object"); + } + + nsresult Init(); + + nsresult Destroy(); + + nsresult Add(jint aJavaObjectHashCode, nsJavaXPTCStub* aProxy); + + nsresult Find(jint aJavaObjectHashCode, const nsIID& aIID, + nsJavaXPTCStub** aResult); + + nsresult Remove(jint aJavaObjectHashCode); + +protected: + PLDHashTable* mHashTable; +}; + + +/******************************* + * Helper functions + *******************************/ + +/** + * Convert a native nsISupports to a Java object. + * + * @param env Java environment pointer + * @param aXPCOMObject XPCOM object for which to find/create Java object + * @param aIID desired interface IID for Java object + * @param aObjectLoader Java object whose class loader we use for finding + * classes; can be null + * @param aResult on success, holds reference to Java object + * + * @return NS_OK if succeeded; all other return values are error codes. + */ +nsresult NativeInterfaceToJavaObject(JNIEnv* env, nsISupports* aXPCOMObject, + const nsIID& aIID, jobject aObjectLoader, + jobject* aResult); + +/** + * Convert a Java object to a native nsISupports object. + * + * @param env Java environment pointer + * @param aJavaObject Java object for which to find/create XPCOM object + * @param aIID desired interface IID for XPCOM object + * @param aResult on success, holds AddRef'd reference to XPCOM object + * + * @return NS_OK if succeeded; all other return values are error codes. + */ +nsresult JavaObjectToNativeInterface(JNIEnv* env, jobject aJavaObject, + const nsIID& aIID, void** aResult); + +nsresult GetIIDForMethodParam(nsIInterfaceInfo *iinfo, + const XPTMethodDescriptor *methodInfo, + const nsXPTParamInfo ¶mInfo, + PRUint8 paramType, PRUint16 methodIndex, + nsXPTCMiniVariant *dispatchParams, + PRBool isFullVariantArray, + nsID &result); + +/** + * Returns the Class object associated with the class or interface with the + * given string name, using the class loader of the given object. + * + * @param env Java environment pointer + * @param aObjectLoader Java object whose class loader is used to load class + * @param aClassName fully qualified name of class to load + * + * @return java.lang.Class object of requested Class; NULL if the class + * wasn't found + * + * @see http://java.sun.com/j2se/1.3/docs/guide/jni/jni-12.html#classops + */ +inline jclass +FindClassInLoader(JNIEnv* env, jobject aObjectLoader, const char* aClassName) +{ + jclass clazz = nsnull; + jstring name = env->NewStringUTF(aClassName); + if (name) + clazz = (jclass) env->CallStaticObjectMethod(javaXPCOMUtilsClass, + findClassInLoaderMID, aObjectLoader, name); + +#ifdef DEBUG + if (!clazz) + fprintf(stderr, "WARNING: failed to find class [%s]\n", aClassName); +#endif + return clazz; +} + + +/******************************* + * JNI helper functions + *******************************/ + +/** + * Returns a pointer to the appropriate JNIEnv structure. This function is + * useful in callbacks or other functions that are not called directly from + * Java and therefore do not have the JNIEnv structure passed in. + * + * @return pointer to JNIEnv structure for current thread + */ +JNIEnv* GetJNIEnv(); + +/** + * Constructs and throws an exception. Some error codes (such as + * NS_ERROR_OUT_OF_MEMORY) are handled by the appropriate Java exception/error. + * Otherwise, an instance of XPCOMException is created with the given error + * code and message. + * + * @param env Java environment pointer + * @param aErrorCode The error code returned by an XPCOM/Gecko function. Pass + * zero for the default behaviour. + * @param aMessage A string that provides details for throwing this + * exception. Pass in <code>nsnull</code> for the default + * behaviour. + * + * @throws OutOfMemoryError if aErrorCode == NS_ERROR_OUT_OF_MEMORY + * XPCOMException for all other error codes + */ +void ThrowException(JNIEnv* env, const nsresult aErrorCode, + const char* aMessage); + +/** + * Helper functions for converting from java.lang.String to + * nsAString/nsACstring. Caller must delete nsAString/nsACString. + * + * @param env Java environment pointer + * @param aString Java string to convert + * + * @return nsAString/nsACString with same content as given Java string; + * a 'void' nsAString/nsACString object if aString is + * <code>null</code>; or <code>nsnull</code> if out of memory + */ +nsAString* jstring_to_nsAString(JNIEnv* env, jstring aString); +nsACString* jstring_to_nsACString(JNIEnv* env, jstring aString); + +/** + * Helper function for converting from java.io.File to nsILocalFile. + * + * @param env Java environment pointer + * @param aFile Java File to convert + * @param aLocalFile returns the converted nsILocalFile + * + * @return NS_OK for success; other values indicate error in conversion + */ +nsresult File_to_nsILocalFile(JNIEnv* env, jobject aFile, + nsILocalFile** aLocalFile); + +#endif // _nsJavaXPCOMBindingUtils_h_ |