From 9a9b487a980748818f656ecca101912fb918a104 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 21 Dec 2018 23:24:13 +0100 Subject: [PATCH] Cleanup, update, fix Cleanup: Removed the VBoxJava source code Update: Updated to VirtualBox 6.0 Fix: Added correct class file to put in the API on updates and (probably) fixed the keyboard --- .../src/libs/xpcom18a4/java/src/MacJawt.mm | 47 - .../xpcom18a4/java/src/dlldeps-javaxpcom.cpp | 81 - .../java/src/nsAppFileLocProviderProxy.cpp | 253 --- .../java/src/nsAppFileLocProviderProxy.h | 65 - .../libs/xpcom18a4/java/src/nsFileStreams.cpp | 475 ---- .../libs/xpcom18a4/java/src/nsFileStreams.h | 153 -- .../libs/xpcom18a4/java/src/nsIFileStreams.h | 209 -- .../xpcom18a4/java/src/nsJavaInterfaces.cpp | 557 ----- .../xpcom18a4/java/src/nsJavaInterfaces.h | 121 - .../libs/xpcom18a4/java/src/nsJavaWrapper.cpp | 2020 ----------------- .../libs/xpcom18a4/java/src/nsJavaWrapper.h | 75 - .../java/src/nsJavaXPCOMBindingUtils.cpp | 1084 --------- .../java/src/nsJavaXPCOMBindingUtils.h | 392 ---- .../xpcom18a4/java/src/nsJavaXPCOMGlue.cpp | 535 ----- .../xpcom18a4/java/src/nsJavaXPTCStub.cpp | 1711 -------------- .../libs/xpcom18a4/java/src/nsJavaXPTCStub.h | 153 -- .../java/src/nsJavaXPTCStubWeakRef.cpp | 98 - .../java/src/nsJavaXPTCStubWeakRef.h | 63 - .../libs/xpcom18a4/java/src/nsThreadUtils.h | 399 ---- .../src/libs/xpcom18a4/java/src/nsXPTCUtils.h | 128 -- .../org/mozilla/xpcom/GREVersionRange.java | 80 - .../mozilla/xpcom/IAppFileLocProvider.java | 92 - .../java/src/org/mozilla/xpcom/IGRE.java | 127 -- .../org/mozilla/xpcom/IJavaXPCOMUtils.java | 59 - .../java/src/org/mozilla/xpcom/IMozilla.java | 63 - .../java/src/org/mozilla/xpcom/INIParser.java | 243 -- .../java/src/org/mozilla/xpcom/IXPCOM.java | 137 -- .../java/src/org/mozilla/xpcom/Mozilla.java | 1079 --------- .../src/org/mozilla/xpcom/ProfileLock.java | 63 - .../org/mozilla/xpcom/VersionComparator.java | 272 --- .../src/org/mozilla/xpcom/XPCOMException.java | 95 - .../xpcom/XPCOMInitializationException.java | 56 - .../org/mozilla/xpcom/internal/GREImpl.java | 63 - .../xpcom/internal/JavaXPCOMMethods.java | 104 - .../mozilla/xpcom/internal/MozillaImpl.java | 56 - .../org/mozilla/xpcom/internal/XPCOMImpl.java | 73 - .../xpcom/internal/XPCOMJavaProxy.java | 257 --- .../xpcom/internal/XPCOMJavaProxyBase.java | 53 - .../src/org/virtualbox/VBoxObjectBase.java | 21 - .../fix/IDisplaySourceBitmap.class | Bin 0 -> 382 bytes VirtualComputer/fix/README | 3 + VirtualComputer/pom.xml | 2 +- .../VirtualBox/6.0/VirtualBox-6.0.jar | Bin 0 -> 546193 bytes .../VirtualBox/6.0/VirtualBox-6.0.pom | 10 + .../VirtualBox/maven-metadata-local.xml | 5 +- .../sznp/virtualcomputer/MCFrameBuffer.java | 2 +- .../src/sznp/virtualcomputer/PluginMain.java | 15 +- .../src/sznp/virtualcomputer/Scancode.java | 135 +- 48 files changed, 96 insertions(+), 11688 deletions(-) delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/MacJawt.mm delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/dlldeps-javaxpcom.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsIFileStreams.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMGlue.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.cpp delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsThreadUtils.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsXPTCUtils.h delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/GREVersionRange.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IAppFileLocProvider.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IGRE.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IJavaXPCOMUtils.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IMozilla.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/INIParser.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IXPCOM.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/Mozilla.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/ProfileLock.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/VersionComparator.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMException.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMInitializationException.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/GREImpl.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/JavaXPCOMMethods.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/MozillaImpl.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMImpl.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxy.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxyBase.java delete mode 100755 VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/virtualbox/VBoxObjectBase.java create mode 100644 VirtualComputer/fix/IDisplaySourceBitmap.class create mode 100644 VirtualComputer/fix/README create mode 100644 VirtualComputer/repo/org/virtualbox/VirtualBox/6.0/VirtualBox-6.0.jar create mode 100644 VirtualComputer/repo/org/virtualbox/VirtualBox/6.0/VirtualBox-6.0.pom diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/MacJawt.mm b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/MacJawt.mm deleted file mode 100755 index a2d0d3f..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/MacJawt.mm +++ /dev/null @@ -1,47 +0,0 @@ -/* ***** 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) 2006 - * 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 -#import -#include "prtypes.h" - - -PRUint64 GetPlatformHandle(JAWT_DrawingSurfaceInfo* dsi) -{ - JAWT_MacOSXDrawingSurfaceInfo* dsi_mac = - static_cast (dsi->platformInfo); - return reinterpret_cast (dsi_mac->cocoaViewRef); -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/dlldeps-javaxpcom.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/dlldeps-javaxpcom.cpp deleted file mode 100755 index a78d6c1..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/dlldeps-javaxpcom.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* ***** 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) 2006 - * 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 "nsJavaInterfaces.h" - - -void XXXNeverCalled_javaxpcom() -{ - MOZILLA_NATIVE(initialize) (nsnull, nsnull); - - GRE_NATIVE(initEmbedding) (nsnull, nsnull, nsnull, nsnull, nsnull); - - GRE_NATIVE(termEmbedding) (nsnull, nsnull); - - GRE_NATIVE(lockProfileDirectory) (nsnull, nsnull, nsnull); - - GRE_NATIVE(notifyProfile) (nsnull, nsnull); - - GRE_NATIVE(lockProfileDirectory) (nsnull, nsnull, nsnull); - - GRE_NATIVE(notifyProfile) (nsnull, nsnull); - - XPCOM_NATIVE(initXPCOM) (nsnull, nsnull, nsnull, nsnull); - - XPCOM_NATIVE(shutdownXPCOM) (nsnull, nsnull, nsnull); - - XPCOM_NATIVE(newLocalFile) (nsnull, nsnull, nsnull, nsnull); - - XPCOM_NATIVE(getComponentManager) (nsnull, nsnull); - - XPCOM_NATIVE(getComponentRegistrar) (nsnull, nsnull); - - XPCOM_NATIVE(getServiceManager) (nsnull, nsnull); - - JAVAPROXY_NATIVE(callXPCOMMethod) (nsnull, nsnull, nsnull, nsnull, nsnull); - - JAVAPROXY_NATIVE(finalizeProxy) (nsnull, nsnull, nsnull); - - JAVAPROXY_NATIVE(isSameXPCOMObject) (nsnull, nsnull, nsnull, nsnull); - - LOCKPROXY_NATIVE(release) (nsnull, nsnull, nsnull); - - MOZILLA_NATIVE(getNativeHandleFromAWT) (nsnull, nsnull, nsnull); - - JXUTILS_NATIVE(wrapJavaObject) (nsnull, nsnull, nsnull, nsnull); - - JXUTILS_NATIVE(wrapXPCOMObject) (nsnull, nsnull, nsnull, nsnull); -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.cpp deleted file mode 100755 index c10bf4c..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/* ***** 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 "nsAppFileLocProviderProxy.h" -#include "nsJavaXPCOMBindingUtils.h" -#include "nsILocalFile.h" -#include "nsISimpleEnumerator.h" - - -nsAppFileLocProviderProxy::nsAppFileLocProviderProxy(jobject aJavaObject) -{ - mJavaLocProvider = GetJNIEnv()->NewGlobalRef(aJavaObject); -} - -nsAppFileLocProviderProxy::~nsAppFileLocProviderProxy() -{ - GetJNIEnv()->DeleteGlobalRef(mJavaLocProvider); -} - -NS_IMPL_ISUPPORTS2(nsAppFileLocProviderProxy, - nsIDirectoryServiceProvider, - nsIDirectoryServiceProvider2) - - -// nsIDirectoryServiceProvider - -NS_IMETHODIMP -nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant, - nsIFile** aResult) -{ - // Setup params for calling Java function - JNIEnv* env = GetJNIEnv(); - jstring prop = env->NewStringUTF(aProp); - if (!prop) - return NS_ERROR_OUT_OF_MEMORY; - jbooleanArray persistant = env->NewBooleanArray(1); - if (!persistant) - return NS_ERROR_OUT_OF_MEMORY; - - // Create method ID - jmethodID mid = nsnull; - jclass clazz = env->GetObjectClass(mJavaLocProvider); - if (clazz) { - mid = env->GetMethodID(clazz, "getFile", - "(Ljava/lang/String;[Z)Ljava/io/File;"); - } - if (!mid) - return NS_ERROR_FAILURE; - - // Call Java function - jobject javaFile = nsnull; - javaFile = env->CallObjectMethod(mJavaLocProvider, mid, prop, persistant); - if (javaFile == nsnull || env->ExceptionCheck()) - return NS_ERROR_FAILURE; - - // Set boolean output value - env->GetBooleanArrayRegion(persistant, 0, 1, (jboolean*) aIsPersistant); - - // Set nsIFile result value - nsCOMPtr localFile; - nsresult rv = File_to_nsILocalFile(env, javaFile, getter_AddRefs(localFile)); - if (NS_SUCCEEDED(rv)) { - return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)aResult); - } - - return rv; -} - - -// nsIDirectoryServiceProvider2 - -class DirectoryEnumerator : public nsISimpleEnumerator -{ -public: - NS_DECL_ISUPPORTS - - DirectoryEnumerator(jobjectArray aJavaFileArray) - : mIndex(0) - { - JNIEnv* env = GetJNIEnv(); - mJavaFileArray = static_cast - (env->NewGlobalRef(aJavaFileArray)); - mArraySize = env->GetArrayLength(aJavaFileArray); - } - - ~DirectoryEnumerator() - { - GetJNIEnv()->DeleteGlobalRef(mJavaFileArray); - } - - NS_IMETHOD HasMoreElements(PRBool* aResult) - { - if (!mJavaFileArray) { - *aResult = PR_FALSE; - } else { - *aResult = (mIndex < mArraySize); - } - return NS_OK; - } - - NS_IMETHOD GetNext(nsISupports** aResult) - { - nsresult rv = NS_ERROR_FAILURE; - - JNIEnv* env = GetJNIEnv(); - jobject javaFile = env->GetObjectArrayElement(mJavaFileArray, mIndex++); - if (javaFile) { - nsCOMPtr localFile; - rv = File_to_nsILocalFile(env, javaFile, getter_AddRefs(localFile)); - env->DeleteLocalRef(javaFile); - - if (NS_SUCCEEDED(rv)) { - return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)aResult); - } - } - - env->ExceptionClear(); - return NS_ERROR_FAILURE; - } - -private: - jobjectArray mJavaFileArray; - PRUint32 mArraySize; - PRUint32 mIndex; -}; - -NS_IMPL_ISUPPORTS1(DirectoryEnumerator, nsISimpleEnumerator) - -NS_IMETHODIMP -nsAppFileLocProviderProxy::GetFiles(const char* aProp, - nsISimpleEnumerator** aResult) -{ - nsresult rv = NS_OK; - - // Setup params for calling Java function - JNIEnv* env = GetJNIEnv(); - jstring prop = env->NewStringUTF(aProp); - if (!prop) - rv = NS_ERROR_OUT_OF_MEMORY; - - // Create method ID - jmethodID mid = nsnull; - if (NS_SUCCEEDED(rv)) { - jclass clazz = env->GetObjectClass(mJavaLocProvider); - if (clazz) { - mid = env->GetMethodID(clazz, "getFiles", - "(Ljava/lang/String;)[Ljava/io/File;"); - env->DeleteLocalRef(clazz); - } - if (!mid) - rv = NS_ERROR_FAILURE; - } - - // Call Java function - jobject javaFileArray = nsnull; - if (NS_SUCCEEDED(rv)) { - javaFileArray = env->CallObjectMethod(mJavaLocProvider, mid, prop); - - // Handle any exception thrown by Java method. - jthrowable exp = env->ExceptionOccurred(); - if (exp) { -#ifdef DEBUG - env->ExceptionDescribe(); -#endif - - // If the exception is an instance of XPCOMException, then get the - // nsresult from the exception instance. Else, default to - // NS_ERROR_FAILURE. - if (env->IsInstanceOf(exp, xpcomExceptionClass)) { - jfieldID fid; - fid = env->GetFieldID(xpcomExceptionClass, "errorcode", "J"); - if (fid) { - rv = env->GetLongField(exp, fid); - } else { - rv = NS_ERROR_FAILURE; - } - NS_ASSERTION(fid, "Couldn't get 'errorcode' field of XPCOMException"); - } else { - rv = NS_ERROR_FAILURE; - } - } else { - // No exception thrown. Check the result. - if (javaFileArray == nsnull) { - rv = NS_ERROR_FAILURE; - } - } - } - - if (NS_SUCCEEDED(rv)) { - // Parse return value - *aResult = new DirectoryEnumerator(static_cast - (javaFileArray)); - NS_ADDREF(*aResult); - return NS_OK; - } - - // Handle error conditions - *aResult = nsnull; - env->ExceptionClear(); - return rv; -} - - -//////////////////////////////////////////////////////////////////////////////// - -nsresult -NS_NewAppFileLocProviderProxy(jobject aJavaLocProvider, - nsIDirectoryServiceProvider** aResult) -{ - nsAppFileLocProviderProxy* provider = - new nsAppFileLocProviderProxy(aJavaLocProvider); - if (provider == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - NS_ADDREF(provider); - - *aResult = provider; - return NS_OK; -} - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.h deleted file mode 100755 index d3b9088..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsAppFileLocProviderProxy.h +++ /dev/null @@ -1,65 +0,0 @@ -/* ***** 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 _nsAppFileLocProviderProxy_h_ -#define _nsAppFileLocProviderProxy_h_ - -#include "nsIDirectoryService.h" -#include "jni.h" - - -class nsAppFileLocProviderProxy : public nsIDirectoryServiceProvider2 -{ -public: - nsAppFileLocProviderProxy(jobject aJavaLocProvider); - ~nsAppFileLocProviderProxy(); - - NS_DECL_ISUPPORTS - NS_DECL_NSIDIRECTORYSERVICEPROVIDER - NS_DECL_NSIDIRECTORYSERVICEPROVIDER2 - -private: - jobject mJavaLocProvider; -}; - -extern "C" nsresult -NS_NewAppFileLocProviderProxy(jobject aJavaLocProvider, - nsIDirectoryServiceProvider** aResult); - - -#endif //_nsAppFileLocProviderProxy_h_ - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.cpp deleted file mode 100755 index 435df58..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.cpp +++ /dev/null @@ -1,475 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* ***** 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 mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * 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 ***** */ - -#if defined(XP_UNIX) || defined(XP_BEOS) -#include -#elif defined(XP_MAC) -#include -#elif defined(XP_WIN) -#include -#elif defined(XP_OS2) -#define INCL_DOSERRORS -#include -#else -// XXX add necessary include file for ftruncate (or equivalent) -#endif - -#if defined(XP_MAC) -#include "pprio.h" -#else -#include "private/pprio.h" -#endif - -#include "nsFileStreams.h" -#include "nsILocalFile.h" -#include "nsXPIDLString.h" -#include "prerror.h" -#include "nsCRT.h" -#include "nsInt64.h" -#include "nsIFile.h" - -#define NS_NO_INPUT_BUFFERING 1 // see http://bugzilla.mozilla.org/show_bug.cgi?id=41067 - -#if defined(PR_LOGGING) -// -// Log module for nsFileTransport logging... -// -// To enable logging (see prlog.h for full details): -// -// set NSPR_LOG_MODULES=nsFileIO:5 -// set NSPR_LOG_FILE=nspr.log -// -// this enables PR_LOG_DEBUG level information and places all output in -// the file nspr.log -// -PRLogModuleInfo* gFileIOLog = nsnull; - -#endif /* PR_LOGGING */ - - -//////////////////////////////////////////////////////////////////////////////// -// nsFileStream - -nsFileStream::nsFileStream() - : mFD(nsnull) - , mCloseFD(PR_TRUE) -{ -} - -nsFileStream::~nsFileStream() -{ - if (mCloseFD) - Close(); -} - -NS_IMPL_THREADSAFE_ISUPPORTS1(nsFileStream, nsISeekableStream) - -nsresult -nsFileStream::InitWithFileDescriptor(PRFileDesc* fd, nsISupports* parent) -{ - NS_ENSURE_TRUE(mFD == nsnull, NS_ERROR_ALREADY_INITIALIZED); - // - // this file stream is dependent on its parent to keep the - // file descriptor valid. an owning reference to the parent - // prevents the file descriptor from going away prematurely. - // - mFD = fd; - mCloseFD = PR_FALSE; - mParent = parent; - return NS_OK; -} - -nsresult -nsFileStream::Close() -{ - nsresult rv = NS_OK; - if (mFD) { - if (mCloseFD) - if (PR_Close(mFD) == PR_FAILURE) - rv = NS_BASE_STREAM_OSERROR; - mFD = nsnull; - } - return rv; -} - -NS_IMETHODIMP -nsFileStream::Seek(PRInt32 whence, PRInt64 offset) -{ - if (mFD == nsnull) - return NS_BASE_STREAM_CLOSED; - - nsInt64 cnt = PR_Seek64(mFD, offset, (PRSeekWhence)whence); - if (cnt == nsInt64(-1)) { - return NS_ErrorAccordingToNSPR(); - } - return NS_OK; -} - -NS_IMETHODIMP -nsFileStream::Tell(PRInt64 *result) -{ - if (mFD == nsnull) - return NS_BASE_STREAM_CLOSED; - - nsInt64 cnt = PR_Seek64(mFD, 0, PR_SEEK_CUR); - if (cnt == nsInt64(-1)) { - return NS_ErrorAccordingToNSPR(); - } - *result = cnt; - return NS_OK; -} - -NS_IMETHODIMP -nsFileStream::SetEOF() -{ - if (mFD == nsnull) - return NS_BASE_STREAM_CLOSED; - -#if defined(XP_UNIX) || defined(XP_MAC) || defined(XP_OS2) || defined(XP_BEOS) - // Some system calls require an EOF offset. - PRInt64 offset; - nsresult rv = Tell(&offset); - if (NS_FAILED(rv)) return rv; -#endif - -#if defined(XP_UNIX) || defined(XP_BEOS) - if (ftruncate(PR_FileDesc2NativeHandle(mFD), offset) != 0) { - NS_ERROR("ftruncate failed"); - return NS_ERROR_FAILURE; - } -#elif defined(XP_MAC) - if (::SetEOF(PR_FileDesc2NativeHandle(mFD), offset) != 0) { - NS_ERROR("SetEOF failed"); - return NS_ERROR_FAILURE; - } -#elif defined(XP_WIN) - if (!SetEndOfFile((HANDLE) PR_FileDesc2NativeHandle(mFD))) { - NS_ERROR("SetEndOfFile failed"); - return NS_ERROR_FAILURE; - } -#elif defined(XP_OS2) - if (DosSetFileSize((HFILE) PR_FileDesc2NativeHandle(mFD), offset) != NO_ERROR) { - NS_ERROR("DosSetFileSize failed"); - return NS_ERROR_FAILURE; - } -#else - // XXX not implemented -#endif - - return NS_OK; -} - -//////////////////////////////////////////////////////////////////////////////// -// nsFileInputStream - -NS_IMPL_ISUPPORTS_INHERITED3(nsFileInputStream, - nsFileStream, - nsIInputStream, - nsIFileInputStream, - nsILineInputStream) - -NS_METHOD -nsFileInputStream::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) -{ - NS_ENSURE_NO_AGGREGATION(aOuter); - - nsFileInputStream* stream = new nsFileInputStream(); - if (stream == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - NS_ADDREF(stream); - nsresult rv = stream->QueryInterface(aIID, aResult); - NS_RELEASE(stream); - return rv; -} - -nsresult -nsFileInputStream::Open(nsIFile* aFile, PRInt32 aIOFlags, PRInt32 aPerm) -{ - nsresult rv = NS_OK; - - // If the previous file is open, close it - if (mFD) { - rv = Close(); - if (NS_FAILED(rv)) return rv; - } - - // Open the file - nsCOMPtr localFile = do_QueryInterface(aFile, &rv); - if (NS_FAILED(rv)) return rv; - if (aIOFlags == -1) - aIOFlags = PR_RDONLY; - if (aPerm == -1) - aPerm = 0; - - PRFileDesc* fd; - rv = localFile->OpenNSPRFileDesc(aIOFlags, aPerm, &fd); - if (NS_FAILED(rv)) return rv; - - mFD = fd; - - if (mBehaviorFlags & DELETE_ON_CLOSE) { - // POSIX compatible filesystems allow a file to be unlinked while a - // file descriptor is still referencing the file. since we've already - // opened the file descriptor, we'll try to remove the file. if that - // fails, then we'll just remember the nsIFile and remove it after we - // close the file descriptor. - rv = aFile->Remove(PR_FALSE); - if (NS_FAILED(rv) && !(mBehaviorFlags & REOPEN_ON_REWIND)) { - // If REOPEN_ON_REWIND is not happenin', we haven't saved the file yet - mFile = aFile; - } - } - - return NS_OK; -} - -NS_IMETHODIMP -nsFileInputStream::Init(nsIFile* aFile, PRInt32 aIOFlags, PRInt32 aPerm, - PRInt32 aBehaviorFlags) -{ - NS_ENSURE_TRUE(!mFD, NS_ERROR_ALREADY_INITIALIZED); - NS_ENSURE_TRUE(!mParent, NS_ERROR_ALREADY_INITIALIZED); - - mBehaviorFlags = aBehaviorFlags; - - // If the file will be reopened on rewind, save the info to open the file - if (mBehaviorFlags & REOPEN_ON_REWIND) { - mFile = aFile; - mIOFlags = aIOFlags; - mPerm = aPerm; - } - - return Open(aFile, aIOFlags, aPerm); -} - -NS_IMETHODIMP -nsFileInputStream::Close() -{ - nsresult rv = nsFileStream::Close(); - if (NS_FAILED(rv)) return rv; - if (mFile && (mBehaviorFlags & DELETE_ON_CLOSE)) { - rv = mFile->Remove(PR_FALSE); - NS_ASSERTION(NS_SUCCEEDED(rv), "failed to delete file"); - // If we don't need to save the file for reopening, free it up - if (!(mBehaviorFlags & REOPEN_ON_REWIND)) { - mFile = nsnull; - } - } - return rv; -} - -NS_IMETHODIMP -nsFileInputStream::Available(PRUint32* aResult) -{ - if (!mFD) { - return NS_BASE_STREAM_CLOSED; - } - - PRInt32 avail = PR_Available(mFD); - if (avail == -1) { - return NS_ErrorAccordingToNSPR(); - } - *aResult = avail; - return NS_OK; -} - -NS_IMETHODIMP -nsFileInputStream::Read(char* aBuf, PRUint32 aCount, PRUint32* aResult) -{ - if (!mFD) { - return NS_BASE_STREAM_CLOSED; - } - - PRInt32 bytesRead = PR_Read(mFD, aBuf, aCount); - if (bytesRead == -1) { - return NS_ErrorAccordingToNSPR(); - } - // Check if we're at the end of file and need to close - if (mBehaviorFlags & CLOSE_ON_EOF) { - if (bytesRead == 0) { - Close(); - } - } - - *aResult = bytesRead; - return NS_OK; -} - -NS_IMETHODIMP -nsFileInputStream::ReadLine(nsACString& aLine, PRBool* aResult) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -nsFileInputStream::ReadSegments(nsWriteSegmentFun aWriter, void* aClosure, - PRUint32 aCount, PRUint32* aResult) -{ - // ReadSegments is not implemented because it would be inefficient when - // the writer does not consume all data. If you want to call ReadSegments, - // wrap a BufferedInputStream around the file stream. That will call - // Read(). - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -nsFileInputStream::IsNonBlocking(PRBool *aNonBlocking) -{ - *aNonBlocking = PR_FALSE; - return NS_OK; -} - -NS_IMETHODIMP -nsFileInputStream::Seek(PRInt32 aWhence, PRInt64 aOffset) -{ - if (!mFD) { - if (mBehaviorFlags & REOPEN_ON_REWIND) { - nsresult rv = Reopen(); - if (NS_FAILED(rv)) { - return rv; - } - } else { - return NS_BASE_STREAM_CLOSED; - } - } - - return nsFileStream::Seek(aWhence, aOffset); -} - -//////////////////////////////////////////////////////////////////////////////// -// nsFileOutputStream - -NS_IMPL_ISUPPORTS_INHERITED2(nsFileOutputStream, - nsFileStream, - nsIOutputStream, - nsIFileOutputStream) - -NS_METHOD -nsFileOutputStream::Create(nsISupports *aOuter, REFNSIID aIID, void **aResult) -{ - NS_ENSURE_NO_AGGREGATION(aOuter); - - nsFileOutputStream* stream = new nsFileOutputStream(); - if (stream == nsnull) - return NS_ERROR_OUT_OF_MEMORY; - NS_ADDREF(stream); - nsresult rv = stream->QueryInterface(aIID, aResult); - NS_RELEASE(stream); - return rv; -} - -NS_IMETHODIMP -nsFileOutputStream::Init(nsIFile* file, PRInt32 ioFlags, PRInt32 perm, - PRInt32 behaviorFlags) -{ - NS_ENSURE_TRUE(mFD == nsnull, NS_ERROR_ALREADY_INITIALIZED); - - nsresult rv; - nsCOMPtr localFile = do_QueryInterface(file, &rv); - if (NS_FAILED(rv)) return rv; - if (ioFlags == -1) - ioFlags = PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE; - if (perm <= 0) - perm = 0664; - - PRFileDesc* fd; - rv = localFile->OpenNSPRFileDesc(ioFlags, perm, &fd); - if (NS_FAILED(rv)) return rv; - - mFD = fd; - return NS_OK; -} - -NS_IMETHODIMP -nsFileOutputStream::Close() -{ - return nsFileStream::Close(); -} - -NS_IMETHODIMP -nsFileOutputStream::Write(const char *buf, PRUint32 count, PRUint32 *result) -{ - if (mFD == nsnull) - return NS_BASE_STREAM_CLOSED; - - PRInt32 cnt = PR_Write(mFD, buf, count); - if (cnt == -1) { - return NS_ErrorAccordingToNSPR(); - } - *result = cnt; - return NS_OK; -} - -NS_IMETHODIMP -nsFileOutputStream::Flush(void) -{ - if (mFD == nsnull) - return NS_BASE_STREAM_CLOSED; - - PRInt32 cnt = PR_Sync(mFD); - if (cnt == -1) { - return NS_ErrorAccordingToNSPR(); - } - return NS_OK; -} - -NS_IMETHODIMP -nsFileOutputStream::WriteFrom(nsIInputStream *inStr, PRUint32 count, PRUint32 *_retval) -{ - NS_NOTREACHED("WriteFrom (see source comment)"); - return NS_ERROR_NOT_IMPLEMENTED; - // File streams intentionally do not support this method. - // If you need something like this, then you should wrap - // the file stream using nsIBufferedOutputStream -} - -NS_IMETHODIMP -nsFileOutputStream::WriteSegments(nsReadSegmentFun reader, void * closure, PRUint32 count, PRUint32 *_retval) -{ - NS_NOTREACHED("WriteSegments (see source comment)"); - return NS_ERROR_NOT_IMPLEMENTED; - // File streams intentionally do not support this method. - // If you need something like this, then you should wrap - // the file stream using nsIBufferedOutputStream -} - -NS_IMETHODIMP -nsFileOutputStream::IsNonBlocking(PRBool *aNonBlocking) -{ - *aNonBlocking = PR_FALSE; - return NS_OK; -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.h deleted file mode 100755 index 7d713fc..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsFileStreams.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* ***** 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 mozilla.org code. - * - * The Initial Developer of the Original Code is - * Netscape Communications Corporation. - * Portions created by the Initial Developer are Copyright (C) 1998 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * - * 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 nsFileStreams_h__ -#define nsFileStreams_h__ - -#include "nsIFileStreams.h" -#include "nsIFile.h" -#include "nsIInputStream.h" -#include "nsIOutputStream.h" -#include "nsISeekableStream.h" -#include "nsILineInputStream.h" -#include "nsCOMPtr.h" -#include "prlog.h" -#include "prio.h" - -template class nsLineBuffer; - -//////////////////////////////////////////////////////////////////////////////// - -class nsFileStream : public nsISeekableStream -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSISEEKABLESTREAM - - nsFileStream(); - virtual ~nsFileStream(); - - nsresult Close(); - nsresult InitWithFileDescriptor(PRFileDesc* fd, nsISupports* parent); - -protected: - PRFileDesc* mFD; - nsCOMPtr mParent; // strong reference to parent nsFileIO, - // which ensures mFD remains valid. - PRBool mCloseFD; -}; - -//////////////////////////////////////////////////////////////////////////////// - -class nsFileInputStream : public nsFileStream, - public nsIFileInputStream, - public nsILineInputStream -{ -public: - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_NSIINPUTSTREAM - NS_DECL_NSIFILEINPUTSTREAM - NS_DECL_NSILINEINPUTSTREAM - - // Overrided from nsFileStream - NS_IMETHOD Seek(PRInt32 aWhence, PRInt64 aOffset); - - nsFileInputStream() : nsFileStream() - { - mBehaviorFlags = 0; - } - virtual ~nsFileInputStream() - { - Close(); - } - - static NS_METHOD - Create(nsISupports *aOuter, REFNSIID aIID, void **aResult); - -protected: - /** - * The file being opened. Only stored when DELETE_ON_CLOSE or - * REOPEN_ON_REWIND are true. - */ - nsCOMPtr mFile; - /** - * The IO flags passed to Init() for the file open. - * Only set for REOPEN_ON_REWIND. - */ - PRInt32 mIOFlags; - /** - * The permissions passed to Init() for the file open. - * Only set for REOPEN_ON_REWIND. - */ - PRInt32 mPerm; - /** - * Flags describing our behavior. See the IDL file for possible values. - */ - PRInt32 mBehaviorFlags; - -protected: - /** - * Internal, called to open a file. Parameters are the same as their - * Init() analogues. - */ - nsresult Open(nsIFile* file, PRInt32 ioFlags, PRInt32 perm); - /** - * Reopen the file (for OPEN_ON_READ only!) - */ - nsresult Reopen() { return Open(mFile, mIOFlags, mPerm); } -}; - -//////////////////////////////////////////////////////////////////////////////// - -class nsFileOutputStream : public nsFileStream, - public nsIFileOutputStream -{ -public: - NS_DECL_ISUPPORTS_INHERITED - NS_DECL_NSIOUTPUTSTREAM - NS_DECL_NSIFILEOUTPUTSTREAM - - nsFileOutputStream() : nsFileStream() {} - virtual ~nsFileOutputStream() { nsFileOutputStream::Close(); } - - static NS_METHOD - Create(nsISupports *aOuter, REFNSIID aIID, void **aResult); -}; - -//////////////////////////////////////////////////////////////////////////////// - -#endif // nsFileStreams_h__ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsIFileStreams.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsIFileStreams.h deleted file mode 100755 index 3df02b5..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsIFileStreams.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - * DO NOT EDIT. THIS FILE IS GENERATED FROM nsIFileStreams.idl - */ - -#ifndef __gen_nsIFileStreams_h__ -#define __gen_nsIFileStreams_h__ - - -#ifndef __gen_nsIInputStream_h__ -#include "nsIInputStream.h" -#endif - -#ifndef __gen_nsIOutputStream_h__ -#include "nsIOutputStream.h" -#endif - -/* For IDL files that don't want to include root IDL files. */ -#ifndef NS_NO_VTABLE -#define NS_NO_VTABLE -#endif -class nsIFile; /* forward declaration */ - - -/* starting interface: nsIFileInputStream */ -#define NS_IFILEINPUTSTREAM_IID_STR "e3d56a20-c7ec-11d3-8cda-0060b0fc14a3" - -#define NS_IFILEINPUTSTREAM_IID \ - {0xe3d56a20, 0xc7ec, 0x11d3, \ - { 0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3 }} - -/** - * An input stream that allows you to read from a file. - */ -class NS_NO_VTABLE nsIFileInputStream : public nsIInputStream { - public: - - NS_DEFINE_STATIC_IID_ACCESSOR(NS_IFILEINPUTSTREAM_IID) - - /** - * @param file file to read from (must QI to nsILocalFile) - * @param ioFlags file open flags listed in prio.h - * @param perm file mode bits listed in prio.h - * @param behaviorFlags flags specifying various behaviors of the class - * (see enumerations in the class) - */ - /* void init (in nsIFile file, in long ioFlags, in long perm, in long behaviorFlags); */ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) = 0; - - /** - * If this is set, the file will be deleted by the time the stream is - * closed. It may be removed before the stream is closed if it is possible - * to delete it and still read from it. - * - * If OPEN_ON_READ is defined, and the file was recreated after the first - * delete, the file will be deleted again when it is closed again. - */ - enum { DELETE_ON_CLOSE = 2 }; - - /** - * If this is set, the file will close automatically when the end of the - * file is reached. - */ - enum { CLOSE_ON_EOF = 4 }; - - /** - * If this is set, the file will be reopened whenever Seek(0) occurs. If - * the file is already open and the seek occurs, it will happen naturally. - * (The file will only be reopened if it is closed for some reason.) - */ - enum { REOPEN_ON_REWIND = 8 }; - -}; - -/* Use this macro when declaring classes that implement this interface. */ -#define NS_DECL_NSIFILEINPUTSTREAM \ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags); \ - -/* Use this macro to declare functions that forward the behavior of this interface to another object. */ -#define NS_FORWARD_NSIFILEINPUTSTREAM(_to) \ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) { return _to Init(file, ioFlags, perm, behaviorFlags); } \ - -/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */ -#define NS_FORWARD_SAFE_NSIFILEINPUTSTREAM(_to) \ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(file, ioFlags, perm, behaviorFlags); } \ - -#if 0 -/* Use the code below as a template for the implementation class for this interface. */ - -/* Header file */ -class nsFileInputStream : public nsIFileInputStream -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSIFILEINPUTSTREAM - - nsFileInputStream(); - -private: - ~nsFileInputStream(); - -protected: - /* additional members */ -}; - -/* Implementation file */ -NS_IMPL_ISUPPORTS1(nsFileInputStream, nsIFileInputStream) - -nsFileInputStream::nsFileInputStream() -{ - /* member initializers and constructor code */ -} - -nsFileInputStream::~nsFileInputStream() -{ - /* destructor code */ -} - -/* void init (in nsIFile file, in long ioFlags, in long perm, in long behaviorFlags); */ -NS_IMETHODIMP nsFileInputStream::Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -/* End of implementation class template. */ -#endif - - -/* starting interface: nsIFileOutputStream */ -#define NS_IFILEOUTPUTSTREAM_IID_STR "e6f68040-c7ec-11d3-8cda-0060b0fc14a3" - -#define NS_IFILEOUTPUTSTREAM_IID \ - {0xe6f68040, 0xc7ec, 0x11d3, \ - { 0x8c, 0xda, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3 }} - -/** - * An output stream that lets you stream to a file. - */ -class NS_NO_VTABLE nsIFileOutputStream : public nsIOutputStream { - public: - - NS_DEFINE_STATIC_IID_ACCESSOR(NS_IFILEOUTPUTSTREAM_IID) - - /** - * @param file - file to write to (must QI to nsILocalFile) - * @param ioFlags - file open flags listed in prio.h - * @param perm - file mode bits listed in prio.h - * @param behaviorFlags flags specifying various behaviors of the class - * (currently none supported) - */ - /* void init (in nsIFile file, in long ioFlags, in long perm, in long behaviorFlags); */ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) = 0; - -}; - -/* Use this macro when declaring classes that implement this interface. */ -#define NS_DECL_NSIFILEOUTPUTSTREAM \ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags); - -/* Use this macro to declare functions that forward the behavior of this interface to another object. */ -#define NS_FORWARD_NSIFILEOUTPUTSTREAM(_to) \ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) { return _to Init(file, ioFlags, perm, behaviorFlags); } - -/* Use this macro to declare functions that forward the behavior of this interface to another object in a safe way. */ -#define NS_FORWARD_SAFE_NSIFILEOUTPUTSTREAM(_to) \ - NS_IMETHOD Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) { return !_to ? NS_ERROR_NULL_POINTER : _to->Init(file, ioFlags, perm, behaviorFlags); } - -#if 0 -/* Use the code below as a template for the implementation class for this interface. */ - -/* Header file */ -class nsFileOutputStream : public nsIFileOutputStream -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSIFILEOUTPUTSTREAM - - nsFileOutputStream(); - -private: - ~nsFileOutputStream(); - -protected: - /* additional members */ -}; - -/* Implementation file */ -NS_IMPL_ISUPPORTS1(nsFileOutputStream, nsIFileOutputStream) - -nsFileOutputStream::nsFileOutputStream() -{ - /* member initializers and constructor code */ -} - -nsFileOutputStream::~nsFileOutputStream() -{ - /* destructor code */ -} - -/* void init (in nsIFile file, in long ioFlags, in long perm, in long behaviorFlags); */ -NS_IMETHODIMP nsFileOutputStream::Init(nsIFile *file, PRInt32 ioFlags, PRInt32 perm, PRInt32 behaviorFlags) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -/* End of implementation class template. */ -#endif - - -#endif /* __gen_nsIFileStreams_h__ */ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.cpp deleted file mode 100755 index 103f2f3..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.cpp +++ /dev/null @@ -1,557 +0,0 @@ -/* ***** 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) 2007 - * 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 "nsJavaInterfaces.h" -#include "nsJavaWrapper.h" -#include "nsJavaXPCOMBindingUtils.h" -#include "nsJavaXPTCStub.h" -#include "nsIComponentRegistrar.h" -#include "nsString.h" -#include "nsISimpleEnumerator.h" -#include "nsIInterfaceInfoManager.h" -#include "nsIInputStream.h" -#include "nsEnumeratorUtils.h" -#include "nsAppFileLocProviderProxy.h" -#ifndef VBOX -#include "nsXULAppAPI.h" -#endif -#include "nsILocalFile.h" - -#ifdef XP_MACOSX -#include "jawt.h" -#endif - - -#ifdef VBOX -#if 0 -#include "org_mozilla_xpcom_internal_GREImpl.h" -#include "org_mozilla_xpcom_internal_JavaXPCOMMethods.h" -#include "org_mozilla_xpcom_internal_MozillaImpl.h" -#include "org_mozilla_xpcom_internal_XPCOMImpl.h" -#include "org_mozilla_xpcom_internal_XPCOMJavaProxy.h" -#include "org_mozilla_xpcom_ProfileLock.h" -#endif -#include -using namespace com; -#include -#include -#include -#endif - -extern "C" NS_EXPORT void JNICALL -MOZILLA_NATIVE(initialize) (JNIEnv* env, jobject) -{ - if (!InitializeJavaGlobals(env)) { - jclass clazz = - env->FindClass("org/mozilla/xpcom/XPCOMInitializationException"); - if (clazz) { - env->ThrowNew(clazz, "Failed to initialize JavaXPCOM"); - } - } -} - -nsresult -InitEmbedding_Impl(JNIEnv* env, jobject aLibXULDirectory, - jobject aAppDirectory, jobject aAppDirProvider) -{ - nsresult rv; - - // create an nsILocalFile from given java.io.File - nsCOMPtr libXULDir; - if (aLibXULDirectory) { - rv = File_to_nsILocalFile(env, aLibXULDirectory, getter_AddRefs(libXULDir)); - NS_ENSURE_SUCCESS(rv, rv); - } - nsCOMPtr appDir; - if (aAppDirectory) { - rv = File_to_nsILocalFile(env, aAppDirectory, getter_AddRefs(appDir)); - NS_ENSURE_SUCCESS(rv, rv); - } - - // create nsAppFileLocProviderProxy from given Java object - nsCOMPtr provider; - if (aAppDirProvider) { - rv = NS_NewAppFileLocProviderProxy(aAppDirProvider, - getter_AddRefs(provider)); - NS_ENSURE_SUCCESS(rv, rv); - } - - // init libXUL -#ifdef VBOX - return 0; -#else - return XRE_InitEmbedding(libXULDir, appDir, provider, nsnull, 0); -#endif -} - -extern "C" NS_EXPORT void JNICALL -GRE_NATIVE(initEmbedding) (JNIEnv* env, jobject, jobject aLibXULDirectory, - jobject aAppDirectory, jobject aAppDirProvider) -{ - nsresult rv = InitEmbedding_Impl(env, aLibXULDirectory, aAppDirectory, - aAppDirProvider); - - if (NS_FAILED(rv)) { - ThrowException(env, rv, "Failure in initEmbedding"); - FreeJavaGlobals(env); - } -} - -extern "C" NS_EXPORT void JNICALL -GRE_NATIVE(termEmbedding) (JNIEnv *env, jobject) -{ - // Free globals before calling XRE_TermEmbedding(), since we need some - // XPCOM services. - FreeJavaGlobals(env); - -#ifndef VBOX - XRE_TermEmbedding(); -#endif -} -#ifdef VBOX -nsresult -InitXPCOMVBox_Impl(JNIEnv* env, jobject aVBoxBinDirectory) -{ -#if defined(VBOX_PATH_APP_PRIVATE_ARCH) && defined(VBOX_PATH_SHARED_LIBS) - rv = RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE); -#else - const char *pszHome = nsnull; - const char *jhome = nsnull; - jstring path = nsnull; - - int rv; - jclass clazz; - jmethodID getPathMID; - - if (aVBoxBinDirectory && - (clazz = env->FindClass("java/io/File")) && - (getPathMID = env->GetMethodID(clazz, "getAbsolutePath", - "()Ljava/lang/String;")) - ) - { - path = (jstring)env->CallObjectMethod(aVBoxBinDirectory, getPathMID); - pszHome = jhome = env->GetStringUTFChars(path, nsnull); - } - - if (pszHome == nsnull) - pszHome = getenv("VBOX_PROGRAM_PATH"); - - if (pszHome) { - size_t cchHome = strlen(pszHome); - char *pszExePath = (char *)alloca(cchHome + 32); - memcpy(pszExePath, pszHome, cchHome); - memcpy(pszExePath + cchHome, "/javafake", sizeof("/javafake")); - rv = RTR3InitEx(RTR3INIT_VER_CUR, RTR3INIT_FLAGS_DLL | RTR3INIT_FLAGS_UNOBTRUSIVE, 0, NULL, pszExePath); - } else { - rv = RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE); - } - - if (jhome) - env->ReleaseStringUTFChars(path, jhome); -#endif - - return com::Initialize(); -} -#endif - -nsresult -InitXPCOM_Impl(JNIEnv* env, jobject aMozBinDirectory, - jobject aAppFileLocProvider, jobject* aResult) -{ - nsresult rv; - // create an nsILocalFile from given java.io.File - nsCOMPtr directory; - if (aMozBinDirectory) { - rv = File_to_nsILocalFile(env, aMozBinDirectory, getter_AddRefs(directory)); - NS_ENSURE_SUCCESS(rv, rv); - } - - // create nsAppFileLocProviderProxy from given Java object - nsCOMPtr provider; - if (aAppFileLocProvider) { - rv = NS_NewAppFileLocProviderProxy(aAppFileLocProvider, - getter_AddRefs(provider)); - NS_ENSURE_SUCCESS(rv, rv); - } - - // init XPCOM - nsCOMPtr servMan; - rv = NS_InitXPCOM2(getter_AddRefs(servMan), directory, provider); - NS_ENSURE_SUCCESS(rv, rv); - - // create Java proxy for service manager returned by NS_InitXPCOM2 - return NativeInterfaceToJavaObject(env, servMan, NS_GET_IID(nsIServiceManager), - nsnull, aResult); -} - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jobject, jobject aMozBinDirectory, - jobject aAppFileLocProvider) -{ -#ifdef VBOX - nsresult rv = InitXPCOMVBox_Impl(env, aMozBinDirectory); - if (NS_SUCCEEDED(rv)) - return nsnull; -#else - jobject servMan; - nsresult rv = InitXPCOM_Impl(env, aMozBinDirectory, aAppFileLocProvider, - &servMan); - if (NS_SUCCEEDED(rv)) - return servMan; -#endif - - ThrowException(env, rv, "Failure in initXPCOM"); - FreeJavaGlobals(env); - return nsnull; -} - -extern "C" NS_EXPORT void JNICALL -#ifdef VBOX -XPCOM_NATIVE2(shutdownXPCOM) (JNIEnv *env, jobject, jobject aServMgr) -#else -XPCOM_NATIVE(shutdownXPCOM) (JNIEnv *env, jobject, jobject aServMgr) -#endif -{ -#ifdef VBOX - // Free globals before calling NS_ShutdownXPCOM(), since we need some - // XPCOM services. - //FreeJavaGlobals(env); - //com::Shutdown(); -#else - nsresult rv; - nsIServiceManager* servMgr = nsnull; - if (aServMgr) { - // Get native XPCOM instance - nsISupports* instancePtr = nsnull; - rv = JavaObjectToNativeInterface(env, aServMgr, - NS_GET_IID(nsIServiceManager), (void**) &instancePtr); - NS_ASSERTION(NS_SUCCEEDED(rv) && instancePtr != nsnull, - "Failed to get XPCOM obj for ServiceMgr."); - if (NS_SUCCEEDED(rv)) { - rv = instancePtr->QueryInterface(NS_GET_IID(nsIServiceManager), - (void**) &servMgr); - NS_ASSERTION(NS_SUCCEEDED(rv), "QI for nsIServiceManager failed"); - } - - // Even if we failed to get the matching xpcom object, we don't abort this - // function. Just call NS_ShutdownXPCOM with a null service manager. - } - - // Free globals before calling NS_ShutdownXPCOM(), since we need some - // XPCOM services. - FreeJavaGlobals(env); - - rv = NS_ShutdownXPCOM(servMgr); - if (NS_FAILED(rv)) - ThrowException(env, rv, "NS_ShutdownXPCOM failed"); -#endif -} - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jobject, jstring aPath, - jboolean aFollowLinks) -{ - // Create a Mozilla string from the jstring - const PRUnichar* buf = nsnull; - if (aPath) { - buf = env->GetStringChars(aPath, nsnull); - if (!buf) - return nsnull; // exception already thrown - } - - nsAutoString path_str(buf); - env->ReleaseStringChars(aPath, buf); - - // Make call to given function - nsCOMPtr file; - nsresult rv = NS_NewLocalFile(path_str, aFollowLinks, getter_AddRefs(file)); - - if (NS_SUCCEEDED(rv)) { - jobject javaProxy; - rv = NativeInterfaceToJavaObject(env, file, NS_GET_IID(nsILocalFile), - nsnull, &javaProxy); - if (NS_SUCCEEDED(rv)) - return javaProxy; - } - - ThrowException(env, rv, "Failure in newLocalFile"); - return nsnull; -} - -extern "C" NS_EXPORT jobject JNICALL -#ifdef VBOX -XPCOM_NATIVE2(getComponentManager) (JNIEnv *env, jobject) -#else -XPCOM_NATIVE(getComponentManager) (JNIEnv *env, jobject) -#endif -{ - // Call XPCOM method - nsCOMPtr cm; - nsresult rv = NS_GetComponentManager(getter_AddRefs(cm)); - - if (NS_SUCCEEDED(rv)) { - jobject javaProxy; - rv = NativeInterfaceToJavaObject(env, cm, NS_GET_IID(nsIComponentManager), - nsnull, &javaProxy); - if (NS_SUCCEEDED(rv)) - return javaProxy; - } - - ThrowException(env, rv, "Failure in getComponentManager"); - return nsnull; -} - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(getComponentRegistrar) (JNIEnv *env, jobject) -{ - // Call XPCOM method - nsCOMPtr cr; - nsresult rv = NS_GetComponentRegistrar(getter_AddRefs(cr)); - - if (NS_SUCCEEDED(rv)) { - jobject javaProxy; - rv = NativeInterfaceToJavaObject(env, cr, NS_GET_IID(nsIComponentRegistrar), - nsnull, &javaProxy); - if (NS_SUCCEEDED(rv)) - return javaProxy; - } - - ThrowException(env, rv, "Failure in getComponentRegistrar"); - return nsnull; -} - -#ifdef VBOX -# include -# include - -extern "C" NS_EXPORT jint JNICALL -XPCOM_NATIVE2(waitForEvents) (JNIEnv *env, jobject, jlong aTimeout) -{ - com::NativeEventQueue* aEventQ = com::NativeEventQueue::getMainEventQueue(); - NS_WARN_IF_FALSE(aEventQ != nsnull, "Null main event queue"); - if (!aEventQ) - return -1; - - int rc = aEventQ->processEventQueue(aTimeout < 0 ? RT_INDEFINITE_WAIT : (uint32_t)aTimeout); - - if (RT_SUCCESS(rc)) - return 0; - - if ( rc == VERR_TIMEOUT - || rc == VERR_INTERRUPTED) - return 1; - - return 2; -} -#endif - -extern "C" NS_EXPORT jobject JNICALL -#ifdef VBOX -XPCOM_NATIVE2(getServiceManager) (JNIEnv *env, jobject) -#else -XPCOM_NATIVE(getServiceManager) (JNIEnv *env, jobject) -#endif -{ - // Call XPCOM method - nsCOMPtr sm; - nsresult rv = NS_GetServiceManager(getter_AddRefs(sm)); - - if (NS_SUCCEEDED(rv)) { - jobject javaProxy; - rv = NativeInterfaceToJavaObject(env, sm, NS_GET_IID(nsIServiceManager), - nsnull, &javaProxy); - if (NS_SUCCEEDED(rv)) - return javaProxy; - } - - ThrowException(env, rv, "Failure in getServiceManager"); - return nsnull; -} - -extern "C" NS_EXPORT jobject JNICALL -GRE_NATIVE(lockProfileDirectory) (JNIEnv* env, jobject, jobject aDirectory) -{ - nsresult rv = NS_ERROR_FAILURE; - - if (aDirectory) { - nsCOMPtr profileDir; - rv = File_to_nsILocalFile(env, aDirectory, getter_AddRefs(profileDir)); - - if (NS_SUCCEEDED(rv)) { - nsISupports* lock; -#ifdef VBOX - rv = 0; - lock = 0; -#else - rv = XRE_LockProfileDirectory(profileDir, &lock); -#endif - - if (NS_SUCCEEDED(rv)) { - jclass clazz = - env->FindClass("org/mozilla/xpcom/ProfileLock"); - if (clazz) { - jmethodID mid = env->GetMethodID(clazz, "", "(J)V"); - if (mid) { - return env->NewObject(clazz, mid, reinterpret_cast(lock)); - } - } - - // if we get here, then something failed - rv = NS_ERROR_FAILURE; - } - } - } - - ThrowException(env, rv, "Failure in lockProfileDirectory"); - return nsnull; -} - -extern "C" NS_EXPORT void JNICALL -GRE_NATIVE(notifyProfile) (JNIEnv *env, jobject) -{ -#ifndef VBOX - XRE_NotifyProfile(); -#endif -} - -#ifdef XP_MACOSX -extern PRUint64 GetPlatformHandle(JAWT_DrawingSurfaceInfo* dsi); -#endif - -extern "C" NS_EXPORT jlong JNICALL -MOZILLA_NATIVE(getNativeHandleFromAWT) (JNIEnv* env, jobject clazz, - jobject widget) -{ - PRUint64 handle = 0; - -#if defined(XP_MACOSX) && !defined(VBOX) - JAWT awt; - awt.version = JAWT_VERSION_1_4; - jboolean result = JAWT_GetAWT(env, &awt); - if (result == JNI_FALSE) - return 0; - - JAWT_DrawingSurface* ds = awt.GetDrawingSurface(env, widget); - if (ds != nsnull) { - jint lock = ds->Lock(ds); - if (!(lock & JAWT_LOCK_ERROR)) { - JAWT_DrawingSurfaceInfo* dsi = ds->GetDrawingSurfaceInfo(ds); - if (dsi) { - handle = GetPlatformHandle(dsi); - ds->FreeDrawingSurfaceInfo(dsi); - } - - ds->Unlock(ds); - } - - awt.FreeDrawingSurface(ds); - } -#else - NS_WARNING("getNativeHandleFromAWT JNI method not implemented"); -#endif - - return handle; -} - -extern "C" NS_EXPORT jlong JNICALL -JXUTILS_NATIVE(wrapJavaObject) (JNIEnv* env, jobject, jobject aJavaObject, - jstring aIID) -{ - nsresult rv; - void* xpcomObject = nsnull; - - if (!aJavaObject || !aIID) { - rv = NS_ERROR_NULL_POINTER; - } else { - const char* str = env->GetStringUTFChars(aIID, nsnull); - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - } else { - nsID iid; - if (iid.Parse(str)) { - rv = JavaObjectToNativeInterface(env, aJavaObject, iid, &xpcomObject); - if (NS_SUCCEEDED(rv)) { - nsISupports *xpcom_nat_obj = (nsISupports*) xpcomObject; - rv = xpcom_nat_obj->QueryInterface(iid, &xpcomObject); - NS_IF_RELEASE(xpcom_nat_obj); - } - } else { - rv = NS_ERROR_INVALID_ARG; - } - - env->ReleaseStringUTFChars(aIID, str); - } - } - - if (NS_FAILED(rv)) { - ThrowException(env, rv, "Failed to create XPCOM proxy for Java object"); - } - return reinterpret_cast(xpcomObject); -} - -extern "C" NS_EXPORT jobject JNICALL -JXUTILS_NATIVE(wrapXPCOMObject) (JNIEnv* env, jobject, jlong aXPCOMObject, - jstring aIID) -{ - nsresult rv; - jobject javaObject = nsnull; - nsISupports* xpcomObject = reinterpret_cast(aXPCOMObject); - - if (!xpcomObject || !aIID) { - rv = NS_ERROR_NULL_POINTER; - } else { - const char* str = env->GetStringUTFChars(aIID, nsnull); - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - } else { - nsID iid; - if (iid.Parse(str)) { - // XXX Should we be passing something other than NULL for aObjectLoader? - rv = NativeInterfaceToJavaObject(env, xpcomObject, iid, nsnull, - &javaObject); - } else { - rv = NS_ERROR_INVALID_ARG; - } - - env->ReleaseStringUTFChars(aIID, str); - } - } - - if (NS_FAILED(rv)) { - ThrowException(env, rv, "Failed to create XPCOM proxy for Java object"); - } - return javaObject; -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.h deleted file mode 100755 index 69d2f68..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaInterfaces.h +++ /dev/null @@ -1,121 +0,0 @@ -/* ***** 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) 2006 - * 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 _nsJavaInterfaces_h_ -#define _nsJavaInterfaces_h_ - -#include "jni.h" -#include "nscore.h" - -#ifdef VBOX -#define MOZILLA_NATIVE(func) Java_org_mozilla_xpcom_internal_MozillaImpl_##func##Native -#define GRE_NATIVE(func) Java_org_mozilla_xpcom_internal_GREImpl_##func##Native -#define XPCOM_NATIVE(func) Java_org_mozilla_xpcom_internal_XPCOMImpl_##func##Native -#define XPCOM_NATIVE2(func) Java_org_mozilla_xpcom_internal_XPCOMImpl_##func -#else -#define MOZILLA_NATIVE(func) Java_org_mozilla_xpcom_internal_MozillaImpl_##func -#define GRE_NATIVE(func) Java_org_mozilla_xpcom_internal_GREImpl_##func -#define XPCOM_NATIVE(func) Java_org_mozilla_xpcom_internal_XPCOMImpl_##func -#endif -#define JAVAPROXY_NATIVE(func) \ - Java_org_mozilla_xpcom_internal_XPCOMJavaProxy_##func -#define LOCKPROXY_NATIVE(func) Java_org_mozilla_xpcom_ProfileLock_##func -#define JXUTILS_NATIVE(func) \ - Java_org_mozilla_xpcom_internal_JavaXPCOMMethods_##func - - -extern "C" NS_EXPORT void JNICALL -MOZILLA_NATIVE(initialize) (JNIEnv* env, jobject); - -extern "C" NS_EXPORT void JNICALL -GRE_NATIVE(initEmbedding) (JNIEnv* env, jobject, jobject aLibXULDirectory, - jobject aAppDirectory, jobject aAppDirProvider); - -extern "C" NS_EXPORT void JNICALL -GRE_NATIVE(termEmbedding) (JNIEnv *env, jobject); - -extern "C" NS_EXPORT jobject JNICALL -GRE_NATIVE(lockProfileDirectory) (JNIEnv *, jobject, jobject aDirectory); - -extern "C" NS_EXPORT void JNICALL -GRE_NATIVE(notifyProfile) (JNIEnv *env, jobject); - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jobject, jobject aMozBinDirectory, - jobject aAppFileLocProvider); - -extern "C" NS_EXPORT void JNICALL -XPCOM_NATIVE(shutdownXPCOM) (JNIEnv *env, jobject, jobject aServMgr); - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jobject, jstring aPath, - jboolean aFollowLinks); - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(getComponentManager) (JNIEnv *env, jobject); - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(getComponentRegistrar) (JNIEnv *env, jobject); - -extern "C" NS_EXPORT jobject JNICALL -XPCOM_NATIVE(getServiceManager) (JNIEnv *env, jobject); - -extern "C" NS_EXPORT jobject JNICALL -JAVAPROXY_NATIVE(callXPCOMMethod) (JNIEnv *env, jclass that, jobject aJavaProxy, - jstring aMethodName, jobjectArray aParams); - -extern "C" NS_EXPORT void JNICALL -JAVAPROXY_NATIVE(finalizeProxy) (JNIEnv *env, jclass that, jobject aJavaProxy); - -extern "C" NS_EXPORT jboolean JNICALL -JAVAPROXY_NATIVE(isSameXPCOMObject) (JNIEnv *env, jclass that, jobject aProxy1, - jobject aProxy2); - -extern "C" NS_EXPORT void JNICALL -LOCKPROXY_NATIVE(release) (JNIEnv *env, jclass that, jlong aLockObject); - -extern "C" NS_EXPORT jlong JNICALL -MOZILLA_NATIVE(getNativeHandleFromAWT) (JNIEnv* env, jobject, jobject widget); - -extern "C" NS_EXPORT jlong JNICALL -JXUTILS_NATIVE(wrapJavaObject) (JNIEnv* env, jobject, jobject aJavaObject, - jstring aIID); - -extern "C" NS_EXPORT jobject JNICALL -JXUTILS_NATIVE(wrapXPCOMObject) (JNIEnv* env, jobject, jlong aXPCOMObject, - jstring aIID); - -#endif // _nsJavaInterfaces_h_ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.cpp deleted file mode 100755 index a046c8a..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.cpp +++ /dev/null @@ -1,2020 +0,0 @@ -/* ***** 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) 2006 - * 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 "nsJavaInterfaces.h" -#include "nsJavaWrapper.h" -#include "nsJavaXPTCStub.h" -#include "nsJavaXPCOMBindingUtils.h" -#include "jni.h" -#include "xptcall.h" -#include "nsIInterfaceInfoManager.h" -#include "nsString.h" -#include "nsCRT.h" -#include "prmem.h" -#include "nsServiceManagerUtils.h" -#include "nsThreadUtils.h" -#include "nsProxyRelease.h" - -static nsID nullID = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}; - -#ifdef VBOX -#include "nsIThread.h" -static nsresult -NS_InvokeByIndex(nsISupports* that, PRUint32 methodIndex, - PRUint32 paramCount, nsXPTCVariant* params) -{ - return XPTC_InvokeByIndex(that, methodIndex, paramCount, params); -} - -#endif - -nsresult -CreateJavaArray(JNIEnv* env, PRUint8 aType, PRUint32 aSize, const nsID& aIID, - jobject* aResult) -{ - jobject array = nsnull; - switch (aType) - { - case nsXPTType::T_I8: - array = env->NewByteArray(aSize); - break; - - case nsXPTType::T_I16: - case nsXPTType::T_U8: - array = env->NewShortArray(aSize); - break; - - case nsXPTType::T_I32: - case nsXPTType::T_U16: - array = env->NewIntArray(aSize); - break; - - case nsXPTType::T_I64: - case nsXPTType::T_U32: - array = env->NewLongArray(aSize); - break; - - case nsXPTType::T_FLOAT: - array = env->NewFloatArray(aSize); - break; - - // XXX how do we handle unsigned 64-bit values? - case nsXPTType::T_U64: - case nsXPTType::T_DOUBLE: - array = env->NewDoubleArray(aSize); - break; - - case nsXPTType::T_BOOL: - array = env->NewBooleanArray(aSize); - break; - - case nsXPTType::T_CHAR: - case nsXPTType::T_WCHAR: - array = env->NewCharArray(aSize); - 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: - array = env->NewObjectArray(aSize, stringClass, nsnull); - break; - - case nsXPTType::T_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - { - nsCOMPtr - iim(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID)); - NS_ASSERTION(iim, "Failed to get InterfaceInfoManager"); - if (!iim) - return NS_ERROR_FAILURE; - - // Get interface info for given IID - nsCOMPtr info; - nsresult rv = iim->GetInfoForIID(&aIID, getter_AddRefs(info)); - if (NS_FAILED(rv)) - return rv; - - // Get interface name - const char* iface_name; - rv = info->GetNameShared(&iface_name); - if (NS_FAILED(rv)) - return rv; - - // Create proper Java interface name - nsCAutoString class_name("org/mozilla/interfaces/"); - class_name.AppendASCII(iface_name); - jclass ifaceClass = env->FindClass(class_name.get()); - if (!ifaceClass) - return NS_ERROR_FAILURE; - - array = env->NewObjectArray(aSize, ifaceClass, nsnull); - break; - } - - case nsXPTType::T_VOID: - array = env->NewLongArray(aSize); - break; - - default: - NS_WARNING("unknown type"); - return NS_ERROR_FAILURE; - } - - if (!array) - return NS_ERROR_OUT_OF_MEMORY; - - *aResult = array; - return NS_OK; -} - -nsresult -GetNativeArrayElement(PRUint8 aType, void* aArray, PRUint32 aIndex, - nsXPTCVariant* aResult) -{ - switch (aType) - { - case nsXPTType::T_I8: - case nsXPTType::T_U8: - aResult->val.u8 = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_I16: - case nsXPTType::T_U16: - aResult->val.u16 = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_I32: - case nsXPTType::T_U32: - aResult->val.u32 = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_I64: - case nsXPTType::T_U64: - aResult->val.u64 = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_FLOAT: - aResult->val.f = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_DOUBLE: - aResult->val.d = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_BOOL: - aResult->val.b = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_CHAR: - aResult->val.c = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_WCHAR: - aResult->val.wc = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_CHAR_STR: - aResult->val.p = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_WCHAR_STR: - aResult->val.p = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_IID: - aResult->val.p = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - aResult->val.p = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_ASTRING: - case nsXPTType::T_DOMSTRING: - aResult->val.p = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_UTF8STRING: - case nsXPTType::T_CSTRING: - aResult->val.p = static_cast(aArray)[aIndex]; - break; - - case nsXPTType::T_VOID: - aResult->val.p = static_cast(aArray)[aIndex]; - break; - - default: - NS_WARNING("unknown type"); - return NS_ERROR_FAILURE; - } - - return NS_OK; -} - -nsresult -CreateNativeArray(PRUint8 aType, PRUint32 aSize, void** aResult) -{ - void* array = nsnull; - switch (aType) - { - case nsXPTType::T_I8: - case nsXPTType::T_U8: - array = PR_Malloc(aSize * sizeof(PRUint8)); - break; - - case nsXPTType::T_I16: - case nsXPTType::T_U16: - array = PR_Malloc(aSize * sizeof(PRUint16)); - break; - - case nsXPTType::T_I32: - case nsXPTType::T_U32: - array = PR_Malloc(aSize * sizeof(PRUint32)); - break; - - case nsXPTType::T_I64: - case nsXPTType::T_U64: - array = PR_Malloc(aSize * sizeof(PRUint64)); - break; - - case nsXPTType::T_FLOAT: - array = PR_Malloc(aSize * sizeof(float)); - break; - - case nsXPTType::T_DOUBLE: - array = PR_Malloc(aSize * sizeof(double)); - break; - - case nsXPTType::T_BOOL: - array = PR_Malloc(aSize * sizeof(PRBool)); - break; - - case nsXPTType::T_CHAR: - array = PR_Malloc(aSize * sizeof(char)); - break; - - case nsXPTType::T_WCHAR: - array = PR_Malloc(aSize * sizeof(PRUnichar)); - 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_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - array = PR_Malloc(aSize * sizeof(void*)); - break; - - case nsXPTType::T_VOID: - array = PR_Malloc(aSize * sizeof(void*)); - break; - - default: - NS_WARNING("unknown type"); - return NS_ERROR_FAILURE; - } - - if (!array) - return NS_ERROR_OUT_OF_MEMORY; - - *aResult = array; - return NS_OK; -} - -/** - * Handle 'in' and 'inout' params. - */ -nsresult -SetupParams(JNIEnv *env, const jobject aParam, PRUint8 aType, PRBool aIsOut, - const nsID& aIID, PRUint8 aArrayType, PRUint32 aArraySize, - PRBool aIsArrayElement, PRUint32 aIndex, nsXPTCVariant &aVariant) -{ - nsresult rv = NS_OK; - - switch (aType) - { - case nsXPTType::T_I8: - { - LOG(("byte\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - aVariant.val.i8 = env->CallByteMethod(aParam, byteValueMID); - } else { // 'inout' & 'array' - jbyte value; - if (aParam) { - env->GetByteArrayRegion((jbyteArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - aVariant.val.i8 = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - case nsXPTType::T_I16: - case nsXPTType::T_U8: // C++ unsigned octet <=> Java short - { - LOG(("short\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - jshort value = env->CallShortMethod(aParam, shortValueMID); - if (aType == nsXPTType::T_I16) - aVariant.val.i16 = value; - else - aVariant.val.u8 = value; - } else { // 'inout' & 'array' - jshort value; - if (aParam) { - env->GetShortArrayRegion((jshortArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - if (aType == nsXPTType::T_I16) - aVariant.val.i16 = value; - else - aVariant.val.u8 = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - if (aType == nsXPTType::T_I16) - static_cast(aVariant.val.p)[aIndex] = value; - else - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - case nsXPTType::T_I32: - case nsXPTType::T_U16: // C++ unsigned short <=> Java int - { - LOG(("int\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - jint value = env->CallIntMethod(aParam, intValueMID); - if (aType == nsXPTType::T_I32) - aVariant.val.i32 = value; - else - aVariant.val.u16 = value; - } else { // 'inout' & 'array' - jint value; - if (aParam) { - env->GetIntArrayRegion((jintArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - if (aType == nsXPTType::T_I32) - aVariant.val.i32 = value; - else - aVariant.val.u16 = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - if (aType == nsXPTType::T_I32) - static_cast(aVariant.val.p)[aIndex] = value; - else - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - case nsXPTType::T_I64: - case nsXPTType::T_U32: // C++ unsigned int <=> Java long - { - LOG(("long\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - jlong value = env->CallLongMethod(aParam, longValueMID); - if (aType == nsXPTType::T_I64) - aVariant.val.i64 = value; - else - aVariant.val.u32 = value; - } else { // 'inout' & 'array' - jlong value; - if (aParam) { - env->GetLongArrayRegion((jlongArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - if (aType == nsXPTType::T_I64) - aVariant.val.i64 = value; - else - aVariant.val.u32 = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - if (aType == nsXPTType::T_I64) - static_cast(aVariant.val.p)[aIndex] = value; - else - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - case nsXPTType::T_FLOAT: - { - LOG(("float\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - aVariant.val.f = env->CallFloatMethod(aParam, floatValueMID); - } else { // 'inout' & 'array' - jfloat value; - if (aParam) { - env->GetFloatArrayRegion((jfloatArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - aVariant.val.f = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - // XXX how do we handle unsigned 64-bit value? - case nsXPTType::T_U64: // C++ unsigned long <=> Java double - case nsXPTType::T_DOUBLE: - { - LOG(("double\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - jdouble value = env->CallDoubleMethod(aParam, doubleValueMID); - if (aType == nsXPTType::T_DOUBLE) - aVariant.val.d = value; - else - aVariant.val.u64 = static_cast(value); - } else { // 'inout' & 'array' - jdouble value; - if (aParam) { - env->GetDoubleArrayRegion((jdoubleArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - if (aType == nsXPTType::T_DOUBLE) - aVariant.val.d = value; - else - aVariant.val.u64 = static_cast(value); - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - if (aType == nsXPTType::T_DOUBLE) - static_cast(aVariant.val.p)[aIndex] = value; - else - static_cast(aVariant.val.p)[aIndex] = - static_cast(value); - } - } - break; - } - - case nsXPTType::T_BOOL: - { - LOG(("boolean\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - aVariant.val.b = env->CallBooleanMethod(aParam, booleanValueMID); - } else { // 'inout' & 'array' - jboolean value; - if (aParam) { - env->GetBooleanArrayRegion((jbooleanArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - aVariant.val.b = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - case nsXPTType::T_CHAR: - { - LOG(("char\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - aVariant.val.c = env->CallCharMethod(aParam, charValueMID); - } else { // 'inout' & 'array' - jchar value; - if (aParam) { - env->GetCharArrayRegion((jcharArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - aVariant.val.c = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - case nsXPTType::T_WCHAR: - { - LOG(("char\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - aVariant.val.wc = env->CallCharMethod(aParam, charValueMID); - } else { // 'inout' & 'array' - jchar value; - if (aParam) { - env->GetCharArrayRegion((jcharArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - aVariant.val.wc = value; - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = value; - } - } - break; - } - - case nsXPTType::T_CHAR_STR: - case nsXPTType::T_WCHAR_STR: - { - LOG(("String\n")); - jstring data = nsnull; - if (!aIsOut && !aIsArrayElement) { // 'in' - data = (jstring) aParam; - } else if (aParam) { // 'inout' & 'array' - data = (jstring) env->GetObjectArrayElement((jobjectArray) aParam, - aIndex); - } - - void* buf = nsnull; - if (data) { - jsize uniLength = env->GetStringLength(data); - if (uniLength > 0) { - if (aType == nsXPTType::T_CHAR_STR) { - jsize utf8Length = env->GetStringUTFLength(data); - buf = nsMemory::Alloc((utf8Length + 1) * sizeof(char)); - if (!buf) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - char* char_str = static_cast(buf); - env->GetStringUTFRegion(data, 0, uniLength, char_str); - char_str[utf8Length] = '\0'; - - } else { // if T_WCHAR_STR - buf = nsMemory::Alloc((uniLength + 1) * sizeof(jchar)); - if (!buf) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - jchar* jchar_str = static_cast(buf); - env->GetStringRegion(data, 0, uniLength, jchar_str); - jchar_str[uniLength] = '\0'; - } - } else { - // create empty string - buf = nsMemory::Alloc(2); - if (!buf) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - ((jchar*)buf)[0] = '\0'; - } - } - - if (!aIsArrayElement) { // 'in' & 'inout' - aVariant.val.p = buf; - if (aIsOut) { // 'inout' - aVariant.ptr = &aVariant.val; - aVariant.SetPtrIsData(); - } - } else { // 'array' - if (aType == nsXPTType::T_CHAR_STR) { - char* str = static_cast(buf); - static_cast(aVariant.val.p)[aIndex] = str; - } else { - PRUnichar* str = static_cast(buf); - static_cast(aVariant.val.p)[aIndex] = str; - } - } - break; - } - - case nsXPTType::T_IID: - { - LOG(("String(IID)\n")); - jstring data = nsnull; - if (!aIsOut && !aIsArrayElement) { // 'in' - data = (jstring) aParam; - } else if (aParam) { // 'inout' & 'array' - data = (jstring) env->GetObjectArrayElement((jobjectArray) aParam, - aIndex); - } - - nsID* iid = new nsID; - if (!iid) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - if (data) { - // extract IID string from Java string - const char* str = env->GetStringUTFChars(data, nsnull); - if (!str) { - delete iid; - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - // parse string into IID object - iid->Parse(str); - env->ReleaseStringUTFChars(data, str); - } else { - *iid = nullID; - } - - if (!aIsArrayElement) { // 'in' & 'inout' - aVariant.val.p = iid; - if (aIsOut) { // 'inout' - aVariant.ptr = &aVariant.val; - aVariant.SetPtrIsData(); - } - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = iid; - } - break; - } - - case nsXPTType::T_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - { - LOG(("nsISupports\n")); - jobject java_obj = nsnull; - if (!aIsOut && !aIsArrayElement) { // 'in' - java_obj = (jobject) aParam; - } else if (aParam) { // 'inout' & 'array' - java_obj = (jobject) env->GetObjectArrayElement((jobjectArray) aParam, - aIndex); - } - - void* xpcom_obj; - if (java_obj) { - // If the requested interface is nsIWeakReference, then we look for or - // create a stub for the nsISupports interface. Then we create a weak - // reference from that stub. - PRBool isWeakRef; - nsID iid; - if (aIID.Equals(NS_GET_IID(nsIWeakReference))) { - isWeakRef = PR_TRUE; - iid = NS_GET_IID(nsISupports); - } else { - isWeakRef = PR_FALSE; - iid = aIID; - } - - rv = JavaObjectToNativeInterface(env, java_obj, iid, &xpcom_obj); - if (NS_FAILED(rv)) - break; - NS_ENSURE_TRUE(xpcom_obj, NS_ERROR_FAILURE); - nsISupports *xpcom_nat_obj = (nsISupports*) xpcom_obj; - rv = xpcom_nat_obj->QueryInterface(iid, &xpcom_obj); - NS_IF_RELEASE(xpcom_nat_obj); - if (NS_FAILED(rv)) - break; - - // If the function expects a weak reference, then we need to - // create it here. - if (isWeakRef) { - nsISupports* isupports = (nsISupports*) xpcom_obj; - nsCOMPtr supportsweak = - do_QueryInterface(isupports); - if (supportsweak) { - nsWeakPtr weakref; - supportsweak->GetWeakReference(getter_AddRefs(weakref)); - NS_RELEASE(isupports); - xpcom_obj = weakref; - NS_ADDREF((nsISupports*) xpcom_obj); - } else { - xpcom_obj = nsnull; - } - } - } else { - xpcom_obj = nsnull; - } - - if (!aIsArrayElement) { // 'in' & 'inout' - aVariant.val.p = xpcom_obj; - aVariant.SetValIsInterface(); - if (aIsOut) { // 'inout' - aVariant.ptr = &aVariant.val; - aVariant.SetPtrIsData(); - } - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = xpcom_obj; - } - break; - } - - case nsXPTType::T_ASTRING: - case nsXPTType::T_DOMSTRING: - { - LOG(("String\n")); - // Expecting only 'in' and 'in dipper' - NS_PRECONDITION(!aIsOut, "unexpected param descriptor"); - if (aIsOut) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - jstring jstr = static_cast(aParam); - nsAString* str = jstring_to_nsAString(env, jstr); - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - aVariant.val.p = str; - aVariant.SetValIsDOMString(); - break; - } - - case nsXPTType::T_UTF8STRING: - case nsXPTType::T_CSTRING: - { - LOG(("StringUTF\n")); - // Expecting only 'in' and 'in dipper' - NS_PRECONDITION(!aIsOut, "unexpected param descriptor"); - if (aIsOut) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - jstring jstr = static_cast(aParam); - nsACString* str = jstring_to_nsACString(env, jstr); - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - aVariant.val.p = str; - if (aType == nsXPTType::T_CSTRING) { - aVariant.SetValIsCString(); - } else { - aVariant.SetValIsUTF8String(); - } - break; - } - - // handle "void *" as an "long" in Java - case nsXPTType::T_VOID: - { - LOG(("long (void*)\n")); - if (!aIsOut && !aIsArrayElement) { // 'in' - aVariant.val.p = - reinterpret_cast(env->CallLongMethod(aParam, longValueMID)); - } else { // 'inout' & 'array' - jlong value; - if (aParam) { - env->GetLongArrayRegion((jlongArray) aParam, aIndex, 1, &value); - } - - if (aIsOut) { // 'inout' - if (aParam) { - aVariant.val.p = reinterpret_cast(value); - aVariant.ptr = &aVariant.val; - } else { - aVariant.ptr = nsnull; - } - aVariant.SetPtrIsData(); - } else { // 'array' - static_cast(aVariant.val.p)[aIndex] = - reinterpret_cast(value); - } - } - break; - } - - case nsXPTType::T_ARRAY: - { - jobject sourceArray = nsnull; - if (!aIsOut) { // 'in' - sourceArray = aParam; - } else if (aParam) { // 'inout' - jobjectArray array = static_cast(aParam); - sourceArray = env->GetObjectArrayElement(array, 0); - } - - if (sourceArray) { - rv = CreateNativeArray(aArrayType, aArraySize, &aVariant.val.p); - - for (PRUint32 i = 0; i < aArraySize && NS_SUCCEEDED(rv); i++) { - rv = SetupParams(env, sourceArray, aArrayType, PR_FALSE, aIID, 0, 0, - PR_TRUE, i, aVariant); - } - } - - if (aIsOut) { // 'inout' - aVariant.ptr = &aVariant.val.p; - aVariant.SetPtrIsData(); - } - break; - } - - case nsXPTType::T_PSTRING_SIZE_IS: - case nsXPTType::T_PWSTRING_SIZE_IS: - { - NS_PRECONDITION(!aIsArrayElement, "sized string array not supported"); - - LOG(("Sized string\n")); - jstring data = nsnull; - if (!aIsOut) { // 'in' - data = (jstring) aParam; - } else if (aParam) { // 'inout' - data = (jstring) env->GetObjectArrayElement((jobjectArray) aParam, - aIndex); - } - - PRUint32 length = 0; - if (data) { - if (aType == nsXPTType::T_PSTRING_SIZE_IS) { - length = env->GetStringUTFLength(data); - } else { - length = env->GetStringLength(data); - } - if (length > aArraySize) { - rv = NS_ERROR_ILLEGAL_VALUE; - break; - } - } - - PRUint32 size_of_char = (aType == nsXPTType::T_PSTRING_SIZE_IS) ? - sizeof(char) : sizeof(jchar); - PRUint32 allocLength = (aArraySize + 1) * size_of_char; - void* buf = nsMemory::Alloc(allocLength); - if (!buf) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - if (data) { - if (aType == nsXPTType::T_PSTRING_SIZE_IS) { - const char* str = env->GetStringUTFChars(data, nsnull); - if (!str) { - nsMemory::Free(buf); - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - memcpy(buf, str, length); - env->ReleaseStringUTFChars(data, str); - } else { - jchar* jchar_str = static_cast(buf); - env->GetStringRegion(data, 0, length, jchar_str); - } - } - - aVariant.val.p = buf; - if (aIsOut) { // 'inout' - aVariant.ptr = &aVariant.val; - aVariant.SetPtrIsData(); - } - - break; - } - - default: - NS_WARNING("unexpected parameter type"); - return NS_ERROR_UNEXPECTED; - } - - return rv; -} - -/** - * Does any cleanup from objects created in SetupParams, as well as converting - * any out params to Java. - * - * NOTE: If aInvokeResult is an error condition, then we just do cleanup in - * this function. - */ -nsresult -FinalizeParams(JNIEnv *env, const nsXPTParamInfo &aParamInfo, PRUint8 aType, - nsXPTCVariant &aVariant, const nsID& aIID, - PRBool aIsArrayElement, PRUint8 aArrayType, PRUint32 aArraySize, - PRUint32 aIndex, nsresult aInvokeResult, jobject* aParam) -{ - nsresult rv = NS_OK; - - switch (aType) - { - case nsXPTType::T_I8: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jbyte value = aVariant.val.i8; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(byteClass, byteInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetByteArrayRegion((jbyteArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_I16: - case nsXPTType::T_U8: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jshort value = (aType == nsXPTType::T_I16) ? aVariant.val.i16 : - aVariant.val.u8; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(shortClass, shortInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetShortArrayRegion((jshortArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_I32: - case nsXPTType::T_U16: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jint value = (aType == nsXPTType::T_I32) ? aVariant.val.i32 : - aVariant.val.u16; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(intClass, intInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetIntArrayRegion((jintArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_I64: - case nsXPTType::T_U32: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jlong value = (aType == nsXPTType::T_I64) ? aVariant.val.i64 : - aVariant.val.u32; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(longClass, longInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetLongArrayRegion((jlongArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_FLOAT: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jfloat value = aVariant.val.f; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(floatClass, floatInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetFloatArrayRegion((jfloatArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - // XXX how do we handle unsigned 64-bit values? - case nsXPTType::T_U64: - case nsXPTType::T_DOUBLE: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jdouble value = (aType == nsXPTType::T_DOUBLE) ? aVariant.val.d : - aVariant.val.u64; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(doubleClass, doubleInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetDoubleArrayRegion((jdoubleArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_BOOL: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jboolean value = aVariant.val.b; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(booleanClass, booleanInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetBooleanArrayRegion((jbooleanArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_CHAR: - case nsXPTType::T_WCHAR: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jchar value; - if (aType == nsXPTType::T_CHAR) - value = aVariant.val.c; - else - value = aVariant.val.wc; - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(charClass, charInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetCharArrayRegion((jcharArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_CHAR_STR: - case nsXPTType::T_WCHAR_STR: - { - if ((aParamInfo.IsOut() || aIsArrayElement) && - NS_SUCCEEDED(aInvokeResult)) - { - // create new string from data - jstring str = nsnull; - if (aVariant.val.p) { - if (aType == nsXPTType::T_CHAR_STR) { - str = env->NewStringUTF((const char*) aVariant.val.p); - } else { - PRUint32 length = nsCRT::strlen((const PRUnichar*) aVariant.val.p); - str = env->NewString((const jchar*) aVariant.val.p, length); - } - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = str; - } else if (*aParam) { - // put new string into output array - env->SetObjectArrayElement((jobjectArray) *aParam, aIndex, str); - } - } - - // cleanup - if (aVariant.val.p) - nsMemory::Free(aVariant.val.p); - break; - } - - case nsXPTType::T_IID: - { - nsID* iid = static_cast(aVariant.val.p); - - if ((aParamInfo.IsOut() || aIsArrayElement) && - NS_SUCCEEDED(aInvokeResult)) - { - // Create the string from nsID - jstring str = nsnull; - if (iid) { - char iid_str[NSID_LENGTH]; - iid->ToProvidedString(iid_str); - str = env->NewStringUTF(iid_str); - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = str; - } else if (*aParam) { - // put new string into output array - env->SetObjectArrayElement((jobjectArray) *aParam, aIndex, str); - } - } - - // Ordinarily, we would delete 'iid' here. But we cannot do that until - // we've handled all of the params. See comment in CallXPCOMMethod. - // We can safely delete array elements, though. - if (aIsArrayElement) - delete iid; - - break; - } - - case nsXPTType::T_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - { - nsISupports* xpcom_obj = static_cast(aVariant.val.p); - - if ((aParamInfo.IsOut() || aIsArrayElement) && - NS_SUCCEEDED(aInvokeResult)) - { - jobject java_obj = nsnull; - if (xpcom_obj) { - // Get matching Java object for given xpcom object - rv = NativeInterfaceToJavaObject(env, xpcom_obj, aIID, nsnull, - &java_obj); - if (NS_FAILED(rv)) - break; - } - - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = java_obj; - } else if (*aParam) { - // put new Java object into output array - env->SetObjectArrayElement((jobjectArray) *aParam, aIndex, java_obj); - } - } - - // cleanup - NS_IF_RELEASE(xpcom_obj); - break; - } - - case nsXPTType::T_ASTRING: - case nsXPTType::T_DOMSTRING: - { - NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor"); - if (!aParamInfo.IsIn()) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - nsString* str = static_cast(aVariant.val.p); - if (NS_SUCCEEDED(aInvokeResult) && aParamInfo.IsDipper()) { - // Create Java string from returned nsString - jstring jstr = nsnull; - if (str && !str->IsVoid()) { - jstr = env->NewString((const jchar*) str->get(), str->Length()); - if (!jstr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - *aParam = jstr; - } - - // cleanup - if (str) { - delete str; - } - break; - } - - case nsXPTType::T_UTF8STRING: - case nsXPTType::T_CSTRING: - { - NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor"); - if (!aParamInfo.IsIn()) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - nsCString* str = static_cast(aVariant.val.p); - if (NS_SUCCEEDED(aInvokeResult) && aParamInfo.IsDipper()) { - // Create Java string from returned nsString - jstring jstr = nsnull; - if (str && !str->IsVoid()) { - jstr = env->NewStringUTF((const char*) str->get()); - if (!jstr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - *aParam = jstr; - } - - // cleanup - if (str) { - delete str; - } - break; - } - - case nsXPTType::T_VOID: - { - if (NS_SUCCEEDED(aInvokeResult)) { - jlong value = reinterpret_cast(aVariant.val.p); - if (aParamInfo.IsRetval() && !aIsArrayElement) { - *aParam = env->NewObject(longClass, longInitMID, value); - } else if ((aParamInfo.IsOut() || aIsArrayElement) && *aParam) { - env->SetLongArrayRegion((jlongArray) *aParam, aIndex, 1, &value); - } - } - break; - } - - case nsXPTType::T_ARRAY: - { - if (aParamInfo.IsOut() && NS_SUCCEEDED(aInvokeResult)) { - // Create Java array from returned native array - jobject jarray = nsnull; - if (aVariant.val.p) { - rv = CreateJavaArray(env, aArrayType, aArraySize, aIID, &jarray); - if (NS_FAILED(rv)) - break; - - nsXPTCVariant var; - for (PRUint32 i = 0; i < aArraySize && NS_SUCCEEDED(rv); i++) { - rv = GetNativeArrayElement(aArrayType, aVariant.val.p, i, &var); - if (NS_SUCCEEDED(rv)) { - rv = FinalizeParams(env, aParamInfo, aArrayType, var, aIID, - PR_TRUE, 0, 0, i, aInvokeResult, &jarray); - } - } - } - - if (aParamInfo.IsRetval()) { - *aParam = jarray; - } else if (*aParam) { - // put new Java array into output array - env->SetObjectArrayElement((jobjectArray) *aParam, 0, jarray); - } - } - - // cleanup - // If this is not an out param or if the invokeResult is a failure case, - // then the array elements have not been cleaned up. Do so now. - if (!aParamInfo.IsOut() || (NS_FAILED(aInvokeResult) && aVariant.val.p)) { - nsXPTCVariant var; - for (PRUint32 i = 0; i < aArraySize; i++) { - rv = GetNativeArrayElement(aArrayType, aVariant.val.p, i, &var); - if (NS_SUCCEEDED(rv)) { - FinalizeParams(env, aParamInfo, aArrayType, var, aIID, PR_TRUE, - 0, 0, i, NS_ERROR_FAILURE, nsnull); - } - } - } - PR_Free(aVariant.val.p); - break; - } - - case nsXPTType::T_PSTRING_SIZE_IS: - case nsXPTType::T_PWSTRING_SIZE_IS: - { - NS_PRECONDITION(!aIsArrayElement, "sized string array not supported"); - - if ((aParamInfo.IsOut()) && NS_SUCCEEDED(aInvokeResult)) - { - // create new string from data - jstring str = nsnull; - if (aVariant.val.p) { - if (aType == nsXPTType::T_PSTRING_SIZE_IS) { - PRUint32 len = (aArraySize + 1) * sizeof(char); - char* buf = (char*) nsMemory::Alloc(len); - if (buf) { - memcpy(buf, aVariant.val.p, len); - buf[aArraySize] = '\0'; - str = env->NewStringUTF((const char*) buf); - nsMemory::Free(buf); - } - } else { - str = env->NewString((const jchar*) aVariant.val.p, aArraySize); - } - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - if (aParamInfo.IsRetval()) { - *aParam = str; - } else if (*aParam) { - // put new string into output array - env->SetObjectArrayElement((jobjectArray) *aParam, aIndex, str); - } - } - - // cleanup - if (aVariant.val.p) - nsMemory::Free(aVariant.val.p); - break; - } - - default: - NS_WARNING("unexpected parameter type"); - return NS_ERROR_UNEXPECTED; - } - - // Check for Java exception, but don't overwrite pre-existing error code. - if (NS_SUCCEEDED(rv) && env->ExceptionCheck()) - rv = NS_ERROR_FAILURE; - - return rv; -} - -nsresult -QueryAttributeInfo(nsIInterfaceInfo* aIInfo, const char* aMethodName, - PRBool aCapitalizedAttr, PRUint16* aMethodIndex, - const nsXPTMethodInfo** aMethodInfo) - -{ - nsresult rv = NS_ERROR_FAILURE; - - // An 'attribute' will start with either "get" or "set". But first, - // we check the length, in order to skip over method names that match exactly - // "get" or "set". - if (strlen(aMethodName) > 3) { - if (strncmp("get", aMethodName, 3) == 0) { - char* getterName = strdup(aMethodName + 3); - if (!aCapitalizedAttr) { - getterName[0] = tolower(getterName[0]); - } - rv = aIInfo->GetMethodInfoForName(getterName, aMethodIndex, aMethodInfo); - free(getterName); - } else if (strncmp("set", aMethodName, 3) == 0) { - char* setterName = strdup(aMethodName + 3); - if (!aCapitalizedAttr) { - setterName[0] = tolower(setterName[0]); - } - rv = aIInfo->GetMethodInfoForName(setterName, aMethodIndex, aMethodInfo); - if (NS_SUCCEEDED(rv)) { - // If this succeeded, GetMethodInfoForName will have returned the - // method info for the 'getter'. We want the 'setter', so increase - // method index by one ('setter' immediately follows the 'getter'), - // and get its method info. - (*aMethodIndex)++; - rv = aIInfo->GetMethodInfo(*aMethodIndex, aMethodInfo); - if (NS_SUCCEEDED(rv)) { - // Double check that this methodInfo matches the given method. - if (!(*aMethodInfo)->IsSetter() || - strcmp(setterName, (*aMethodInfo)->name) != 0) { - rv = NS_ERROR_FAILURE; - } - } - } - free(setterName); - } - } - - return rv; -} - -/** - * Given an interface info struct and a method name, returns the method info - * and index, if that method exists. - * - * Most method names are lower case. Unfortunately, the method names of some - * interfaces (such as nsIAppShell) start with a capital letter. This function - * will try all of the permutations. - */ -nsresult -QueryMethodInfo(nsIInterfaceInfo* aIInfo, const char* aMethodName, - PRUint16* aMethodIndex, const nsXPTMethodInfo** aMethodInfo) -{ - // Skip over any leading underscores, since these are methods that conflicted - // with existing Java keywords - const char* methodName = aMethodName; - if (methodName[0] == '_') { - methodName++; - } - - // The common case is that the method name is lower case, so we check - // that first. - nsresult rv; - rv = aIInfo->GetMethodInfoForName(methodName, aMethodIndex, aMethodInfo); - if (NS_SUCCEEDED(rv)) - return rv; - - // If there is no method called , then maybe it is an - // 'attribute'. - rv = QueryAttributeInfo(aIInfo, methodName, PR_FALSE, aMethodIndex, - aMethodInfo); - if (NS_SUCCEEDED(rv)) - return rv; - - // If we get here, then maybe the method name is capitalized. - char* name = strdup(methodName); - name[0] = toupper(name[0]); - rv = aIInfo->GetMethodInfoForName(name, aMethodIndex, aMethodInfo); - free(name); - if (NS_SUCCEEDED(rv)) - return rv; - - // If there is no method called , then maybe it is an - // 'attribute'. - rv = QueryAttributeInfo(aIInfo, methodName, PR_TRUE, aMethodIndex, - aMethodInfo); - - return rv; -} - -#ifdef VBOX -#include -#include -#include "nspr.h" - -static void makeErrorMessage(nsresult r, char* msg, size_t msgSize) -{ - bool gotMsg = false; - - if (!gotMsg) - { - nsresult rc; - nsCOMPtr es; - es = do_GetService (NS_EXCEPTIONSERVICE_CONTRACTID, &rc); - if (NS_SUCCEEDED (rc)) - { - nsCOMPtr em; - rc = es->GetCurrentExceptionManager (getter_AddRefs (em)); - if (NS_SUCCEEDED (rc)) - { - nsCOMPtr ex; - rc = em->GetCurrentException(getter_AddRefs (ex)); - if (NS_SUCCEEDED (rc) && ex) - { - nsXPIDLCString emsg; - ex->GetMessage(getter_Copies(emsg)); - PR_snprintf(msg, msgSize, "%s", - emsg.get()); - gotMsg = true; - } - } - } - } - - if (!gotMsg) - { - const RTCOMERRMSG* pMsg = RTErrCOMGet(r); - if (strncmp(pMsg->pszMsgFull, "Unknown", 7) != 0) - { - PR_snprintf(msg, msgSize, "%s (%s)", - pMsg->pszMsgFull, pMsg->pszDefine); - gotMsg = true; - } - } - - if (!gotMsg) - { - PR_snprintf(msg, msgSize, "Error 0x%x in module 0x%x", - NS_ERROR_GET_CODE(r), NS_ERROR_GET_MODULE(r)); - } -} -#endif - -/** - * org.mozilla.xpcom.XPCOMJavaProxy.internal.callXPCOMMethod - */ -extern "C" NS_EXPORT jobject JNICALL -JAVAPROXY_NATIVE(callXPCOMMethod) (JNIEnv *env, jclass that, jobject aJavaProxy, - jstring aMethodName, jobjectArray aParams) -{ - nsresult rv; - - // Get native XPCOM instance - void* xpcom_obj; - rv = GetXPCOMInstFromProxy(env, aJavaProxy, &xpcom_obj); - if (NS_FAILED(rv)) { - ThrowException(env, 0, "Failed to get matching XPCOM object"); - return nsnull; - } - JavaXPCOMInstance* inst = static_cast(xpcom_obj); - - // Get method info - PRUint16 methodIndex; - const nsXPTMethodInfo* methodInfo; - nsIInterfaceInfo* iinfo = inst->InterfaceInfo(); - const char* methodName = env->GetStringUTFChars(aMethodName, nsnull); - rv = QueryMethodInfo(iinfo, methodName, &methodIndex, &methodInfo); - env->ReleaseStringUTFChars(aMethodName, methodName); - - if (NS_FAILED(rv)) { - ThrowException(env, rv, "GetMethodInfoForName failed"); - return nsnull; - } - -#ifdef DEBUG_JAVAXPCOM - const char* ifaceName; - iinfo->GetNameShared(&ifaceName); - LOG(("===> (XPCOM) %s::%s()\n", ifaceName, methodInfo->GetName())); -#endif - - // Convert the Java params - PRUint8 paramCount = methodInfo->GetParamCount(); - nsXPTCVariant* params = nsnull; - if (paramCount) - { - params = new nsXPTCVariant[paramCount]; - if (!params) { - ThrowException(env, NS_ERROR_OUT_OF_MEMORY, "Can't create params array"); - return nsnull; - } - memset(params, 0, paramCount * sizeof(nsXPTCVariant)); - - PRBool foundDependentParam = PR_FALSE; - for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++) - { - LOG(("\t Param %d: ", i)); - const nsXPTParamInfo ¶mInfo = methodInfo->GetParam(i); - params[i].type = paramInfo.GetType(); - - if (params[i].type.IsDependent() && paramInfo.IsIn()) { - foundDependentParam = PR_TRUE; - continue; - } - - if (paramInfo.IsIn()) { - PRUint8 type = params[i].type.TagPart(); - - // get IID for interface params - nsID iid; - if (type == nsXPTType::T_INTERFACE) { - rv = GetIIDForMethodParam(iinfo, methodInfo, paramInfo, type, - methodIndex, params, PR_TRUE, iid); - } - - if (NS_SUCCEEDED(rv)) { - jobject param = nsnull; - if (aParams && !paramInfo.IsRetval()) { - param = env->GetObjectArrayElement(aParams, i); - } - rv = SetupParams(env, param, type, paramInfo.IsOut(), iid, 0, 0, - PR_FALSE, 0, params[i]); - } - } else { - LOG(("out/retval\n")); - params[i].ptr = &(params[i].val); - params[i].SetPtrIsData(); - } - } - - // Handle any dependent params by doing a second pass - if (foundDependentParam) { - - for (PRUint8 j = 0; j < paramCount && NS_SUCCEEDED(rv); j++) { - - const nsXPTParamInfo ¶mInfo = methodInfo->GetParam(j); - params[j].type = paramInfo.GetType(); - - if (!params[j].type.IsDependent()) - continue; - - if (paramInfo.IsIn()) { - PRUint8 type = params[j].type.TagPart(); - - // is paramater an array or sized string? - PRUint8 arrayType = 0; - PRUint32 arraySize = 0; - PRBool isArray = params[j].type.IsArray(); - PRBool isSizedString = isArray ? PR_FALSE : - type == nsXPTType::T_PSTRING_SIZE_IS || - type == nsXPTType::T_PWSTRING_SIZE_IS; - - if (isArray) { - // get array type - nsXPTType xpttype; - rv = iinfo->GetTypeForParam(methodIndex, ¶mInfo, 1, &xpttype); - if (NS_FAILED(rv)) - break; - arrayType = xpttype.TagPart(); - // IDL 'octet' arrays are not 'promoted' to short, but kept as 'byte'; - // therefore, treat as a signed 8bit value - if (arrayType == nsXPTType::T_U8) - arrayType = nsXPTType::T_I8; - } - - if (isArray || isSizedString) { - // get size of array or string - PRUint8 argnum; - rv = iinfo->GetSizeIsArgNumberForParam(methodIndex, ¶mInfo, 0, - &argnum); - if (NS_FAILED(rv)) - break; - arraySize = params[argnum].val.u32; - } - - // get IID for interface params - nsID iid; - if (type == nsXPTType::T_INTERFACE_IS || - (type == nsXPTType::T_ARRAY && - (arrayType == nsXPTType::T_INTERFACE || - arrayType == nsXPTType::T_INTERFACE_IS))) - { - PRUint8 paramType = type == nsXPTType::T_ARRAY ? arrayType : type; - rv = GetIIDForMethodParam(iinfo, methodInfo, paramInfo, paramType, - methodIndex, params, PR_TRUE, iid); - } - - if (NS_SUCCEEDED(rv)) { - jobject param = nsnull; - if (aParams && !paramInfo.IsRetval()) { - param = env->GetObjectArrayElement(aParams, j); - } - rv = SetupParams(env, param, type, paramInfo.IsOut(), iid, arrayType, - arraySize, PR_FALSE, 0, params[j]); - } - } - } - } - - if (NS_FAILED(rv)) { - ThrowException(env, rv, "SetupParams failed"); - return nsnull; - } - } - - // Call the XPCOM method - const nsIID* iid; - iinfo->GetIIDShared(&iid); - nsISupports* realObject; - rv = inst->GetInstance()->QueryInterface(*iid, (void**) &realObject); - if (NS_FAILED(rv)) { - ThrowException(env, rv, "Failed to get real XPCOM object"); - return nsnull; - } - nsresult invokeResult = NS_InvokeByIndex(realObject, methodIndex, - paramCount, params); - NS_RELEASE(realObject); - - // Clean up params - jobject result = nsnull; - for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++) - { - const nsXPTParamInfo ¶mInfo = methodInfo->GetParam(i); - PRUint8 type = paramInfo.GetType().TagPart(); - - // is paramater an array or sized string? - PRUint8 arrayType = 0; - PRUint32 arraySize = 0; - PRBool isArray = params[i].type.IsArray(); - PRBool isSizedString = isArray ? PR_FALSE : - type == nsXPTType::T_PSTRING_SIZE_IS || - type == nsXPTType::T_PWSTRING_SIZE_IS; - - if (isArray) { - // get array type - nsXPTType array_xpttype; - rv = iinfo->GetTypeForParam(methodIndex, ¶mInfo, 1, &array_xpttype); - if (NS_FAILED(rv)) - break; - arrayType = array_xpttype.TagPart(); - // IDL 'octet' arrays are not 'promoted' to short, but kept as 'byte'; - // therefore, treat as a signed 8bit value - if (arrayType == nsXPTType::T_U8) - arrayType = nsXPTType::T_I8; - } - - if (isArray || isSizedString) { - // get size of array - PRUint8 argnum; - rv = iinfo->GetSizeIsArgNumberForParam(methodIndex, ¶mInfo, 0, - &argnum); - if (NS_FAILED(rv)) - break; - arraySize = params[argnum].val.u32; - } - - // get IID for interface params - nsID iid; - if (type == nsXPTType::T_INTERFACE || type == nsXPTType::T_INTERFACE_IS || - (type == nsXPTType::T_ARRAY && (arrayType == nsXPTType::T_INTERFACE || - arrayType == nsXPTType::T_INTERFACE_IS))) - { - PRUint8 paramType = type == nsXPTType::T_ARRAY ? arrayType : type; - rv = GetIIDForMethodParam(iinfo, methodInfo, paramInfo, paramType, - methodIndex, params, PR_TRUE, iid); - if (NS_FAILED(rv)) - break; - } - - jobject* javaElement; - jobject element = nsnull; - if (!paramInfo.IsRetval()) { - element = env->GetObjectArrayElement(aParams, i); - javaElement = &element; - } else { - javaElement = &result; - } - rv = FinalizeParams(env, paramInfo, type, params[i], iid, PR_FALSE, - arrayType, arraySize, 0, invokeResult, javaElement); - } - - // Normally, we would delete any created nsID object in the above loop. - // However, GetIIDForMethodParam may need some of the nsID params when it's - // looking for the IID of an INTERFACE_IS. Therefore, we can't delete it - // until we've gone through the 'Finalize' loop once and created the result. - for (PRUint8 j = 0; j < paramCount; j++) - { - const nsXPTParamInfo ¶mInfo = methodInfo->GetParam(j); - const nsXPTType &type = paramInfo.GetType(); - if (type.TagPart() == nsXPTType::T_IID) { - nsID* iid = (nsID*) params[j].val.p; - delete iid; - } - } - - if (params) { - delete params; - } - - // If the XPCOM method invocation failed, we don't immediately throw an - // exception and return so that we can clean up any parameters. - if (NS_FAILED(invokeResult)) { - nsCAutoString message("The function \""); - message.AppendASCII(methodInfo->GetName()); - message.AppendLiteral("\" returned an error condition"); -#ifdef VBOX - char vboxMsg[1024]; - message.AppendLiteral(": \""); - makeErrorMessage(invokeResult, vboxMsg, sizeof vboxMsg); - message.AppendASCII(vboxMsg); - message.AppendLiteral("\""); -#endif - ThrowException(env, invokeResult, message.get()); - } - if (NS_FAILED(rv)) { - ThrowException(env, rv, "FinalizeParams failed"); - return nsnull; - } - - LOG(("<=== (XPCOM) %s::%s()\n", ifaceName, methodInfo->GetName())); - return result; -} - -nsresult -GetNewOrUsedJavaWrapper(JNIEnv* env, nsISupports* aXPCOMObject, - const nsIID& aIID, jobject aObjectLoader, - jobject* aResult) -{ - NS_PRECONDITION(aResult != nsnull, "null ptr"); - if (!aResult) - return NS_ERROR_NULL_POINTER; - - // Get the root nsISupports of the xpcom object - nsresult rv; - nsCOMPtr rootObject = do_QueryInterface(aXPCOMObject, &rv); - NS_ENSURE_SUCCESS(rv, rv); - - // Get associated Java object from hash table - rv = gNativeToJavaProxyMap->Find(env, rootObject, aIID, aResult); - NS_ENSURE_SUCCESS(rv, rv); - if (*aResult) - return NS_OK; - - // No Java object is associated with the given XPCOM object, so we - // create a Java proxy. - - nsCOMPtr - iim(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID)); - NS_ASSERTION(iim, "Failed to get InterfaceInfoManager"); - if (!iim) - return NS_ERROR_FAILURE; - - // Get interface info for class - nsCOMPtr info; - rv = iim->GetInfoForIID(&aIID, getter_AddRefs(info)); - if (NS_FAILED(rv)) - return rv; - - // Wrap XPCOM object (addrefs rootObject) - JavaXPCOMInstance* inst = new JavaXPCOMInstance(rootObject, info); - if (!inst) - return NS_ERROR_OUT_OF_MEMORY; - - // Get interface name - const char* iface_name; - rv = info->GetNameShared(&iface_name); - - if (NS_SUCCEEDED(rv)) { - jobject java_obj = nsnull; - - // Create proper Java interface name - nsCAutoString class_name("org.mozilla.interfaces."); - class_name.AppendASCII(iface_name); - jclass ifaceClass = FindClassInLoader(env, aObjectLoader, class_name.get()); - - if (ifaceClass) { - java_obj = env->CallStaticObjectMethod(xpcomJavaProxyClass, - createProxyMID, ifaceClass, - reinterpret_cast(inst)); - if (env->ExceptionCheck()) - java_obj = nsnull; - } - - if (java_obj) { -#ifdef DEBUG_JAVAXPCOM - char* iid_str = aIID.ToString(); - LOG(("+ CreateJavaProxy (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, - java_obj), - (PRUint32) rootObject, iid_str)); - PR_Free(iid_str); -#endif - - // Associate XPCOM object with Java proxy - rv = gNativeToJavaProxyMap->Add(env, rootObject, aIID, java_obj); - if (NS_SUCCEEDED(rv)) { - *aResult = java_obj; - return NS_OK; - } - } else { - rv = NS_ERROR_FAILURE; - } - } - - // If there was an error, clean up. - delete inst; - return rv; -} - -nsresult -GetXPCOMInstFromProxy(JNIEnv* env, jobject aJavaObject, void** aResult) -{ - NS_PRECONDITION(aResult != nsnull, "null ptr"); - if (!aResult) - return NS_ERROR_NULL_POINTER; - - jlong xpcom_obj = env->CallStaticLongMethod(xpcomJavaProxyClass, - getNativeXPCOMInstMID, aJavaObject); - - if (!xpcom_obj || env->ExceptionCheck()) { - return NS_ERROR_FAILURE; - } - - *aResult = reinterpret_cast(xpcom_obj); -#ifdef DEBUG_JAVAXPCOM - JavaXPCOMInstance* inst = static_cast(*aResult); - nsIID* iid; - inst->InterfaceInfo()->GetInterfaceIID(&iid); - char* iid_str = iid->ToString(); - LOG(("< GetXPCOMInstFromProxy (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, - aJavaObject), - (PRUint32) inst->GetInstance(), iid_str)); - PR_Free(iid_str); - nsMemory::Free(iid); -#endif - return NS_OK; -} - -/** - * org.mozilla.xpcom.internal.XPCOMJavaProxy.finalizeProxy - */ -extern "C" NS_EXPORT void JNICALL -JAVAPROXY_NATIVE(finalizeProxy) (JNIEnv *env, jclass that, jobject aJavaProxy) -{ -#ifdef DEBUG_JAVAXPCOM - PRUint32 xpcom_addr = 0; -#endif - - // Due to Java's garbage collection, this finalize statement may get called - // after FreeJavaGlobals(). So check to make sure that everything is still - // initialized. - if (gJavaXPCOMLock) { - nsAutoLock lock(gJavaXPCOMLock); - - // If may be possible for the lock to be acquired here when FreeGlobals is - // in the middle of running. If so, then this thread will sleep until - // FreeGlobals releases its lock. At that point, we resume this thread - // here, but JavaXPCOM may no longer be initialized. So we need to check - // that everything is legit after acquiring the lock. - if (gJavaXPCOMInitialized) { - // Get native XPCOM instance - void* xpcom_obj; - nsresult rv = GetXPCOMInstFromProxy(env, aJavaProxy, &xpcom_obj); - if (NS_SUCCEEDED(rv)) { - JavaXPCOMInstance* inst = static_cast(xpcom_obj); -#ifdef DEBUG_JAVAXPCOM - xpcom_addr = reinterpret_cast(inst->GetInstance()); -#endif - nsIID* iid; - rv = inst->InterfaceInfo()->GetInterfaceIID(&iid); - if (NS_SUCCEEDED(rv)) { - rv = gNativeToJavaProxyMap->Remove(env, inst->GetInstance(), *iid); - nsMemory::Free(iid); - } - NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to RemoveJavaProxy"); - // Release gJavaXPCOMLock before deleting inst (see bug 340022) - lock.unlock(); - delete inst; - } - } - } - -#ifdef DEBUG_JAVAXPCOM - LOG(("- Finalize (Java=%08x | XPCOM=%08x)\n", - (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, - aJavaProxy), - xpcom_addr)); -#endif -} - -/** - * org.mozilla.xpcom.XPCOMJavaProxy.isSameXPCOMObject - */ -extern "C" NS_EXPORT jboolean JNICALL -JAVAPROXY_NATIVE(isSameXPCOMObject) (JNIEnv *env, jclass that, - jobject aProxy1, jobject aProxy2) -{ - void* xpcom_obj1; - nsresult rv = GetXPCOMInstFromProxy(env, aProxy1, &xpcom_obj1); - if (NS_SUCCEEDED(rv)) { - void* xpcom_obj2; - rv = GetXPCOMInstFromProxy(env, aProxy2, &xpcom_obj2); - if (NS_SUCCEEDED(rv)) { - JavaXPCOMInstance* inst1 = static_cast(xpcom_obj1); - JavaXPCOMInstance* inst2 = static_cast(xpcom_obj2); - if (inst1->GetInstance() == inst2->GetInstance()) { - return JNI_TRUE; - } - } - } - return JNI_FALSE; -} - -/** - * org.mozilla.xpcom.ProfileLock.release - */ -extern "C" NS_EXPORT void JNICALL -LOCKPROXY_NATIVE(release) (JNIEnv *env, jclass that, jlong aLockObject) -{ - // Need to release object on the main thread. - nsresult rv = NS_ERROR_FAILURE; -#ifdef VBOX - rv = NS_ProxyRelease(do_GetMainThreadQueue().get(), reinterpret_cast(aLockObject)); -#else - nsCOMPtr thread = do_GetMainThread(); - if (thread) { - rv = NS_ProxyRelease(thread, reinterpret_cast(aLockObject)); - } -#endif - NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to release using NS_ProxyRelease"); -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.h deleted file mode 100755 index c441a41..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaWrapper.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ***** 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) 2004 - * 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 _nsJavaWrapper_h_ -#define _nsJavaWrapper_h_ - -#include "jni.h" -#include "nsISupports.h" - - -/** - * Finds the associated Java wraper for the given XPCOM object and IID. If no - * such Java wrapper exists, then a new one is created. - * - * @param env Java environment pointer - * @param aXPCOMObject XPCOM object for which to find/create Java wrapper - * @param aIID desired interface IID for Java wrapper - * @param aObjectLoader Java wrapper whose class loader we use for finding - * classes; can be null - * @param aResult on success, holds reference to Java wrapper - * - * @return NS_OK if succeeded; all other return values are error codes. - */ -nsresult GetNewOrUsedJavaWrapper(JNIEnv* env, nsISupports* aXPCOMObject, - const nsIID& aIID, jobject aObjectLoader, - jobject* aResult); - -/** - * Returns the XPCOM object for which the given Java proxy was created. - * - * @param env pointer to Java context - * @param aJavaObject a Java proxy created by CreateJavaProxy() - * @param aResult on exit, holds pointer to XPCOM instance - * - * @return NS_OK if the XPCOM object was successfully retrieved; - * any other value denotes an error condition. - */ -nsresult GetXPCOMInstFromProxy(JNIEnv* env, jobject aJavaObject, - void** aResult); - -#endif // _nsJavaWrapper_h_ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.cpp deleted file mode 100755 index f91fdd8..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.cpp +++ /dev/null @@ -1,1084 +0,0 @@ -/* ***** 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 "nsJavaXPCOMBindingUtils.h" -#include "nsJavaXPTCStub.h" -#include "nsJavaWrapper.h" -#include "jni.h" -#include "nsIInterfaceInfoManager.h" -#include "nsThreadUtils.h" -#include "nsProxyRelease.h" -#ifdef VBOX -#ifndef NS_INT32_TO_PTR -#define NS_INT32_TO_PTR(x) ((void *)((char *)0 + (x))) -#endif -#endif - - -/* Java JNI globals */ - -JavaVM* gCachedJVM = nsnull; - -jclass systemClass = nsnull; -jclass booleanClass = nsnull; -jclass charClass = nsnull; -jclass byteClass = nsnull; -jclass shortClass = nsnull; -jclass intClass = nsnull; -jclass longClass = nsnull; -jclass floatClass = nsnull; -jclass doubleClass = nsnull; -jclass stringClass = nsnull; -jclass nsISupportsClass = nsnull; -jclass xpcomExceptionClass = nsnull; -jclass xpcomJavaProxyClass = nsnull; -jclass weakReferenceClass = nsnull; -jclass javaXPCOMUtilsClass = nsnull; - -jmethodID hashCodeMID = nsnull; -jmethodID booleanValueMID = nsnull; -jmethodID booleanInitMID = nsnull; -jmethodID charValueMID = nsnull; -jmethodID charInitMID = nsnull; -jmethodID byteValueMID = nsnull; -jmethodID byteInitMID = nsnull; -jmethodID shortValueMID = nsnull; -jmethodID shortInitMID = nsnull; -jmethodID intValueMID = nsnull; -jmethodID intInitMID = nsnull; -jmethodID longValueMID = nsnull; -jmethodID longInitMID = nsnull; -jmethodID floatValueMID = nsnull; -jmethodID floatInitMID = nsnull; -jmethodID doubleValueMID = nsnull; -jmethodID doubleInitMID = nsnull; -jmethodID createProxyMID = nsnull; -jmethodID isXPCOMJavaProxyMID = nsnull; -jmethodID getNativeXPCOMInstMID = nsnull; -jmethodID weakReferenceConstructorMID = nsnull; -jmethodID getReferentMID = nsnull; -jmethodID clearReferentMID = nsnull; -jmethodID findClassInLoaderMID = nsnull; - -#ifdef DEBUG_JAVAXPCOM -jmethodID getNameMID = nsnull; -jmethodID proxyToStringMID = nsnull; -#endif - -NativeToJavaProxyMap* gNativeToJavaProxyMap = nsnull; -JavaToXPTCStubMap* gJavaToXPTCStubMap = nsnull; - -PRBool gJavaXPCOMInitialized = PR_FALSE; -PRLock* gJavaXPCOMLock = nsnull; - -static const char* kJavaKeywords[] = { - "abstract", "default" , "if" , "private" , "throw" , - "boolean" , "do" , "implements", "protected" , "throws" , - "break" , "double" , "import", "public" , "transient" , - "byte" , "else" , "instanceof", "return" , "try" , - "case" , "extends" , "int" , "short" , "void" , - "catch" , "final" , "interface" , "static" , "volatile" , - "char" , "finally" , "long" , "super" , "while" , - "class" , "float" , "native" , "switch" , - "const" , "for" , "new" , "synchronized", - "continue", "goto" , "package" , "this" , - /* added in Java 1.2 */ - "strictfp", - /* added in Java 1.4 */ - "assert" , - /* added in Java 5.0 */ - "enum" , - /* Java constants */ - "true" , "false" , "null" , - /* java.lang.Object methods * - * - don't worry about "toString", since it does the same thing * - * as Object's "toString" */ - "clone" , "equals" , "finalize" , "getClass" , "hashCode" , - "notify" , "notifyAll", /*"toString" ,*/ "wait" -}; - -nsTHashtable* gJavaKeywords = nsnull; - - -/****************************** - * InitializeJavaGlobals - ******************************/ -PRBool -InitializeJavaGlobals(JNIEnv *env) -{ - if (gJavaXPCOMInitialized) - return PR_TRUE; - - // Save pointer to JavaVM, which is valid across threads. - jint rc = env->GetJavaVM(&gCachedJVM); - if (rc != 0) { - NS_WARNING("Failed to get JavaVM"); - goto init_error; - } - - jclass clazz; - if (!(clazz = env->FindClass("java/lang/System")) || - !(systemClass = (jclass) env->NewGlobalRef(clazz)) || - !(hashCodeMID = env->GetStaticMethodID(clazz, "identityHashCode", - "(Ljava/lang/Object;)I"))) - { - NS_WARNING("Problem creating java.lang.System globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Boolean")) || - !(booleanClass = (jclass) env->NewGlobalRef(clazz)) || - !(booleanValueMID = env->GetMethodID(clazz, "booleanValue", "()Z")) || - !(booleanInitMID = env->GetMethodID(clazz, "", "(Z)V"))) - { - NS_WARNING("Problem creating java.lang.Boolean globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Character")) || - !(charClass = (jclass) env->NewGlobalRef(clazz)) || - !(charValueMID = env->GetMethodID(clazz, "charValue", "()C")) || - !(charInitMID = env->GetMethodID(clazz, "", "(C)V"))) - { - NS_WARNING("Problem creating java.lang.Character globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Byte")) || - !(byteClass = (jclass) env->NewGlobalRef(clazz)) || - !(byteValueMID = env->GetMethodID(clazz, "byteValue", "()B")) || - !(byteInitMID = env->GetMethodID(clazz, "", "(B)V"))) - { - NS_WARNING("Problem creating java.lang.Byte globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Short")) || - !(shortClass = (jclass) env->NewGlobalRef(clazz)) || - !(shortValueMID = env->GetMethodID(clazz, "shortValue", "()S")) || - !(shortInitMID = env->GetMethodID(clazz, "", "(S)V"))) - { - NS_WARNING("Problem creating java.lang.Short globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Integer")) || - !(intClass = (jclass) env->NewGlobalRef(clazz)) || - !(intValueMID = env->GetMethodID(clazz, "intValue", "()I")) || - !(intInitMID = env->GetMethodID(clazz, "", "(I)V"))) - { - NS_WARNING("Problem creating java.lang.Integer globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Long")) || - !(longClass = (jclass) env->NewGlobalRef(clazz)) || - !(longValueMID = env->GetMethodID(clazz, "longValue", "()J")) || - !(longInitMID = env->GetMethodID(clazz, "", "(J)V"))) - { - NS_WARNING("Problem creating java.lang.Long globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Float")) || - !(floatClass = (jclass) env->NewGlobalRef(clazz)) || - !(floatValueMID = env->GetMethodID(clazz, "floatValue", "()F")) || - !(floatInitMID = env->GetMethodID(clazz, "", "(F)V"))) - { - NS_WARNING("Problem creating java.lang.Float globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/Double")) || - !(doubleClass = (jclass) env->NewGlobalRef(clazz)) || - !(doubleValueMID = env->GetMethodID(clazz, "doubleValue", "()D")) || - !(doubleInitMID = env->GetMethodID(clazz, "", "(D)V"))) - { - NS_WARNING("Problem creating java.lang.Double globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/String")) || - !(stringClass = (jclass) env->NewGlobalRef(clazz))) - { - NS_WARNING("Problem creating java.lang.String globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("org/mozilla/interfaces/nsISupports")) || - !(nsISupportsClass = (jclass) env->NewGlobalRef(clazz))) - { - NS_WARNING("Problem creating org.mozilla.interfaces.nsISupports globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("org/mozilla/xpcom/XPCOMException")) || - !(xpcomExceptionClass = (jclass) env->NewGlobalRef(clazz))) - { - NS_WARNING("Problem creating org.mozilla.xpcom.XPCOMException globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("org/mozilla/xpcom/internal/XPCOMJavaProxy")) || - !(xpcomJavaProxyClass = (jclass) env->NewGlobalRef(clazz)) || - !(createProxyMID = env->GetStaticMethodID(clazz, "createProxy", - "(Ljava/lang/Class;J)Ljava/lang/Object;")) || - !(isXPCOMJavaProxyMID = env->GetStaticMethodID(clazz, "isXPCOMJavaProxy", - "(Ljava/lang/Object;)Z")) || - !(getNativeXPCOMInstMID = env->GetStaticMethodID(xpcomJavaProxyClass, - "getNativeXPCOMInstance", - "(Ljava/lang/Object;)J"))) - { - NS_WARNING("Problem creating org.mozilla.xpcom.internal.XPCOMJavaProxy globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("java/lang/ref/WeakReference")) || - !(weakReferenceClass = (jclass) env->NewGlobalRef(clazz)) || - !(weakReferenceConstructorMID = env->GetMethodID(weakReferenceClass, - "","(Ljava/lang/Object;)V")) || - !(getReferentMID = env->GetMethodID(weakReferenceClass, - "get", "()Ljava/lang/Object;")) || - !(clearReferentMID = env->GetMethodID(weakReferenceClass, - "clear", "()V"))) - { - NS_WARNING("Problem creating java.lang.ref.WeakReference globals"); - goto init_error; - } - - if (!(clazz = env->FindClass("org/mozilla/xpcom/internal/JavaXPCOMMethods")) || - !(javaXPCOMUtilsClass = (jclass) env->NewGlobalRef(clazz)) || - !(findClassInLoaderMID = env->GetStaticMethodID(clazz, - "findClassInLoader", - "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Class;"))) - { - NS_WARNING("Problem creating org.mozilla.xpcom.internal.JavaXPCOMMethods globals"); - goto init_error; - } - -#ifdef DEBUG_JAVAXPCOM - if (!(clazz = env->FindClass("java/lang/Class")) || - !(getNameMID = env->GetMethodID(clazz, "getName","()Ljava/lang/String;"))) - { - NS_WARNING("Problem creating java.lang.Class globals"); - goto init_error; - } - - if (!(proxyToStringMID = env->GetStaticMethodID(xpcomJavaProxyClass, - "proxyToString", - "(Ljava/lang/Object;)Ljava/lang/String;"))) - { - NS_WARNING("Problem creating proxyToString global"); - goto init_error; - } -#endif - - gNativeToJavaProxyMap = new NativeToJavaProxyMap(); - if (!gNativeToJavaProxyMap || NS_FAILED(gNativeToJavaProxyMap->Init())) { - NS_WARNING("Problem creating NativeToJavaProxyMap"); - goto init_error; - } - gJavaToXPTCStubMap = new JavaToXPTCStubMap(); - if (!gJavaToXPTCStubMap || NS_FAILED(gJavaToXPTCStubMap->Init())) { - NS_WARNING("Problem creating JavaToXPTCStubMap"); - goto init_error; - } - - { - nsresult rv = NS_OK; - PRUint32 size = NS_ARRAY_LENGTH(kJavaKeywords); - gJavaKeywords = new nsTHashtable(); - if (!gJavaKeywords || NS_FAILED(gJavaKeywords->Init(size))) { - NS_WARNING("Failed to init JavaKeywords HashSet"); - goto init_error; - } - for (PRUint32 i = 0; i < size && NS_SUCCEEDED(rv); i++) { - if (!gJavaKeywords->PutEntry(kJavaKeywords[i])) { - rv = NS_ERROR_OUT_OF_MEMORY; - } - } - if (NS_FAILED(rv)) { - NS_WARNING("Failed to populate JavaKeywords hash"); - goto init_error; - } - } - - gJavaXPCOMLock = PR_NewLock(); - gJavaXPCOMInitialized = PR_TRUE; - return PR_TRUE; - -init_error: - // If we encounter an error during initialization, then free any globals that - // were allocated, and return false. - FreeJavaGlobals(env); - return PR_FALSE; -} - -/************************* - * FreeJavaGlobals - *************************/ -void -FreeJavaGlobals(JNIEnv* env) -{ - PRLock* tempLock = nsnull; - if (gJavaXPCOMLock) { - PR_Lock(gJavaXPCOMLock); - - // null out global lock so no one else can use it - tempLock = gJavaXPCOMLock; - gJavaXPCOMLock = nsnull; - } - - gJavaXPCOMInitialized = PR_FALSE; - - // Free the mappings first, since that process depends on some of the Java - // globals that are freed later. - if (gNativeToJavaProxyMap) { - gNativeToJavaProxyMap->Destroy(env); - delete gNativeToJavaProxyMap; - gNativeToJavaProxyMap = nsnull; - } - if (gJavaToXPTCStubMap) { - gJavaToXPTCStubMap->Destroy(); - delete gJavaToXPTCStubMap; - gJavaToXPTCStubMap = nsnull; - } - - // Free remaining Java globals - if (systemClass) { - env->DeleteGlobalRef(systemClass); - systemClass = nsnull; - } - if (booleanClass) { - env->DeleteGlobalRef(booleanClass); - booleanClass = nsnull; - } - if (charClass) { - env->DeleteGlobalRef(charClass); - charClass = nsnull; - } - if (byteClass) { - env->DeleteGlobalRef(byteClass); - byteClass = nsnull; - } - if (shortClass) { - env->DeleteGlobalRef(shortClass); - shortClass = nsnull; - } - if (intClass) { - env->DeleteGlobalRef(intClass); - intClass = nsnull; - } - if (longClass) { - env->DeleteGlobalRef(longClass); - longClass = nsnull; - } - if (floatClass) { - env->DeleteGlobalRef(floatClass); - floatClass = nsnull; - } - if (doubleClass) { - env->DeleteGlobalRef(doubleClass); - doubleClass = nsnull; - } - if (stringClass) { - env->DeleteGlobalRef(stringClass); - stringClass = nsnull; - } - if (nsISupportsClass) { - env->DeleteGlobalRef(nsISupportsClass); - nsISupportsClass = nsnull; - } - if (xpcomExceptionClass) { - env->DeleteGlobalRef(xpcomExceptionClass); - xpcomExceptionClass = nsnull; - } - if (xpcomJavaProxyClass) { - env->DeleteGlobalRef(xpcomJavaProxyClass); - xpcomJavaProxyClass = nsnull; - } - if (weakReferenceClass) { - env->DeleteGlobalRef(weakReferenceClass); - weakReferenceClass = nsnull; - } - - if (gJavaKeywords) { - delete gJavaKeywords; - gJavaKeywords = nsnull; - } - - if (tempLock) { - PR_Unlock(tempLock); - PR_DestroyLock(tempLock); - } -} - - -/************************************** - * Java<->XPCOM object mappings - **************************************/ - -// NativeToJavaProxyMap: The common case is that each XPCOM object will have -// one Java proxy. But there are instances where there will be multiple Java -// proxies for a given XPCOM object, each representing a different interface. -// So we optimize the common case by using a hash table. Then, if there are -// multiple Java proxies, we cycle through the linked list, comparing IIDs. - -nsresult -NativeToJavaProxyMap::Init() -{ - mHashTable = PL_NewDHashTable(PL_DHashGetStubOps(), nsnull, - sizeof(Entry), 16); - if (!mHashTable) - return NS_ERROR_OUT_OF_MEMORY; - return NS_OK; -} - -PLDHashOperator -DestroyJavaProxyMappingEnum(PLDHashTable* aTable, PLDHashEntryHdr* aHeader, - PRUint32 aNumber, void* aData) -{ - JNIEnv* env = static_cast(aData); - NativeToJavaProxyMap::Entry* entry = - static_cast(aHeader); - - // first, delete XPCOM instances from the Java proxies - nsresult rv; - NativeToJavaProxyMap::ProxyList* item = entry->list; - while(item != nsnull) { - void* xpcom_obj; - jobject javaObject = env->CallObjectMethod(item->javaObject, getReferentMID); - rv = GetXPCOMInstFromProxy(env, javaObject, &xpcom_obj); - NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to get XPCOM instance from Java proxy"); - - if (NS_SUCCEEDED(rv)) { - JavaXPCOMInstance* inst = static_cast(xpcom_obj); -#ifdef DEBUG_JAVAXPCOM - char* iid_str = item->iid.ToString(); - LOG(("- NativeToJavaProxyMap (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, - javaObject), - (PRUint32) entry, iid_str)); - PR_Free(iid_str); -#endif - delete inst; // releases native XPCOM object - } - - NativeToJavaProxyMap::ProxyList* next = item->next; - env->CallVoidMethod(item->javaObject, clearReferentMID); - env->DeleteGlobalRef(item->javaObject); - delete item; - item = next; - } - - return PL_DHASH_REMOVE; -} - -nsresult -NativeToJavaProxyMap::Destroy(JNIEnv* env) -{ - // This is only called from FreeGlobals(), which already holds the lock. - // nsAutoLock lock(gJavaXPCOMLock); - - PL_DHashTableEnumerate(mHashTable, DestroyJavaProxyMappingEnum, env); - PL_DHashTableDestroy(mHashTable); - mHashTable = nsnull; - - return NS_OK; -} - -nsresult -NativeToJavaProxyMap::Add(JNIEnv* env, nsISupports* aXPCOMObject, - const nsIID& aIID, jobject aProxy) -{ - nsAutoLock lock(gJavaXPCOMLock); - - Entry* e = static_cast(PL_DHashTableOperate(mHashTable, - aXPCOMObject, - PL_DHASH_ADD)); - if (!e) - return NS_ERROR_FAILURE; - - jobject ref = nsnull; - jobject weakRefObj = env->NewObject(weakReferenceClass, - weakReferenceConstructorMID, aProxy); - if (weakRefObj) - ref = env->NewGlobalRef(weakRefObj); - if (!ref) - return NS_ERROR_OUT_OF_MEMORY; - - // Add Java proxy weak reference ref to start of list - ProxyList* item = new ProxyList(ref, aIID, e->list); - e->key = aXPCOMObject; - e->list = item; - -#ifdef DEBUG_JAVAXPCOM - char* iid_str = aIID.ToString(); - LOG(("+ NativeToJavaProxyMap (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, aProxy), - (PRUint32) aXPCOMObject, iid_str)); - PR_Free(iid_str); -#endif - return NS_OK; -} - -nsresult -NativeToJavaProxyMap::Find(JNIEnv* env, nsISupports* aNativeObject, - const nsIID& aIID, jobject* aResult) -{ - NS_PRECONDITION(aResult != nsnull, "null ptr"); - if (!aResult) - return NS_ERROR_FAILURE; - - nsAutoLock lock(gJavaXPCOMLock); - - *aResult = nsnull; - Entry* e = static_cast(PL_DHashTableOperate(mHashTable, - aNativeObject, - PL_DHASH_LOOKUP)); - - if (PL_DHASH_ENTRY_IS_FREE(e)) - return NS_OK; - - ProxyList* item = e->list; - while (item != nsnull && *aResult == nsnull) { - if (item->iid.Equals(aIID)) { - jobject referentObj = env->CallObjectMethod(item->javaObject, - getReferentMID); - if (!env->IsSameObject(referentObj, NULL)) { - *aResult = referentObj; -#ifdef DEBUG_JAVAXPCOM - char* iid_str = aIID.ToString(); - LOG(("< NativeToJavaProxyMap (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, - *aResult), - (PRUint32) aNativeObject, iid_str)); - PR_Free(iid_str); -#endif - } - } - item = item->next; - } - - return NS_OK; -} - -nsresult -NativeToJavaProxyMap::Remove(JNIEnv* env, nsISupports* aNativeObject, - const nsIID& aIID) -{ - // This is only called from finalizeProxy(), which already holds the lock. - // nsAutoLock lock(gJavaXPCOMLock); - - Entry* e = static_cast(PL_DHashTableOperate(mHashTable, - aNativeObject, - PL_DHASH_LOOKUP)); - - if (PL_DHASH_ENTRY_IS_FREE(e)) { - NS_WARNING("XPCOM object not found in hash table"); - return NS_ERROR_FAILURE; - } - - ProxyList* item = e->list; - ProxyList* last = e->list; - while (item != nsnull) { - if (item->iid.Equals(aIID)) { -#ifdef DEBUG_JAVAXPCOM - char* iid_str = aIID.ToString(); - LOG(("- NativeToJavaProxyMap (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) env->CallStaticIntMethod(systemClass, hashCodeMID, - item->javaObject), - (PRUint32) aNativeObject, iid_str)); - PR_Free(iid_str); -#endif - - env->CallVoidMethod(item->javaObject, clearReferentMID); - env->DeleteGlobalRef(item->javaObject); - if (item == e->list) { - e->list = item->next; - if (e->list == nsnull) - PL_DHashTableOperate(mHashTable, aNativeObject, PL_DHASH_REMOVE); - } else { - last->next = item->next; - } - - delete item; - return NS_OK; - } - - last = item; - item = item->next; - } - - NS_WARNING("Java proxy matching given IID not found"); - return NS_ERROR_FAILURE; -} - -nsresult -JavaToXPTCStubMap::Init() -{ - mHashTable = PL_NewDHashTable(PL_DHashGetStubOps(), nsnull, - sizeof(Entry), 16); - if (!mHashTable) - return NS_ERROR_OUT_OF_MEMORY; - return NS_OK; -} - - -PLDHashOperator -DestroyXPTCMappingEnum(PLDHashTable* aTable, PLDHashEntryHdr* aHeader, - PRUint32 aNumber, void* aData) -{ - JavaToXPTCStubMap::Entry* entry = - static_cast(aHeader); - - // The XPTC stub will be released by the XPCOM side, if it hasn't been - // already. We just need to delete the Java global ref held by the XPTC stub, - // so the Java garbage collector can handle the Java object when necessary. - entry->xptcstub->DeleteStrongRef(); - - return PL_DHASH_REMOVE; -} - -nsresult -JavaToXPTCStubMap::Destroy() -{ - // This is only called from FreeGlobals(), which already holds the lock. - // nsAutoLock lock(gJavaXPCOMLock); - - PL_DHashTableEnumerate(mHashTable, DestroyXPTCMappingEnum, nsnull); - PL_DHashTableDestroy(mHashTable); - mHashTable = nsnull; - - return NS_OK; -} - -nsresult -JavaToXPTCStubMap::Add(jint aJavaObjectHashCode, nsJavaXPTCStub* aProxy) -{ - nsAutoLock lock(gJavaXPCOMLock); - - Entry* e = static_cast - (PL_DHashTableOperate(mHashTable, - NS_INT32_TO_PTR(aJavaObjectHashCode), - PL_DHASH_ADD)); - if (!e) - return NS_ERROR_FAILURE; - - NS_ASSERTION(e->key == nsnull, - "XPTCStub for given Java object already exists in hash table"); - e->key = aJavaObjectHashCode; - e->xptcstub = aProxy; - -#ifdef DEBUG_JAVAXPCOM - nsIInterfaceInfo* iface_info; - aProxy->GetInterfaceInfo(&iface_info); - nsIID* iid; - iface_info->GetInterfaceIID(&iid); - char* iid_str = iid->ToString(); - LOG(("+ JavaToXPTCStubMap (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) aJavaObjectHashCode, (PRUint32) aProxy, iid_str)); - PR_Free(iid_str); - nsMemory::Free(iid); - NS_RELEASE(iface_info); -#endif - return NS_OK; -} - -nsresult -JavaToXPTCStubMap::Find(jint aJavaObjectHashCode, const nsIID& aIID, - nsJavaXPTCStub** aResult) -{ - NS_PRECONDITION(aResult != nsnull, "null ptr"); - if (!aResult) - return NS_ERROR_FAILURE; - - nsAutoLock lock(gJavaXPCOMLock); - - *aResult = nsnull; - Entry* e = static_cast - (PL_DHashTableOperate(mHashTable, - NS_INT32_TO_PTR(aJavaObjectHashCode), - PL_DHASH_LOOKUP)); - - if (PL_DHASH_ENTRY_IS_FREE(e)) - return NS_OK; - - nsresult rv = e->xptcstub->QueryInterface(aIID, (void**) aResult); - -#ifdef DEBUG_JAVAXPCOM - if (NS_SUCCEEDED(rv)) { - char* iid_str = aIID.ToString(); - LOG(("< JavaToXPTCStubMap (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) aJavaObjectHashCode, (PRUint32) *aResult, iid_str)); - PR_Free(iid_str); - } -#endif - - // NS_NOINTERFACE is not an error condition - if (rv == NS_NOINTERFACE) - rv = NS_OK; - return rv; -} - -nsresult -JavaToXPTCStubMap::Remove(jint aJavaObjectHashCode) -{ - PL_DHashTableOperate(mHashTable, NS_INT32_TO_PTR(aJavaObjectHashCode), - PL_DHASH_REMOVE); - -#ifdef DEBUG_JAVAXPCOM - LOG(("- JavaToXPTCStubMap (Java=%08x)\n", (PRUint32) aJavaObjectHashCode)); -#endif - - return NS_OK; -} - - -/********************************************************** - * JavaXPCOMInstance - *********************************************************/ -JavaXPCOMInstance::JavaXPCOMInstance(nsISupports* aInstance, - nsIInterfaceInfo* aIInfo) - : mInstance(aInstance) - , mIInfo(aIInfo) -{ - NS_ADDREF(mInstance); - NS_ADDREF(mIInfo); -} - -JavaXPCOMInstance::~JavaXPCOMInstance() -{ - nsresult rv = NS_OK; - -#ifdef VBOX -# if 0 - nsCOMPtr eq = do_GetMainThreadQueue(); - rv = NS_ProxyRelease(eq.get(), mInstance); - rv |= NS_ProxyRelease(eq.get(), mIInfo); -# else - // The above code crashes in nsTraceRefcntImpl::LogAddCOMPtr() (@bugref 7620) - NS_RELEASE(mInstance); - NS_RELEASE(mIInfo); - rv = NS_OK; -# endif -#else - // Need to release these objects on the main thread. - nsCOMPtr thread = do_GetMainThread(); - if (thread) { - rv = NS_ProxyRelease(thread, mInstance); - rv |= NS_ProxyRelease(thread, mIInfo); - } -#endif - NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to release using NS_ProxyRelease"); -} - - -/******************************* - * Helper functions - *******************************/ - -nsresult -NativeInterfaceToJavaObject(JNIEnv* env, nsISupports* aXPCOMObject, - const nsIID& aIID, jobject aObjectLoader, - jobject* aResult) -{ - NS_PRECONDITION(aResult != nsnull, "null ptr"); - if (!aResult) - return NS_ERROR_NULL_POINTER; - - // If the object is an nsJavaXPTCStub, then get the Java object directly - nsJavaXPTCStub* stub = nsnull; - aXPCOMObject->QueryInterface(NS_GET_IID(nsJavaXPTCStub), (void**) &stub); - if (stub) { - *aResult = stub->GetJavaObject(); - NS_ASSERTION(*aResult != nsnull, "nsJavaXPTCStub w/o matching Java object"); - NS_RELEASE(stub); - return NS_OK; - } - - // ... else, get a Java wrapper for the native object - return GetNewOrUsedJavaWrapper(env, aXPCOMObject, aIID, aObjectLoader, - aResult); -} - -nsresult -JavaObjectToNativeInterface(JNIEnv* env, jobject aJavaObject, const nsIID& aIID, - void** aResult) -{ - NS_PRECONDITION(aResult != nsnull, "null ptr"); - if (!aResult) - return NS_ERROR_NULL_POINTER; - - nsresult rv; - *aResult = nsnull; - - // If the given Java object is one of our Java proxies, then query the - // associated XPCOM object directly from the proxy. - jboolean isProxy = env->CallStaticBooleanMethod(xpcomJavaProxyClass, - isXPCOMJavaProxyMID, - aJavaObject); - if (env->ExceptionCheck()) - return NS_ERROR_FAILURE; - - if (isProxy) { - void* inst; - rv = GetXPCOMInstFromProxy(env, aJavaObject, &inst); - NS_ENSURE_SUCCESS(rv, rv); - - nsISupports* rootObject = - static_cast(inst)->GetInstance(); - rv = rootObject->QueryInterface(aIID, aResult); - NS_ENSURE_SUCCESS(rv, rv); - - return NS_OK; - } - - // ... else, we get an nsJavaXPTCStub - return nsJavaXPTCStub::GetNewOrUsed(env, aJavaObject, aIID, aResult); -} - -nsresult -GetIIDForMethodParam(nsIInterfaceInfo *iinfo, - const XPTMethodDescriptor *methodInfo, - const nsXPTParamInfo ¶mInfo, PRUint8 paramType, - PRUint16 methodIndex, nsXPTCMiniVariant *dispatchParams, - PRBool isFullVariantArray, nsID &result) -{ - nsresult rv; - - switch (paramType) - { - case nsXPTType::T_INTERFACE: - rv = iinfo->GetIIDForParamNoAlloc(methodIndex, ¶mInfo, &result); - break; - - case nsXPTType::T_INTERFACE_IS: - { - PRUint8 argnum; - rv = iinfo->GetInterfaceIsArgNumberForParam(methodIndex, ¶mInfo, - &argnum); - if (NS_FAILED(rv)) - break; - - const nsXPTParamInfo& arg_param = methodInfo->params[argnum]; - const nsXPTType& arg_type = arg_param.GetType(); - - // The xpidl compiler ensures this. We reaffirm it for safety. - if (!arg_type.IsPointer() || arg_type.TagPart() != nsXPTType::T_IID) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - nsID *p = nsnull; - if (isFullVariantArray) { - p = (nsID *) ((nsXPTCVariant*) dispatchParams)[argnum].val.p; - } else { - p = (nsID *) dispatchParams[argnum].val.p; - } - if (!p) - return NS_ERROR_UNEXPECTED; - - result = *p; - break; - } - - default: - rv = NS_ERROR_UNEXPECTED; - } - return rv; -} - - -/******************************* - * JNI helper functions - *******************************/ - -JNIEnv* -GetJNIEnv() -{ - JNIEnv* env = nsnull; - jint rc = gCachedJVM->GetEnv((void**) &env, JNI_VERSION_1_2); -#ifdef VBOX - if (env == nsnull) - { - rc = gCachedJVM->AttachCurrentThreadAsDaemon((void**)&env, nsnull); - printf("attaching\n"); - } -#endif - NS_ASSERTION(rc == JNI_OK && env != nsnull, - "Current thread not attached to given JVM instance"); - return env; -} - -void -ThrowException(JNIEnv* env, const nsresult aErrorCode, const char* aMessage) -{ - // Only throw this exception if one hasn't already been thrown, so we don't - // mask a previous exception/error. - if (env->ExceptionCheck()) - return; - - // If the error code we get is for an Out Of Memory error, try to throw an - // OutOfMemoryError. The JVM may have enough memory to create this error. - if (aErrorCode == NS_ERROR_OUT_OF_MEMORY) { - jclass clazz = env->FindClass("java/lang/OutOfMemoryError"); - if (clazz) { - env->ThrowNew(clazz, aMessage); - } - env->DeleteLocalRef(clazz); - return; - } - - // If the error was not handled above, then create an XPCOMException with the - // given error code and message. - - // Create parameters and method signature. Max of 2 params. The error code - // comes before the message string. - PRInt64 errorCode = aErrorCode ? aErrorCode : NS_ERROR_FAILURE; - nsCAutoString methodSig("(J"); - jstring message = nsnull; - if (aMessage) { - message = env->NewStringUTF(aMessage); - if (!message) { - return; - } - methodSig.AppendLiteral("Ljava/lang/String;"); - } - methodSig.AppendLiteral(")V"); - - // In some instances (such as in shutdownXPCOM() and termEmbedding()), we - // will need to throw an exception when JavaXPCOM has already been - // terminated. In such a case, 'xpcomExceptionClass' will be null. So we - // reset it temporarily in order to throw the appropriate exception. - if (xpcomExceptionClass == nsnull) { - xpcomExceptionClass = env->FindClass("org/mozilla/xpcom/XPCOMException"); - if (!xpcomExceptionClass) { - return; - } - } - - // create exception object - jthrowable throwObj = nsnull; - jmethodID mid = env->GetMethodID(xpcomExceptionClass, "", - methodSig.get()); - if (mid) { - throwObj = (jthrowable) env->NewObject(xpcomExceptionClass, mid, errorCode, - message); - } - NS_ASSERTION(throwObj, "Failed to create XPCOMException object"); - - // throw exception - if (throwObj) { - env->Throw(throwObj); - } -} - -nsAString* -jstring_to_nsAString(JNIEnv* env, jstring aString) -{ - const PRUnichar* buf = nsnull; - if (aString) { - buf = env->GetStringChars(aString, nsnull); - if (!buf) - return nsnull; // exception already thrown - } - - nsString* str = new nsString(buf); - - if (aString) { - env->ReleaseStringChars(aString, buf); - } else { - str->SetIsVoid(PR_TRUE); - } - - // returns string, or nsnull if 'new' failed - return str; -} - -nsACString* -jstring_to_nsACString(JNIEnv* env, jstring aString) -{ - const char* buf = nsnull; - if (aString) { - buf = env->GetStringUTFChars(aString, nsnull); - if (!buf) - return nsnull; // exception already thrown - } - - nsCString* str = new nsCString(buf); - - if (aString) { - env->ReleaseStringUTFChars(aString, buf); - } else { - str->SetIsVoid(PR_TRUE); - } - - // returns string, or nsnull if 'new' failed - return str; -} - -nsresult -File_to_nsILocalFile(JNIEnv* env, jobject aFile, nsILocalFile** aLocalFile) -{ - nsresult rv = NS_ERROR_FAILURE; - jstring pathName = nsnull; - jclass clazz = env->FindClass("java/io/File"); - if (clazz) { - jmethodID pathMID = env->GetMethodID(clazz, "getCanonicalPath", - "()Ljava/lang/String;"); - if (pathMID) { - pathName = (jstring) env->CallObjectMethod(aFile, pathMID); - if (pathName != nsnull && !env->ExceptionCheck()) - rv = NS_OK; - } - } - - if (NS_SUCCEEDED(rv)) { - nsAString* path = jstring_to_nsAString(env, pathName); - if (!path) - rv = NS_ERROR_OUT_OF_MEMORY; - - if (NS_SUCCEEDED(rv)) { - rv = NS_NewLocalFile(*path, false, aLocalFile); - delete path; - } - } - - return rv; -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h deleted file mode 100755 index 894a8cb..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMBindingUtils.h +++ /dev/null @@ -1,392 +0,0 @@ -/* ***** 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* 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 nsnull 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 - * null; or nsnull 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_ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMGlue.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMGlue.cpp deleted file mode 100755 index b0b6b72..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPCOMGlue.cpp +++ /dev/null @@ -1,535 +0,0 @@ -/* ***** 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) 2006 - * 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 "jni.h" -#include "nsXPCOMPrivate.h" // for XPCOM_DLL defines. -#include "nsXPCOMGlue.h" -#include - - -#ifdef VBOX -#include -#include "nsDebug.h" -#endif - -#if defined(XP_WIN) || defined(XP_OS2) -#define JX_EXPORT JNIEXPORT -#else -#define JX_EXPORT JNIEXPORT NS_EXPORT -#endif - - -/*********************** - * JNI Load & Unload - ***********************/ - -extern "C" JX_EXPORT jint JNICALL -JNI_OnLoad(JavaVM* vm, void* reserved) -{ - // Let the JVM know that we are using JDK 1.2 JNI features. - return JNI_VERSION_1_2; -} - -extern "C" JX_EXPORT void JNICALL -JNI_OnUnload(JavaVM* vm, void* reserved) -{ -} - -/******************************** - * JavaXPCOM JNI interfaces - ********************************/ - -#define JXM_NATIVE(func) Java_org_mozilla_xpcom_internal_JavaXPCOMMethods_##func - -enum { - kFunc_Initialize, - kFunc_InitEmbedding, - kFunc_TermEmbedding, - kFunc_LockProfileDirectory, - kFunc_NotifyProfile, - kFunc_InitXPCOM, - kFunc_ShutdownXPCOM, - kFunc_GetComponentManager, - kFunc_GetComponentRegistrar, - kFunc_GetServiceManager, - kFunc_NewLocalFile, - kFunc_CallXPCOMMethod, - kFunc_FinalizeProxy, - kFunc_IsSameXPCOMObject, - kFunc_ReleaseProfileLock, - kFunc_GetNativeHandleFromAWT, - kFunc_WrapJavaObject, - kFunc_WrapXPCOMObject -}; - -#define JX_NUM_FUNCS 18 - - -// Get path string from java.io.File object. -jstring -GetJavaFilePath(JNIEnv* env, jobject aFile) -{ - jclass clazz = env->FindClass("java/io/File"); - if (clazz) { - jmethodID pathMID = env->GetMethodID(clazz, "getCanonicalPath", - "()Ljava/lang/String;"); - if (pathMID) { - return (jstring) env->CallObjectMethod(aFile, pathMID); - } - } - - return nsnull; -} -#ifdef VBOX - -#include "nsXPTCUtils.h" -#include "nsCOMPtr.h" -#include "nsIInterfaceInfoManager.h" -#include "nsJavaInterfaces.h" - -void -ThrowException(JNIEnv* env, const nsresult aErrorCode, const char* aMessage); - -class nsXPTCJStub : public nsXPTCStubBase -{ - nsCOMPtr mII; - nsIXPTCProxy* mOuter; - public: - NS_DECL_ISUPPORTS_INHERITED - - nsXPTCJStub(REFNSIID aIID, nsIXPTCProxy* aOuter, nsIInterfaceInfo* ii) - { - mOuter = aOuter; - mII = ii; - } - - virtual ~nsXPTCJStub() - { - } - - NS_IMETHOD GetInterfaceInfo(nsIInterfaceInfo** info) - { - *info = mII; - (*info)->AddRef(); - return NS_OK; - } - // call this method and return result - NS_IMETHOD CallMethod(PRUint16 methodIndex, - const nsXPTMethodInfo* info, - nsXPTCMiniVariant* params) - { - return mOuter->CallMethod(methodIndex, info, params); - } -}; - -NS_IMETHODIMP_(nsrefcnt) -nsXPTCJStub::AddRef() -{ - return mOuter->AddRef(); -} - -NS_IMETHODIMP_(nsrefcnt) -nsXPTCJStub::Release() -{ - return mOuter->Release(); -} - -NS_IMETHODIMP nsXPTCJStub::QueryInterface(REFNSIID aIID, void** aInstancePtr) -{ - nsIID* mIID; - mII->GetInterfaceIID(&mIID); - - if (mIID->Equals(aIID)) { - NS_ADDREF_THIS(); - *aInstancePtr = static_cast(this); - return NS_OK; - } - - return mOuter->QueryInterface(aIID, aInstancePtr); -} - -nsresult -NS_GetXPTCallStub(REFNSIID aIID, nsIXPTCProxy* aOuter, - nsISomeInterface* *aResult) -{ - NS_ENSURE_ARG(aOuter && aResult); -#if 0 - xptiInterfaceInfoManager *iim = - xptiInterfaceInfoManager::GetInterfaceInfoManagerNoAddRef(); - NS_ENSURE_TRUE(iim, NS_ERROR_NOT_INITIALIZED); - - xptiInterfaceEntry *iie = iim->GetInterfaceEntryForIID(&aIID); - if (!iie || !iie->EnsureResolved()) - return NS_ERROR_FAILURE; - - nsXPTCStubBase* newbase = new nsXPTCStubBase(aOuter, iie); - if (!newbase) - return NS_ERROR_OUT_OF_MEMORY; - - *aResult = newbase; -#else - nsCOMPtr iim = XPTI_GetInterfaceInfoManager(); - nsCOMPtr ii; - nsresult rv; - - rv = iim->GetInfoForIID(&aIID, getter_AddRefs(ii)); - if (NS_FAILED(rv)) - return rv; - - nsXPTCStubBase* newbase = new nsXPTCJStub(aIID, aOuter, ii); - if (!newbase) - return NS_ERROR_OUT_OF_MEMORY; - *aResult = newbase; -#endif - return NS_OK; -} - -void -NS_DestroyXPTCallStub(nsISomeInterface* aStub) -{ - nsXPTCStubBase* stub = static_cast(aStub); - delete(stub); -} - - -extern "C" void JAVAPROXY_NATIVE(finalizeProxy)(JNIEnv *env, jclass that, jobject aJavaProxy); - -nsresult -FindVBoxMethods(JNIEnv* env, jobject aXPCOMPath, void** aFunctions) -{ - nsresult rv = 0; - - // We only need to care about this function because the C function we offer - // is different from what the Java side expects - aFunctions[kFunc_FinalizeProxy] = (void*)JAVAPROXY_NATIVE(finalizeProxy); - - return rv; -} -#else -// Calls XPCOMGlueStartup using the given java.io.File object, and loads -// the JavaXPCOM methods from the XUL shared library. -nsresult -LoadXULMethods(JNIEnv* env, jobject aXPCOMPath, void** aFunctions) -{ - jstring pathString = GetJavaFilePath(env, aXPCOMPath); - if (!pathString) - return NS_ERROR_FAILURE; - const char* path = env->GetStringUTFChars(pathString, nsnull); - if (!path) - return NS_ERROR_OUT_OF_MEMORY; - - int len = strlen(path); - char* xpcomPath = (char*) malloc(len + sizeof(XPCOM_DLL) + - sizeof(XPCOM_FILE_PATH_SEPARATOR) + 1); - if (!xpcomPath) - return NS_ERROR_OUT_OF_MEMORY; - sprintf(xpcomPath, "%s" XPCOM_FILE_PATH_SEPARATOR XPCOM_DLL, path); - - nsresult rv = XPCOMGlueStartup(xpcomPath); - free(xpcomPath); - if (NS_FAILED(rv)) - return rv; - -#ifdef XP_WIN32 - // The JNICALL calling convention defines to "__stdcall" on Win32, which - // mangles the name. - nsDynamicFunctionLoad funcs[] = { - { "_Java_org_mozilla_xpcom_internal_MozillaImpl_initialize@8", - (NSFuncPtr*) &aFunctions[kFunc_Initialize] }, - { "_Java_org_mozilla_xpcom_internal_GREImpl_initEmbedding@20", - (NSFuncPtr*) &aFunctions[kFunc_InitEmbedding] }, - { "_Java_org_mozilla_xpcom_internal_GREImpl_termEmbedding@8", - (NSFuncPtr*) &aFunctions[kFunc_TermEmbedding] }, - { "_Java_org_mozilla_xpcom_internal_GREImpl_lockProfileDirectory@12", - (NSFuncPtr*) &aFunctions[kFunc_LockProfileDirectory] }, - { "_Java_org_mozilla_xpcom_internal_GREImpl_notifyProfile@8", - (NSFuncPtr*) &aFunctions[kFunc_NotifyProfile] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMImpl_initXPCOM@16", - (NSFuncPtr*) &aFunctions[kFunc_InitXPCOM] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMImpl_shutdownXPCOM@12", - (NSFuncPtr*) &aFunctions[kFunc_ShutdownXPCOM] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMImpl_getComponentManager@8", - (NSFuncPtr*) &aFunctions[kFunc_GetComponentManager] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMImpl_getComponentRegistrar@8", - (NSFuncPtr*) &aFunctions[kFunc_GetComponentRegistrar] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMImpl_getServiceManager@8", - (NSFuncPtr*) &aFunctions[kFunc_GetServiceManager] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMImpl_newLocalFile@16", - (NSFuncPtr*) &aFunctions[kFunc_NewLocalFile] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMJavaProxy_callXPCOMMethod@20", - (NSFuncPtr*) &aFunctions[kFunc_CallXPCOMMethod] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMJavaProxy_finalizeProxy@12", - (NSFuncPtr*) &aFunctions[kFunc_FinalizeProxy] }, - { "_Java_org_mozilla_xpcom_internal_XPCOMJavaProxy_isSameXPCOMObject@16", - (NSFuncPtr*) &aFunctions[kFunc_IsSameXPCOMObject] }, - { "_Java_org_mozilla_xpcom_ProfileLock_release@16", - (NSFuncPtr*) &aFunctions[kFunc_ReleaseProfileLock] }, - { "_Java_org_mozilla_xpcom_internal_MozillaImpl_getNativeHandleFromAWT@12", - (NSFuncPtr*) &aFunctions[kFunc_GetNativeHandleFromAWT] }, - { "_Java_org_mozilla_xpcom_internal_JavaXPCOMMethods_wrapJavaObject@16", - (NSFuncPtr*) &aFunctions[kFunc_WrapJavaObject] }, - { "_Java_org_mozilla_xpcom_internal_JavaXPCOMMethods_wrapXPCOMObject@20", - (NSFuncPtr*) &aFunctions[kFunc_WrapXPCOMObject] }, - { nsnull, nsnull } - }; -#else - nsDynamicFunctionLoad funcs[] = { - { "Java_org_mozilla_xpcom_internal_MozillaImpl_initialize", - (NSFuncPtr*) &aFunctions[kFunc_Initialize] }, - { "Java_org_mozilla_xpcom_internal_GREImpl_initEmbedding", - (NSFuncPtr*) &aFunctions[kFunc_InitEmbedding] }, - { "Java_org_mozilla_xpcom_internal_GREImpl_termEmbedding", - (NSFuncPtr*) &aFunctions[kFunc_TermEmbedding] }, - { "Java_org_mozilla_xpcom_internal_GREImpl_lockProfileDirectory", - (NSFuncPtr*) &aFunctions[kFunc_LockProfileDirectory] }, - { "Java_org_mozilla_xpcom_internal_GREImpl_notifyProfile", - (NSFuncPtr*) &aFunctions[kFunc_NotifyProfile] }, - { "Java_org_mozilla_xpcom_internal_XPCOMImpl_initXPCOM", - (NSFuncPtr*) &aFunctions[kFunc_InitXPCOM] }, - { "Java_org_mozilla_xpcom_internal_XPCOMImpl_shutdownXPCOM", - (NSFuncPtr*) &aFunctions[kFunc_ShutdownXPCOM] }, - { "Java_org_mozilla_xpcom_internal_XPCOMImpl_getComponentManager", - (NSFuncPtr*) &aFunctions[kFunc_GetComponentManager] }, - { "Java_org_mozilla_xpcom_internal_XPCOMImpl_getComponentRegistrar", - (NSFuncPtr*) &aFunctions[kFunc_GetComponentRegistrar] }, - { "Java_org_mozilla_xpcom_internal_XPCOMImpl_getServiceManager", - (NSFuncPtr*) &aFunctions[kFunc_GetServiceManager] }, - { "Java_org_mozilla_xpcom_internal_XPCOMImpl_newLocalFile", - (NSFuncPtr*) &aFunctions[kFunc_NewLocalFile] }, - { "Java_org_mozilla_xpcom_internal_XPCOMJavaProxy_callXPCOMMethod", - (NSFuncPtr*) &aFunctions[kFunc_CallXPCOMMethod] }, - { "Java_org_mozilla_xpcom_internal_XPCOMJavaProxy_finalizeProxy", - (NSFuncPtr*) &aFunctions[kFunc_FinalizeProxy] }, - { "Java_org_mozilla_xpcom_internal_XPCOMJavaProxy_isSameXPCOMObject", - (NSFuncPtr*) &aFunctions[kFunc_IsSameXPCOMObject] }, - { "Java_org_mozilla_xpcom_ProfileLock_release", - (NSFuncPtr*) &aFunctions[kFunc_ReleaseProfileLock] }, - { "Java_org_mozilla_xpcom_internal_MozillaImpl_getNativeHandleFromAWT", - (NSFuncPtr*) &aFunctions[kFunc_GetNativeHandleFromAWT] }, - { "Java_org_mozilla_xpcom_internal_JavaXPCOMMethods_wrapJavaObject", - (NSFuncPtr*) &aFunctions[kFunc_WrapJavaObject] }, - { "Java_org_mozilla_xpcom_internal_JavaXPCOMMethods_wrapXPCOMObject", - (NSFuncPtr*) &aFunctions[kFunc_WrapXPCOMObject] }, - { nsnull, nsnull } - }; -#endif - - rv = XPCOMGlueLoadXULFunctions(funcs); - if (NS_FAILED(rv)) - return rv; - - return NS_OK; -} - -void -ThrowException(JNIEnv* env, const nsresult aErrorCode, const char* aMessage) -{ - // Only throw this exception if one hasn't already been thrown, so we don't - // mask a previous exception/error. - if (env->ExceptionCheck()) - return; - - // If the error code we get is for an Out Of Memory error, try to throw an - // OutOfMemoryError. The JVM may have enough memory to create this error. - if (aErrorCode == NS_ERROR_OUT_OF_MEMORY) { - jclass clazz = env->FindClass("java/lang/OutOfMemoryError"); - if (clazz) { - env->ThrowNew(clazz, aMessage); - } - env->DeleteLocalRef(clazz); - return; - } - - // If the error was not handled above, then create an XPCOMException with the - // given error code. - jthrowable throwObj = nsnull; - jclass exceptionClass = env->FindClass("org/mozilla/xpcom/XPCOMException"); - if (exceptionClass) { - jmethodID mid = env->GetMethodID(exceptionClass, "", - "(JLjava/lang/String;)V"); - if (mid) { - throwObj = (jthrowable) env->NewObject(exceptionClass, mid, - (PRInt64) aErrorCode, - env->NewStringUTF(aMessage)); - } - } - NS_ASSERTION(throwObj, "Failed to create XPCOMException object"); - - // throw exception - if (throwObj) { - env->Throw(throwObj); - } -} -#endif // VBOX - -// Register the JavaXPCOM native methods. This associates a native Java -// method with its C implementation. -nsresult -RegisterNativeMethods(JNIEnv* env, void** aFunctions) -{ - JNINativeMethod mozilla_methods[] = { - { "initializeNative", "()V", - (void*) aFunctions[kFunc_Initialize] }, - { "getNativeHandleFromAWT", "(Ljava/lang/Object;)J", - (void*) aFunctions[kFunc_GetNativeHandleFromAWT] } - }; - - JNINativeMethod gre_methods[] = { - { "initEmbeddingNative", - "(Ljava/io/File;Ljava/io/File;Lorg/mozilla/xpcom/IAppFileLocProvider;)V", - (void*) aFunctions[kFunc_InitEmbedding] }, - { "termEmbedding", "()V", - (void*) aFunctions[kFunc_TermEmbedding] }, - { "lockProfileDirectory", "(Ljava/io/File;)Lorg/mozilla/xpcom/ProfileLock;", - (void*) aFunctions[kFunc_LockProfileDirectory] }, - { "notifyProfile", "()V", - (void*) aFunctions[kFunc_NotifyProfile] }, - }; - - JNINativeMethod xpcom_methods[] = { - { "initXPCOMNative", - "(Ljava/io/File;Lorg/mozilla/xpcom/IAppFileLocProvider;)Lorg/mozilla/interfaces/nsIServiceManager;", - (void*) aFunctions[kFunc_InitXPCOM] }, - { "shutdownXPCOM", "(Lorg/mozilla/interfaces/nsIServiceManager;)V", - (void*) aFunctions[kFunc_ShutdownXPCOM] }, - { "getComponentManager", "()Lorg/mozilla/interfaces/nsIComponentManager;", - (void*) aFunctions[kFunc_GetComponentManager] }, - { "getComponentRegistrar", "()Lorg/mozilla/interfaces/nsIComponentRegistrar;", - (void*) aFunctions[kFunc_GetComponentRegistrar] }, - { "getServiceManager", "()Lorg/mozilla/interfaces/nsIServiceManager;", - (void*) aFunctions[kFunc_GetServiceManager] }, - { "newLocalFile", "(Ljava/lang/String;Z)Lorg/mozilla/interfaces/nsILocalFile;", - (void*) aFunctions[kFunc_NewLocalFile] } - }; - - JNINativeMethod proxy_methods[] = { - { "callXPCOMMethod", - "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;", - (void*) aFunctions[kFunc_CallXPCOMMethod] }, - { "finalizeProxyNative", "(Ljava/lang/Object;)V", - (void*) aFunctions[kFunc_FinalizeProxy] }, - { "isSameXPCOMObject", "(Ljava/lang/Object;Ljava/lang/Object;)Z", - (void*) aFunctions[kFunc_IsSameXPCOMObject] } - }; - - JNINativeMethod lockProxy_methods[] = { - { "releaseNative", "(J)V", - (void*) aFunctions[kFunc_ReleaseProfileLock] } - }; - - JNINativeMethod util_methods[] = { - { "wrapJavaObject", "(Ljava/lang/Object;Ljava/lang/String;)J", - (void*) aFunctions[kFunc_WrapJavaObject] }, - { "wrapXPCOMObject", "(JLjava/lang/String;)Ljava/lang/Object;", - (void*) aFunctions[kFunc_WrapXPCOMObject] } - }; - - jint rc = -1; - jclass clazz = env->FindClass("org/mozilla/xpcom/internal/MozillaImpl"); - if (clazz) { - rc = env->RegisterNatives(clazz, mozilla_methods, - sizeof(mozilla_methods) / sizeof(mozilla_methods[0])); - } - NS_ENSURE_TRUE(rc == 0, NS_ERROR_FAILURE); - - rc = -1; - clazz = env->FindClass("org/mozilla/xpcom/internal/GREImpl"); - if (clazz) { - rc = env->RegisterNatives(clazz, gre_methods, - sizeof(gre_methods) / sizeof(gre_methods[0])); - } - NS_ENSURE_TRUE(rc == 0, NS_ERROR_FAILURE); - - rc = -1; - clazz = env->FindClass("org/mozilla/xpcom/internal/XPCOMImpl"); - if (clazz) { - rc = env->RegisterNatives(clazz, xpcom_methods, - sizeof(xpcom_methods) / sizeof(xpcom_methods[0])); - } - NS_ENSURE_TRUE(rc == 0, NS_ERROR_FAILURE); - - rc = -1; - clazz = env->FindClass("org/mozilla/xpcom/internal/XPCOMJavaProxy"); - if (clazz) { - rc = env->RegisterNatives(clazz, proxy_methods, - sizeof(proxy_methods) / sizeof(proxy_methods[0])); - } - NS_ENSURE_TRUE(rc == 0, NS_ERROR_FAILURE); - - rc = -1; - clazz = env->FindClass("org/mozilla/xpcom/ProfileLock"); - if (clazz) { - rc = env->RegisterNatives(clazz, lockProxy_methods, - sizeof(lockProxy_methods) / sizeof(lockProxy_methods[0])); - } - NS_ENSURE_TRUE(rc == 0, NS_ERROR_FAILURE); - - rc = -1; - clazz = env->FindClass("org/mozilla/xpcom/internal/JavaXPCOMMethods"); - if (clazz) { - rc = env->RegisterNatives(clazz, util_methods, - sizeof(util_methods) / sizeof(util_methods[0])); - } - NS_ENSURE_TRUE(rc == 0, NS_ERROR_FAILURE); - - return NS_OK; -} - -// Load the JavaXPCOM methods from the XUL shared library, and registers them -// as Java native methods. -extern "C" JX_EXPORT void JNICALL -JXM_NATIVE(registerJavaXPCOMMethodsNative) (JNIEnv *env, jclass that, - jobject aXPCOMPath) -{ - void* functions[JX_NUM_FUNCS]; - memset(functions, 0, JX_NUM_FUNCS * sizeof(void*)); - -#ifdef VBOX - nsresult rv = FindVBoxMethods(env, aXPCOMPath, functions); - if (NS_SUCCEEDED(rv)) { - rv = RegisterNativeMethods(env, functions); - } -#else - nsresult rv = LoadXULMethods(env, aXPCOMPath, functions); - if (NS_SUCCEEDED(rv)) { - rv = RegisterNativeMethods(env, functions); - } -#endif - - if (NS_FAILED(rv)) { - ThrowException(env, rv, "Failed to register JavaXPCOM methods"); - } -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.cpp deleted file mode 100755 index c8136ec..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.cpp +++ /dev/null @@ -1,1711 +0,0 @@ -/* ***** 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 "nsJavaXPTCStub.h" -#include "nsJavaWrapper.h" -#include "nsJavaXPCOMBindingUtils.h" -#include "prmem.h" -#include "nsIInterfaceInfoManager.h" -#include "nsString.h" -#include "nsString.h" -#include "nsCRT.h" -#include "nsServiceManagerUtils.h" - - -nsJavaXPTCStub::nsJavaXPTCStub(jobject aJavaObject, nsIInterfaceInfo *aIInfo, - nsresult *rv) - : mJavaStrongRef(nsnull) - , mIInfo(aIInfo) - , mMaster(nsnull) - , mWeakRefCnt(0) -{ - const nsIID *iid = nsnull; - aIInfo->GetIIDShared(&iid); - NS_ASSERTION(iid, "GetIIDShared must not fail!"); - - *rv = InitStub(*iid); - if (NS_FAILED(*rv)) - return; - - JNIEnv* env = GetJNIEnv(); - jobject weakref = env->NewObject(weakReferenceClass, - weakReferenceConstructorMID, aJavaObject); - mJavaWeakRef = env->NewGlobalRef(weakref); - mJavaRefHashCode = env->CallStaticIntMethod(systemClass, hashCodeMID, - aJavaObject); - -#ifdef DEBUG_JAVAXPCOM - char* iid_str = iid->ToString(); - LOG(("+ nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) mJavaRefHashCode, (PRUint32) this, iid_str)); - PR_Free(iid_str); -#endif -} - -nsJavaXPTCStub::~nsJavaXPTCStub() -{ -} - -NS_IMETHODIMP_(nsrefcnt) -nsJavaXPTCStub::AddRefInternal() -{ - // If this is the first AddRef call, we create a strong global ref to the - // Java object to keep it from being garbage collected. - if (mRefCnt == 0) { - JNIEnv* env = GetJNIEnv(); - jobject referent = env->CallObjectMethod(mJavaWeakRef, getReferentMID); - if (!env->IsSameObject(referent, NULL)) { - mJavaStrongRef = env->NewGlobalRef(referent); - } - NS_ASSERTION(mJavaStrongRef != nsnull, "Failed to acquire strong ref"); - } - - // if this is the master interface - NS_PRECONDITION(PRInt32(mRefCnt) >= 0, "illegal refcnt"); - NS_ASSERT_OWNINGTHREAD(nsJavaXPTCStub); - ++mRefCnt; - NS_LOG_ADDREF(this, mRefCnt, "nsJavaXPTCStub", sizeof(*this)); - return mRefCnt; -} - -NS_IMETHODIMP_(nsrefcnt) -nsJavaXPTCStub::AddRef() -{ -#ifdef DEBUG_JAVAXPCOM_REFCNT - nsIID* iid; - mIInfo->GetInterfaceIID(&iid); - char* iid_str = iid->ToString(); - int refcnt = PRInt32(mMaster ? mMaster->mRefCnt : mRefCnt) + 1; - LOG(("= nsJavaXPTCStub::AddRef (XPCOM=%08x | refcnt = %d | IID=%s)\n", - (int) this, refcnt, iid_str)); - PR_Free(iid_str); - nsMemory::Free(iid); -#endif - - nsJavaXPTCStub* master = mMaster ? mMaster : this; - return master->AddRefInternal(); -} - -NS_IMETHODIMP_(nsrefcnt) -nsJavaXPTCStub::ReleaseInternal() -{ - NS_PRECONDITION(0 != mRefCnt, "dup release"); - NS_ASSERT_OWNINGTHREAD(nsJavaXPTCStub); - --mRefCnt; - NS_LOG_RELEASE(this, mRefCnt, "nsJavaXPTCStub"); - if (mRefCnt == 0) { - // delete strong ref; allows Java object to be garbage collected - DeleteStrongRef(); - - // If we have a weak ref, we don't delete this object. - if (mWeakRefCnt == 0) { - mRefCnt = 1; /* stabilize */ - Destroy(); - delete this; - } - return 0; - } - return mRefCnt; -} - -NS_IMETHODIMP_(nsrefcnt) -nsJavaXPTCStub::Release() -{ -#ifdef DEBUG_JAVAXPCOM_REFCNT - nsIID* iid; - mIInfo->GetInterfaceIID(&iid); - char* iid_str = iid->ToString(); - int refcnt = PRInt32(mMaster ? mMaster->mRefCnt : mRefCnt) - 1; - LOG(("= nsJavaXPTCStub::Release (XPCOM=%08x | refcnt = %d | IID=%s)\n", - (int) this, refcnt, iid_str)); - PR_Free(iid_str); - nsMemory::Free(iid); -#endif - - nsJavaXPTCStub* master = mMaster ? mMaster : this; - return master->ReleaseInternal(); -} - -void -nsJavaXPTCStub::Destroy() -{ - JNIEnv* env = GetJNIEnv(); - -#ifdef DEBUG_JAVAXPCOM - nsIID* iid; - mIInfo->GetInterfaceIID(&iid); - char* iid_str = iid->ToString(); - LOG(("- nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) mJavaRefHashCode, (PRUint32) this, iid_str)); - PR_Free(iid_str); - nsMemory::Free(iid); -#endif - - if (!mMaster) { - // delete each child stub - for (PRInt32 i = 0; i < mChildren.Count(); i++) { - delete (nsJavaXPTCStub*) mChildren[i]; - } - - // Since we are destroying this stub, also remove the mapping. - // It is possible for mJavaStrongRef to be NULL here. That is why we - // store the hash code value earlier. - if (gJavaXPCOMInitialized) { - gJavaToXPTCStubMap->Remove(mJavaRefHashCode); - } - } - - env->CallVoidMethod(mJavaWeakRef, clearReferentMID); - env->DeleteGlobalRef(mJavaWeakRef); -} - -void -nsJavaXPTCStub::ReleaseWeakRef() -{ - // if this is a child - if (mMaster) - mMaster->ReleaseWeakRef(); - - --mWeakRefCnt; - - // If there are no more associated weak refs, and no one else holds a strong - // ref to this object, then delete it. - if (mWeakRefCnt == 0 && mRefCnt == 0) { - NS_ASSERT_OWNINGTHREAD(nsJavaXPTCStub); - mRefCnt = 1; /* stabilize */ - Destroy(); - delete this; - } -} - -void -nsJavaXPTCStub::DeleteStrongRef() -{ - if (mJavaStrongRef == nsnull) - return; - - GetJNIEnv()->DeleteGlobalRef(mJavaStrongRef); - mJavaStrongRef = nsnull; -} - -NS_IMETHODIMP -nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr) -{ - nsresult rv; - - LOG(("JavaStub::QueryInterface()\n")); - *aInstancePtr = nsnull; - nsJavaXPTCStub *master = mMaster ? mMaster : this; - - // This helps us differentiate between the help classes. - if (aIID.Equals(NS_GET_IID(nsJavaXPTCStub))) - { - *aInstancePtr = master; - NS_ADDREF(this); - return NS_OK; - } - - // always return the master stub for nsISupports - if (aIID.Equals(NS_GET_IID(nsISupports))) - { - *aInstancePtr = master->mXPTCStub; - NS_ADDREF(master); - return NS_OK; - } - - // All Java objects support weak references - if (aIID.Equals(NS_GET_IID(nsISupportsWeakReference))) - { - *aInstancePtr = static_cast(master); - NS_ADDREF(master); - return NS_OK; - } - - // does any existing stub support the requested IID? - nsJavaXPTCStub *stub = master->FindStubSupportingIID(aIID); - if (stub) - { - *aInstancePtr = stub->mXPTCStub; - NS_ADDREF(stub); - return NS_OK; - } - - JNIEnv* env = GetJNIEnv(); - - // Query Java object - LOG(("\tCalling Java object queryInterface\n")); - jobject javaObject = env->CallObjectMethod(mJavaWeakRef, getReferentMID); - - jmethodID qiMID = 0; - jclass clazz = env->GetObjectClass(javaObject); - if (clazz) { - char* sig = "(Ljava/lang/String;)Lorg/mozilla/interfaces/nsISupports;"; - qiMID = env->GetMethodID(clazz, "queryInterface", sig); - NS_ASSERTION(qiMID, "Failed to get queryInterface method ID"); - } - - if (qiMID == 0) { - env->ExceptionClear(); - return NS_NOINTERFACE; - } - - // construct IID string - jstring iid_jstr = nsnull; - char* iid_str = aIID.ToString(); - if (iid_str) { - iid_jstr = env->NewStringUTF(iid_str); - } - if (!iid_str || !iid_jstr) { - env->ExceptionClear(); - return NS_ERROR_OUT_OF_MEMORY; - } - PR_Free(iid_str); - - // call queryInterface method - jobject obj = env->CallObjectMethod(javaObject, qiMID, iid_jstr); - if (env->ExceptionCheck()) { - env->ExceptionClear(); - return NS_ERROR_FAILURE; - } - if (!obj) - return NS_NOINTERFACE; - - // Get interface info for new java object - nsCOMPtr - iim(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID, &rv)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr iinfo; - rv = iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo)); - if (NS_FAILED(rv)) - return rv; - - stub = new nsJavaXPTCStub(obj, iinfo, &rv); - if (!stub) - return NS_ERROR_OUT_OF_MEMORY; - - if (NS_FAILED(rv)) { - delete stub; - return rv; - } - - // add stub to the master's list of children, so we can preserve - // symmetry in future QI calls. the master will delete each child - // when it is destroyed. the refcount of each child is bound to - // the refcount of the master. this is done to deal with code - // like this: - // - // nsCOMPtr bar = ...; - // nsIFoo *foo; - // { - // nsCOMPtr temp = do_QueryInterface(bar); - // foo = temp; - // } - // foo->DoStuff(); - // - // while this code is not valid XPCOM (since it is using |foo| - // after having called Release on it), such code is unfortunately - // very common in the mozilla codebase. the assumption this code - // is making is that so long as |bar| is alive, it should be valid - // to access |foo| even if the code doesn't own a strong reference - // to |foo|! clearly wrong, but we need to support it anyways. - - stub->mMaster = master; - master->mChildren.AppendElement(stub); - - *aInstancePtr = stub->mXPTCStub; - NS_ADDREF(stub); - return NS_OK; -} - -PRBool -nsJavaXPTCStub::SupportsIID(const nsID &iid) -{ - PRBool match; - nsCOMPtr iter = mIInfo; - do - { - if (NS_SUCCEEDED(iter->IsIID(&iid, &match)) && match) - return PR_TRUE; - - nsCOMPtr parent; - iter->GetParent(getter_AddRefs(parent)); - iter = parent; - } - while (iter != nsnull); - - return PR_FALSE; -} - -nsJavaXPTCStub * -nsJavaXPTCStub::FindStubSupportingIID(const nsID &iid) -{ - NS_ASSERTION(mMaster == nsnull, "this is not a master stub"); - - if (SupportsIID(iid)) - return this; - - for (PRInt32 i = 0; i < mChildren.Count(); i++) - { - nsJavaXPTCStub *child = (nsJavaXPTCStub *) mChildren[i]; - if (child->SupportsIID(iid)) - return child; - } - return nsnull; -} - -NS_IMETHODIMP -nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex, - const XPTMethodDescriptor *aMethodInfo, - nsXPTCMiniVariant *aParams) -{ -#ifdef DEBUG_JAVAXPCOM - const char* ifaceName; - mIInfo->GetNameShared(&ifaceName); - LOG(("---> (Java) %s::%s()\n", ifaceName, aMethodInfo->name)); -#endif - - nsresult rv = NS_OK; - JNIEnv* env = GetJNIEnv(); - jobject javaObject = env->CallObjectMethod(mJavaWeakRef, getReferentMID); - - nsCAutoString methodSig("("); - - // Create jvalue array to hold Java params - PRUint8 paramCount = aMethodInfo->num_args; - jvalue* java_params = nsnull; - const nsXPTParamInfo* retvalInfo = nsnull; - if (paramCount) { - java_params = new jvalue[paramCount]; - if (!java_params) - return NS_ERROR_OUT_OF_MEMORY; - - for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++) - { - const nsXPTParamInfo ¶mInfo = aMethodInfo->params[i]; - if (!paramInfo.IsRetval()) { - rv = SetupJavaParams(paramInfo, aMethodInfo, aMethodIndex, aParams, - aParams[i], java_params[i], methodSig); - } else { - retvalInfo = ¶mInfo; - } - } - NS_ASSERTION(NS_SUCCEEDED(rv), "SetupJavaParams failed"); - } - - // Finish method signature - if (NS_SUCCEEDED(rv)) { - methodSig.Append(')'); - if (retvalInfo) { - nsCAutoString retvalSig; - rv = GetRetvalSig(retvalInfo, aMethodInfo, aMethodIndex, aParams, - retvalSig); - methodSig.Append(retvalSig); - } else { - methodSig.Append('V'); - } - NS_ASSERTION(NS_SUCCEEDED(rv), "GetRetvalSig failed"); - } - - // Get Java method to call - jmethodID mid = nsnull; - if (NS_SUCCEEDED(rv)) { - nsCAutoString methodName; - if (XPT_MD_IS_GETTER(aMethodInfo->flags) || - XPT_MD_IS_SETTER(aMethodInfo->flags)) { - if (XPT_MD_IS_GETTER(aMethodInfo->flags)) - methodName.AppendLiteral("get"); - else - methodName.AppendLiteral("set"); - methodName.AppendASCII(aMethodInfo->name); - methodName.SetCharAt(toupper(methodName[3]), 3); - } else { - methodName.AppendASCII(aMethodInfo->name); - methodName.SetCharAt(tolower(methodName[0]), 0); - } - // If it's a Java keyword, then prepend an underscore - if (gJavaKeywords->GetEntry(methodName.get())) { - methodName.Insert('_', 0); - } - - jclass clazz = env->GetObjectClass(javaObject); - if (clazz) - mid = env->GetMethodID(clazz, methodName.get(), methodSig.get()); - NS_ASSERTION(mid, "Failed to get requested method for Java object"); - if (!mid) - rv = NS_ERROR_FAILURE; - } - - // Call method - jvalue retval; - if (NS_SUCCEEDED(rv)) { - if (!retvalInfo) { - env->CallVoidMethodA(javaObject, mid, java_params); - } else { - switch (retvalInfo->GetType().TagPart()) - { - case nsXPTType::T_I8: - retval.b = env->CallByteMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_I16: - case nsXPTType::T_U8: - retval.s = env->CallShortMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_I32: - case nsXPTType::T_U16: - retval.i = env->CallIntMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_I64: - case nsXPTType::T_U32: - retval.j = env->CallLongMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_FLOAT: - retval.f = env->CallFloatMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_U64: - case nsXPTType::T_DOUBLE: - retval.d = env->CallDoubleMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_BOOL: - retval.z = env->CallBooleanMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_CHAR: - case nsXPTType::T_WCHAR: - retval.c = env->CallCharMethodA(javaObject, mid, java_params); - 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_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - retval.l = env->CallObjectMethodA(javaObject, mid, java_params); - break; - - case nsXPTType::T_VOID: - retval.j = env->CallLongMethodA(javaObject, mid, java_params); - break; - - default: - NS_WARNING("Unhandled retval type"); - break; - } - } - - // Check for exception from called Java function - jthrowable exp = env->ExceptionOccurred(); - if (exp) { - // If the exception is an instance of XPCOMException, then get the - // nsresult from the exception instance. Else, default to - // NS_ERROR_FAILURE. - if (env->IsInstanceOf(exp, xpcomExceptionClass)) { - jfieldID fid; - fid = env->GetFieldID(xpcomExceptionClass, "errorcode", "J"); - if (fid) { - rv = env->GetLongField(exp, fid); - } else { - rv = NS_ERROR_FAILURE; - } - NS_ASSERTION(fid, "Couldn't get 'errorcode' field of XPCOMException"); - } else { - rv = NS_ERROR_FAILURE; - } - } - } - - // Handle any 'inout', 'out' and 'retval' params - if (NS_SUCCEEDED(rv)) { - for (PRUint8 i = 0; i < paramCount; i++) - { - const nsXPTParamInfo ¶mInfo = aMethodInfo->params[i]; - if (paramInfo.IsIn() && !paramInfo.IsOut() && !paramInfo.IsDipper()) // 'in' - continue; - - // If param is null, then caller is not expecting an output value. - if (aParams[i].val.p == nsnull) - continue; - - if (!paramInfo.IsRetval()) { - rv = FinalizeJavaParams(paramInfo, aMethodInfo, aMethodIndex, aParams, - aParams[i], java_params[i]); - } else { - rv = FinalizeJavaParams(paramInfo, aMethodInfo, aMethodIndex, aParams, - aParams[i], retval); - } - } - NS_ASSERTION(NS_SUCCEEDED(rv), "FinalizeJavaParams/SetXPCOMRetval failed"); - } - - if (java_params) - delete [] java_params; - -#ifdef DEBUG - if (env->ExceptionCheck()) - env->ExceptionDescribe(); -#endif - env->ExceptionClear(); - - LOG(("<--- (Java) %s::%s()\n", ifaceName, aMethodInfo->name)); - return rv; -} - -/** - * Handle 'in', 'inout', and 'out' params - */ -nsresult -nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, - const XPTMethodDescriptor* aMethodInfo, - PRUint16 aMethodIndex, - nsXPTCMiniVariant* aDispatchParams, - nsXPTCMiniVariant &aVariant, jvalue &aJValue, - nsACString &aMethodSig) -{ - nsresult rv = NS_OK; - JNIEnv* env = GetJNIEnv(); - const nsXPTType &type = aParamInfo.GetType(); - - PRUint8 tag = type.TagPart(); - switch (tag) - { - case nsXPTType::T_I8: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.b = aVariant.val.i8; - aMethodSig.Append('B'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jbyteArray array = env->NewByteArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetByteArrayRegion(array, 0, 1, (jbyte*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[B"); - } - } - break; - - case nsXPTType::T_I16: - case nsXPTType::T_U8: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.s = (tag == nsXPTType::T_I16) ? aVariant.val.i16 : - aVariant.val.u8; - aMethodSig.Append('S'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jshortArray array = env->NewShortArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetShortArrayRegion(array, 0, 1, (jshort*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[S"); - } - } - break; - - case nsXPTType::T_I32: - case nsXPTType::T_U16: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.i = (tag == nsXPTType::T_I32) ? aVariant.val.i32 : - aVariant.val.u16; - aMethodSig.Append('I'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jintArray array = env->NewIntArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetIntArrayRegion(array, 0, 1, (jint*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[I"); - } - } - break; - - case nsXPTType::T_I64: - case nsXPTType::T_U32: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.j = (tag == nsXPTType::T_I64) ? aVariant.val.i64 : - aVariant.val.u32; - aMethodSig.Append('J'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jlongArray array = env->NewLongArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetLongArrayRegion(array, 0, 1, (jlong*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[J"); - } - } - break; - - case nsXPTType::T_FLOAT: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.f = aVariant.val.f; - aMethodSig.Append('F'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jfloatArray array = env->NewFloatArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetFloatArrayRegion(array, 0, 1, (jfloat*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[F"); - } - } - break; - - // XXX how do we handle unsigned 64-bit values? - case nsXPTType::T_U64: - case nsXPTType::T_DOUBLE: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.d = (tag == nsXPTType::T_DOUBLE) ? aVariant.val.d : - aVariant.val.u64; - aMethodSig.Append('D'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jdoubleArray array = env->NewDoubleArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetDoubleArrayRegion(array, 0, 1, (jdouble*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[D"); - } - } - break; - - case nsXPTType::T_BOOL: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.z = aVariant.val.b; - aMethodSig.Append('Z'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jbooleanArray array = env->NewBooleanArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetBooleanArrayRegion(array, 0, 1, (jboolean*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[Z"); - } - } - break; - - case nsXPTType::T_CHAR: - case nsXPTType::T_WCHAR: - { - if (!aParamInfo.IsOut()) { // 'in' - if (tag == nsXPTType::T_CHAR) - aJValue.c = aVariant.val.c; - else - aJValue.c = aVariant.val.wc; - aMethodSig.Append('C'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jcharArray array = env->NewCharArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetCharArrayRegion(array, 0, 1, (jchar*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[C"); - } - } - break; - - case nsXPTType::T_CHAR_STR: - case nsXPTType::T_WCHAR_STR: - { - void* ptr = nsnull; - if (!aParamInfo.IsOut()) { // 'in' - ptr = aVariant.val.p; - } else if (aVariant.val.p) { // 'inout' & 'out' - void** variant = static_cast(aVariant.val.p); - ptr = *variant; - } - - jobject str; - if (ptr) { - if (tag == nsXPTType::T_CHAR_STR) { - str = env->NewStringUTF((const char*) ptr); - } else { - const PRUnichar* buf = (const PRUnichar*) ptr; - str = env->NewString(buf, nsCRT::strlen(buf)); - } - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } else { - str = nsnull; - } - - if (!aParamInfo.IsOut()) { // 'in' - aJValue.l = str; - aMethodSig.AppendLiteral("Ljava/lang/String;"); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - aJValue.l = env->NewObjectArray(1, stringClass, str); - if (aJValue.l == nsnull) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[Ljava/lang/String;"); - } - } - break; - - case nsXPTType::T_IID: - { - nsID* iid = nsnull; - if (!aParamInfo.IsOut()) { // 'in' - iid = static_cast(aVariant.val.p); - } else if (aVariant.val.p) { // 'inout' & 'out' - nsID** variant = static_cast(aVariant.val.p); - iid = *variant; - } - - jobject str = nsnull; - if (iid) { - char iid_str[NSID_LENGTH]; - iid->ToProvidedString(iid_str); - str = env->NewStringUTF(iid_str); - if (!str) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - if (!aParamInfo.IsOut()) { // 'in' - aJValue.l = str; - aMethodSig.AppendLiteral("Ljava/lang/String;"); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - aJValue.l = env->NewObjectArray(1, stringClass, str); - if (aJValue.l == nsnull) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[Ljava/lang/String;"); - } - } - break; - - case nsXPTType::T_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - { - nsISupports* xpcom_obj = nsnull; - if (!aParamInfo.IsOut()) { // 'in' - xpcom_obj = static_cast(aVariant.val.p); - } else if (aVariant.val.p) { // 'inout' & 'out' - nsISupports** variant = static_cast(aVariant.val.p); - 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 - iim(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - break; - - rv = iim->GetNameForIID(&iid, &iface_name); - if (NS_FAILED(rv) || !iface_name) - break; - - jobject java_stub = nsnull; - if (xpcom_obj) { - // Get matching Java object for given xpcom object - jobject objLoader = env->CallObjectMethod(mJavaWeakRef, getReferentMID); - rv = NativeInterfaceToJavaObject(env, xpcom_obj, iid, objLoader, - &java_stub); - if (NS_FAILED(rv)) - break; - } - - if (!aParamInfo.IsOut()) { // 'in' - aJValue.l = java_stub; - } else { // 'inout' & 'out' - if (aVariant.val.p) { - aJValue.l = env->NewObjectArray(1, nsISupportsClass, java_stub); - if (aJValue.l == nsnull) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } else { - aJValue.l = nsnull; - } - aMethodSig.Append('['); - } - - if (tag != nsXPTType::T_INTERFACE_IS) { - aMethodSig.AppendLiteral("Lorg/mozilla/interfaces/"); - aMethodSig.AppendASCII(iface_name); - aMethodSig.Append(';'); - } else { - aMethodSig.AppendLiteral("Lorg/mozilla/interfaces/nsISupports;"); - } - - nsMemory::Free(iface_name); - } - break; - - case nsXPTType::T_ASTRING: - case nsXPTType::T_DOMSTRING: - { - // This only handle 'in' or 'in dipper' params. In XPIDL, the 'out' - // descriptor is mapped to 'in dipper'. - NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor"); - if (!aParamInfo.IsIn()) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - nsString* str = static_cast(aVariant.val.p); - if (!str) { - rv = NS_ERROR_FAILURE; - break; - } - - jstring jstr = nsnull; - if (!str->IsVoid()) { - jstr = env->NewString(str->get(), str->Length()); - if (!jstr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - aJValue.l = jstr; - aMethodSig.AppendLiteral("Ljava/lang/String;"); - } - break; - - case nsXPTType::T_UTF8STRING: - case nsXPTType::T_CSTRING: - { - // This only handle 'in' or 'in dipper' params. In XPIDL, the 'out' - // descriptor is mapped to 'in dipper'. - NS_PRECONDITION(aParamInfo.IsIn(), "unexpected param descriptor"); - if (!aParamInfo.IsIn()) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - nsCString* str = static_cast(aVariant.val.p); - if (!str) { - rv = NS_ERROR_FAILURE; - break; - } - - jstring jstr = nsnull; - if (!str->IsVoid()) { - jstr = env->NewStringUTF(str->get()); - if (!jstr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - } - - aJValue.l = jstr; - aMethodSig.AppendLiteral("Ljava/lang/String;"); - } - break; - - // Pass the 'void*' address as a long - case nsXPTType::T_VOID: - { - if (!aParamInfo.IsOut()) { // 'in' - aJValue.j = reinterpret_cast(aVariant.val.p); - aMethodSig.Append('J'); - } else { // 'inout' & 'out' - if (aVariant.val.p) { - jlongArray array = env->NewLongArray(1); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - env->SetLongArrayRegion(array, 0, 1, (jlong*) aVariant.val.p); - aJValue.l = array; - } else { - aJValue.l = nsnull; - } - aMethodSig.AppendLiteral("[J"); - } - } - break; - - case nsXPTType::T_ARRAY: - NS_WARNING("array types are not yet supported"); - return NS_ERROR_NOT_IMPLEMENTED; - break; - - case nsXPTType::T_PSTRING_SIZE_IS: - case nsXPTType::T_PWSTRING_SIZE_IS: - default: - NS_WARNING("unexpected parameter type"); - return NS_ERROR_UNEXPECTED; - } - - return rv; -} - -nsresult -nsJavaXPTCStub::GetRetvalSig(const nsXPTParamInfo* aParamInfo, - const XPTMethodDescriptor* aMethodInfo, - PRUint16 aMethodIndex, - nsXPTCMiniVariant* aDispatchParams, - nsACString &aRetvalSig) -{ - PRUint8 type = aParamInfo->GetType().TagPart(); - switch (type) - { - case nsXPTType::T_I8: - aRetvalSig.Append('B'); - break; - - case nsXPTType::T_I16: - case nsXPTType::T_U8: - aRetvalSig.Append('S'); - break; - - case nsXPTType::T_I32: - case nsXPTType::T_U16: - aRetvalSig.Append('I'); - break; - - case nsXPTType::T_I64: - case nsXPTType::T_U32: - aRetvalSig.Append('J'); - break; - - case nsXPTType::T_FLOAT: - aRetvalSig.Append('F'); - break; - - case nsXPTType::T_U64: - case nsXPTType::T_DOUBLE: - aRetvalSig.Append('D'); - break; - - case nsXPTType::T_BOOL: - aRetvalSig.Append('Z'); - break; - - case nsXPTType::T_CHAR: - case nsXPTType::T_WCHAR: - aRetvalSig.Append('C'); - 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: - aRetvalSig.AppendLiteral("Ljava/lang/String;"); - 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 - iim(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID, &rv)); - if (NS_FAILED(rv)) - break; - - rv = iim->GetNameForIID(&iid, &iface_name); - if (NS_FAILED(rv) || !iface_name) - break; - - aRetvalSig.AppendLiteral("Lorg/mozilla/interfaces/"); - aRetvalSig.AppendASCII(iface_name); - aRetvalSig.Append(';'); - nsMemory::Free(iface_name); - break; - } - - case nsXPTType::T_INTERFACE_IS: - aRetvalSig.AppendLiteral("Lorg/mozilla/interfaces/nsISupports;"); - break; - - case nsXPTType::T_VOID: - aRetvalSig.Append('J'); - break; - - case nsXPTType::T_ARRAY: - NS_WARNING("array types are not yet supported"); - return NS_ERROR_NOT_IMPLEMENTED; - break; - - case nsXPTType::T_PSTRING_SIZE_IS: - case nsXPTType::T_PWSTRING_SIZE_IS: - default: - NS_WARNING("unexpected parameter type"); - return NS_ERROR_UNEXPECTED; - } - - return NS_OK; -} - -/** - * Handle 'inout', 'out', and 'retval' params - */ -nsresult -nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, - const XPTMethodDescriptor *aMethodInfo, - PRUint16 aMethodIndex, - nsXPTCMiniVariant* aDispatchParams, - nsXPTCMiniVariant &aVariant, jvalue &aJValue) -{ - nsresult rv = NS_OK; - JNIEnv* env = GetJNIEnv(); - const nsXPTType &type = aParamInfo.GetType(); - - PRUint8 tag = type.TagPart(); - switch (tag) - { - case nsXPTType::T_I8: - { - jbyte value; - if (aParamInfo.IsRetval()) { // 'retval' - value = aJValue.b; - } else if (aJValue.l) { // 'inout' & 'out' - env->GetByteArrayRegion((jbyteArray) aJValue.l, 0, 1, &value); - } - if (aVariant.val.p) - *((PRInt8 *) aVariant.val.p) = value; - } - break; - - case nsXPTType::T_U8: - case nsXPTType::T_I16: - { - jshort value = 0; - if (aParamInfo.IsRetval()) { // 'retval' - value = aJValue.s; - } else if (aJValue.l) { // 'inout' & 'out' - env->GetShortArrayRegion((jshortArray) aJValue.l, 0, 1, &value); - } - - if (aVariant.val.p) { - if (tag == nsXPTType::T_U8) - *((PRUint8 *) aVariant.val.p) = value; - else - *((PRInt16 *) aVariant.val.p) = value; - } - } - break; - - case nsXPTType::T_U16: - case nsXPTType::T_I32: - { - jint value = 0; - if (aParamInfo.IsRetval()) { // 'retval' - value = aJValue.i; - } else if (aJValue.l) { // 'inout' & 'out' - env->GetIntArrayRegion((jintArray) aJValue.l, 0, 1, &value); - } - - if (aVariant.val.p) { - if (tag == nsXPTType::T_U16) - *((PRUint16 *) aVariant.val.p) = value; - else - *((PRInt32 *) aVariant.val.p) = value; - } - } - break; - - case nsXPTType::T_U32: - case nsXPTType::T_I64: - { - jlong value = 0; - if (aParamInfo.IsRetval()) { // 'retval' - value = aJValue.j; - } else if (aJValue.l) { // 'inout' & 'out' - env->GetLongArrayRegion((jlongArray) aJValue.l, 0, 1, &value); - } - - if (aVariant.val.p) { - if (tag == nsXPTType::T_U32) - *((PRUint32 *) aVariant.val.p) = value; - else - *((PRInt64 *) aVariant.val.p) = value; - } - } - break; - - case nsXPTType::T_FLOAT: - { - if (aParamInfo.IsRetval()) { // 'retval' - *((float *) aVariant.val.p) = aJValue.f; - } else if (aJValue.l) { // 'inout' & 'out' - env->GetFloatArrayRegion((jfloatArray) aJValue.l, 0, 1, - (jfloat*) aVariant.val.p); - } - } - break; - - // XXX how do we handle 64-bit values? - case nsXPTType::T_U64: - case nsXPTType::T_DOUBLE: - { - jdouble value = 0; - if (aParamInfo.IsRetval()) { // 'retval' - value = aJValue.d; - } else if (aJValue.l) { // 'inout' & 'out' - env->GetDoubleArrayRegion((jdoubleArray) aJValue.l, 0, 1, &value); - } - - if (aVariant.val.p) { - if (tag == nsXPTType::T_DOUBLE) - *((double *) aVariant.val.p) = value; - else - *((PRUint64 *) aVariant.val.p) = static_cast(value); - } - } - break; - - case nsXPTType::T_BOOL: - { - if (aParamInfo.IsRetval()) { // 'retval' - *((PRBool *) aVariant.val.p) = aJValue.z; - } else if (aJValue.l) { // 'inout' & 'out' - env->GetBooleanArrayRegion((jbooleanArray) aJValue.l, 0, 1, - (jboolean*) aVariant.val.p); - } - } - break; - - case nsXPTType::T_CHAR: - case nsXPTType::T_WCHAR: - { - if (aParamInfo.IsRetval()) { // 'retval' - if (type.TagPart() == nsXPTType::T_CHAR) - *((char *) aVariant.val.p) = aJValue.c; - else - *((PRUnichar *) aVariant.val.p) = aJValue.c; - } else if (aJValue.l) { // 'inout' & 'out' - jchar* array = env->GetCharArrayElements((jcharArray) aJValue.l, - nsnull); - if (!array) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - if (type.TagPart() == nsXPTType::T_CHAR) - *((char *) aVariant.val.p) = array[0]; - else - *((PRUnichar *) aVariant.val.p) = array[0]; - - env->ReleaseCharArrayElements((jcharArray) aJValue.l, array, JNI_ABORT); - } - } - break; - - case nsXPTType::T_CHAR_STR: - { - jstring str = nsnull; - if (aParamInfo.IsRetval()) { // 'retval' - str = (jstring) aJValue.l; - } else { // 'inout' & 'out' - str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0); - } - - char** variant = static_cast(aVariant.val.p); - if (str) { - // Get string buffer - const char* char_ptr = env->GetStringUTFChars(str, nsnull); - if (!char_ptr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - // If new string is different from one passed in, free old string - // and replace with new string. - if (aParamInfo.IsRetval() || - *variant == nsnull || strcmp(*variant, char_ptr) != 0) - { - if (!aParamInfo.IsRetval() && *variant) - PR_Free(*variant); - - *variant = strdup(char_ptr); - if (*variant == nsnull) { - rv = NS_ERROR_OUT_OF_MEMORY; - // don't 'break'; fall through to release chars - } - } - - // Release string buffer - env->ReleaseStringUTFChars(str, char_ptr); - } else { - // If we were passed in a string, delete it now, and set to null. - // (Only for 'inout' & 'out' params) - if (*variant && !aParamInfo.IsRetval()) { - PR_Free(*variant); - } - *variant = nsnull; - } - } - break; - - case nsXPTType::T_WCHAR_STR: - { - jstring str = nsnull; - if (aParamInfo.IsRetval()) { // 'retval' - str = (jstring) aJValue.l; - } else { // 'inout' & 'out' - str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0); - } - - PRUnichar** variant = static_cast(aVariant.val.p); - if (str) { - // Get string buffer - const jchar* wchar_ptr = env->GetStringChars(str, nsnull); - if (!wchar_ptr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - // If new string is different from one passed in, free old string - // and replace with new string. We - if (aParamInfo.IsRetval() || - *variant == nsnull || nsCRT::strcmp(*variant, wchar_ptr) != 0) - { - if (!aParamInfo.IsRetval() && *variant) - PR_Free(*variant); - - PRUint32 length = nsCRT::strlen(wchar_ptr); - *variant = (PRUnichar*) PR_Malloc((length + 1) * sizeof(PRUnichar)); - if (*variant) { - memcpy(*variant, wchar_ptr, length * sizeof(PRUnichar)); - (*variant)[length] = 0; - } else { - rv = NS_ERROR_OUT_OF_MEMORY; - // don't 'break'; fall through to release chars - } - } - - // Release string buffer - env->ReleaseStringChars(str, wchar_ptr); - } else { - // If we were passed in a string, delete it now, and set to null. - // (Only for 'inout' & 'out' params) - if (*variant && !aParamInfo.IsRetval()) { - PR_Free(*variant); - } - *variant = nsnull; - } - } - break; - - case nsXPTType::T_IID: - { - jstring str = nsnull; - if (aParamInfo.IsRetval()) { // 'retval' - str = (jstring) aJValue.l; - } else { // 'inout' & 'out' - str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0); - } - - nsID** variant = static_cast(aVariant.val.p); - if (str) { - // Get string buffer - const char* char_ptr = env->GetStringUTFChars(str, nsnull); - if (!char_ptr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - if (!aParamInfo.IsRetval() && *variant) { - // If we were given an nsID, set it to the new string - nsID* oldIID = *variant; - oldIID->Parse(char_ptr); - } else { - // If the argument that was passed in was null, then we need to - // create a new nsID. - nsID* newIID = new nsID; - if (newIID) { - newIID->Parse(char_ptr); - *variant = newIID; - } else { - rv = NS_ERROR_OUT_OF_MEMORY; - // don't 'break'; fall through to release chars - } - } - - // Release string buffer - env->ReleaseStringUTFChars(str, char_ptr); - } else { - // If we were passed in an nsID, delete it now, and set to null. - // (Free only 'inout' & 'out' params) - if (*variant && !aParamInfo.IsRetval()) { - delete *variant; - } - *variant = nsnull; - } - } - break; - - case nsXPTType::T_INTERFACE: - case nsXPTType::T_INTERFACE_IS: - { - jobject java_obj = nsnull; - if (aParamInfo.IsRetval()) { // 'retval' - java_obj = aJValue.l; - } else if (aJValue.l) { // 'inout' & 'out' - java_obj = env->GetObjectArrayElement((jobjectArray) aJValue.l, 0); - } - - void* xpcom_obj = nsnull; - if (java_obj) { - // Get IID for this param - nsID iid; - rv = GetIIDForMethodParam(mIInfo, aMethodInfo, aParamInfo, - aParamInfo.GetType().TagPart(), aMethodIndex, - aDispatchParams, PR_FALSE, iid); - if (NS_FAILED(rv)) - break; - - // If the requested interface is nsIWeakReference, then we look for or - // create a stub for the nsISupports interface. Then we create a weak - // reference from that stub. - PRBool isWeakRef; - if (iid.Equals(NS_GET_IID(nsIWeakReference))) { - isWeakRef = PR_TRUE; - iid = NS_GET_IID(nsISupports); - } else { - isWeakRef = PR_FALSE; - } - - rv = JavaObjectToNativeInterface(env, java_obj, iid, &xpcom_obj); - if (NS_FAILED(rv)) - break; - rv = ((nsISupports*) xpcom_obj)->QueryInterface(iid, &xpcom_obj); - if (NS_FAILED(rv)) - break; - - // If the function expects a weak reference, then we need to - // create it here. - if (isWeakRef) { - nsISupports* isupports = (nsISupports*) xpcom_obj; - nsCOMPtr supportsweak = - do_QueryInterface(isupports); - if (supportsweak) { - nsWeakPtr weakref; - supportsweak->GetWeakReference(getter_AddRefs(weakref)); - NS_RELEASE(isupports); - xpcom_obj = weakref; - NS_ADDREF((nsISupports*) xpcom_obj); - } else { - xpcom_obj = nsnull; - } - } - } - - // For 'inout' params, if the resulting xpcom value is different than the - // one passed in, then we must release the incoming xpcom value. - nsISupports** variant = static_cast(aVariant.val.p); - if (aParamInfo.IsIn() && *variant) { - nsCOMPtr in = do_QueryInterface(*variant); - nsCOMPtr out = do_QueryInterface((nsISupports*) xpcom_obj); - if (in != out) { - NS_RELEASE(*variant); - } - } - - *(static_cast(aVariant.val.p)) = xpcom_obj; - } - break; - - case nsXPTType::T_ASTRING: - case nsXPTType::T_DOMSTRING: - { - NS_PRECONDITION(aParamInfo.IsDipper(), "string argument is not dipper"); - if (!aParamInfo.IsDipper()) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - jstring jstr = (jstring) aJValue.l; - nsString* variant = static_cast(aVariant.val.p); - - if (jstr) { - // Get string buffer - const jchar* wchar_ptr = env->GetStringChars(jstr, nsnull); - if (!wchar_ptr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - variant->Assign(wchar_ptr); - - // release String buffer - env->ReleaseStringChars(jstr, wchar_ptr); - } else { - variant->SetIsVoid(PR_TRUE); - } - } - break; - - case nsXPTType::T_UTF8STRING: - case nsXPTType::T_CSTRING: - { - NS_PRECONDITION(aParamInfo.IsDipper(), "string argument is not dipper"); - if (!aParamInfo.IsDipper()) { - rv = NS_ERROR_UNEXPECTED; - break; - } - - jstring jstr = (jstring) aJValue.l; - nsCString* variant = static_cast(aVariant.val.p); - - if (jstr) { - // Get string buffer - const char* char_ptr = env->GetStringUTFChars(jstr, nsnull); - if (!char_ptr) { - rv = NS_ERROR_OUT_OF_MEMORY; - break; - } - - variant->Assign(char_ptr); - - // release String buffer - env->ReleaseStringUTFChars(jstr, char_ptr); - } else { - variant->SetIsVoid(PR_TRUE); - } - } - break; - - case nsXPTType::T_VOID: - { - if (aParamInfo.IsRetval()) { // 'retval' - aVariant.val.p = reinterpret_cast(aJValue.j); - } else if (aJValue.l) { // 'inout' & 'out' - env->GetLongArrayRegion((jlongArray) aJValue.l, 0, 1, - (jlong*) aVariant.val.p); - } - } - break; - - default: - NS_WARNING("unexpected parameter type"); - return NS_ERROR_UNEXPECTED; - } - - return rv; -} - -NS_IMETHODIMP -nsJavaXPTCStub::GetWeakReference(nsIWeakReference** aInstancePtr) -{ - if (mMaster) - return mMaster->GetWeakReference(aInstancePtr); - - LOG(("==> nsJavaXPTCStub::GetWeakReference()\n")); - - if (!aInstancePtr) - return NS_ERROR_NULL_POINTER; - - jobject javaObject = GetJNIEnv()->CallObjectMethod(mJavaWeakRef, - getReferentMID); - nsJavaXPTCStubWeakRef* weakref; - weakref = new nsJavaXPTCStubWeakRef(javaObject, this); - if (!weakref) - return NS_ERROR_OUT_OF_MEMORY; - - *aInstancePtr = weakref; - NS_ADDREF(*aInstancePtr); - ++mWeakRefCnt; - - return NS_OK; -} - -jobject -nsJavaXPTCStub::GetJavaObject() -{ - JNIEnv* env = GetJNIEnv(); - jobject javaObject = env->CallObjectMethod(mJavaWeakRef, getReferentMID); - -#ifdef DEBUG_JAVAXPCOM - nsIID* iid; - mIInfo->GetInterfaceIID(&iid); - char* iid_str = iid->ToString(); - LOG(("< nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n", - (PRUint32) mJavaRefHashCode, (PRUint32) this, iid_str)); - PR_Free(iid_str); - nsMemory::Free(iid); -#endif - - return javaObject; -} - - -/*static*/ nsresult -nsJavaXPTCStub::GetNewOrUsed(JNIEnv* env, jobject aJavaObject, - const nsIID& aIID, void** aResult) -{ - nsJavaXPTCStub* stub; - jint hash = env->CallStaticIntMethod(systemClass, hashCodeMID, aJavaObject); - nsresult rv = gJavaToXPTCStubMap->Find(hash, aIID, &stub); - NS_ENSURE_SUCCESS(rv, rv); - if (stub) { - // stub is already AddRef'd and QI'd - *aResult = stub; - return NS_OK; - } - - // If there is no corresponding XPCOM object, then that means that the - // parameter is a non-generated class (that is, it is not one of our - // Java stubs that represent an exising XPCOM object). So we need to - // create an XPCOM stub, that can route any method calls to the class. - - // Get interface info for class - nsCOMPtr - iim(do_GetService(NS_INTERFACEINFOMANAGER_SERVICE_CONTRACTID, &rv)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr iinfo; - rv = iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo)); - NS_ENSURE_SUCCESS(rv, rv); - - // Create XPCOM stub - stub = new nsJavaXPTCStub(aJavaObject, iinfo, &rv); - if (!stub) - return NS_ERROR_OUT_OF_MEMORY; - if (NS_FAILED(rv)) { - delete stub; - return rv; - } - - rv = gJavaToXPTCStubMap->Add(hash, stub); - if (NS_FAILED(rv)) { - delete stub; - return rv; - } - - NS_ADDREF(stub); - *aResult = stub; - - return NS_OK; -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.h deleted file mode 100755 index 90d42c8..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStub.h +++ /dev/null @@ -1,153 +0,0 @@ -/* ***** 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 _nsJavaXPTCStub_h_ -#define _nsJavaXPTCStub_h_ - -#include "nsXPTCUtils.h" -#include "jni.h" -#include "nsVoidArray.h" -#include "nsIInterfaceInfo.h" -#include "nsCOMPtr.h" -#include "nsWeakReference.h" -#include "nsJavaXPTCStubWeakRef.h" - - -#define NS_JAVAXPTCSTUB_IID \ -{0x88dd8130, 0xebe6, 0x4431, {0x9d, 0xa7, 0xe6, 0xb7, 0x54, 0x74, 0xfb, 0x21}} - -class nsJavaXPTCStub : protected nsAutoXPTCStub, - public nsSupportsWeakReference -{ - friend class nsJavaXPTCStubWeakRef; - -public: - NS_DECL_ISUPPORTS - NS_DECL_NSISUPPORTSWEAKREFERENCE - NS_DECLARE_STATIC_IID_ACCESSOR(NS_JAVAXPTCSTUB_IID) - - nsJavaXPTCStub(jobject aJavaObject, nsIInterfaceInfo *aIInfo, - nsresult *rv); - - virtual ~nsJavaXPTCStub(); - - // call this method and return result - NS_IMETHOD CallMethod(PRUint16 aMethodIndex, - const XPTMethodDescriptor *aInfo, - nsXPTCMiniVariant *aParams); - - nsISomeInterface* GetStub() { return mXPTCStub; } - - // getter for mJavaObject - jobject GetJavaObject(); - - // Deletes the strong global ref for the Java object, so it can be garbage - // collected if necessary. See DestroyXPTCMappingEnum(). - void DeleteStrongRef(); - - /** - * Finds the associated nsJavaXPTCStub for the given Java object and IID. - * If no such stub exists, then a new one is created. - * - * @param env Java environment pointer - * @param aJavaObject Java object for which to find/create nsJavaXPTCStub - * @param aIID desired interface IID for nsJavaXPTCStub - * @param aResult on success, holds AddRef'd reference to nsJavaXPTCStub - * - * @return NS_OK if succeeded; all other return values are error codes. - */ - static nsresult GetNewOrUsed(JNIEnv* env, jobject aJavaObject, - const nsIID& aIID, void** aResult); - - -private: - NS_IMETHOD_(nsrefcnt) AddRefInternal(); - NS_IMETHOD_(nsrefcnt) ReleaseInternal(); - - // Deletes this object and its members. Called by ReleaseInternal() and - // ReleaseWeakRef(). - void Destroy(); - - // When a nsJavaXPTCStubWeakRef associated with this object is released, it - // calls this function to let this object know that there is one less weak - // ref. If there are no more weakrefs referencing this object, and no one - // holds a strong ref, then this function takes care of deleting the object. - void ReleaseWeakRef(); - - // returns a weak reference to a child supporting the specified interface - nsJavaXPTCStub * FindStubSupportingIID(const nsID &aIID); - - // returns true if this stub supports the specified interface - PRBool SupportsIID(const nsID &aIID); - - nsresult SetupJavaParams(const nsXPTParamInfo &aParamInfo, - const XPTMethodDescriptor* aMethodInfo, - PRUint16 aMethodIndex, - nsXPTCMiniVariant* aDispatchParams, - nsXPTCMiniVariant &aVariant, - jvalue &aJValue, nsACString &aMethodSig); - nsresult GetRetvalSig(const nsXPTParamInfo* aParamInfo, - const XPTMethodDescriptor* aMethodInfo, - PRUint16 aMethodIndex, - nsXPTCMiniVariant* aDispatchParams, - nsACString &aRetvalSig); - nsresult FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, - const XPTMethodDescriptor* aMethodInfo, - PRUint16 aMethodIndex, - nsXPTCMiniVariant* aDispatchParams, - nsXPTCMiniVariant &aVariant, - jvalue &aJValue); - nsresult SetXPCOMRetval(); - - jobject mJavaWeakRef; - jobject mJavaStrongRef; - jint mJavaRefHashCode; - nsCOMPtr mIInfo; - - nsVoidArray mChildren; // weak references (cleared by the children) - nsJavaXPTCStub *mMaster; // strong reference - - nsAutoRefCnt mWeakRefCnt; // count for number of associated weak refs -}; - -#ifdef VBOX -NS_DEFINE_STATIC_IID_ACCESSOR2(nsJavaXPTCStub, NS_JAVAXPTCSTUB_IID) -#else -NS_DEFINE_STATIC_IID_ACCESSOR2(nsJavaXPTCStub, NS_JAVAXPTCSTUB_IID) -#endif - -#endif // _nsJavaXPTCStub_h_ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.cpp b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.cpp deleted file mode 100755 index cb98fc9..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* ***** 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 "jni.h" -#include "nsJavaXPTCStubWeakRef.h" -#include "nsJavaXPTCStub.h" -#include "nsJavaXPCOMBindingUtils.h" -#include "nsIInterfaceInfoManager.h" - - -/** - * How we handle XPCOM weak references to a Java object: - * - * If XPCOM requires or asks for a weak reference of a Java object, we first - * find (or create) an nsJavaXPTCStub for that Java object. That way, there is - * always an nsJavaXPTCStub for any nsJavaXPTCStubWeakRef. However, the - * XPTCStub may not always be 'valid'; that is, its refcount may be zero if - * is not currently referenced by any XPCOM class. - * When an XPCOM method queries the referent from the weak reference, the - * weak ref checks first whether the Java object is still valid. If so, we can - * immediately return an addref'd nsJavaXPTCStub. The XPTCStub takes care of - * finding an XPTCStub for the required IID. - */ - -nsJavaXPTCStubWeakRef::nsJavaXPTCStubWeakRef(jobject aJavaObject, - nsJavaXPTCStub* aXPTCStub) - : mXPTCStub(aXPTCStub) -{ - JNIEnv* env = GetJNIEnv(); - jobject weakref = env->NewObject(weakReferenceClass, - weakReferenceConstructorMID, aJavaObject); - mWeakRef = env->NewGlobalRef(weakref); -} - -nsJavaXPTCStubWeakRef::~nsJavaXPTCStubWeakRef() -{ - JNIEnv* env = GetJNIEnv(); - env->CallVoidMethod(mWeakRef, clearReferentMID); - env->DeleteGlobalRef(mWeakRef); - mXPTCStub->ReleaseWeakRef(); -} - -NS_IMPL_ADDREF(nsJavaXPTCStubWeakRef) -NS_IMPL_RELEASE(nsJavaXPTCStubWeakRef) - -NS_IMPL_QUERY_INTERFACE1(nsJavaXPTCStubWeakRef, nsIWeakReference) - -NS_IMETHODIMP -nsJavaXPTCStubWeakRef::QueryReferent(const nsIID& aIID, void** aInstancePtr) -{ - LOG(("nsJavaXPTCStubWeakRef::QueryReferent()\n")); - - // Is weak ref still valid? - // We create a strong local ref to make sure Java object isn't garbage - // collected during this call. - JNIEnv* env = GetJNIEnv(); - jobject javaObject = env->CallObjectMethod(mWeakRef, getReferentMID); - if (env->IsSameObject(javaObject, NULL)) - return NS_ERROR_NULL_POINTER; - - // Java object has not been garbage collected, so return QI from XPTCStub. - return mXPTCStub->QueryInterface(aIID, aInstancePtr); -} - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.h deleted file mode 100755 index b538eec..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsJavaXPTCStubWeakRef.h +++ /dev/null @@ -1,63 +0,0 @@ -/* ***** 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 _nsJavaXPTCStubWeakRef_h_ -#define _nsJavaXPTCStubWeakRef_h_ - -#include "jni.h" -#include "nsIWeakReference.h" - - -class nsJavaXPTCStub; - -/** - * This class represents an XPCOM weak reference to a Java object. - */ -class nsJavaXPTCStubWeakRef : public nsIWeakReference -{ -public: - nsJavaXPTCStubWeakRef(jobject aJavaObject, nsJavaXPTCStub* aXPTCStub); - virtual ~nsJavaXPTCStubWeakRef(); - NS_DECL_ISUPPORTS - NS_DECL_NSIWEAKREFERENCE - -protected: - jobject mWeakRef; - nsJavaXPTCStub* mXPTCStub; -}; - -#endif // _nsJavaXPTCStubWeakRef_h_ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsThreadUtils.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsThreadUtils.h deleted file mode 100755 index 53f3dbd..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsThreadUtils.h +++ /dev/null @@ -1,399 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim:set ts=2 sw=2 sts=2 et cindent: */ -/* ***** 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 Mozilla code. - * - * The Initial Developer of the Original Code is Google Inc. - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Darin Fisher - * - * 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 nsThreadUtils_h__ -#define nsThreadUtils_h__ - - -#ifdef VBOX -#include "nsIThread.h" - -inline already_AddRefed -do_GetMainThread() { - nsIThread *thread = nsnull; - nsIThread::GetMainThread(&thread); - return already_AddRefed(thread); -} - -#include "VBox/com/NativeEventQueue.h" - -inline already_AddRefed do_GetMainThreadQueue() -{ - com::NativeEventQueue* eq = com::NativeEventQueue::getMainEventQueue(); - NS_ASSERTION(eq != nsnull, "Must be valid"); - return eq->getIEventQueue(); -} - -#else -#include "prthread.h" -#include "prinrval.h" -#include "nsIThreadManager.h" -#include "nsIThread.h" -#include "nsIRunnable.h" -#include "nsStringGlue.h" -#include "nsCOMPtr.h" - - -// This is needed on some systems to prevent collisions between the symbols -// appearing in xpcom_core and xpcomglue. It may be unnecessary in the future -// with better toolchain support. -#ifdef MOZILLA_INTERNAL_API -# define NS_NewThread NS_NewThread_P -# define NS_GetCurrentThread NS_GetCurrentThread_P -# define NS_GetMainThread NS_GetMainThread_P -# define NS_IsMainThread NS_IsMainThread_P -# define NS_DispatchToCurrentThread NS_DispatchToCurrentThread_P -# define NS_DispatchToMainThread NS_DispatchToMainThread_P -# define NS_ProcessPendingEvents NS_ProcessPendingEvents_P -# define NS_HasPendingEvents NS_HasPendingEvents_P -# define NS_ProcessNextEvent NS_ProcessNextEvent_P -#endif - -//----------------------------------------------------------------------------- -// These methods are alternatives to the methods on nsIThreadManager, provided -// for convenience. - -/** - * Create a new thread, and optionally provide an initial event for the thread. - * - * @param result - * The resulting nsIThread object. - * @param initialEvent - * The initial event to run on this thread. This parameter may be null. - * - * @returns NS_ERROR_INVALID_ARG - * Indicates that the given name is not unique. - */ -extern NS_COM_GLUE NS_METHOD -NS_NewThread(nsIThread **result, nsIRunnable *initialEvent = nsnull); - -/** - * Get a reference to the current thread. - * - * @param result - * The resulting nsIThread object. - */ -extern NS_COM_GLUE NS_METHOD -NS_GetCurrentThread(nsIThread **result); - -/** - * Get a reference to the main thread. - * - * @param result - * The resulting nsIThread object. - */ -extern NS_COM_GLUE NS_METHOD -NS_GetMainThread(nsIThread **result); - -/** - * Test to see if the current thread is the main thread. - * - * @returns PR_TRUE if the current thread is the main thread, and PR_FALSE - * otherwise. - */ -extern NS_COM_GLUE NS_METHOD_(PRBool) -NS_IsMainThread(); - -/** - * Dispatch the given event to the current thread. - * - * @param event - * The event to dispatch. - * - * @returns NS_ERROR_INVALID_ARG - * If event is null. - */ -extern NS_COM_GLUE NS_METHOD -NS_DispatchToCurrentThread(nsIRunnable *event); - -/** - * Dispatch the given event to the main thread. - * - * @param event - * The event to dispatch. - * @param dispatchFlags - * The flags to pass to the main thread's dispatch method. - * - * @returns NS_ERROR_INVALID_ARG - * If event is null. - */ -extern NS_COM_GLUE NS_METHOD -NS_DispatchToMainThread(nsIRunnable *event, - PRUint32 dispatchFlags = NS_DISPATCH_NORMAL); - -#ifndef XPCOM_GLUE_AVOID_NSPR -/** - * Process all pending events for the given thread before returning. This - * method simply calls ProcessNextEvent on the thread while HasPendingEvents - * continues to return true and the time spent in NS_ProcessPendingEvents - * does not exceed the given timeout value. - * - * @param thread - * The thread object for which to process pending events. If null, then - * events will be processed for the current thread. - * @param timeout - * The maximum number of milliseconds to spend processing pending events. - * Events are not pre-empted to honor this timeout. Rather, the timeout - * value is simply used to determine whether or not to process another event. - * Pass PR_INTERVAL_NO_TIMEOUT to specify no timeout. - */ -extern NS_COM_GLUE NS_METHOD -NS_ProcessPendingEvents(nsIThread *thread, - PRIntervalTime timeout = PR_INTERVAL_NO_TIMEOUT); -#endif - -/** - * Shortcut for nsIThread::HasPendingEvents. - * - * It is an error to call this function when the given thread is not the - * current thread. This function will return PR_FALSE if called from some - * other thread. - * - * @param thread - * The current thread or null. - * - * @returns - * A boolean value that if "true" indicates that there are pending events - * in the current thread's event queue. - */ -extern NS_COM_GLUE PRBool -NS_HasPendingEvents(nsIThread *thread = nsnull); - -/** - * Shortcut for nsIThread::ProcessNextEvent. - * - * It is an error to call this function when the given thread is not the - * current thread. This function will simply return PR_FALSE if called - * from some other thread. - * - * @param thread - * The current thread or null. - * @param mayWait - * A boolean parameter that if "true" indicates that the method may block - * the calling thread to wait for a pending event. - * - * @returns - * A boolean value that if "true" indicates that an event from the current - * thread's event queue was processed. - */ -extern NS_COM_GLUE PRBool -NS_ProcessNextEvent(nsIThread *thread = nsnull, PRBool mayWait = PR_TRUE); - -//----------------------------------------------------------------------------- -// Helpers that work with nsCOMPtr: - -inline already_AddRefed -do_GetCurrentThread() { - nsIThread *thread = nsnull; - NS_GetCurrentThread(&thread); - return already_AddRefed(thread); -} - -inline already_AddRefed -do_GetMainThread() { - nsIThread *thread = nsnull; - NS_GetMainThread(&thread); - return already_AddRefed(thread); -} - -//----------------------------------------------------------------------------- - -#ifdef MOZILLA_INTERNAL_API -// Fast access to the current thread. Do not release the returned pointer! If -// you want to use this pointer from some other thread, then you will need to -// AddRef it. Otherwise, you should only consider this pointer valid from code -// running on the current thread. -extern NS_COM_GLUE nsIThread *NS_GetCurrentThread(); -#endif - -//----------------------------------------------------------------------------- - -#ifndef XPCOM_GLUE_AVOID_NSPR - -#undef IMETHOD_VISIBILITY -#define IMETHOD_VISIBILITY NS_COM_GLUE - -// This class is designed to be subclassed. -class NS_COM_GLUE nsRunnable : public nsIRunnable -{ -public: - NS_DECL_ISUPPORTS - NS_DECL_NSIRUNNABLE - - nsRunnable() { - } - -protected: - virtual ~nsRunnable() { - } -}; - -#undef IMETHOD_VISIBILITY -#define IMETHOD_VISIBILITY NS_VISIBILITY_HIDDEN - -// An event that can be used to call a method on a class. The class type must -// support reference counting. -template -class nsRunnableMethod : public nsRunnable -{ -public: - typedef void (T::*Method)(); - - nsRunnableMethod(T *obj, Method method) - : mObj(obj), mMethod(method) { - NS_ADDREF(mObj); - } - - NS_IMETHOD Run() { - (mObj->*mMethod)(); - return NS_OK; - } - -private: - virtual ~nsRunnableMethod() { - NS_RELEASE(mObj); - } - - T *mObj; - Method mMethod; -}; - -// Use this helper macro like so: -// -// nsCOMPtr event = -// NS_NEW_RUNNABLE_METHOD(MyClass, myObject, HandleEvent); -// NS_DispatchToCurrentThread(event); -// -// Constraints: -// - myObject must be of type MyClass -// - MyClass must defined AddRef and Release methods -// -// NOTE: Attempts to make this a template function caused VC6 to barf :-( -// -#define NS_NEW_RUNNABLE_METHOD(class_, obj_, method_) \ - new nsRunnableMethod(obj_, &class_::method_) - -#endif // XPCOM_GLUE_AVOID_NSPR - -// This class is designed to be used when you have an event class E that has a -// pointer back to resource class R. If R goes away while E is still pending, -// then it is important to "revoke" E so that it does not try use R after R has -// been destroyed. nsRevocableEventPtr makes it easy for R to manage such -// situations: -// -// class R; -// -// class E : public nsRunnable { -// public: -// void Revoke() { -// mResource = nsnull; -// } -// private: -// R *mResource; -// }; -// -// class R { -// public: -// void EventHandled() { -// mEvent.Forget(); -// } -// private: -// nsRevocableEventPtr mEvent; -// }; -// -// void R::PostEvent() { -// // Make sure any pending event is revoked. -// mEvent->Revoke(); -// -// nsCOMPtr event = new E(); -// if (NS_SUCCEEDED(NS_DispatchToCurrentThread(event))) { -// // Keep pointer to event so we can revoke it. -// mEvent = event; -// } -// } -// -// NS_IMETHODIMP E::Run() { -// if (!mResource) -// return NS_OK; -// ... -// mResource->EventHandled(); -// return NS_OK; -// } -// -template -class nsRevocableEventPtr { -public: - nsRevocableEventPtr() - : mEvent(nsnull) { - } - - ~nsRevocableEventPtr() { - Revoke(); - } - - const nsRevocableEventPtr& operator=(T *event) { - Revoke(); - mEvent = event; - return *this; - } - - void Revoke() { - if (mEvent) { - mEvent->Revoke(); - mEvent = nsnull; - } - } - - void Forget() { - mEvent = nsnull; - } - - PRBool IsPending() { - return mEvent != nsnull; - } - -private: - // Not implemented - nsRevocableEventPtr(const nsRevocableEventPtr&); - nsRevocableEventPtr& operator=(const nsRevocableEventPtr&); - - T *mEvent; -}; -#endif - -#endif // nsThreadUtils_h__ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsXPTCUtils.h b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsXPTCUtils.h deleted file mode 100755 index 9a1fe3c..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/nsXPTCUtils.h +++ /dev/null @@ -1,128 +0,0 @@ -/* ***** 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 Mozilla XPCOM. - * - * The Initial Developer of the Original Code is - * the Mozilla Foundation . - * Portions created by the Initial Developer are Copyright (C) 2006 - * the Initial Developer. All Rights Reserved. - * - * Contributor(s): - * Benjamin Smedberg - New code - * - * 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 nsXPTCUtils_h__ -#define nsXPTCUtils_h__ - -#include "xptcall.h" - -#ifdef VBOX - -#define NS_DECLARE_STATIC_IID_ACCESSOR(the_iid) \ - template \ - struct COMTypeInfo \ - { \ - static const nsIID kIID NS_HIDDEN; \ - }; \ - static const nsIID& GetIID() {return COMTypeInfo::kIID;} - - -#define NS_DEFINE_STATIC_IID_ACCESSOR2(the_interface, the_iid) \ - template \ - const nsIID the_interface::COMTypeInfo::kIID NS_HIDDEN = the_iid; - - -class nsIXPTCProxy : public nsISupports -{ -public: - NS_IMETHOD CallMethod(PRUint16 aMethodIndex, - const XPTMethodDescriptor *aInfo, - nsXPTCMiniVariant *aParams) = 0; -}; - -/** - * This is a typedef to avoid confusion between the canonical - * nsISupports* that provides object identity and an interface pointer - * for inheriting interfaces that aren't known at compile-time. - */ -typedef nsISupports nsISomeInterface; - -/** - * Get a proxy object to implement the specified interface. - * - * @param aIID The IID of the interface to implement. - * @param aOuter An object to receive method calls from the proxy object. - * The stub forwards QueryInterface/AddRef/Release to the - * outer object. The proxy object does not hold a reference to - * the outer object; it is the caller's responsibility to - * ensure that this pointer remains valid until the stub has - * been destroyed. - * @param aStub Out parameter for the new proxy object. The object is - * not addrefed. The object never destroys itself. It must be - * explicitly destroyed by calling - * NS_DestroyXPTCallStub when it is no longer needed. - */ -XPTC_PUBLIC_API(nsresult) -NS_GetXPTCallStub(REFNSIID aIID, nsIXPTCProxy* aOuter, - nsISomeInterface* *aStub); - -/** - * Destroys an XPTCall stub previously created with NS_GetXPTCallStub. - */ -XPTC_PUBLIC_API(void) -NS_DestroyXPTCallStub(nsISomeInterface* aStub); - - -#endif - - -/** - * A helper class that initializes an xptcall helper at construction - * and releases it at destruction. - */ -class nsAutoXPTCStub : protected nsIXPTCProxy -{ -public: - nsISomeInterface* mXPTCStub; - -protected: - nsAutoXPTCStub() : mXPTCStub(nsnull) { } - - nsresult - InitStub(const nsIID& aIID) - { - return NS_GetXPTCallStub(aIID, this, &mXPTCStub); - } - - ~nsAutoXPTCStub() - { - if (mXPTCStub) - NS_DestroyXPTCallStub(mXPTCStub); - } -}; - -#endif // nsXPTCUtils_h__ diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/GREVersionRange.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/GREVersionRange.java deleted file mode 100755 index ede1a52..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/GREVersionRange.java +++ /dev/null @@ -1,80 +0,0 @@ -/* ***** 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 ***** */ - -package org.mozilla.xpcom; - - -public class GREVersionRange { - - private String lower; - private boolean lowerInclusive; - private String upper; - private boolean upperInclusive; - - public GREVersionRange(String aLower, boolean aLowerInclusive, - String aUpper, boolean aUpperInclusive) { - lower = aLower; - lowerInclusive = aLowerInclusive; - upper = aUpper; - upperInclusive = aUpperInclusive; - } - - public boolean check(String aVersion) { - VersionComparator comparator = new VersionComparator(); - int c = comparator.compare(aVersion, lower); - if (c < 0) { - return false; - } - - if (c == 0 && !lowerInclusive) { - return false; - } - - c = comparator.compare(aVersion, upper); - if (c > 0) { - return false; - } - - if (c == 0 && !upperInclusive) { - return false; - } - - return true; - } - -} - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IAppFileLocProvider.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IAppFileLocProvider.java deleted file mode 100755 index 633d8bb..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IAppFileLocProvider.java +++ /dev/null @@ -1,92 +0,0 @@ -/* ***** 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) 2004 - * 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 ***** */ - -package org.mozilla.xpcom; - -import java.io.File; - - -/** - * Used by XPCOM's Directory Service to get file locations. - *

- * This interface is similar to nsIDirectoryServiceProvider and - * nsIDirectoryServiceProvider2, except that its methods use - * java.io.File instead of nsIFile. - *

- * - * @see Mozilla#initEmbedding - * @see Mozilla#initXPCOM - * @see - * nsIDirectoryServiceProvider - * @see - * Directory Service property names - */ -public interface IAppFileLocProvider { - - /** - * Directory Service calls this when it gets the first request for - * a property or on every request if the property is not persistent. - * - * @param prop the symbolic name of the file - * @param persistent an array of length one used to supply the output value: - *
    - *
  • true - The returned file will be - * cached by Directory Service. Subsequent requests for - * this prop will bypass the provider and use the cache. - *
  • - *
  • false - The provider will be asked - * for this prop each time it is requested.
  • - *
- * - * @return the file represented by the property - */ - File getFile(String prop, boolean[] persistent); - - /** - * Directory Service calls this when it gets a request for - * a property and the requested type is nsISimpleEnumerator. - * - * @param prop the symbolic name of the file list - * - * @return an array of file locations - */ - File[] getFiles(String prop); - -} - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IGRE.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IGRE.java deleted file mode 100755 index ecf000f..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IGRE.java +++ /dev/null @@ -1,127 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom; - -import java.io.File; - - -public interface IGRE { - - /** - * Initializes libXUL for embedding purposes. - *

- * NOTE: This function must be called from the "main" thread. - *

- * NOTE: At the present time, this function may only be called once in - * a given process. Use termEmbedding to clean up and free - * resources allocated by initEmbedding. - * - * @param aLibXULDirectory The directory in which the libXUL shared library - * was found. - * @param aAppDirectory The directory in which the application components - * and resources can be found. This will map to - * the "resource:app" directory service key. - * @param aAppDirProvider A directory provider for the application. This - * provider will be aggregated by a libXUL provider - * which will provide the base required GRE keys. - * - * @throws XPCOMException if a failure occurred during initialization - */ - void initEmbedding(File aLibXULDirectory, File aAppDirectory, - IAppFileLocProvider aAppDirProvider) throws XPCOMException; - - /** - * Terminates libXUL embedding. - *

- * NOTE: Release any references to XPCOM objects that you may be holding - * before calling this function. - */ - void termEmbedding(); - - /** - * Lock a profile directory using platform-specific semantics. - * - * @param aDirectory The profile directory to lock. - * - * @return A lock object. The directory will remain locked until the lock is - * released by invoking the release method, or by the - * termination of the JVM, whichever comes first. - * - * @throws XPCOMException if a failure occurred - */ - ProfileLock lockProfileDirectory(File aDirectory) throws XPCOMException; - - /** - * Fire notifications to inform the toolkit about a new profile. This - * method should be called after initEmbedding if the - * embedder wishes to run with a profile. - *

- * Normally the embedder should call lockProfileDirectory - * to lock the directory before calling this method. - *

- * NOTE: There are two possibilities for selecting a profile: - *

    - *
  • - * Select the profile before calling initEmbedding. - * The aAppDirProvider object passed to initEmbedding - * should provide the NS_APP_USER_PROFILE_50_DIR key, and - * may also provide the following keys: - *
      - *
    • NS_APP_USER_PROFILE_LOCAL_50_DIR - *
    • NS_APP_PROFILE_DIR_STARTUP - *
    • NS_APP_PROFILE_LOCAL_DIR_STARTUP - *
    - * In this scenario notifyProfile should be called - * immediately after initEmbedding. Component - * registration information will be stored in the profile and - * JS components may be stored in the fastload cache. - *
  • - *
  • - * Select a profile some time after calling initEmbedding. - * In this case the embedder must install a directory service - * provider which provides NS_APP_USER_PROFILE_50_DIR and optionally - * NS_APP_USER_PROFILE_LOCAL_50_DIR. Component registration information - * will be stored in the application directory and JS components will not - * fastload. - *
  • - *
- */ - void notifyProfile(); - -} - - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IJavaXPCOMUtils.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IJavaXPCOMUtils.java deleted file mode 100755 index 7b70caf..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IJavaXPCOMUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -/* ***** 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) 2007 - * 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 ***** */ - -package org.mozilla.xpcom; - -public interface IJavaXPCOMUtils { - - /** - * Returns a pointer to a C++ proxy object for the given Java object. - * - * @param aJavaObject Java object to encapsulate in C++ proxy - * @param aIID interface ID for requested proxy - * @return C pointer (as long) of new proxy - */ - long wrapJavaObject(Object aJavaObject, String aIID); - - /** - * Returns a Java proxy for the given C++ XPCOM object - * - * @param aXPCOMObject C++ XPCOM object to encapsulate in Java proxy - * @param aIID interface ID for requested proxy - * @return new Proxy - */ - Object wrapXPCOMObject(long aXPCOMObject, String aIID); - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IMozilla.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IMozilla.java deleted file mode 100755 index b148e9a..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IMozilla.java +++ /dev/null @@ -1,63 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom; - -import java.io.File; - -public interface IMozilla { - - /** - * Initialize the Mozilla object with the given XULRunner path. All - * subsequent Mozilla method invocations be done against the given XULRunner - * version. - * - * @param aLibXULDirectory path of XULRunner build to use - * - * @throws XPCOMInitializationException if failure occurred during - * initialization - */ - void initialize(File aLibXULDirectory) throws XPCOMInitializationException; - - /** - * Return the native window handle for an AWT component. - * - * @param widget An AWT component (such as Canvas, Frame) that is backed by - * a real native window. - * @return the pointer to the native window (platform specific) - */ - long getNativeHandleFromAWT(Object widget); -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/INIParser.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/INIParser.java deleted file mode 100755 index ba2f11c..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/INIParser.java +++ /dev/null @@ -1,243 +0,0 @@ -/* ***** 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 ***** */ - -package org.mozilla.xpcom; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.Charset; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Properties; -import java.util.StringTokenizer; - - -/** - * A simple parser for INI files. - */ -public class INIParser { - - private HashMap mSections; - - /** - * Creates a new INIParser instance from the INI file at the - * given path. aCharset specifies the character encoding of - * the file. - * - * @param aFilename path of INI file to parse - * @param aCharset character encoding of file - * @throws FileNotFoundException if aFilename does not exist. - * @throws IOException if there is a problem reading the given file. - */ - public INIParser(String aFilename, Charset aCharset) - throws FileNotFoundException, IOException { - initFromFile(new File(aFilename), aCharset); - } - - /** - * Creates a new INIParser instance from the INI file at the - * given path, which is assumed to be in the UTF-8 charset. - * - * @param aFilename path of INI file to parse - * @throws FileNotFoundException if aFilename does not exist. - * @throws IOException if there is a problem reading the given file. - */ - public INIParser(String aFilename) throws FileNotFoundException, IOException { - initFromFile(new File(aFilename), Charset.forName("UTF-8")); - } - - /** - * Creates a new INIParser instance from the given file. - * aCharset specifies the character encoding of the file. - * - * @param aFile INI file to parse - * @param aCharset character encoding of file - * @throws FileNotFoundException if aFile does not exist. - * @throws IOException if there is a problem reading the given file. - */ - public INIParser(File aFile, Charset aCharset) - throws FileNotFoundException, IOException { - initFromFile(aFile, aCharset); - } - - /** - * Creates a new INIParser instance from the given file, - * which is assumed to be in the UTF-8 charset. - * - * @param aFile INI file to parse - * @throws FileNotFoundException if aFile does not exist. - * @throws IOException if there is a problem reading the given file. - */ - public INIParser(File aFile) throws FileNotFoundException, IOException { - initFromFile(aFile, Charset.forName("UTF-8")); - } - - /** - * Parses given INI file. - * - * @param aFile INI file to parse - * @param aCharset character encoding of file - * @throws FileNotFoundException if aFile does not exist. - * @throws IOException if there is a problem reading the given file. - */ - private void initFromFile(File aFile, Charset aCharset) - throws FileNotFoundException, IOException { - FileInputStream fileStream = new FileInputStream(aFile); - InputStreamReader inStream = new InputStreamReader(fileStream, aCharset); - BufferedReader reader = new BufferedReader(inStream); - - mSections = new HashMap(); - String currSection = null; - - String line; - while ((line = reader.readLine()) != null) { - // skip empty lines and comment lines - String trimmedLine = line.trim(); - if (trimmedLine.length() == 0 || trimmedLine.startsWith("#") - || trimmedLine.startsWith(";")) { - continue; - } - - // Look for section headers (i.e. "[Section]"). - if (line.startsWith("[")) { - /* - * We are looking for a well-formed "[Section]". If this header is - * malformed (i.e. "[Section" or "[Section]Moretext"), just skip it - * and go on to next well-formed section header. - */ - if (!trimmedLine.endsWith("]") || - trimmedLine.indexOf("]") != (trimmedLine.length() - 1)) { - currSection = null; - continue; - } - - // remove enclosing brackets - currSection = trimmedLine.substring(1, trimmedLine.length() - 1); - continue; - } - - // If we haven't found a valid section header, continue to next line - if (currSection == null) { - continue; - } - - StringTokenizer tok = new StringTokenizer(line, "="); - if (tok.countTokens() != 2) { // looking for value pairs - continue; - } - - Properties props = mSections.get(currSection); - if (props == null) { - props = new Properties(); - mSections.put(currSection, props); - } - props.setProperty(tok.nextToken(), tok.nextToken()); - } - - reader.close(); - } - - /** - * Returns an iterator over the section names available in the INI file. - * - * @return an iterator over the section names - */ - public Iterator getSections() { - return mSections.keySet().iterator(); - } - - /** - * Returns an iterator over the keys available within a section. - * - * @param aSection section name whose keys are to be returned - * @return an iterator over section keys, or null if no - * such section exists - */ - public Iterator getKeys(String aSection) { - /* - * Simple wrapper class to convert Enumeration to Iterator - */ - class PropertiesIterator implements Iterator { - private Enumeration e; - - public PropertiesIterator(Enumeration aEnum) { - e = aEnum; - } - - public boolean hasNext() { - return e.hasMoreElements(); - } - - public Object next() { - return e.nextElement(); - } - - public void remove() { - return; - } - } - - Properties props = mSections.get(aSection); - if (props == null) { - return null; - } - - return new PropertiesIterator(props.propertyNames()); - } - - /** - * Gets the string value for a particular section and key. - * - * @param aSection a section name - * @param aKey the key whose value is to be returned. - * @return string value of particular section and key - */ - public String getString(String aSection, String aKey) { - Properties props = mSections.get(aSection); - if (props == null) { - return null; - } - - return props.getProperty(aKey); - } - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IXPCOM.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IXPCOM.java deleted file mode 100755 index 8cfbfb3..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/IXPCOM.java +++ /dev/null @@ -1,137 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom; - -import java.io.File; - -import org.mozilla.interfaces.nsIComponentManager; -import org.mozilla.interfaces.nsIComponentRegistrar; -import org.mozilla.interfaces.nsILocalFile; -import org.mozilla.interfaces.nsIServiceManager; - - -public interface IXPCOM { - - /** - * Initializes XPCOM. You must call this method before proceeding - * to use XPCOM. - * - * @param aMozBinDirectory The directory containing the component - * registry and runtime libraries; - * or use null to use the working - * directory. - * - * @param aAppFileLocProvider The object to be used by Gecko that specifies - * to Gecko where to find profiles, the component - * registry preferences and so on; or use - * null for the default behaviour. - * - * @return the service manager - * - * @throws XPCOMException
    - *
  • NS_ERROR_NOT_INITIALIZED - if static globals were not initialied, - * which can happen if XPCOM is reloaded, but did not completly - * shutdown.
  • - *
  • Other error codes indicate a failure during initialisation.
  • - *
- */ - nsIServiceManager initXPCOM(File aMozBinDirectory, - IAppFileLocProvider aAppFileLocProvider) throws XPCOMException; - - /** - * Shutdown XPCOM. You must call this method after you are finished - * using xpcom. - * - * @param aServMgr The service manager which was returned by initXPCOM. - * This will release servMgr. - * - * @throws XPCOMException if a failure occurred during termination - */ - void shutdownXPCOM(nsIServiceManager aServMgr) throws XPCOMException; - - /** - * Public Method to access to the service manager. - * - * @return the service manager - * - * @throws XPCOMException - */ - nsIServiceManager getServiceManager() throws XPCOMException; - - /** - * Public Method to access to the component manager. - * - * @return the component manager - * - * @throws XPCOMException - */ - nsIComponentManager getComponentManager() throws XPCOMException; - - /** - * Public Method to access to the component registration manager. - * - * @return the component registration manager - * - * @throws XPCOMException - */ - nsIComponentRegistrar getComponentRegistrar() throws XPCOMException; - - /** - * Public Method to create an instance of a nsILocalFile. - * - * @param aPath A string which specifies a full file path to a - * location. Relative paths will be treated as an - * error (NS_ERROR_FILE_UNRECOGNIZED_PATH). - * @param aFollowLinks This attribute will determine if the nsLocalFile will - * auto resolve symbolic links. By default, this value - * will be false on all non unix systems. On unix, this - * attribute is effectively a noop. - * - * @return an instance of an nsILocalFile that points to given path - * - * @throws XPCOMException
    - *
  • NS_ERROR_FILE_UNRECOGNIZED_PATH - raised for unrecognized paths - * or relative paths (must supply full file path)
  • - *
- */ - nsILocalFile newLocalFile(String aPath, boolean aFollowLinks) - throws XPCOMException; - - // #ifdef VBOX - int waitForEvents(long timeout); - // #endif VBOX -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/Mozilla.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/Mozilla.java deleted file mode 100755 index 05314c9..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/Mozilla.java +++ /dev/null @@ -1,1079 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.Properties; - -import org.mozilla.interfaces.nsIComponentManager; -import org.mozilla.interfaces.nsIComponentRegistrar; -import org.mozilla.interfaces.nsILocalFile; -import org.mozilla.interfaces.nsIServiceManager; -import org.mozilla.interfaces.nsISupports; - - -/** - * A singleton class which provides access to the Mozilla browser. Requires - * that XULRunner be installed on the user's system. - *

- * You would use to class to find a XULRunner installation, setup a profile (if - * necessary), and initialize embedding. A typical scenario would look like - * this: - *

- * Mozilla mozilla = Mozilla.getInstance();
- * GREVersionRange[] range = new GREVersionRange[1];
- * range[0] = new GREVersionRange("1.8.0.*", false, "1.8.1.*", true);
- * try {
- *    File grePath = Mozilla.getGREPathWithProperties(range, null);
- *    mozilla.initialize(grePath);
- *    profLock = mozilla.lockProfileDirectory(profileDir);
- *    // LocationProvider is a user class that implements IAppFileLocProvider
- *    LocationProvider locProvider = new LocationProvider(grePath, profileDir);
- *    mozilla.initEmbedding(grePath, grePath, locProvider);
- *    mozilla.notifyProfile();
- * } catch (XPCOMInitializationException xie) {
- *    // handle exception
- * } catch (XPCOMException xe) {
- *    // handle exception
- * }
- * 
- * - * @see http://www.mozilla.org/projects/embedding/GRE.html - */ -public class Mozilla implements IMozilla, IGRE, IXPCOM, IJavaXPCOMUtils,XPCOMError { - - private static Mozilla mozillaInstance = new Mozilla(); - - private static final String JAVAXPCOM_JAR = "vboxjxpcom.jar"; - - private IMozilla mozilla = null; - private IGRE gre = null; - private IXPCOM xpcom = null; - private IJavaXPCOMUtils jxutils = null; - - /** - * @return - */ - public static Mozilla getInstance() { - return mozillaInstance; - } - - /** - * - */ - private Mozilla() { - } - - /** - * Locates the path of a GRE with the specified properties. This method - * will only return GREs that support Java embedding (looks for the - * presence of "javaxpcom.jar"). - *

- * Currently this uses a "first-fit" algorithm, it does not select - * the newest available GRE. - * - * @param aVersions An array of version ranges: if any version range - * matches, the GRE is considered acceptable. - * @param aProperties A list of GRE property/value pairs which must - * all be satisfied. This parameter is ignored on - * Macintosh, because of the manner in which the - * XUL frameworks are installed. - * - * @return A file object of the appropriate path. If - * the "local" GRE is specified (via the USE_LOCAL_GRE - * environment variable, for example), returns - * null. - * - * @throws FileNotFoundException if an appropriate GRE could not be found - */ - public static File getGREPathWithProperties(GREVersionRange[] aVersions, - Properties aProperties) throws FileNotFoundException { - File grePath = null; - - // if GRE_HOME is in the environment, use that GRE - String env = System.getProperty("GRE_HOME"); - if (env != null) { - try { - grePath = new File(env).getCanonicalFile(); - } catch (IOException e) { - throw new FileNotFoundException("cannot access GRE_HOME"); - } - if (!grePath.exists()) { - throw new FileNotFoundException("GRE_HOME doesn't exist"); - } - return grePath; - } - - // the Gecko bits that sit next to the application or in the PATH - env = System.getProperty("USE_LOCAL_GRE"); - if (env != null) { - return null; - } - - // Search for GRE in platform specific locations. We want a GRE that - // supports Java, so we look for the "javaxpcom" property by default. - if (aProperties == null) { - aProperties = new Properties(); - } - aProperties.setProperty("javaxpcom", "1"); - - String osName = System.getProperty("os.name").toLowerCase(); - if (osName.startsWith("mac os x")) { - grePath = getGREPathMacOSX(aVersions); - } else if (osName.startsWith("windows")) { - grePath = getGREPathWindows(aVersions, aProperties); - } else { - // assume everything else is Unix/Linux - grePath = getGREPathUnix(aVersions, aProperties); - } - - if (grePath == null) { - throw new FileNotFoundException("GRE not found"); - } - - return grePath; - } - - /** - * @param aVersions - * @return - */ - private static File getGREPathMacOSX(GREVersionRange[] aVersions) { - /* - * Check the application bundle first, for - * /Contents/Frameworks/XUL.framework/libxpcom.dylib. - */ - File grePath = findGREBundleFramework(); - if (grePath != null) { - return grePath; - } - - // Check ~/Library/Frameworks/XUL.framework/Versions//libxpcom.dylib - String home = System.getProperty("user.home"); - if (home != null) { - grePath = findGREFramework(home, aVersions); - if (grePath != null) { - return grePath; - } - } - - // Check /Library/Frameworks/XUL.framework/Versions//libxpcom.dylib - return findGREFramework("", aVersions); - } - - /** - * @return - */ - private static File findGREBundleFramework() { - /* - * Use reflection to get Apple's NSBundle class, which can be used - * to get the bundle's "Frameworks" directory. - */ - try { - URL[] urls = new URL[1]; - urls[0] = new File("/System/Library/Java/").toURI().toURL(); - ClassLoader loader = new URLClassLoader(urls); - Class bundleClass = Class.forName("com.apple.cocoa.foundation.NSBundle", - true, loader); - - // Get the bundle for this app. If this is not executing from - // a bundle, this will return null. - Method mainBundleMethod = bundleClass.getMethod("mainBundle", (java.lang.Class[])null); - Object bundle = mainBundleMethod.invoke(null, (java.lang.Object[])null); - - if (bundle != null) { - // Get the path to the bundle's "Frameworks" directory - Method fwPathMethod = bundleClass.getMethod("privateFrameworksPath", - (java.lang.Class[])null); - String path = (String) fwPathMethod.invoke(bundle, (java.lang.Object[])null); - - // look for libxpcom.dylib - if (path.length() != 0) { - File xulDir = new File(path, "XUL.framework"); - if (xulDir.isDirectory()) { - File xpcomLib = new File(xulDir, "libxpcom.dylib"); - if (xpcomLib.canRead()) { - File grePath = xpcomLib.getCanonicalFile().getParentFile(); - - // Since GRE Properties aren't supported on Mac OS X, we check - // for the existence of the "javaxpcom.jar" file in the GRE. - File jar = new File(grePath, JAVAXPCOM_JAR); - if (jar.canRead()) { - // found GRE - return grePath; - } - } - } - } - } - } catch (Exception e) { } - - return null; - } - - /** - * @param aRootPath - * @param aVersions - * @return - */ - private static File findGREFramework(String aRootPath, - GREVersionRange[] aVersions) { - File frameworkDir = new File(aRootPath + - "/Library/Frameworks/XUL.framework/Versions"); - if (!frameworkDir.exists()) - return null; - - File[] files = frameworkDir.listFiles(); - for (int i = 0; i < files.length; i++) { - if (checkVersion(files[i].getName(), aVersions)) { - File xpcomLib = new File(files[i], "libxpcom.dylib"); - - // Since GRE Properties aren't supported on Mac OS X, we check - // for the existence of the "javaxpcom.jar" file in the GRE. - File jar = new File(files[i], JAVAXPCOM_JAR); - if (xpcomLib.canRead() && jar.canRead()) { - return files[i]; - } - } - } - - return null; - } - - /** - * @param aVersions - * @param aProperties - * @return - */ - private static File getGREPathWindows(GREVersionRange[] aVersions, - Properties aProperties) { - /* - * Note the usage of the "Software\\mozilla.org\\GRE" subkey - this allows - * us to have multiple versions of GREs on the same machine by having - * subkeys such as 1.0, 1.1, 2.0 etc. under it. - * - * Please see http://www.mozilla.org/projects/embedding/GRE.html for - * more info. - */ - - final String greKey = "Software\\mozilla.org\\GRE"; - - // See if there is a GRE registered for the current user. - // If not, look for one on the system. - String key = "HKEY_CURRENT_USER" + "\\" + greKey; - File grePath = getGREPathFromRegKey(key, aVersions, aProperties); - if (grePath == null) { - key = "HKEY_LOCAL_MACHINE" + "\\" + greKey; - grePath = getGREPathFromRegKey(key, aVersions, aProperties); - } - - return grePath; - } - - /** - * @param aRegKey - * @param aVersions - * @param aProperties - * @return - */ - private static File getGREPathFromRegKey(String aRegKey, - GREVersionRange[] aVersions, Properties aProperties) { - // create a temp file for the registry export - File tempFile; - try { - tempFile = File.createTempFile("jx_registry", null); - } catch (IOException e) { - // failed to create temp file. ABORT - return null; - } - - Process proc; - try { - proc = Runtime.getRuntime().exec("regedit /e " + "\"" + tempFile.getPath() - + "\" \"" + aRegKey + "\""); - proc.waitFor(); - } catch (Exception e) { - // Failed to run regedit.exe. Length of temp file is zero, and that's - // handled next. - } - - // If there is a key by that name in the registry, then the file length - // will not be zero. - File grePath = null; - if (tempFile.length() != 0) { - grePath = getGREPathFromRegistryFile(tempFile.getPath(), - aRegKey, aVersions, aProperties); - } - - tempFile.delete(); - return grePath; - } - - /** - * @param aFileName - * @param aCharset - * @param aKeyName - * @param aVersions - * @param aProperties - * @return - */ - private static File getGREPathFromRegistryFile(String aFileName, - String aKeyName, GREVersionRange[] aVersions, - Properties aProperties) { - INIParser parser; - try { - parser = new INIParser(aFileName, Charset.forName("UTF-16")); - } catch (Exception e) { - // Problem reading from file. Bail out. - return null; - } - - Iterator sectionsIter = parser.getSections(); - while (sectionsIter.hasNext()) { - // get 'section' name, which will be a registry key name - String section = (String) sectionsIter.next(); - - // Skip over GRE key ("\Software\mozilla.org\GRE") - int gre_len = aKeyName.length(); - if (section.length() <= gre_len) { - continue; - } - - // Get the GRE subkey; that is, everything after - // "\Software\mozilla.org\GRE\" - String subkeyName = section.substring(gre_len + 1); - - // We are only interested in _immediate_ subkeys. We want - // "\Software\mozilla.org\GRE\" but not - // "\Software\mozilla.org\GRE\\". - if (subkeyName.indexOf('\\') != -1) { - continue; - } - - // See if this registry key has a "Version" value, and if so, compare - // it to our desired versions. - String version = parser.getString(section, "\"Version\""); - if (version == null) { - continue; - } - // remove quotes around string - version = version.substring(1, version.length() - 1); - if (!checkVersion(version, aVersions)) { - continue; - } - - // All properties must match, keeping in mind that the propery/value - // pairs returned by regedit.exe have quotes around them. - if (aProperties != null) { - boolean ok = true; - Enumeration e = aProperties.propertyNames(); - while (ok && e.hasMoreElements()) { - String prop = (String) e.nextElement(); - String greValue = parser.getString(section, "\"" + prop + "\""); - if (greValue == null) { - // No such property is set for this GRE. Go on to next GRE. - ok = false; - } else { - // See if the value of the property for the GRE matches - // the given value. - String value = aProperties.getProperty(prop); - if (!greValue.equals("\"" + value + "\"")) { - ok = false; - } - } - } - if (!ok) { - continue; - } - } - - String pathStr = parser.getString(section, "\"GreHome\""); - if (pathStr != null) { - // remove quotes around string - pathStr = pathStr.substring(1, pathStr.length() - 1); - File grePath = new File(pathStr); - if (grePath.exists()) { - File xpcomLib = new File(grePath, "xpcom.dll"); - if (xpcomLib.canRead()) { - // found a good GRE - return grePath; - } - } - } - } - - return null; - } - - /** - * @param aVersions - * @param aProperties - * @return - */ - private static File getGREPathUnix(GREVersionRange[] aVersions, - Properties aProperties) { - File grePath = null; - - String env = System.getProperty("MOZ_GRE_CONF"); - if (env != null) { - grePath = getPathFromConfigFile(env, aVersions, aProperties); - if (grePath != null) { - return grePath; - } - } - - final String greUserConfFile = ".gre.config"; - final String greUserConfDir = ".gre.d"; - final String greConfPath = "/etc/gre.conf"; - final String greConfDir = "/etc/gre.d"; - - env = System.getProperty("user.home"); - if (env != null) { - // Look in ~/.gre.config - grePath = getPathFromConfigFile(env + File.separator + greUserConfFile, - aVersions, aProperties); - if (grePath != null) { - return grePath; - } - - // Look in ~/.gre.d/*.conf - grePath = getPathFromConfigDir(env + File.separator + greUserConfDir, - aVersions, aProperties); - if (grePath != null) { - return grePath; - } - } - - // Look for a global /etc/gre.conf file - grePath = getPathFromConfigFile(greConfPath, aVersions, aProperties); - if (grePath != null) { - return grePath; - } - - // Look for a group of config files in /etc/gre.d/ - grePath = getPathFromConfigDir(greConfDir, aVersions, aProperties); - return grePath; - } - - /** - * @param aFileName - * @param aVersions - * @param aProperties - * @return - */ - private static File getPathFromConfigFile(String aFileName, - GREVersionRange[] aVersions, Properties aProperties) { - INIParser parser; - try { - parser = new INIParser(aFileName); - } catch (Exception e) { - // Problem reading from file. Bail out. - return null; - } - - Iterator sectionsIter = parser.getSections(); - while (sectionsIter.hasNext()) { - // get 'section' name, which will be a version string - String section = (String) sectionsIter.next(); - - // if this isn't one of the versions we are looking for, move - // on to next section - if (!checkVersion(section, aVersions)) { - continue; - } - - // all properties must match - if (aProperties != null) { - boolean ok = true; - Enumeration e = aProperties.propertyNames(); - while (ok && e.hasMoreElements()) { - String prop = (String) e.nextElement(); - String greValue = parser.getString(section, prop); - if (greValue == null) { - // No such property is set for this GRE. Go on to next GRE. - ok = false; - } else { - // See if the value of the property for the GRE matches - // the given value. - if (!greValue.equals(aProperties.getProperty(prop))) { - ok = false; - } - } - } - if (!ok) { - continue; - } - } - - String pathStr = parser.getString(section, "GRE_PATH"); - if (pathStr != null) { - File grePath = new File(pathStr); - if (grePath.exists()) { - File xpcomLib = new File(grePath, "libxpcom.so"); - if (xpcomLib.canRead()) { - // found a good GRE - return grePath; - } - } - } - } - - return null; - } - - /** - * @param aDirName - * @param aVersions - * @param aProperties - * @return - */ - private static File getPathFromConfigDir(String aDirName, - GREVersionRange[] aVersions, Properties aProperties) { - /* - * Open the directory provided and try to read any files in that - * directory that end with .conf. We look for an entry that might - * point to the GRE that we're interested in. - */ - - File dir = new File(aDirName); - if (!dir.isDirectory()) { - return null; - } - - File grePath = null; - File[] files = dir.listFiles(); - for (int i = 0; i < files.length && grePath == null; i++) { - // only look for files that end in '.conf' - if (!files[i].getName().endsWith(".conf")) { - continue; - } - - grePath = getPathFromConfigFile(files[i].getPath(), aVersions, - aProperties); - } - - return grePath; - } - - /** - * @param aVersionToCheck - * @param aVersions - * @return - */ - private static boolean checkVersion(String aVersionToCheck, - GREVersionRange[] aVersions) { - for (int i = 0; i < aVersions.length; i++) { - if (aVersions[i].check(aVersionToCheck)) { - return true; - } - } - return false; - } - - /** - * Initialize the Mozilla object with the given XULRunner path. All - * subsequent Mozilla method invocations be done against the given XULRunner - * version. - * - * @param aLibXULDirectory path of XULRunner build to use - * - * @throws XPCOMInitializationException if failure occurred during - * initialization - */ - public void initialize(File aLibXULDirectory) - throws XPCOMInitializationException { - File jar = new File(aLibXULDirectory, JAVAXPCOM_JAR); - if (!jar.exists()) { - jar = new File(this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath()); - if (!jar.exists()) - throw new XPCOMInitializationException("Could not find " + JAVAXPCOM_JAR + - " in " + aLibXULDirectory); - } - - URL[] urls = new URL[1]; - try { - urls[0] = jar.toURI().toURL(); - } catch (MalformedURLException e) { - throw new XPCOMInitializationException(e); - } - ClassLoader loader = new URLClassLoader(urls, - this.getClass().getClassLoader()); - - try { - Class mozillaClass = Class.forName("org.mozilla.xpcom.internal.MozillaImpl", - true, loader); - mozilla = (IMozilla) mozillaClass.newInstance(); - - Class greClass = Class.forName("org.mozilla.xpcom.internal.GREImpl", - true, loader); - gre = (IGRE) greClass.newInstance(); - - Class xpcomClass = Class.forName("org.mozilla.xpcom.internal.XPCOMImpl", - true, loader); - xpcom = (IXPCOM) xpcomClass.newInstance(); - - Class javaXPCOMClass = - Class.forName("org.mozilla.xpcom.internal.JavaXPCOMMethods", - true, loader); - jxutils = (IJavaXPCOMUtils) javaXPCOMClass.newInstance(); - } catch (Exception e) { - throw new XPCOMInitializationException("Could not load " + - "org.mozilla.xpcom.internal.* classes", e); - } - - mozilla.initialize(aLibXULDirectory); - } - - /** - * Initializes libXUL for embedding purposes. - *

- * NOTE: This function must be called from the "main" thread. - *

- * NOTE: At the present time, this function may only be called once in - * a given process. Use termEmbedding to clean up and free - * resources allocated by initEmbedding. - * - * @param aLibXULDirectory The directory in which the libXUL shared library - * was found. - * @param aAppDirectory The directory in which the application components - * and resources can be found. This will map to - * the "resource:app" directory service key. - * @param aAppDirProvider A directory provider for the application. This - * provider will be aggregated by a libXUL provider - * which will provide the base required GRE keys. - * - * @throws XPCOMException if a failure occurred during initialization - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public void initEmbedding(File aLibXULDirectory, File aAppDirectory, - IAppFileLocProvider aAppDirProvider) throws XPCOMException { - try { - gre.initEmbedding(aLibXULDirectory, aAppDirectory, aAppDirProvider); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - /** - * Terminates libXUL embedding. - *

- * NOTE: Release any references to XPCOM objects that you may be holding - * before calling this function. - * - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public void termEmbedding() { - try { - gre.termEmbedding(); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } finally { - mozilla = null; - gre = null; - xpcom = null; - } - } - - /** - * Lock a profile directory using platform-specific semantics. - * - * @param aDirectory The profile directory to lock. - * - * @return A lock object. The directory will remain locked until the lock is - * released by invoking the release method, or by the - * termination of the JVM, whichever comes first. - * - * @throws XPCOMException if profile is already locked (with - * errorcode == NS_ERROR_FILE_ACCESS_DENIED); - * or if a failure occurred - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public ProfileLock lockProfileDirectory(File aDirectory) - throws XPCOMException { - try { - return gre.lockProfileDirectory(aDirectory); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - /** - * Fire notifications to inform the toolkit about a new profile. This - * method should be called after initEmbedding if the - * embedder wishes to run with a profile. - *

- * Normally the embedder should call lockProfileDirectory - * to lock the directory before calling this method. - *

- * NOTE: There are two possibilities for selecting a profile: - *

    - *
  • - * Select the profile before calling initEmbedding. - * The aAppDirProvider object passed to initEmbedding - * should provide the NS_APP_USER_PROFILE_50_DIR key, and - * may also provide the following keys: - *
      - *
    • NS_APP_USER_PROFILE_LOCAL_50_DIR - *
    • NS_APP_PROFILE_DIR_STARTUP - *
    • NS_APP_PROFILE_LOCAL_DIR_STARTUP - *
    - * In this scenario notifyProfile should be called - * immediately after initEmbedding. Component - * registration information will be stored in the profile and - * JS components may be stored in the fastload cache. - *
  • - *
  • - * Select a profile some time after calling initEmbedding. - * In this case the embedder must install a directory service - * provider which provides NS_APP_USER_PROFILE_50_DIR and optionally - * NS_APP_USER_PROFILE_LOCAL_50_DIR. Component registration information - * will be stored in the application directory and JS components will not - * fastload. - *
  • - *
- * - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public void notifyProfile() { - try { - gre.notifyProfile(); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - /** - * Initializes XPCOM. You must call this method before proceeding - * to use XPCOM. - * - * @param aMozBinDirectory The directory containing the component - * registry and runtime libraries; - * or use null to use the working - * directory. - * - * @param aAppFileLocProvider The object to be used by Gecko that specifies - * to Gecko where to find profiles, the component - * registry preferences and so on; or use - * null for the default behaviour. - * - * @return the service manager - * - * @throws XPCOMException
    - *
  • NS_ERROR_NOT_INITIALIZED - if static globals were not initialied, - * which can happen if XPCOM is reloaded, but did not completly - * shutdown.
  • - *
  • Other error codes indicate a failure during initialisation.
  • - *
- * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public nsIServiceManager initXPCOM(File aMozBinDirectory, - IAppFileLocProvider aAppFileLocProvider) throws XPCOMException { - try { - return xpcom.initXPCOM(aMozBinDirectory, aAppFileLocProvider); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - /** - * Shutdown XPCOM. You must call this method after you are finished - * using xpcom. - * - * @param aServMgr The service manager which was returned by initXPCOM. - * This will release servMgr. - * - * @throws XPCOMException if a failure occurred during termination - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public void shutdownXPCOM(nsIServiceManager aServMgr) throws XPCOMException { - try { - xpcom.shutdownXPCOM(aServMgr); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } finally { - mozilla = null; - gre = null; - xpcom = null; - } - } - - /** - * Public Method to access to the service manager. - * - * @return the service manager - * - * @throws XPCOMException if a failure occurred - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public nsIServiceManager getServiceManager() throws XPCOMException { - try { - return xpcom.getServiceManager(); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - /** - * Public Method to access to the component manager. - * - * @return the component manager - * - * @throws XPCOMException if a failure occurred - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public nsIComponentManager getComponentManager() throws XPCOMException { - try { - return xpcom.getComponentManager(); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - /** - * Public Method to access to the component registration manager. - * - * @return the component registration manager - * - * @throws XPCOMException if a failure occurred - * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public nsIComponentRegistrar getComponentRegistrar() throws XPCOMException { - try { - return xpcom.getComponentRegistrar(); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - // #ifdef VBOX - public int waitForEvents(long tmo) throws XPCOMException { - try { - return xpcom.waitForEvents(tmo); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - // #endif // VBOX - - /** - * Public Method to create an instance of a nsILocalFile. - * - * @param aPath A string which specifies a full file path to a - * location. Relative paths will be treated as an - * error (NS_ERROR_FILE_UNRECOGNIZED_PATH). - * @param aFollowLinks This attribute will determine if the nsLocalFile will - * auto resolve symbolic links. By default, this value - * will be false on all non unix systems. On unix, this - * attribute is effectively a noop. - * - * @return an instance of an nsILocalFile that points to given path - * - * @throws XPCOMException
    - *
  • NS_ERROR_FILE_UNRECOGNIZED_PATH - raised for unrecognized paths - * or relative paths (must supply full file path)
  • - *
- * @throws XPCOMInitializationException if Mozilla was not properly - * initialized - */ - public nsILocalFile newLocalFile(String aPath, boolean aFollowLinks) - throws XPCOMException { - try { - return xpcom.newLocalFile(aPath, aFollowLinks); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - /** - * If you create a class that implements nsISupports, you will need to provide - * an implementation of the queryInterface method. This helper - * function provides a simple implementation. Therefore, if your class does - * not need to do anything special with queryInterface, your - * implementation would look like: - *
-   *      public nsISupports queryInterface(String aIID) {
-   *        return XPCOM.queryInterface(this, aIID);
-   *      }
-   * 
- * - * @param aObject object to query - * @param aIID requested interface IID - * - * @return aObject if the given object supports that - * interface; - * null otherwise. - */ - public static nsISupports queryInterface(nsISupports aObject, String aIID) { - ArrayList classes = new ArrayList(); - classes.add(aObject.getClass()); - - while (!classes.isEmpty()) { - Class clazz = classes.remove(0); - - // Skip over any class/interface in the "java.*" and "javax.*" domains. - String className = clazz.getName(); - if (className.startsWith("java.") || className.startsWith("javax.")) { - continue; - } - - // If given IID matches that of the current interface, then we - // know that aObject implements the interface specified by the given IID. - if (clazz.isInterface() && className.startsWith("org.mozilla")) { - String iid = Mozilla.getInterfaceIID(clazz); - if (iid != null && aIID.equals(iid)) { - return aObject; - } - } - - // clazz didn't match, so add the interfaces it implements - Class[] interfaces = clazz.getInterfaces(); - for (int i = 0; i < interfaces.length; i++ ) { - classes.add(interfaces[i]); - } - - // Also add its superclass - Class superclass = clazz.getSuperclass(); - if (superclass != null) { - classes.add(superclass); - } - } - - return null; - } - - /** - * Gets the interface IID for a particular Java interface. This is similar - * to NS_GET_IID in the C++ Mozilla files. - * - * @param aInterface interface which has defined an IID - * - * @return IID for given interface - */ - public static String getInterfaceIID(Class aInterface) { - // Get short class name (i.e. "bar", not "org.blah.foo.bar") - StringBuffer iidName = new StringBuffer(); - String fullClassName = aInterface.getName(); - int index = fullClassName.lastIndexOf("."); - String className = index > 0 ? fullClassName.substring(index + 1) - : fullClassName; - - // Create iid field name - if (className.startsWith("ns")) { - iidName.append("NS_"); - iidName.append(className.substring(2).toUpperCase()); - } else { - iidName.append(className.toUpperCase()); - } - iidName.append("_IID"); - - String iid; - try { - Field iidField = aInterface.getDeclaredField(iidName.toString()); - iid = (String) iidField.get(null); - } catch (NoSuchFieldException e) { - // Class may implement non-Mozilla interfaces, which would not have an - // IID method. In that case, just null. - iid = null; - } catch (IllegalAccessException e) { - // Not allowed to access that field for some reason. Write out an - // error message, but don't fail. - System.err.println("ERROR: Could not get field " + iidName.toString()); - iid = null; - } - - return iid; - } - - public long getNativeHandleFromAWT(Object widget) { - try { - return mozilla.getNativeHandleFromAWT(widget); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - public long wrapJavaObject(Object aJavaObject, String aIID) { - try { - return jxutils.wrapJavaObject(aJavaObject, aIID); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - - public Object wrapXPCOMObject(long aXPCOMObject, String aIID) { - try { - return jxutils.wrapXPCOMObject(aXPCOMObject, aIID); - } catch (NullPointerException e) { - throw new XPCOMInitializationException("Must call " + - "Mozilla.getInstance().initialize() before using this method", e); - } - } - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/ProfileLock.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/ProfileLock.java deleted file mode 100755 index f995a38..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/ProfileLock.java +++ /dev/null @@ -1,63 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom; - -public class ProfileLock { - - private long lock = 0; - - public ProfileLock(long aLockObject) { - lock = aLockObject; - } - - public void release() { - releaseNative(lock); - lock = 0; - } - - private native void releaseNative(long aLockObject); - - public boolean isValid() { - return lock != 0; - } - - protected void finalize() throws Throwable { - release(); - super.finalize(); - } - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/VersionComparator.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/VersionComparator.java deleted file mode 100755 index f9fb105..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/VersionComparator.java +++ /dev/null @@ -1,272 +0,0 @@ -/* ***** 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 ***** */ - -package org.mozilla.xpcom; - -import java.util.Enumeration; -import java.util.StringTokenizer; - -import org.mozilla.interfaces.nsISupports; -/* import org.mozilla.interfaces.nsIVersionComparator; */ - - -/** - * Version strings are dot-separated sequences of version-parts. - *

- * A version-part consists of up to four parts, all of which are optional: - *
- * <number-a><string-b><number-c> - * <string-d (everything else)> - *

- * A version-part may also consist of a single asterisk "*" which indicates - * "infinity". - *

- * Numbers are base-10, and are zero if left out. - * Strings are compared bytewise. - *

- * For additional backwards compatibility, if "string-b" is "+" then - * "number-a" is incremented by 1 and "string-b" becomes "pre". - *

- * 1.0pre1
- * < 1.0pre2
- *   < 1.0 == 1.0.0 == 1.0.0.0
- *     < 1.1pre == 1.1pre0 == 1.0+
- *       < 1.1pre1a
- *         < 1.1pre1
- *           < 1.1pre10a
- *             < 1.1pre10
- * 
- * Although not required by this interface, it is recommended that - * numbers remain within the limits of a signed char, i.e. -127 to 128. - */ -public class VersionComparator implements nsISupports /* implements nsIVersionComparator */ { - - public nsISupports queryInterface(String aIID) { - return Mozilla.queryInterface(this, aIID); - } - - /** - * Compare two version strings - * @param A a version string - * @param B a version string - * @return a value less than 0 if A < B; - * the value 0 if A == B; - * or a value greater than 0 if A > B - */ - public int compare(String A, String B) { - int result; - String a = A, b = B; - - do { - VersionPart va = new VersionPart(); - VersionPart vb = new VersionPart(); - a = parseVersionPart(a, va); - b = parseVersionPart(b, vb); - - result = compareVersionPart(va, vb); - if (result != 0) { - break; - } - } while (a != null || b != null); - - return result; - } - - private class VersionPart { - int numA = 0; - String strB; - int numC = 0; - String extraD; - } - - private static String parseVersionPart(String aVersion, VersionPart result) { - if (aVersion == null || aVersion.length() == 0) { - return aVersion; - } - - StringTokenizer tok = new StringTokenizer(aVersion.trim(), "."); - String part = tok.nextToken(); - - if (part.equals("*")) { - result.numA = Integer.MAX_VALUE; - result.strB = ""; - } else { - VersionPartTokenizer vertok = new VersionPartTokenizer(part); - try { - result.numA = Integer.parseInt(vertok.nextToken()); - } catch (NumberFormatException e) { - // parsing error; default to zero like 'strtol' C function - result.numA = 0; - } - - if (vertok.hasMoreElements()) { - String str = vertok.nextToken(); - - // if part is of type "+" - if (str.charAt(0) == '+') { - result.numA++; - result.strB = "pre"; - } else { - // else if part is of type "..." - result.strB = str; - - if (vertok.hasMoreTokens()) { - try { - result.numC = Integer.parseInt(vertok.nextToken()); - } catch (NumberFormatException e) { - // parsing error; default to zero like 'strtol' C function - result.numC = 0; - } - if (vertok.hasMoreTokens()) { - result.extraD = vertok.getRemainder(); - } - } - } - } - } - - if (tok.hasMoreTokens()) { - // return everything after "." - return aVersion.substring(part.length() + 1); - } - return null; - } - - private int compareVersionPart(VersionPart va, VersionPart vb) { - int res = compareInt(va.numA, vb.numA); - if (res != 0) { - return res; - } - - res = compareString(va.strB, vb.strB); - if (res != 0) { - return res; - } - - res = compareInt(va.numC, vb.numC); - if (res != 0) { - return res; - } - - return compareString(va.extraD, vb.extraD); - } - - private int compareInt(int n1, int n2) { - return n1 - n2; - } - - private int compareString(String str1, String str2) { - // any string is *before* no string - if (str1 == null) { - return (str2 != null) ? 1 : 0; - } - - if (str2 == null) { - return -1; - } - - return str1.compareTo(str2); - } - -} - -/** - * Specialized tokenizer for Mozilla version strings. A token can - * consist of one of the four sections of a version string: - * <number-a><string-b><number-c> - * <string-d (everything else)>. - */ -class VersionPartTokenizer implements Enumeration { - - String part; - - public VersionPartTokenizer(String aPart) { - part = aPart; - } - - public boolean hasMoreElements() { - return part.length() != 0; - } - - public boolean hasMoreTokens() { - return part.length() != 0; - } - - public Object nextElement() { - if (part.matches("[\\+\\-]?[0-9].*")) { - // if string starts with a number... - int index = 0; - if (part.charAt(0) == '+' || part.charAt(0) == '-') { - index = 1; - } - - while (index < part.length() && Character.isDigit(part.charAt(index))) { - index++; - } - - String numPart = part.substring(0, index); - part = part.substring(index); - return numPart; - } else { - // ... or if this is the non-numeric part of version string - int index = 0; - while (index < part.length() && !Character.isDigit(part.charAt(index))) { - index++; - } - - String alphaPart = part.substring(0, index); - part = part.substring(index); - return alphaPart; - } - } - - public String nextToken() { - return (String) nextElement(); - } - - /** - * Returns what remains of the original string, without tokenization. This - * method is useful for getting the <string-d (everything else)> - * section of a version string. - * - * @return remaining version string - */ - public String getRemainder() { - return part; - } - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMException.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMException.java deleted file mode 100755 index 9eca58f..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMException.java +++ /dev/null @@ -1,95 +0,0 @@ -/* ***** 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) 2004 - * 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 ***** */ - -package org.mozilla.xpcom; - - -/** - * This exception is thrown whenever an internal XPCOM/Gecko error occurs. - * You can query the error ID returned by XPCOM by checking - * errorcode field. - */ -public class XPCOMException extends RuntimeException { - - /** - * The XPCOM error value. - */ - public long errorcode; - - private static final long serialVersionUID = 198521829884000593L; - - /** - * Constructs a new XPCOMException instance, with a default error - * (NS_ERROR_FAILURE) and message. - */ - public XPCOMException() { - this(0x80004005L, "Unspecified internal XPCOM error"); - } - - /** - * Constructs a new XPCOMException instance with the given message, passing - * NS_ERROR_FAILURE as the error code. - * - * @param message detailed message of exception - */ - public XPCOMException(String message) { - this(0x80004005L, message); - } - - /** - * Constructs a new XPCOMException instance with the given code, passing - * a default message. - * - * @param code internal XPCOM error ID - */ - public XPCOMException(long code) { - this(code, "Internal XPCOM error"); - } - - /** - * Constructs a new XPCOMException instance with an error code and message. - * - * @param code internal XPCOM error ID - * @param message detailed message of exception - */ - public XPCOMException(long code, String message) { - super(message + " (0x" + Long.toHexString(code) + ")"); - this.errorcode = code; - } - -} - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMInitializationException.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMInitializationException.java deleted file mode 100755 index 26ce532..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/XPCOMInitializationException.java +++ /dev/null @@ -1,56 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom; - - -public class XPCOMInitializationException extends RuntimeException { - - private static final long serialVersionUID = -7067350325909231055L; - - public XPCOMInitializationException(String message) { - super(message); - } - - public XPCOMInitializationException(Throwable cause) { - super(cause); - } - - public XPCOMInitializationException(String message, Throwable cause) { - super(message, cause); - } - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/GREImpl.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/GREImpl.java deleted file mode 100755 index 74821c3..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/GREImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom.internal; - -import java.io.File; - -import org.mozilla.xpcom.IAppFileLocProvider; -import org.mozilla.xpcom.IGRE; -import org.mozilla.xpcom.ProfileLock; - - -public class GREImpl implements IGRE { - - public void initEmbedding(File aLibXULDirectory, File aAppDirectory, - IAppFileLocProvider aAppDirProvider) { - initEmbeddingNative(aLibXULDirectory, aAppDirectory, aAppDirProvider); - } - - public native void initEmbeddingNative(File aLibXULDirectory, - File aAppDirectory, IAppFileLocProvider aAppDirProvider); - - public native void termEmbedding(); - - public native ProfileLock lockProfileDirectory(File aDirectory); - - public native void notifyProfile(); - -} - diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/JavaXPCOMMethods.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/JavaXPCOMMethods.java deleted file mode 100755 index ab0ca25..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/JavaXPCOMMethods.java +++ /dev/null @@ -1,104 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom.internal; - -import java.io.File; - -import org.mozilla.xpcom.IJavaXPCOMUtils; - - -public class JavaXPCOMMethods implements IJavaXPCOMUtils { - - public static void registerJavaXPCOMMethods(File aLibXULDirectory) { - // load JNI library - String path = ""; - if (aLibXULDirectory != null) { - path = aLibXULDirectory + File.separator; - } - - if (false) - { - String osName = System.getProperty("os.name").toLowerCase(); - if (osName.startsWith("os/2")) { - System.load(path + System.mapLibraryName("jxpcmglu")); - } else { - System.load(path + System.mapLibraryName("javaxpcomglue")); - } - } else { - // #ifdef VBOX - try { - System.load(path + System.mapLibraryName("vboxjxpcom")); - } catch (java.lang.UnsatisfiedLinkError ule) { - System.loadLibrary("vboxjxpcom"); - } - // #endif - } - registerJavaXPCOMMethodsNative(aLibXULDirectory); - } - - public static native void - registerJavaXPCOMMethodsNative(File aLibXULDirectory); - - /** - * Returns the Class object associated with the class or interface with the - * given string name, using the class loader of the given object. - * - * @param aObject the Java object whose class loader is used to load class - * @param aClassName the fully qualified name of desired class - * @return the Class object of requested Class; null if the - * class was not found - * - * @see http://java.sun.com/j2se/1.3/docs/guide/jni/jni-12.html#classops - */ - public static Class findClassInLoader(Object aObject, String aClassName) { - try { - if (aObject == null) { - return Class.forName(aClassName); - } else { - return Class.forName(aClassName, true, - aObject.getClass().getClassLoader()); - } - } catch (ClassNotFoundException e) { - return null; - } - } - - public native long wrapJavaObject(Object aJavaObject, String aIID); - - public native Object wrapXPCOMObject(long aXPCOMObject, String aIID); - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/MozillaImpl.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/MozillaImpl.java deleted file mode 100755 index 27fd948..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/MozillaImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom.internal; - -import java.io.File; - -import org.mozilla.xpcom.IMozilla; -import org.mozilla.xpcom.XPCOMInitializationException; - -public class MozillaImpl implements IMozilla { - - public void initialize(File aLibXULDirectory) - throws XPCOMInitializationException { - JavaXPCOMMethods.registerJavaXPCOMMethods(aLibXULDirectory); - initializeNative(); - } - - private native void initializeNative(); - - public native long getNativeHandleFromAWT(Object widget); - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMImpl.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMImpl.java deleted file mode 100755 index 1111a9e..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* ***** 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) 2006 - * 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 ***** */ - -package org.mozilla.xpcom.internal; - -import java.io.File; - -import org.mozilla.xpcom.IAppFileLocProvider; -import org.mozilla.xpcom.IXPCOM; - -import org.mozilla.interfaces.nsIComponentManager; -import org.mozilla.interfaces.nsIComponentRegistrar; -import org.mozilla.interfaces.nsILocalFile; -import org.mozilla.interfaces.nsIServiceManager; - - -public class XPCOMImpl implements IXPCOM { - - public nsIServiceManager initXPCOM(File aMozBinDirectory, - IAppFileLocProvider aAppFileLocProvider) { - return initXPCOMNative(aMozBinDirectory, aAppFileLocProvider); - } - - public native nsIServiceManager initXPCOMNative(File aMozBinDirectory, - IAppFileLocProvider aAppFileLocProvider); - - public native void shutdownXPCOM(nsIServiceManager aServMgr); - - public native nsIComponentManager getComponentManager(); - - public native nsIComponentRegistrar getComponentRegistrar(); - - public native nsIServiceManager getServiceManager(); - - public native nsILocalFile newLocalFile(String aPath, boolean aFollowLinks); - - // #ifdef VBOX - public native int waitForEvents(long timeout); - // #endif VBOX -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxy.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxy.java deleted file mode 100755 index c648570..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxy.java +++ /dev/null @@ -1,257 +0,0 @@ -/* ***** 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) 2004 - * 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 ***** */ - -package org.mozilla.xpcom.internal; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -import org.mozilla.xpcom.XPCOMException; - - -/** - * This class is used to pass XPCOM objects to Java functions. A - * java.lang.reflect.Proxy instance is created using the expected - * interface, and all calls to the proxy are forwarded to the XPCOM object. - */ -public class XPCOMJavaProxy implements InvocationHandler { - - /** - * Pointer to the XPCOM object for which we are a proxy. - */ - protected long nativeXPCOMPtr; - - /** - * Default constructor. - * - * @param aXPCOMInstance address of XPCOM object as a long - */ - public XPCOMJavaProxy(long aXPCOMInstance) { - nativeXPCOMPtr = aXPCOMInstance; - } - - /** - * Returns the XPCOM object that the given proxy references. - * - * @param aProxy Proxy created by createProxy - * - * @return address of XPCOM object as a long - */ - protected static long getNativeXPCOMInstance(Object aProxy) { - XPCOMJavaProxy proxy = (XPCOMJavaProxy) Proxy.getInvocationHandler(aProxy); - return proxy.nativeXPCOMPtr; - } - - /** - * Creates a Proxy for the given XPCOM object. - * - * @param aInterface interface from which to create Proxy - * @param aXPCOMInstance address of XPCOM object as a long - * - * @return Proxy of given XPCOM object - */ - protected static Object createProxy(Class aInterface, long aXPCOMInstance) { - // XXX We should really get the class loader from |aInterface|. However, - // that class loader doesn't know about |XPCOMJavaProxyBase|. So for - // now, we get the class loader that loaded |XPCOMJavaProxy|. When - // we get rid of the "XPCOMJavaProxyBase.java" class, we can revert - // to the old method below. -// return Proxy.newProxyInstance(aInterface.getClassLoader(), - return Proxy.newProxyInstance(XPCOMJavaProxy.class.getClassLoader(), - new Class[] { aInterface, XPCOMJavaProxyBase.class }, - new XPCOMJavaProxy(aXPCOMInstance)); - } - - /** - * All calls to the Java proxy are forwarded to this method. This method - * takes care of a few of the Object method calls; all other - * calls are forwarded to the XPCOM object. - * - * @param aProxy Proxy created by createProxy - * @param aMethod object that describes the called method - * @param aParams array of the arguments passed to the method - * - * @return return value as defined by given aMethod - */ - public Object invoke(Object aProxy, Method aMethod, Object[] aParams) - throws Throwable { - String methodName = aMethod.getName(); - - // Handle the three java.lang.Object methods that are passed to us. - if (aMethod.getDeclaringClass() == Object.class) { - if (methodName.equals("hashCode")) { - return proxyHashCode(aProxy); - } - if (methodName.equals("equals")) { - return proxyEquals(aProxy, aParams[0]); - } - if (methodName.equals("toString")) { - return proxyToString(aProxy); - } - System.err.println("WARNING: Unhandled Object method [" + - methodName + "]"); - return null; - } - - // Handle the 'finalize' method called during garbage collection - if (aMethod.getDeclaringClass() == XPCOMJavaProxyBase.class) { - if (methodName.equals("finalize")) { - finalizeProxy(aProxy); - } else { - System.err.println("WARNING: Unhandled XPCOMJavaProxyBase method [" + - methodName + "]"); - } - return null; - } - - // If not already handled, pass method calls to XPCOM object. - return callXPCOMMethod(aProxy, methodName, aParams); - } - - /** - * Handles method calls of java.lang.Object.hashCode - * - * @param aProxy Proxy created by createProxy - * - * @return Integer object representing hash code of given object - * - * @see Object#hashCode() - */ - protected static Integer proxyHashCode(Object aProxy) { - return new Integer(System.identityHashCode(aProxy)); - } - - /** - * Handles method calls of java.lang.Object.equals - * - * @param aProxy Proxy created by createProxy - * @param aOther another object - * - * @return true if the given objects are the same; - * false otherwise - * - * @see Object#equals(Object) - */ - protected static Boolean proxyEquals(Object aProxy, Object aOther) { - // See if the two are the same Java object - if (aProxy == aOther) { - return Boolean.TRUE; - } else { - // If not, then see if they represent the same XPCOM object. But first, - // we need to check if |aOther| is an XPCOMJavaProxy. - if (isXPCOMJavaProxy(aOther) && isSameXPCOMObject(aProxy, aOther)) { - return Boolean.TRUE; - } - } - return Boolean.FALSE; - } - - /** - * Indicates whether the given object is an XPCOMJavaProxy. - * - * @param aObject object to check - * - * @return true if the given object is an XPCOMJavaProxy; - * false otherwise - */ - protected static boolean isXPCOMJavaProxy(Object aObject) { - if (aObject != null && Proxy.isProxyClass(aObject.getClass())) { - InvocationHandler h = Proxy.getInvocationHandler(aObject); - if (h instanceof XPCOMJavaProxy) { - return true; - } - } - return false; - } - - /** - * Checks if the two given XPCOMJavaProxy objects are proxies for - * the same XPCOM object. - * - * @param aProxy1 XPCOMJavaProxy created by createProxy - * @param aProxy2 XPCOMJavaProxy created by createProxy - * - * @return true if both proxies represent the same XPCOM object; - * false otherwise - */ - protected static native boolean isSameXPCOMObject(Object aProxy1, - Object aProxy2); - - /** - * Handles method calls of java.lang.Object.toString - * - * @param aProxy Proxy created by createProxy - * - * @return String representation of given object - * - * @see Object#toString() - */ - protected static String proxyToString(Object aProxy) { - return aProxy.getClass().getInterfaces()[0].getName() + '@' + - Integer.toHexString(aProxy.hashCode()); - } - - /** - * Called when the proxy is garbage collected by the JVM. Allows us to clean - * up any references to the XPCOM object. - * - * @param aProxy reference to Proxy that is being garbage collected - */ - protected void finalizeProxy(Object aProxy) throws Throwable { - finalizeProxyNative(aProxy); - super.finalize(); - } - - protected static native void finalizeProxyNative(Object aProxy); - - /** - * Calls the XPCOM object referenced by the proxy with the given method. - * - * @param aProxy Proxy created by createProxy - * @param aMethodName name of method that we want to call - * @param aParams array of params passed to method - * - * @return return value as defined by given method - * - * @exception XPCOMException if XPCOM method failed. Values of XPCOMException - * are defined by the method called. - */ - protected static native Object callXPCOMMethod(Object aProxy, - String aMethodName, Object[] aParams); - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxyBase.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxyBase.java deleted file mode 100755 index 595a7a2..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/mozilla/xpcom/internal/XPCOMJavaProxyBase.java +++ /dev/null @@ -1,53 +0,0 @@ -/* ***** 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) 2004 - * 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 ***** */ - -package org.mozilla.xpcom.internal; - - -/** - * This interface forms the foundation of any XPCOMJavaProxy that is created. - * It allows us to handle any JVM calls to finalize when the Proxy - * is garbage collected. - */ -public interface XPCOMJavaProxyBase { - - /** - * @see java.lang.Object#finalize() - */ - void finalize() throws Throwable; - -} diff --git a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/virtualbox/VBoxObjectBase.java b/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/virtualbox/VBoxObjectBase.java deleted file mode 100755 index 7a01dd4..0000000 --- a/VirtualBox-5.2.14/src/libs/xpcom18a4/java/src/org/virtualbox/VBoxObjectBase.java +++ /dev/null @@ -1,21 +0,0 @@ -/* $Id: VBoxObjectBase.java $ */ -/* - * Copyright (C) 2010 Oracle Corporation - * - * This file is part of VirtualBox Open Source Edition (OSE), as - * available from http://www.virtualbox.org. This file is free software; - * you can redistribute it and/or modify it under the terms of the GNU - * General Public License (GPL) as published by the Free Software - * Foundation, in version 2 as it comes in the "COPYING" file of the - * VirtualBox OSE distribution. VirtualBox OSE is distributed in the - * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. - */ -import org.mozilla.interfaces.nsISupports; - -public abstract class VBoxObjectBase implements nsISupports -{ - public nsISupports queryInterface(String iid) - { - return org.mozilla.xpcom.Mozilla.queryInterface(this, iid); - } -} diff --git a/VirtualComputer/fix/IDisplaySourceBitmap.class b/VirtualComputer/fix/IDisplaySourceBitmap.class new file mode 100644 index 0000000000000000000000000000000000000000..e22aab7245e7ccbe1ac26593994b7bc362c8f202 GIT binary patch literal 382 zcmZ{gPfG$(6vfX~b4)YMRc>2^64S(JrL^)-!4pGiN{ANmW_&Y@jBlp-6Ik@cTJ!<> zP|=hNH^t>};CDHf!~Ohv{{Wz)reIe=MM0IY&xXvHj(hjUB zKP8Qa(Po-6LecP(&=Oa!CkS;mbfduIt2JCFkADgfj{MNkmi~+Dd0ca4EJB-GBGUef z5UQKj6LTS~m~imV0U0qP2?9TiBf{b9iFw|cb789Xscx(7mf2OiUC~k7yk+V7nPm!n m{+1^YGO4nu>d0X$^?dr*3>0K?gaWpK)Qc#kl(6%=D}MtfHf1aT literal 0 HcmV?d00001 diff --git a/VirtualComputer/fix/README b/VirtualComputer/fix/README new file mode 100644 index 0000000..e2322da --- /dev/null +++ b/VirtualComputer/fix/README @@ -0,0 +1,3 @@ +If a new version is released, copy this to the JAR into org/mozilla/interfaces +This fixes the source bitmap pointer return type in the Java API. + diff --git a/VirtualComputer/pom.xml b/VirtualComputer/pom.xml index 353b19d..53187c5 100644 --- a/VirtualComputer/pom.xml +++ b/VirtualComputer/pom.xml @@ -67,7 +67,7 @@ org.virtualbox VirtualBox - 5.2 + 6.0 org.bukkit diff --git a/VirtualComputer/repo/org/virtualbox/VirtualBox/6.0/VirtualBox-6.0.jar b/VirtualComputer/repo/org/virtualbox/VirtualBox/6.0/VirtualBox-6.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..3c8983d9701b6d6218f26b1dfa0467e21b290eab GIT binary patch literal 546193 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 ^{6cY3=ZCUwDQecHDw4Bcp=r|f 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 z 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%0A&xSfpe+SE}yfpa9|v>>`?eI?|o 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 literal 0 HcmV?d00001 diff --git a/VirtualComputer/repo/org/virtualbox/VirtualBox/6.0/VirtualBox-6.0.pom b/VirtualComputer/repo/org/virtualbox/VirtualBox/6.0/VirtualBox-6.0.pom new file mode 100644 index 0000000..9b7d6af --- /dev/null +++ b/VirtualComputer/repo/org/virtualbox/VirtualBox/6.0/VirtualBox-6.0.pom @@ -0,0 +1,10 @@ + + + 4.0.0 + org.virtualbox + VirtualBox + 6.0 + POM was created from install:install-file + diff --git a/VirtualComputer/repo/org/virtualbox/VirtualBox/maven-metadata-local.xml b/VirtualComputer/repo/org/virtualbox/VirtualBox/maven-metadata-local.xml index 43695dd..ea3d226 100644 --- a/VirtualComputer/repo/org/virtualbox/VirtualBox/maven-metadata-local.xml +++ b/VirtualComputer/repo/org/virtualbox/VirtualBox/maven-metadata-local.xml @@ -3,11 +3,12 @@ org.virtualbox VirtualBox - 5.2 + 6.0 5.1 5.2 + 6.0 - 20171219203228 + 20181221211412 diff --git a/VirtualComputer/src/sznp/virtualcomputer/MCFrameBuffer.java b/VirtualComputer/src/sznp/virtualcomputer/MCFrameBuffer.java index 9bb7cbf..bc978ba 100644 --- a/VirtualComputer/src/sznp/virtualcomputer/MCFrameBuffer.java +++ b/VirtualComputer/src/sznp/virtualcomputer/MCFrameBuffer.java @@ -7,7 +7,7 @@ import org.mozilla.interfaces.IFramebuffer; import org.mozilla.interfaces.IFramebufferOverlay; import org.mozilla.interfaces.nsISupports; import org.mozilla.xpcom.Mozilla; -import org.virtualbox_5_2.*; +import org.virtualbox_6_0.*; import java.util.Arrays; diff --git a/VirtualComputer/src/sznp/virtualcomputer/PluginMain.java b/VirtualComputer/src/sznp/virtualcomputer/PluginMain.java index 0fff19f..d2d95fa 100644 --- a/VirtualComputer/src/sznp/virtualcomputer/PluginMain.java +++ b/VirtualComputer/src/sznp/virtualcomputer/PluginMain.java @@ -7,7 +7,7 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; -import org.virtualbox_5_2.*; +import org.virtualbox_6_0.*; import javax.annotation.Nullable; import java.io.File; @@ -40,6 +40,7 @@ public class PluginMain extends JavaPlugin { ? "/Applications/VirtualBox.app/Contents/MacOS" : "/opt/virtualbox"; File f = new File(vbpath); + //noinspection ConstantConditions if (!f.isDirectory() || Arrays.stream(f.list()).noneMatch(s -> s.contains("xpcom"))) vbpath = "/usr/lib/virtualbox"; if (System.getProperty("vbox.home") == null || System.getProperty("vbox.home").isEmpty()) @@ -132,8 +133,6 @@ public class PluginMain extends JavaPlugin { }); } - public static int MouseSpeed = 1; - public void Stop(CommandSender sender) { if (checkMachineNotRunning(sender)) { if (session.getState().equals(SessionState.Locked)) { @@ -202,10 +201,16 @@ public class PluginMain extends JavaPlugin { durationorstate = -2; else durationorstate = Short.parseShort(stateorduration); - int code = 0; + int code; + try { + code = Scancode.valueOf("sc_" + key.toLowerCase()).Code; + } catch (IllegalArgumentException e) { + sender.sendMessage("§cUnknown key: " + key); + return; + } // Release key scan code concept taken from VirtualBox source code (KeyboardImpl.cpp:putCAD()) // +128 - if (durationorstate != 2) + if (durationorstate != -2) session.getConsole().getKeyboard().putScancode(code); Runnable sendrelease = () -> session.getConsole().getKeyboard().putScancodes(Lists.newArrayList(code + 128, Scancode.sc_controlLeft.Code + 128, Scancode.sc_shiftLeft.Code + 128, Scancode.sc_altLeft.Code + 128)); diff --git a/VirtualComputer/src/sznp/virtualcomputer/Scancode.java b/VirtualComputer/src/sznp/virtualcomputer/Scancode.java index 2a4a623..409e727 100644 --- a/VirtualComputer/src/sznp/virtualcomputer/Scancode.java +++ b/VirtualComputer/src/sznp/virtualcomputer/Scancode.java @@ -8,68 +8,69 @@ The scancode values come from: - reading win32 WM_INPUT keyboard messages. */ +@SuppressWarnings("unused") enum Scancode { // https://handmade.network/forums/t/2011-keyboard_inputs_-_scancodes,_raw_input,_text_input,_key_names sc_escape(0x01), sc_1(0x02), sc_2(0x03), sc_3(0x04), sc_4(0x05), sc_5(0x06), sc_6(0x07), sc_7(0x08), sc_8( 0x09), sc_9(0x0A), sc_0(0x0B), sc_minus(0x0C), sc_equals(0x0D), sc_backspace(0x0E), sc_tab(0x0F), sc_q( - 0x10), sc_w(0x11), sc_e(0x12), sc_r(0x13), sc_t(0x14), sc_y(0x15), sc_u(0x16), sc_i(0x17), sc_o( - 0x18), sc_p(0x19), sc_bracketLeft(0x1A), sc_bracketRight(0x1B), sc_enter( - 0x1C), sc_controlLeft(0x1D), sc_a(0x1E), sc_s(0x1F), sc_d( - 0x20), sc_f(0x21), sc_g(0x22), sc_h(0x23), sc_j(0x24), sc_k(0x25), sc_l( - 0x26), sc_semicolon(0x27), sc_apostrophe(0x28), sc_grave( - 0x29), sc_shiftLeft(0x2A), sc_backslash(0x2B), sc_z( - 0x2C), sc_x(0x2D), sc_c(0x2E), sc_v(0x2F), sc_b( - 0x30), sc_n(0x31), sc_m(0x32), sc_comma( - 0x33), sc_preiod(0x34), sc_slash( - 0x35), sc_shiftRight( - 0x36), sc_numpad_multiply( - 0x37), sc_altLeft( - 0x38), sc_space( - 0x39), sc_capsLock( - 0x3A), sc_f1( - 0x3B), sc_f2( - 0x3C), sc_f3( - 0x3D), sc_f4( - 0x3E), sc_f5( - 0x3F), sc_f6( - 0x40), sc_f7( - 0x41), sc_f8( - 0x42), sc_f9( - 0x43), sc_f10( - 0x44), sc_numLock( - 0x45), sc_scrollLock( - 0x46), sc_numpad_7( - 0x47), sc_numpad_8( - 0x48), sc_numpad_9( - 0x49), sc_numpad_minus( - 0x4A), sc_numpad_4( - 0x4B), sc_numpad_5( - 0x4C), sc_numpad_6( - 0x4D), sc_numpad_plus( - 0x4E), sc_numpad_1( - 0x4F), sc_numpad_2( - 0x50), sc_numpad_3( - 0x51), sc_numpad_0( - 0x52), sc_numpad_period( - 0x53), sc_alt_printScreen( - 0x54), /* - * Alt - * + - * print - * screen. - * MapVirtualKeyEx( - * VK_SNAPSHOT - * ) - * , - * MAPVK_VK_TO_VSC_EX - * ) - * , - * 0 - * ) - * returns - * scancode - * 0x54. - */ + 0x10), sc_w(0x11), sc_e(0x12), sc_r(0x13), sc_t(0x14), sc_y(0x15), sc_u(0x16), sc_i(0x17), sc_o( + 0x18), sc_p(0x19), sc_bracketLeft(0x1A), sc_bracketRight(0x1B), sc_enter( + 0x1C), sc_controlLeft(0x1D), sc_a(0x1E), sc_s(0x1F), sc_d( + 0x20), sc_f(0x21), sc_g(0x22), sc_h(0x23), sc_j(0x24), sc_k(0x25), sc_l( + 0x26), sc_semicolon(0x27), sc_apostrophe(0x28), sc_grave( + 0x29), sc_shiftLeft(0x2A), sc_backslash(0x2B), sc_z( + 0x2C), sc_x(0x2D), sc_c(0x2E), sc_v(0x2F), sc_b( + 0x30), sc_n(0x31), sc_m(0x32), sc_comma( + 0x33), sc_preiod(0x34), sc_slash( + 0x35), sc_shiftRight( + 0x36), sc_numpad_multiply( + 0x37), sc_altLeft( + 0x38), sc_space( + 0x39), sc_capsLock( + 0x3A), sc_f1( + 0x3B), sc_f2( + 0x3C), sc_f3( + 0x3D), sc_f4( + 0x3E), sc_f5( + 0x3F), sc_f6( + 0x40), sc_f7( + 0x41), sc_f8( + 0x42), sc_f9( + 0x43), sc_f10( + 0x44), sc_numLock( + 0x45), sc_scrollLock( + 0x46), sc_numpad_7( + 0x47), sc_numpad_8( + 0x48), sc_numpad_9( + 0x49), sc_numpad_minus( + 0x4A), sc_numpad_4( + 0x4B), sc_numpad_5( + 0x4C), sc_numpad_6( + 0x4D), sc_numpad_plus( + 0x4E), sc_numpad_1( + 0x4F), sc_numpad_2( + 0x50), sc_numpad_3( + 0x51), sc_numpad_0( + 0x52), sc_numpad_period( + 0x53), sc_alt_printScreen( + 0x54), /* + * Alt + * + + * print + * screen. + * MapVirtualKeyEx( + * VK_SNAPSHOT + * ) + * , + * MAPVK_VK_TO_VSC_EX + * ) + * , + * 0 + * ) + * returns + * scancode + * 0x54. + */ sc_bracketAngle(0x56), /* Key between the left shift and Z. */ sc_f11(0x57), sc_f12(0x58), sc_oem_1(0x5a), /* VK_OEM_WSCTRL */ sc_oem_2(0x5b), /* VK_OEM_FINISH */ @@ -78,25 +79,25 @@ enum Scancode { // https://handmade.network/forums/t/2011-keyboard_inputs_-_scan sc_oem_5(0x5f), /* VK_OEM_AUTO */ sc_zoom(0x62), sc_help(0x63), sc_f13(0x64), sc_f14(0x65), sc_f15(0x66), sc_f16(0x67), sc_f17(0x68), sc_f18( 0x69), sc_f19( - 0x6a), sc_f20(0x6b), sc_f21(0x6c), sc_f22(0x6d), sc_f23(0x6e), sc_oem_6(0x6f), /* VK_OEM_PA3 */ + 0x6a), sc_f20(0x6b), sc_f21(0x6c), sc_f22(0x6d), sc_f23(0x6e), sc_oem_6(0x6f), /* VK_OEM_PA3 */ sc_katakana(0x70), sc_oem_7(0x71), /* VK_OEM_RESET */ sc_f24(0x76), sc_sbcschar(0x77), sc_convert(0x79), sc_nonconvert(0x7B), /* VK_OEM_PA1 */ sc_media_previous(0xE010), sc_media_next(0xE019), sc_numpad_enter(0xE01C), sc_controlRight(0xE01D), sc_volume_mute( 0xE020), sc_launch_app2(0xE021), sc_media_play(0xE022), sc_media_stop( - 0xE024), sc_volume_down(0xE02E), sc_volume_up( - 0xE030), sc_browser_home(0xE032), sc_numpad_divide(0xE035), sc_printScreen(0xE037), + 0xE024), sc_volume_down(0xE02E), sc_volume_up( + 0xE030), sc_browser_home(0xE032), sc_numpad_divide(0xE035), sc_printScreen(0xE037), /* * sc_printScreen: - make: 0xE02A 0xE037 - break: 0xE0B7 0xE0AA - MapVirtualKeyEx( VK_SNAPSHOT), MAPVK_VK_TO_VSC_EX), 0 ) returns scancode 0x54; - There is no VK_KEYDOWN with VK_SNAPSHOT. */ sc_altRight(0xE038), sc_cancel(0xE046), /* CTRL + Pause */ sc_home(0xE047), sc_arrowUp(0xE048), sc_pageUp(0xE049), sc_arrowLeft(0xE04B), sc_arrowRight(0xE04D), sc_end( 0xE04F), sc_arrowDown(0xE050), sc_pageDown(0xE051), sc_insert(0xE052), sc_delete(0xE053), sc_metaLeft( - 0xE05B), sc_metaRight(0xE05C), sc_application(0xE05D), sc_power(0xE05E), sc_sleep(0xE05F), sc_wake( - 0xE063), sc_browser_search(0xE065), sc_browser_favorites(0xE066), sc_browser_refresh( - 0xE067), sc_browser_stop(0xE068), sc_browser_forward(0xE069), sc_browser_back( - 0xE06A), sc_launch_app1( - 0xE06B), sc_launch_email(0xE06C), sc_launch_media(0xE06D), + 0xE05B), sc_metaRight(0xE05C), sc_application(0xE05D), sc_power(0xE05E), sc_sleep(0xE05F), sc_wake( + 0xE063), sc_browser_search(0xE065), sc_browser_favorites(0xE066), sc_browser_refresh( + 0xE067), sc_browser_stop(0xE068), sc_browser_forward(0xE069), sc_browser_back( + 0xE06A), sc_launch_app1( + 0xE06B), sc_launch_email(0xE06C), sc_launch_media(0xE06D), sc_pause(0xE11D45); /* @@ -111,4 +112,4 @@ enum Scancode { // https://handmade.network/forums/t/2011-keyboard_inputs_-_scan Scancode(int code) { Code = code; } -}; \ No newline at end of file +} \ No newline at end of file