/* ***** 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 InnoTek Plugin Wrapper code. * * The Initial Developer of the Original Code is * InnoTek Systemberatung GmbH. * Portions created by the Initial Developer are Copyright (C) 2003-2005 * the Initial Developer. All Rights Reserved. * * Contributor(s): * InnoTek Systemberatung GmbH / Knut St. Osmundsen * Peter Weilbacher * * 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 ***** */ /* * XPCOM Plugin Interface */ /******************************************************************************* * Header Files * *******************************************************************************/ # ifdef IPLUGINW_OUTOFTREE # ifdef __IBMCPP__ # include "moz_VACDefines.h" # else # include "moz_GCCDefines.h" # endif # endif #define INCL_DOSSEMAPHORES #define INCL_DOSMODULEMGR #define INCL_ERRORS #define INCL_PM #include #include /* the headers */ #include "npapi.h" #include "npupp.h" #include "nscore.h" #include "nsError.h" #include "nsDebug.h" #include "nsID.h" #include "nsrootidl.h" #include "nsISupports.h" #include "nsISupportsBase.h" #include "nsISupportsImpl.h" #include "nsISupportsUtils.h" #include "nsIClassInfo.h" #include "nsIFile.h" #include "nsIEnumerator.h" #include "nsCOMPtr.h" #include "nsIServiceManager.h" #include "nsIServiceManagerObsolete.h" #include "nsIComponentManagerObsolete.h" #include "nsIComponentManager.h" #include "nsIFactory.h" #include "nsIMemory.h" #include "nsIOutputStream.h" #include "nsIRequestObserver.h" #include "nsIStreamListener.h" #include "nspluginroot.h" #include "nsplugindefs.h" #include "nsIPlugin.h" #include "nsIPluginManager.h" #include "nsIEventHandler.h" #include "nsIPluginManager2.h" #include "nsIPluginStreamInfo.h" #include "nsIPluginStreamListener.h" #include "nsIPluginInstance.h" #include "nsIPluginInstancePeer.h" #include "nsIPluginInstancePeer2.h" #include "nsIPluginTagInfo.h" #include "nsIPluginTagInfo2.h" #include "nsICookieStorage.h" #include "nsIHTTPHeaderListener.h" #include "nsIJRIPlugin.h" #include "nsIJVMPluginInstance.h" #include "nsIJVMManager.h" #include "nsIJVMWindow.h" #include "nsIJVMConsole.h" #include "nsISerializable.h" #include "nsIPrincipal.h" #include "nsIJVMPlugin.h" #include "nsIJVMPluginTagInfo.h" #include "nsIJVMPrefsWindow.h" #include "nsILiveConnectManager.h" #include "nsISecurityContext.h" #include "nsILiveConnect.h" #include "nsISecureLiveConnect.h" #include "nsISecureEnv.h" #include "nsISymantecDebugger.h" #include "nsISymantecDebugManager.h" #include "nsIJVMThreadManager.h" #include "nsIRunnable.h" #include "nsIJVMConsole.h" #include "nsILoadGroup.h" #include "nsIInterfaceRequestor.h" #ifdef IPLUGINW_OUTOFTREE #include "nsStringDefines.h" #include "nsStringFwd.h" #include "nsBufferHandle.h" #include "nsStringIteratorUtils.h" #include "nsCharTraits.h" #include "nsStringFragment.h" #include "nsCharTraits.h" #include "nsStringTraits.h" #include "nsAlgorithm.h" #include "nsStringIterator.h" #include "nsAString.h" #endif #include "domstubs.h" #include "nsIDOM3Node.h" #include "nsIDOMNode.h" #include "nsIDOMElement.h" #include "prlink.h" #include "nsInnoTekPluginWrapper.h" #include "wrap_XPCOM_3rdparty.h" #include "wrap_VFTs.h" /******************************************************************************* * Defined Constants And Macros * *******************************************************************************/ /** Define DO_EXTRA_FAILURE_HANDLING and we'll zero some return buffers. */ #define DO_EXTRA_FAILURE_HANDLING /** Breakpoing macro */ #ifdef __IBMCPP__ # define BREAK_POINT() __interrupt(3) #else # define BREAK_POINT() asm("int $3") #endif /** Global breakpoint trigger. */ #ifdef DEBUG # define DEBUG_GLOBAL_BREAKPOINT(cond) do { if (gfGlobalBreakPoint && (cond)) BREAK_POINT(); } while (0) #else # define DEBUG_GLOBAL_BREAKPOINT(cond) do {} while (0) #endif /** Function define to use. */ #ifdef __IBMCPP__ #define XPFUNCTION __FUNCTION__ #else #define XPFUNCTION __PRETTY_FUNCTION__ #endif /** Function name variable. */ #ifdef DEBUG # define DEBUG_FUNCTIONNAME() static const char *pszFunction = XPFUNCTION #else # define DEBUG_FUNCTIONNAME() do {} while (0) #endif /** Creates a 'safe' VFT, meaning we add a bunch of empty entries at the end * of the VFT just in case someone is trying to access them. */ #define MAKE_SAFE_VFT(VFTType, name) \ const struct VFTType##WithPaddings \ { \ const VFTType vft; \ unsigned aulNulls[10]; \ } name = { /** The NULL padding of the safe VFT. */ //#define SAFE_VFT_ZEROS() 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 #define SAFE_VFT_ZEROS() ,{ 0x81000001, 0x81000002, 0x81000003, 0x81000004, \ 0x81000005, 0x81000006, 0x81000007, 0x81000008, 0x81000009, 0x8100000a} } /** dprintf a nsID structure (reference to such). */ #define DPRINTF_NSID(refID) \ if (VALID_REF(refID)) \ dprintf(("%s: %s={%08x,%04x,%04x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x} %s (%p)", \ pszFunction, #refID, (refID).m0, (refID).m1, (refID).m2, (refID).m3[0], (refID).m3[1], \ (refID).m3[2], (refID).m3[3], (refID).m3[4], (refID).m3[5], (refID).m3[6], (refID).m3[7], \ getIIDCIDName(refID), &(refID))); \ else \ dprintf(("%s: %s=%p (illegal pointer!!!)", pszFunction, #refID, &(refID))) /** dprintf a contract ID. */ #define DPRINTF_CONTRACTID(pszContractID) \ DPRINTF_STR(pszContractID) /** safely dprintf a string. */ #define DPRINTF_STR(pszStr) \ do \ { \ if (VALID_PTR(pszStr)) \ dprintf(("%s: %s='%s' (%p)", pszFunction, #pszStr, pszStr, pszStr)); \ else if (pszStr) \ dprintf(("%s: %s=%p (illegal pointer!!!)", pszFunction, #pszStr, pszStr));\ else \ dprintf(("%s: %s=", pszFunction, #pszStr)); \ } while (0) /** safely dprintf a string, if it's NULL it will be ignored. */ #define DPRINTF_STRNULL(pszStr) \ do \ { \ if (VALID_PTR(pszStr)) \ dprintf(("%s: %s='%s' (%p)", pszFunction, #pszStr, pszStr, pszStr)); \ else if (pszStr) \ dprintf(("%s: %s=%p (illegal pointer!!!)", pszFunction, #pszStr, pszStr)); \ } while (0) /** Debugging thing for stack corruption. */ #if defined(DEBUG) && 0 #define DEBUG_STACK_ENTER() \ void * pvStackGuard = memset(alloca(sizeof(achDebugStack)), 'k', sizeof(achDebugStack)) #else #define DEBUG_STACK_ENTER() do {} while (0) #endif /** Debugging thing for stack corruption. */ #if defined(DEBUG) && 0 static char achDebugStack[0x1000]; #define DEBUG_STACK_LEAVE() \ do { \ if (achDebugStack[0] != 'k') \ memset(achDebugStack, 'k', sizeof(achDebugStack)); \ if (memcmp(achDebugStack, pvStackGuard, sizeof(achDebugStack))) \ { \ dprintf(("%s: ARRRRRRRRRGGGGGGGGGGG!!!!!!!! Stack is f**ked !!!", pszFunction)); \ DebugInt3(); \ } \ } while (0) #else #define DEBUG_STACK_LEAVE() do {} while (0) #endif /** Save the FPU control word. */ #define SAVELOAD_FPU_CW(usNewCw) \ unsigned short usSavedCw = _control87(usNewCw, 0xffff) /** Restore the FPU control word. */ #define RESTORE_FPU_CW() \ _control87(usSavedCw, 0xffff) /** Make a interface pointer pMozI from a DOWNTHIS pointer. */ #define DOWN_MAKE_pMozI(interface, pvDownThis) \ interface *pMozI = (interface *)((PDOWNTHIS)pvDownThis)->pvThis /** Test and assert that the down this pointer is valid. */ #define DOWN_VALID(pvDownThis) \ ( VALID_PTR(pvDownThis) \ && !memcmp(&((PDOWNTHIS)(pvDownThis))->achMagic[0], gszDownMagicString, sizeof(gszDownMagicString)) ) /** Validate the down this pointer, complaing and returning error code if invalid. */ #define DOWN_VALIDATE_RET(pvDownThis) \ if (!DOWN_VALID(pvDownThis)) \ { \ dprintf(("%s: invalid this pointer %p!", pszFunction, pvDownThis)); \ DebugInt3(); \ DOWN_TRACE_LEAVE_INT(pvDownThis, NS_ERROR_INVALID_POINTER); \ return NS_ERROR_INVALID_POINTER; \ } /** Validate the down this pointer, complaing and returning error code if invalid. */ #define DOWN_VALIDATE_NORET(pvDownThis) \ if (!DOWN_VALID(pvDownThis)) \ { \ dprintf(("%s: invalid this pointer %p!", pszFunction, pvDownThis)); \ DebugInt3(); \ } /** Enter a DOWN worker. */ #define DOWN_TRACE_ENTER(pvDownThis) \ dprintf(("%s: enter this=%p (down)", pszFunction, pvDownThis)); /** Default DOWN enter code. */ #define DOWN_ENTER(pvDownThis, interface) \ DEBUG_STACK_ENTER(); \ DEBUG_FUNCTIONNAME(); \ DOWN_TRACE_ENTER(pvDownThis); \ DOWN_VALIDATE_RET(pvDownThis); \ DOWN_MAKE_pMozI(interface, pvDownThis); \ DEBUG_GLOBAL_BREAKPOINT(1); /** No-return DOWN enter code. */ #define DOWN_ENTER_NORET(pvDownThis, interface) \ DEBUG_STACK_ENTER(); \ DEBUG_FUNCTIONNAME(); \ DOWN_TRACE_ENTER(pvDownThis); \ DOWN_VALIDATE_NORET(pvDownThis); \ DOWN_MAKE_pMozI(interface, pvDownThis); \ DEBUG_GLOBAL_BREAKPOINT(1); /** Default DOWN enter code, with default rc declaration. */ #define DOWN_ENTER_RC(pvDownThis, interface) \ DOWN_ENTER(pvDownThis, interface); \ nsresult rc = NS_ERROR_UNEXPECTED /** Leave a DOWN worker. */ #define DOWN_TRACE_LEAVE(pvDownThis) \ dprintf(("%s: leave this=%p (down)", pszFunction, pvDownThis)) /** Leave a DOWN worker with INT rc. */ #define DOWN_TRACE_LEAVE_INT(pvDownThis, rc) \ dprintf(("%s: leave this=%p rc=%x (down)", pszFunction, pvDownThis, rc)) /** Leave a DOWN worker. */ #define DOWN_LEAVE(pvDownThis) \ DOWN_TRACE_LEAVE(pvDownThis); \ DEBUG_GLOBAL_BREAKPOINT(1); \ DEBUG_STACK_LEAVE(); /** Leave a DOWN worker with INT rc. */ #define DOWN_LEAVE_INT(pvDownThis, rc) \ DOWN_TRACE_LEAVE_INT(pvDownThis, rc); \ DEBUG_GLOBAL_BREAKPOINT(1); \ DEBUG_STACK_LEAVE(); /** Magic string. */ #define DOWN_MAGIC_STRING "DownMagicString" /** Lock the down list. */ #define DOWN_LOCK() downLock() /** UnLock the down list. */ #define DOWN_UNLOCK() downUnLock() /** Validates a UP object. */ #define UP_VALID() \ (*(void**)mpvThis == mpvVFTable) /** Validates a UP object and returns NS_ERROR_UNEXPECTED if invalid. */ #define UP_VALIDATE_RET() \ if (*(void**)mpvThis != mpvVFTable) \ { \ dprintf(("%s: invalid object!!! VFTable entery have changed! %x != %x", \ pszFunction, *(void**)mpvThis, mpvVFTable)); \ DebugInt3(); \ return NS_ERROR_UNEXPECTED; \ } /** Enter a UP worker. */ #define UP_TRACE_ENTER() \ dprintf(("%s: enter this=%p (up)", pszFunction, mpvThis)); /** Default UP enter code. */ #define UP_ENTER__(fGDB) \ DEBUG_FUNCTIONNAME(); \ UP_TRACE_ENTER(); \ DEBUG_GLOBAL_BREAKPOINT(fGDB) /** Default UP enter code with default rc declaration. */ #define UP_ENTER_RC__(fGDB) \ DEBUG_FUNCTIONNAME(); \ UP_TRACE_ENTER(); \ nsresult rc = NS_ERROR_UNEXPECTED; \ UP_VALIDATE_RET(); \ DEBUG_GLOBAL_BREAKPOINT(fGDB) /** Default UP enter code. */ #define UP_ENTER() \ UP_ENTER__(1) /** Default UP enter code - no global breakpoint. */ #define UP_ENTER_NODBGBRK() \ UP_ENTER__(0) /** Default UP enter code, with default rc declaration. */ #define UP_ENTER_RC() \ UP_ENTER_RC__(1) /** Default UP enter code, with default rc declaration - no global breakpoint. */ #define UP_ENTER_RC_NODBGBRK() \ UP_ENTER_RC__(0) /** Leave a UP worker. */ #define UP_TRACE_LEAVE() \ dprintf(("%s: leave this=%p (up)", pszFunction, mpvThis)); /** Leave a UP worker with INT rc. */ #define UP_TRACE_LEAVE_INT(rc) \ dprintf(("%s: leave this=%p rc=%x (up)", pszFunction, mpvThis, rc)); /** Leave a UP worker. */ #define UP_LEAVE() \ UP_TRACE_LEAVE(); \ DEBUG_GLOBAL_BREAKPOINT(1); \ DEBUG_STACK_LEAVE() /** Leave a UP worker with INT rc. */ #define UP_LEAVE_INT(rc) \ UP_TRACE_LEAVE_INT(rc); \ DEBUG_GLOBAL_BREAKPOINT(1); \ DEBUG_STACK_LEAVE() /** Leave a UP worker with INT rc. */ #define UP_LEAVE_INT_NODBGBRK(rc) \ UP_TRACE_LEAVE_INT(rc); \ DEBUG_STACK_LEAVE() /** Implements the nsISupports Interface. */ #define UP_IMPL_NSISUPPORTS() \ NS_IMETHOD QueryInterface(REFNSIID aIID, void **aInstancePtr) { return hlpQueryInterface(aIID, aInstancePtr); } \ NS_IMETHOD_(nsrefcnt) AddRef(void) { return hlpAddRef(); } \ NS_IMETHOD_(nsrefcnt) Release(void) { return hlpRelease(); } \ // /** Implements the nsISupports Interface. */ #define UP_IMPL_NSISUPPORTS_NOT_RELEASE() \ NS_IMETHOD QueryInterface(REFNSIID aIID, void **aInstancePtr) { return hlpQueryInterface(aIID, aInstancePtr); } \ NS_IMETHOD_(nsrefcnt) AddRef(void) { return hlpAddRef(); } \ // /** Implements the nsIFactory Interface. */ #define UP_IMPL_NSIFACTORY() \ NS_IMETHOD CreateInstance(nsISupports *aOuter, const nsIID & aIID, void * *result) \ { return hlpCreateInstance(aOuter, aIID, result); } \ NS_IMETHOD LockFactory(PRBool lock) \ { return hlpLockFactory(lock); } \ // /** Implements the nsIJVMWindow Interface. */ #define UP_IMPL_NSIJVMWINDOW() \ NS_IMETHOD Show(void) \ { return hlpShow(); } \ NS_IMETHOD Hide(void) \ { return hlpHide(); } \ NS_IMETHOD IsVisible(PRBool *result) \ { return hlpIsVisible(result); } \ // /** Implements the nsIPluginInstnacePeer Interface. */ #define UP_IMPL_NSIPLUGININSTANCEPEER() \ NS_IMETHOD GetValue(nsPluginInstancePeerVariable aVariable, void * aValue) \ { return hlpGetValue(aVariable, aValue); } \ NS_IMETHOD GetMIMEType(nsMIMEType *aMIMEType) \ { return hlpGetMIMEType(aMIMEType); } \ NS_IMETHOD GetMode(nsPluginMode *aMode) \ { return hlpGetMode(aMode); } \ NS_IMETHOD NewStream(nsMIMEType aType, const char *aTarget, nsIOutputStream **aResult) \ { return hlpNewStream(aType, aTarget, aResult); } \ NS_IMETHOD ShowStatus(const char *aMessage) \ { return hlpShowStatus(aMessage); } \ NS_IMETHOD SetWindowSize(PRUint32 aWidth, PRUint32 aHeight) \ { return hlpSetWindowSize(aWidth, aHeight); } \ // /** Implements the nsIRequestObserver Interface. */ #define UP_IMPL_NSIREQUESTOBSERVER() \ NS_IMETHOD OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) \ { return hlpOnStartRequest(aRequest, aContext); } \ NS_IMETHOD OnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) \ { return hlpOnStopRequest(aRequest, aContext, aStatusCode); } \ // /** Implements the nsIRequest Interface. */ #define UP_IMPL_NSIREQUEST() \ NS_IMETHOD GetName(nsACString & aName) \ { return hlpGetName(aName); } \ NS_IMETHOD IsPending(PRBool *_retval) \ { return hlpIsPending(_retval); } \ NS_IMETHOD GetStatus(nsresult *aStatus) \ { return hlpGetStatus(aStatus); } \ NS_IMETHOD Cancel(nsresult aStatus) \ { return hlpCancel(aStatus); } \ NS_IMETHOD Suspend(void) \ { return hlpSuspend(); } \ NS_IMETHOD Resume(void) \ { return hlpResume(); } \ NS_IMETHOD GetLoadGroup(nsILoadGroup * *aLoadGroup) \ { return hlpGetLoadGroup(aLoadGroup); } \ NS_IMETHOD SetLoadGroup(nsILoadGroup * aLoadGroup) \ { return hlpSetLoadGroup(aLoadGroup); } \ NS_IMETHOD GetLoadFlags(nsLoadFlags *aLoadFlags) \ { return hlpGetLoadFlags(aLoadFlags); } \ NS_IMETHOD SetLoadFlags(nsLoadFlags aLoadFlags) \ { return hlpSetLoadFlags(aLoadFlags); } \ // /** Clears a java value. */ #if 1 #define ZERO_JAVAVALUE(value, type) memset(&value, 0, sizeof(jvalue)) #else #define ZERO_JAVAVALUE(value, type) \ do \ { \ switch (type) \ { \ case jobject_type: (value).l = 0; break; \ case jboolean_type: (value).z = 0; break; \ case jbyte_type: (value).b = 0; break; \ case jchar_type: (value).c = 0; break; \ case jshort_type: (value).s = 0; break; \ case jint_type: (value).i = 0; break; \ case jlong_type: (value).j = 0; break; \ case jfloat_type: (value).f = 0; break; \ case jdouble_type: (value).d = 0; break; \ } \ } while (0) #endif /******************************************************************************* * Structures and Typedefs * *******************************************************************************/ /* forward references */ struct DownThis; class UpWrapperBase; /** * Linked list node. */ typedef struct WrapperNode { /** Wrapper type. */ enum enmWrapperType { enmDown, enmUp } enmType; /** Next */ volatile struct WrapperNode *pNext; /** The this pointer they're wrapping. */ void *pvThis; /** Pointer to the wrapper. */ union WrapperPointer { struct DownThis * pDown; UpWrapperBase * pUp; } u; } WNODE, *PWNODE; /** * What the pvThis pointer points at when the plugin calls back thru a 'down' * wrapper. (This is a struct really and I don't care that it's not proper C++.) */ typedef struct DownThis { /** @name Public Data * @{ */ /** Pointer to virtual function table. */ const void * pvVFT; /** Some zero padding. (paranoia) */ #ifdef DEBUG char achZeros[12 + 256]; #else char achZeros[12 + 16]; #endif /** Pointer to the original class. */ void * pvThis; /** Magic */ char achMagic[16]; /** Next pointer */ volatile struct DownThis * pNext; //@} /** * Initalize the struct. */ inline void initialize(void *zpvThis, const void *zpvVFT) { this->pvVFT = zpvVFT; memset(&achZeros[0], 0, sizeof(achZeros)); for (unsigned i = 0; i < sizeof(achZeros) / sizeof(unsigned); i += sizeof(unsigned)) achZeros[i] = 0xC0000000 | i; this->pvThis = zpvThis; memcpy(achMagic, DOWN_MAGIC_STRING, sizeof(achMagic)); } } DOWNTHIS, *PDOWNTHIS; /******************************************************************************* * Global Variables * *******************************************************************************/ /** This variable is used to drag in XPCOM in the linking of a primary wrapper. */ int giXPCOM; /** Global flag for triggering breakpoing on enter and leave of wrapper methods. * DEBUG ONLY for use in the Debugger. */ #ifdef DEBUG int gfGlobalBreakPoint = FALSE; #endif /** @name Constants * @{ */ /** Magic of the DOWNTHIS structure. */ const char gszDownMagicString[16] = DOWN_MAGIC_STRING; //@} /** Down Wrapper List. * Protected by gmtxDown. */ volatile struct DownThis * gpDownHead = NULL; /** Down Wrapper Mutex. */ HMTX ghmtxDown = NULLHANDLE; /* * Include the IDs and make them materialize here. * Include twice to get the right definition. */ #include "moz_IDs_Generated.h" #undef NP_DEF_ID #define NP_DEF_ID NS_DEFINE_IID #define NP_INCL_LOOKUP #include "moz_IDs_Generated.h" /******************************************************************************* * Internal Functions * *******************************************************************************/ const void * downIsSupportedInterface(REFNSIID aIID); nsresult downCreateWrapper(void **ppvResult, const void *pvVFT, nsresult rc); nsresult downCreateWrapper(void **ppvResult, REFNSIID aIID, nsresult rc); void downLock(void); void downUnLock(void); BOOL upIsSupportedInterface(REFNSIID aIID); nsresult upCreateWrapper(void **ppvResult, REFNSIID aIID, nsresult rc); int downCreateJNIEnvWrapper(JNIEnv **ppJNIEnv, int rc); int upCreateJNIEnvWrapper(JNIEnv **ppJNIEnv, int rc); void verifyAndFixUTF8String(const char *pszString, const char *pszFunction); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP Base Classes //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Base class for all 'up' wrappers - meaning up to mozilla. */ class UpWrapperBase { protected: /** This pointer of the Win32 object. */ void * mpvThis; /** This pointer of the Win32 class vftable. * This is actually an duplicate but it's ok for the purpose of list key. */ void * mpvVFTable; /** Interface ID. Also needed for the list stuff.*/ REFNSIID miid; /** Pointer to the interface we implement. * This is kind of required to get the right pointer when searching existing * wrappers without having to perform a bunch of stupid IID compares to find * the proper casing. (C++ rulez!) */ void * mpvInterface; /** Next wrapper */ volatile UpWrapperBase * mpNext; /** List of UP wrappers. * Protected by hmtx. */ static volatile UpWrapperBase * mpHead; /** Our The mutex protecting this wrapper list. */ static HMTX mhmtx; protected: /** * Constructor. * * @param pvThis Pointer to the Win32 class. * @param pvInterface Pointer to the interface we implement. Meaning * what's returned on a query interface. * @param iid The Interface ID of the wrapped interface. */ UpWrapperBase(void *pvThis, void *pvInterface, REFNSIID iid) : mpvThis(pvThis), mpvVFTable(*(void**)pvThis), miid(iid), mpvInterface(pvInterface), mpNext(NULL) { } public: /** * Destructor. */ virtual ~UpWrapperBase() { } /** * Inserts the wrapper into the linked list of wrappers. * We hold the lock at entry. */ void upInsertWrapper(void) { mpNext = mpHead; mpHead = this; } /** * Remove this wrapper from the linked list. * We hold the lock at entry. * @returns 1 if successfully removed it. * @returns 0 on failure. */ int upRemoveWrapper(void) { int fUnchained; UpWrapperBase * pUp, *pUpPrev; for (pUp = (UpWrapperBase*)mpHead, pUpPrev = NULL, fUnchained = 0; pUp; pUpPrev = pUp, pUp = (UpWrapperBase*)pUp->mpNext) { if (pUp->mpvThis == mpvThis) { if (pUpPrev) pUpPrev->mpNext = pUp->mpNext; else mpHead = pUp->mpNext; #ifdef DEBUG /* paranoid as always */ if (fUnchained) { dprintf(("upRemoveWrapper: this=%x is linked twice !!!", this)); DebugInt3(); } fUnchained = 1; #else fUnchained = 1; break; #endif } } if (fUnchained) this->mpNext = NULL; return fUnchained; } /** * Gets the interface pointer. */ void * getInterfacePointer() { return mpvInterface; } /** * Gets the Win32 this pointer. */ void * getThis() { return mpvThis; } /** * Gets the Win32 VFT pointer. */ void * getVFT() { return mpvVFTable; } /** * Locks the linked list of up wrappers. */ static void upLock(void) { DEBUG_FUNCTIONNAME(); if (!mhmtx) { int rc = DosCreateMutexSem(NULL, &mhmtx, 0, TRUE); if (rc) { dprintf(("%s: DosCreateMutexSem failed with rc=%d.", pszFunction, rc)); ReleaseInt3(0xdeadbee1, 0xe000, rc); } } else { int rc = DosRequestMutexSem(mhmtx, SEM_INDEFINITE_WAIT); if (rc) { dprintf(("%s: DosRequestMutexSem failed with rc=%d.", pszFunction, rc)); ReleaseInt3(0xdeadbee1, 0xe001, rc); } //@todo handle cases with the holder dies. } } /** * Unlocks the linked list of up wrappers. */ static void upUnLock() { DEBUG_FUNCTIONNAME(); int rc = DosReleaseMutexSem(mhmtx); if (rc) { dprintf(("%s: DosRequestMutexSem failed with rc=%d.", pszFunction, rc)); ReleaseInt3(0xdeadbee1, 0xe002, rc); } //@todo handle cases with the holder dies. } /** * Try find an existing wrapper. * * The list is locked on entry and exit. * * @returns Pointer to existing wrapper if found. * @returns NULL if not found. * @param pvThis Pointer to the Win32 class. * @param iid The Interface ID of the wrapped interface. */ static UpWrapperBase * findUpWrapper(void *pvThis, REFNSIID iid) { DEBUG_FUNCTIONNAME(); /* * Walk the list and look... */ for (UpWrapperBase * pUp = (UpWrapperBase*)mpHead; pUp; pUp = (UpWrapperBase*)pUp->mpNext) if (pUp->mpvThis == pvThis) { if (pUp->mpvVFTable == *((void**)pvThis)) { if (iid.Equals(pUp->miid) || iid.Equals(kSupportsIID)) { dprintf(("%s: Found existing UP wrapper %p/%p for %p.", pszFunction, pUp, pUp->mpvInterface, pvThis)); return pUp; } else { dprintf(("%s: Found wrapper %p/%p for %p, but iid's wasn't matching.", pszFunction, pUp, pUp->getInterfacePointer(), pvThis)); DPRINTF_NSID(iid); DPRINTF_NSID(pUp->miid); } } else { dprintf(("%s: Seems like an object have been release and reused again... (pvThis=%x)", pszFunction, pvThis)); /* * This happens with the IBM java. * I think we safely can remove this wrapper and reuse it. */ if (pUp->upRemoveWrapper()) pUp = (UpWrapperBase*)mpHead; } } /** @todo remove from list and such. */ return NULL; } /** * Try find an existing up wrapper before creating a down wrapper. * * See findDownWrapper() for explanation. * * @returns Pointer to existing wrapper if found. * @returns NULL if not found. * @param pvThis Pointer to the Mozilla interface object which * may actually be an UpWrapperBase pointer. */ static void * findUpWrapper(void *pvThis) { DEBUG_FUNCTIONNAME(); /* * Walk the list and look. */ upLock(); for (UpWrapperBase * pUp = (UpWrapperBase *)mpHead; pUp; pUp = (UpWrapperBase *)pUp->mpNext) if ((void*)pUp == pvThis) { void *pvRet = pUp->mpvThis; upUnLock(); dprintf(("%s: pvThis(=%x) was pointing to an up wrapper. Returning pointer to real object(=%x)", pszFunction, pvThis, pvRet)); return pvRet; } upUnLock(); /* No luck... */ return NULL; } /** * Try find an down wrapper for the desired up wrapper. * * This is the first thing we'll try when creating an up wrapper. The * object might actually have been created by mozilla and is sent down * to the plugin, like the nsIPluginInstancePeer, and is later queried * by mozilla. It is inefficient to wrap the object twice, also it's * potentially dangerous to do so. * * @returns Pointer to real object if it was sent down. * @returns NULL if not found. * @param pvThis Pointer to the Win32 class. */ static void * findDownWrapper(void *pvThis) { DEBUG_FUNCTIONNAME(); /* * Walk the list and look. */ DOWN_LOCK(); for (PDOWNTHIS pDown = (PDOWNTHIS)gpDownHead; pDown; pDown = (PDOWNTHIS)pDown->pNext) if (pDown == pvThis) { void *pvRet = pDown->pvThis; DOWN_UNLOCK(); dprintf(("%s: pvThis(=%x) was pointing to a down wrapper. Returning pointer to real object(=%x)", pszFunction, pvThis, pvRet)); return pvRet; } DOWN_UNLOCK(); /* No luck... */ return NULL; } }; volatile UpWrapperBase * UpWrapperBase::mpHead = NULL; HMTX UpWrapperBase::mhmtx = NULLHANDLE; /** * This class implements helpers for the nsISupports interface. * * Because of the way C++ treats multiple inheritance we cannot implement * nsISupports here and inherit the implementation automagically when * wrapping an interface subclassing nsISupports. Therefore we implement * helpers here with different names which can be called from the subclasses. */ class UpSupportsBase : public UpWrapperBase { protected: /** * Constructor. * * @param pvThis Pointer to the Win32 class. * @param pvInterface Pointer to the interface we implement. Meaning * what's returned on a query interface. * @param iid The Interface ID of the wrapped interface. */ UpSupportsBase(void *pvThis, void *pvInterface, REFNSIID iid) : UpWrapperBase(pvThis, pvInterface, iid) { } /** * A run time mechanism for interface discovery. * @param aIID [in] A requested interface IID * @param aInstancePtr [out] A pointer to an interface pointer to * receive the result. * @return NS_OK if the interface is supported by the associated * instance, NS_NOINTERFACE if it is not. * NS_ERROR_INVALID_POINTER if aInstancePtr is NULL. */ nsresult hlpQueryInterface(REFNSIID aIID, void **aInstancePtr) { UP_ENTER_RC_NODBGBRK(); DPRINTF_NSID(aIID); rc = VFTCALL2((VFTnsISupports*)mpvVFTable, QueryInterface, mpvThis, aIID, aInstancePtr); rc = upCreateWrapper(aInstancePtr, aIID, rc); UP_LEAVE_INT_NODBGBRK(rc); return rc; } /** * Increases the reference count for this interface. * The associated instance will not be deleted unless * the reference count is returned to zero. * * @return The resulting reference count. */ nsrefcnt hlpAddRef() { UP_ENTER_NODBGBRK(); nsrefcnt c = 0; if (UP_VALID()) c = VFTCALL0((VFTnsISupports*)mpvVFTable, AddRef, mpvThis); else { dprintf(("%s: Invalid object!", pszFunction)); DebugInt3(); } UP_LEAVE_INT_NODBGBRK(c); return c; } /** * Decreases the reference count for this interface. * Generally, if the reference count returns to zero, * the associated instance is deleted. * * @return The resulting reference count. */ nsrefcnt hlpRelease() { UP_ENTER_NODBGBRK(); nsrefcnt c = 0; if (UP_VALID()) { c = VFTCALL0((VFTnsISupports*)mpvVFTable, Release, mpvThis); if (!c) { dprintf(("%s: the reference count is zero! Delete this wrapper", pszFunction)); /* (This is prohibitted by german law I think, suicide that is.) */ UP_LEAVE_INT_NODBGBRK(0); /* exit odin context *first* */ #ifdef DO_DELETE /* * First unchain this object. */ upLock(); if (upRemoveWrapper()) { upUnLock(); /** @todo Make a list of wrapper which is scheduled for lazy destruction. * We can then easily check if we get a call to a dead object. */ delete this; } else { upUnLock(); /* * Allready unchained? This shouldn't ever happen... * The only possible case is that two threads calls hlpRelease() * a the same time. So, we will *not* touch this node now. */ dprintf(("%s: pvThis=%p not found in the list !!!!", pszFunction, mpvThis)); DebugInt3(); } #endif return 0; } } else { dprintf(("%s: Invalid object!", pszFunction)); DebugInt3(); } UP_LEAVE_INT_NODBGBRK(c); return c; } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsISupports //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsISupports wrapper. * @remark No, you are NOT gonna inherit anything from this. Use UpSupportsBase. */ class UpSupports : public nsISupports, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Constructor */ UpSupports(void *pvThis) : UpSupportsBase(pvThis, (nsISupports*)this, kSupportsIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIFactory //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// class UpFactoryBase : public UpSupportsBase { protected: /** * Creates an instance of a component. * * @param aOuter Pointer to a component that wishes to be aggregated * in the resulting instance. This will be nsnull if no * aggregation is requested. * @param iid The IID of the interface being requested in * the component which is being currently created. * @param result [out] Pointer to the newly created instance, if successful. * @return NS_OK - Component successfully created and the interface * being requested was successfully returned in result. * NS_NOINTERFACE - Interface not accessible. * NS_ERROR_NO_AGGREGATION - if an 'outer' object is supplied, but the * component is not aggregatable. * NS_ERROR* - Method failure. */ /* void createInstance (in nsISupports aOuter, in nsIIDRef iid, [iid_is (iid), retval] out nsQIResult result); */ NS_IMETHOD hlpCreateInstance(nsISupports *aOuter, const nsIID & aIID, void * *result) { UP_ENTER_RC(); DPRINTF_NSID(aIID); /* * Supported interface requested? */ if (upIsSupportedInterface(aIID)) { /* * Wrap the outer. */ nsISupports * pDownOuter = aOuter; rc = downCreateWrapper((void**)&pDownOuter, downIsSupportedInterface(kSupportsIID), NS_OK); if (rc == NS_OK) { rc = VFTCALL3((VFTnsIFactory*)mpvVFTable, CreateInstance, mpvThis, pDownOuter, aIID, result); rc = upCreateWrapper(result, aIID, rc); } else { dprintf(("%s: downCreateWrapper failed for nsISupports/aOuter. rc=%x", pszFunction, rc)); DebugInt3(); } } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 7, aIID.m0); } UP_LEAVE_INT(rc); return rc; } /** * LockFactory provides the client a way to keep the component * in memory until it is finished with it. The client can call * LockFactory(PR_TRUE) to lock the factory and LockFactory(PR_FALSE) * to release the factory. * * @param lock - Must be PR_TRUE or PR_FALSE * @return NS_OK - If the lock operation was successful. * NS_ERROR* - Method failure. */ /* void lockFactory (in PRBool lock); */ NS_IMETHOD hlpLockFactory(PRBool lock) { UP_ENTER_RC(); dprintf(("%s: lock=%d", pszFunction, lock)); rc = VFTCALL1((VFTnsIFactory*)mpvVFTable, LockFactory, mpvThis, lock); UP_LEAVE_INT(rc); return rc; } /** Constructor. */ UpFactoryBase(void *pvThis, void *pvInterface, REFNSIID iid = kFactoryIID) : UpSupportsBase(pvThis, pvInterface, iid) { } }; /** * nsIFactory wrapper. */ class UpFactory : public nsIFactory, public UpFactoryBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIFACTORY(); /** Constructor. */ UpFactory(void *pvThis) : UpFactoryBase(pvThis, (nsIFactory*)this, kFactoryIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIPlugin //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIPlugin wrapper. */ class UpPlugin : public nsIPlugin, public UpFactoryBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIFACTORY(); /** * Creates a new plugin instance, based on a MIME type. This * allows different impelementations to be created depending on * the specified MIME type. */ /* void createPluginInstance (in nsISupports aOuter, in nsIIDRef aIID, in string aPluginMIMEType, [iid_is (aIID), retval] out nsQIResult aResult); */ NS_IMETHOD CreatePluginInstance(nsISupports *aOuter, const nsIID & aIID, const char *aPluginMIMEType, void * *aResult) { UP_ENTER_RC(); DPRINTF_NSID(aIID); DPRINTF_STR(aPluginMIMEType); /* * Supported interface requested? */ if (upIsSupportedInterface(aIID)) { /* * Wrap the outer. */ nsISupports * pDownOuter = aOuter; rc = downCreateWrapper((void**)&pDownOuter, downIsSupportedInterface(kSupportsIID), NS_OK); if (rc == NS_OK) { rc = VFTCALL4((VFTnsIPlugin*)mpvVFTable, CreatePluginInstance, mpvThis, aOuter, aIID, aPluginMIMEType, aResult); rc = upCreateWrapper(aResult, aIID, rc); } else { dprintf(("%s: downCreateWrapper failed for nsISupports/aOuter. rc=%x", pszFunction, rc)); DebugInt3(); } } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 8, aIID.m0); } UP_LEAVE_INT(rc); return rc; } /** * Initializes the plugin and will be called before any new instances are * created. It is passed browserInterfaces on which QueryInterface * may be used to obtain an nsIPluginManager, and other interfaces. * * @param browserInterfaces - an object that allows access to other browser * interfaces via QueryInterface * @result - NS_OK if this operation was successful */ /* void initialize (); */ NS_IMETHOD Initialize(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIPlugin*)mpvVFTable, Initialize, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Called when the browser is done with the plugin factory, or when * the plugin is disabled by the user. * * (Corresponds to NPP_Shutdown.) * * @result - NS_OK if this operation was successful */ /* void shutdown (); */ NS_IMETHOD Shutdown(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIPlugin*)mpvVFTable, Shutdown, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Returns the MIME description for the plugin. The MIME description * is a colon-separated string containg the plugin MIME type, plugin * data file extension, and plugin name, e.g.: * * "application/x-simple-plugin:smp:Simple LiveConnect Sample Plug-in" * * (Corresponds to NPP_GetMIMEDescription.) * * @param aMIMEDescription - the resulting MIME description * @result - NS_OK if this operation was successful */ /* void getMIMEDescription (out constCharPtr aMIMEDescription); */ NS_IMETHOD GetMIMEDescription(const char * *aMIMEDescription) { //@todo TEXT: aMIMEDescription? Doesn't apply to java plugin, and probably not called by OS/2. UP_ENTER_RC(); dprintf(("%s: aMIMEDescription=%x", pszFunction, aMIMEDescription)); rc = VFTCALL1((VFTnsIPlugin*)mpvVFTable, GetMIMEDescription, mpvThis, aMIMEDescription); if (NS_SUCCEEDED(rc) && VALID_PTR(aMIMEDescription)) DPRINTF_STR(*aMIMEDescription); UP_LEAVE_INT(rc); return rc; } /** * Returns the value of a variable associated with the plugin. * * (Corresponds to NPP_GetValue.) * * @param aVariable - the plugin variable to get * @param aValue - the address of where to store the resulting value * @result - NS_OK if this operation was successful */ /* void getValue (in nsPluginVariable aVariable, in voidPtr aValue); */ NS_IMETHOD GetValue(nsPluginVariable aVariable, void * aValue) { UP_ENTER_RC(); dprintf(("%s: aVariable=%d aValue=%x", pszFunction, aVariable, aValue)); rc = VFTCALL2((VFTnsIPlugin*)mpvVFTable, GetValue, mpvThis, aVariable, aValue); UP_LEAVE_INT(rc); return rc; } /** * Constructor */ UpPlugin(void *pvThis) : UpFactoryBase(pvThis, (nsIPlugin*)this, kPluginIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIJVMPlugin //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// class UpJVMPlugin : public nsIJVMPlugin, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); // Causes the JVM to append a new directory to its classpath. // If the JVM doesn't support this operation, an error is returned. NS_IMETHOD AddToClassPath(const char* dirPath) { UP_ENTER_RC(); DPRINTF_STR(dirPath); rc = VFTCALL1((VFTnsIJVMPlugin*)mpvVFTable, AddToClassPath, mpvThis, dirPath); UP_LEAVE_INT(rc); return rc; } // Causes the JVM to remove a directory from its classpath. // If the JVM doesn't support this operation, an error is returned. NS_IMETHOD RemoveFromClassPath(const char* dirPath) { UP_ENTER_RC(); DPRINTF_STR(dirPath); rc = VFTCALL1((VFTnsIJVMPlugin*)mpvVFTable, RemoveFromClassPath, mpvThis, dirPath); UP_LEAVE_INT(rc); return rc; } // Returns the current classpath in use by the JVM. NS_IMETHOD GetClassPath(const char* *result) { UP_ENTER_RC(); dprintf(("%s: result=%p", pszFunction, result)); rc = VFTCALL1((VFTnsIJVMPlugin*)mpvVFTable, GetClassPath, mpvThis, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) DPRINTF_STR(*result); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetJavaWrapper(JNIEnv* jenv, jint obj, jobject *jobj) { UP_ENTER_RC(); dprintf(("%s: jenv=%p obj=%p jobj=%p", pszFunction, jenv, obj, jobj)); rc = VFTCALL3((VFTnsIJVMPlugin*)mpvVFTable, GetJavaWrapper, mpvThis, jenv, obj, jobj); if (NS_SUCCEEDED(rc) && VALID_PTR(jobj)) dprintf(("%s: *jobj=%x", pszFunction, jobj)); UP_LEAVE_INT(rc); return rc; } /** * This creates a new secure communication channel with Java. The second parameter, * nativeEnv, if non-NULL, will be the actual thread for Java communication. * Otherwise, a new thread should be created. * @param proxyEnv the env to be used by all clients on the browser side * @return outSecureEnv the secure environment used by the proxyEnv */ NS_IMETHOD CreateSecureEnv(JNIEnv* proxyEnv, nsISecureEnv* *outSecureEnv) { UP_ENTER_RC(); dprintf(("%s: proxyEnv=%x outSecureEnv=%x", pszFunction, proxyEnv, outSecureEnv)); JNIEnv *pdownProxyEnv = proxyEnv; rc = downCreateJNIEnvWrapper(&pdownProxyEnv, NS_OK); if (NS_SUCCEEDED(rc)) { rc = VFTCALL2((VFTnsIJVMPlugin*)mpvVFTable, CreateSecureEnv, mpvThis, pdownProxyEnv, outSecureEnv); rc = upCreateWrapper((void**)outSecureEnv, kSecureEnvIID, rc); } else dprintf(("%s: Failed to make JNIEnv down wrapper!!!", pszFunction)); UP_LEAVE_INT(rc); return rc; } /** * Gives time to the JVM from the main event loop of the browser. This is * necessary when there aren't any plugin instances around, but Java threads exist. */ NS_IMETHOD SpendTime(PRUint32 timeMillis) { UP_ENTER_RC(); dprintf(("%s: timeMillis=%d", pszFunction, timeMillis)); rc = VFTCALL1((VFTnsIJVMPlugin*)mpvVFTable, SpendTime, mpvThis, timeMillis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD UnwrapJavaWrapper(JNIEnv* jenv, jobject jobj, jint* obj) { UP_ENTER_RC(); dprintf(("%s: jenv=%p jobj=%p obj=%p", pszFunction, jenv, jobj, obj)); rc = VFTCALL3((VFTnsIJVMPlugin*)mpvVFTable, UnwrapJavaWrapper, mpvThis, jenv, jobj, obj); if (NS_SUCCEEDED(rc) && VALID_PTR(jobj)) dprintf(("%s: *jobj=%p", pszFunction, jobj)); UP_LEAVE_INT(rc); return rc; } /** * Constructor */ UpJVMPlugin(void *pvThis) : UpSupportsBase(pvThis, (nsIJVMPlugin*)this, kJVMPluginIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIJVMPluginInstance //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIJVMPluginInstance */ class UpJVMPluginInstance : public nsIJVMPluginInstance, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /* [noscript] void GetJavaObject (out jobject result); */ NS_IMETHOD GetJavaObject(jobject *result) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIJVMPluginInstance*)mpvVFTable, GetJavaObject, mpvThis, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } /* [noscript] void GetText (in nChar result); */ NS_IMETHOD GetText(const char ** result) { //@todo TEXT: result? Don't know, can't find anyone calling this... UP_ENTER_RC(); rc = VFTCALL1((VFTnsIJVMPluginInstance*)mpvVFTable, GetText, mpvThis, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result) && VALID_PTR(*result)) DPRINTF_STR(*result); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpJVMPluginInstance(void *pvThis) : UpSupportsBase(pvThis, (nsIJVMWindow*)this, kJVMPluginInstanceIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsISecureEnv //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsISecureEnv Wrapper. */ class UpSecureEnv : public nsISecureEnv, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Create new Java object in LiveConnect. * * @param clazz -- Java Class object. * @param methodID -- Method id * @param args -- arguments for invoking the constructor. * @param result -- return new Java object. * @param ctx -- security context */ NS_IMETHOD NewObject(/*[in]*/ jclass clazz, /*[in]*/ jmethodID methodID, /*[in]*/ jvalue *args, /*[out]*/ jobject* result, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: clazz=%p methodID=%p args=%p result=%p ctx=%p", pszFunction, clazz, methodID, args, result, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, downIsSupportedInterface(kSecurityContextIID), NS_OK); if (rc == NS_OK) { rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, NewObject, mpvThis, clazz, methodID, args, result, pDownCtx); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, result)); } UP_LEAVE_INT(rc); return rc; } /** * Invoke method on Java object in LiveConnect. * * @param type -- Return type * @param obj -- Java object. * @param methodID -- method id * @param args -- arguments for invoking the constructor. * @param result -- return result of invocation. * @param ctx -- security context */ NS_IMETHOD CallMethod(/*[in]*/ jni_type type, /*[in]*/ jobject obj, /*[in]*/ jmethodID methodID, /*[in]*/ jvalue *args, /*[out]*/ jvalue* result, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: type=%x obj=%p methodID=%p args=%p result=%p ctx=%p", pszFunction, type, obj, methodID, args, result, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, downIsSupportedInterface(kSecurityContextIID), NS_OK); if (rc == NS_OK) { rc = VFTCALL6((VFTnsISecureEnv*)mpvVFTable, CallMethod, mpvThis, type, obj, methodID, args, result, pDownCtx); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=0x%08x", pszFunction, *(int*)result)); #ifdef DO_EXTRA_FAILURE_HANDLING else if (VALID_PTR(result)) ZERO_JAVAVALUE(*result, type); #endif } UP_LEAVE_INT(rc); return rc; } /** * Invoke non-virtual method on Java object in LiveConnect. * * @param type -- Return type * @param obj -- Java object. * @param clazz -- Class object * @param methodID -- method id * @param args -- arguments for invoking the constructor. * @param ctx -- security context * @param result -- return result of invocation. */ NS_IMETHOD CallNonvirtualMethod(/*[in]*/ jni_type type, /*[in]*/ jobject obj, /*[in]*/ jclass clazz, /*[in]*/ jmethodID methodID, /*[in]*/ jvalue *args, /*[out]*/ jvalue* result, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: type=%x obj=%p clazz=%p methodID=%p args=%p result=%p ctx=%p", pszFunction, type, obj, clazz, methodID, args, result, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, downIsSupportedInterface(kSecurityContextIID), NS_OK); if (NS_SUCCEEDED(rc)) { rc = VFTCALL7((VFTnsISecureEnv*)mpvVFTable, CallNonvirtualMethod, mpvThis, type, obj, clazz, methodID, args, result, pDownCtx); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=0x%08x (int)", pszFunction, *(int*)result)); #ifdef DO_EXTRA_FAILURE_HANDLING else if (VALID_PTR(result)) ZERO_JAVAVALUE(*result, type); #endif } UP_LEAVE_INT(rc); return rc; } /** * Get a field on Java object in LiveConnect. * * @param type -- Return type * @param obj -- Java object. * @param fieldID -- field id * @param result -- return field value * @param ctx -- security context */ NS_IMETHOD GetField(/*[in]*/ jni_type type, /*[in]*/ jobject obj, /*[in]*/ jfieldID fieldID, /*[out]*/ jvalue* result, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: type=%x obj=%p fieldID= result=%p ctx=%p", pszFunction, type, fieldID, result, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, downIsSupportedInterface(kSecurityContextIID), NS_OK); if (rc == NS_OK) { rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, GetField, mpvThis, type, obj, fieldID, result, pDownCtx); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=0x%08x (int)", pszFunction, *(int*)result)); } UP_LEAVE_INT(rc); return rc; } /** * Set a field on Java object in LiveConnect. * * @param type -- Return type * @param obj -- Java object. * @param fieldID -- field id * @param val -- field value to set * @param ctx -- security context */ NS_IMETHOD SetField(/*[in]*/ jni_type type, /*[in]*/ jobject obj, /*[in]*/ jfieldID fieldID, /*[in]*/ jvalue val, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: type=%x, obj=%p fieldID=%p val=0x%08x (int) ctx=%p", pszFunction, type, obj, fieldID, val.i, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, downIsSupportedInterface(kSecurityContextIID), NS_OK); if (rc == NS_OK) rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, SetField, mpvThis, type, obj, fieldID, val, pDownCtx); UP_LEAVE_INT(rc); return rc; } /** * Invoke static method on Java object in LiveConnect. * * @param type -- Return type * @param clazz -- Class object. * @param methodID -- method id * @param args -- arguments for invoking the constructor. * @param result -- return result of invocation. * @param ctx -- security context */ NS_IMETHOD CallStaticMethod(/*[in]*/ jni_type type, /*[in]*/ jclass clazz, /*[in]*/ jmethodID methodID, /*[in]*/ jvalue *args, /*[out]*/ jvalue* result, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: type=%d clazz=%#x methodID=%#x args=%p result=%p ctx=%p", pszFunction, type, clazz, methodID, args, result, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, downIsSupportedInterface(kSecurityContextIID), NS_OK); if (rc == NS_OK) { rc = VFTCALL6((VFTnsISecureEnv*)mpvVFTable, CallStaticMethod, mpvThis, type, clazz, methodID, args, result, pDownCtx); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=0x%08x (int)", pszFunction, *(int*)result)); #ifdef DO_EXTRA_FAILURE_HANDLING else if (VALID_PTR(result)) ZERO_JAVAVALUE(*result, type); #endif } UP_LEAVE_INT(rc); return rc; } /** * Get a static field on Java object in LiveConnect. * * @param type -- Return type * @param clazz -- Class object. * @param fieldID -- field id * @param result -- return field value * @param ctx -- security context */ NS_IMETHOD GetStaticField(/*[in]*/ jni_type type, /*[in]*/ jclass clazz, /*[in]*/ jfieldID fieldID, /*[out]*/ jvalue* result, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: type=%d clazz=%#x fieldID=%#x result=%p ctx=%p", pszFunction, type, clazz, fieldID, result, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, kSecurityContextIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, GetStaticField, mpvThis, type, clazz, fieldID, result, pDownCtx); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=0x%08x (int)", pszFunction, *(int*)result)); } UP_LEAVE_INT(rc); return rc; } /** * Set a static field on Java object in LiveConnect. * * @param type -- Return type * @param clazz -- Class object. * @param fieldID -- field id * @param val -- field value to set * @param ctx -- security context */ NS_IMETHOD SetStaticField(/*[in]*/ jni_type type, /*[in]*/ jclass clazz, /*[in]*/ jfieldID fieldID, /*[in]*/ jvalue val, /*[in]*/ nsISecurityContext* ctx = NULL) { UP_ENTER_RC(); dprintf(("%s: type=%x, clazz=%p fieldID=%p val=0x%08x (int) ctx=%p", pszFunction, type, clazz, fieldID, val.i, ctx)); nsISecurityContext *pDownCtx = ctx; rc = downCreateWrapper((void**)&pDownCtx, downIsSupportedInterface(kSecurityContextIID), NS_OK); if (rc == NS_OK) rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, SetStaticField, mpvThis, type, clazz, fieldID, val, pDownCtx); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetVersion(/*[out]*/ jint* version) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsISecureEnv*)mpvVFTable, GetVersion, mpvThis, version); if (NS_SUCCEEDED(rc) && VALID_PTR(version)) dprintf(("%s: *version=%d", pszFunction, *version)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD DefineClass(/*[in]*/ const char* name, /*[in]*/ jobject loader, /*[in]*/ const jbyte *buf, /*[in]*/ jsize len, /*[out]*/ jclass* clazz) { UP_ENTER_RC(); DPRINTF_STR(name); rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, DefineClass, mpvThis, name, loader, buf, len, clazz); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD FindClass(/*[in]*/ const char* name, /*[out]*/ jclass* clazz) { UP_ENTER_RC(); DPRINTF_STR(name); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, FindClass, mpvThis, name, clazz); if (NS_SUCCEEDED(rc) && VALID_PTR(clazz)) dprintf(("%s: *clazz=%p", pszFunction, *clazz)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetSuperclass(/*[in]*/ jclass sub, /*[out]*/ jclass* super) { UP_ENTER_RC(); dprintf(("%s: sub=%p super=%p", pszFunction, sub, super)); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, GetSuperclass, mpvThis, sub, super); if (NS_SUCCEEDED(rc) && VALID_PTR(super)) dprintf(("%s: *super=%p", pszFunction, *super)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD IsAssignableFrom(/*[in]*/ jclass sub, /*[in]*/ jclass super, /*[out]*/ jboolean* result) { UP_ENTER_RC(); dprintf(("%s: sub=%p super=%p result=%p", pszFunction, sub, super, result)); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, IsAssignableFrom, mpvThis, sub, super, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%d", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Throw(/*[in]*/ jthrowable obj, /*[out]*/ jint* result) { UP_ENTER_RC(); dprintf(("%s: obj=%p result=%p", pszFunction, obj, result)); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, Throw, mpvThis, obj, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD ThrowNew(/*[in]*/ jclass clazz, /*[in]*/ const char *msg, /*[out]*/ jint* result) { //@todo TEXT: msg?? Don't think we care to much about this. :) UP_ENTER_RC(); dprintf(("%s: clazz=%p msg=%p result=%p", pszFunction, clazz, msg, result)); DPRINTF_STR(msg); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, ThrowNew, mpvThis, clazz, msg, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD ExceptionOccurred(/*[out]*/ jthrowable* result) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsISecureEnv*)mpvVFTable, ExceptionOccurred, mpvThis, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD ExceptionDescribe(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsISecureEnv*)mpvVFTable, ExceptionDescribe, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD ExceptionClear(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsISecureEnv*)mpvVFTable, ExceptionClear, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD FatalError(/*[in]*/ const char* msg) { UP_ENTER_RC(); DPRINTF_STR(msg); rc = VFTCALL1((VFTnsISecureEnv*)mpvVFTable, FatalError, mpvThis, msg); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD NewGlobalRef(/*[in]*/ jobject lobj, /*[out]*/ jobject* result) { UP_ENTER_RC(); dprintf(("%s: lobj=%p result=%p", pszFunction, lobj, result)); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, NewGlobalRef, mpvThis, lobj, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD DeleteGlobalRef(/*[in]*/ jobject gref) { UP_ENTER_RC(); dprintf(("%s: gref=%p", pszFunction, gref)); rc = VFTCALL1((VFTnsISecureEnv*)mpvVFTable, DeleteGlobalRef, mpvThis, gref); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD DeleteLocalRef(/*[in]*/ jobject obj) { UP_ENTER_RC(); dprintf(("%s: obj=%p", pszFunction, obj)); rc = VFTCALL1((VFTnsISecureEnv*)mpvVFTable, DeleteLocalRef, mpvThis, obj); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD IsSameObject(/*[in]*/ jobject obj1, /*[in]*/ jobject obj2, /*[out]*/ jboolean* result) { UP_ENTER_RC(); dprintf(("%s: obj1=%p obj2=%p result=%p", pszFunction, obj1, obj2, result)); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, IsSameObject, mpvThis, obj1, obj2, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%d", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD AllocObject(/*[in]*/ jclass clazz, /*[out]*/ jobject* result) { UP_ENTER_RC(); dprintf(("%s: clazz=%p result=%p", pszFunction, clazz, result)); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, AllocObject, mpvThis, clazz, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetObjectClass(/*[in]*/ jobject obj, /*[out]*/ jclass* result) { UP_ENTER_RC(); dprintf(("%s: obj=%p result=%p", pszFunction, obj, result)); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, GetObjectClass, mpvThis, obj, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=0x%08x (int)", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD IsInstanceOf(/*[in]*/ jobject obj, /*[in]*/ jclass clazz, /*[out]*/ jboolean* result) { UP_ENTER_RC(); dprintf(("%s: obj=%p clazz=%p result=%p", pszFunction, obj, clazz, result)); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, IsInstanceOf, mpvThis, obj, clazz, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%d", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetMethodID(/*[in]*/ jclass clazz, /*[in]*/ const char* name, /*[in]*/ const char* sig, /*[out]*/ jmethodID* id) { UP_ENTER_RC(); dprintf(("%s: clazz=%#x name=%p sig=%p id=%p", pszFunction, clazz, name, sig, id)); DPRINTF_STR(name); DPRINTF_STR(sig); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, GetMethodID, mpvThis, clazz, name, sig, id); if (NS_SUCCEEDED(rc) && VALID_PTR(id)) dprintf(("%s: *id=%#x", pszFunction, *id)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetFieldID(/*[in]*/ jclass clazz, /*[in]*/ const char* name, /*[in]*/ const char* sig, /*[out]*/ jfieldID* id) { UP_ENTER_RC(); dprintf(("%s: clazz=%#x id=%p", pszFunction, clazz, id)); DPRINTF_STR(name); DPRINTF_STR(sig); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, GetFieldID, mpvThis, clazz, name, sig, id); if (NS_SUCCEEDED(rc) && VALID_PTR(id)) dprintf(("%s: *id=%#x", pszFunction, *id)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetStaticMethodID(/*[in]*/ jclass clazz, /*[in]*/ const char* name, /*[in]*/ const char* sig, /*[out]*/ jmethodID* id) { UP_ENTER_RC(); dprintf(("%s: clazz=%#x id=%p", pszFunction, clazz, id)); DPRINTF_STR(name); DPRINTF_STR(sig); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, GetStaticMethodID, mpvThis, clazz, name, sig, id); if (NS_SUCCEEDED(rc) && VALID_PTR(id)) dprintf(("%s: *id=%#x", pszFunction, *id)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetStaticFieldID(/*[in]*/ jclass clazz, /*[in]*/ const char* name, /*[in]*/ const char* sig, /*[out]*/ jfieldID* id) { UP_ENTER_RC(); dprintf(("%s: clazz=%#x id=%p", pszFunction, clazz, id)); DPRINTF_STR(name); DPRINTF_STR(sig); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, GetStaticFieldID, mpvThis, clazz, name, sig, id); if (NS_SUCCEEDED(rc) && VALID_PTR(id)) dprintf(("%s: *id=%#x", pszFunction, *id)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD NewString(/*[in]*/ const jchar* unicode, /*[in]*/ jsize len, /*[out]*/ jstring* result) { UP_ENTER_RC(); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, NewString, mpvThis, unicode, len, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetStringLength(/*[in]*/ jstring str, /*[out]*/ jsize* result) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, GetStringLength, mpvThis, str, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%d", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetStringChars(/*[in]*/ jstring str, /*[in]*/ jboolean *isCopy, /*[out]*/ const jchar** result) { UP_ENTER_RC(); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, GetStringChars, mpvThis, str, isCopy, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD ReleaseStringChars(/*[in]*/ jstring str, /*[in]*/ const jchar *chars) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, ReleaseStringChars, mpvThis, str, chars); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD NewStringUTF(/*[in]*/ const char *utf, /*[out]*/ jstring* result) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, NewStringUTF, mpvThis, utf, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetStringUTFLength(/*[in]*/ jstring str, /*[out]*/ jsize* result) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, GetStringUTFLength, mpvThis, str, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%d", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetStringUTFChars(/*[in]*/ jstring str, /*[in]*/ jboolean *isCopy, /*[out]*/ const char** result) { UP_ENTER_RC(); dprintf(("%s: str=%p isCopy=%p result=%p", pszFunction, str, isCopy, result)); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, GetStringUTFChars, mpvThis, str, isCopy, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD ReleaseStringUTFChars(/*[in]*/ jstring str, /*[in]*/ const char *chars) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, ReleaseStringUTFChars, mpvThis, str, chars); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetArrayLength(/*[in]*/ jarray array, /*[out]*/ jsize* result) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, GetArrayLength, mpvThis, array, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%d", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD NewObjectArray(/*[in]*/ jsize len, /*[in]*/ jclass clazz, /*[in]*/ jobject init, /*[out]*/ jobjectArray* result) { UP_ENTER_RC(); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, NewObjectArray, mpvThis, len, clazz, init, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetObjectArrayElement(/*[in]*/ jobjectArray array, /*[in]*/ jsize index, /*[out]*/ jobject* result) { UP_ENTER_RC(); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, GetObjectArrayElement, mpvThis, array, index, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetObjectArrayElement(/*[in]*/ jobjectArray array, /*[in]*/ jsize index, /*[in]*/ jobject val) { UP_ENTER_RC(); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, SetObjectArrayElement, mpvThis, array, index, val); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD NewArray(/*[in]*/ jni_type element_type, /*[in]*/ jsize len, /*[out]*/ jarray* result) { UP_ENTER_RC(); rc = VFTCALL3((VFTnsISecureEnv*)mpvVFTable, NewArray, mpvThis, element_type, len, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetArrayElements(/*[in]*/ jni_type type, /*[in]*/ jarray array, /*[in]*/ jboolean *isCopy, /*[out]*/ void* result) { UP_ENTER_RC(); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, GetArrayElements, mpvThis, type, array, isCopy, result); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD ReleaseArrayElements(/*[in]*/ jni_type type, /*[in]*/ jarray array, /*[in]*/ void *elems, /*[in]*/ jint mode) { UP_ENTER_RC(); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, ReleaseArrayElements, mpvThis, type, array, elems, mode); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetArrayRegion(/*[in]*/ jni_type type, /*[in]*/ jarray array, /*[in]*/ jsize start, /*[in]*/ jsize len, /*[out]*/ void* buf) { UP_ENTER_RC(); rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, GetArrayRegion, mpvThis, type, array, start, len, buf); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetArrayRegion(/*[in]*/ jni_type type, /*[in]*/ jarray array, /*[in]*/ jsize start, /*[in]*/ jsize len, /*[in]*/ void* buf) { UP_ENTER_RC(); rc = VFTCALL5((VFTnsISecureEnv*)mpvVFTable, SetArrayRegion, mpvThis, type, array, start, len, buf); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD RegisterNatives(/*[in]*/ jclass clazz, /*[in]*/ const JNINativeMethod *methods, /*[in]*/ jint nMethods, /*[out]*/ jint* result) { UP_ENTER_RC(); rc = VFTCALL4((VFTnsISecureEnv*)mpvVFTable, RegisterNatives, mpvThis, clazz, methods, nMethods, result); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD UnregisterNatives(/*[in]*/ jclass clazz, /*[out]*/ jint* result) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, UnregisterNatives, mpvThis, clazz, result); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD MonitorEnter(/*[in]*/ jobject obj, /*[out]*/ jint* result) { UP_ENTER_RC(); dprintf(("%s: obj=%p result=%p", pszFunction, obj, result)); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, MonitorEnter, mpvThis, obj, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD MonitorExit(/*[in]*/ jobject obj, /*[out]*/ jint* result) { UP_ENTER_RC(); dprintf(("%s: obj=%p result=%p", pszFunction, obj, result)); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, MonitorExit, mpvThis, obj, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%p", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetJavaVM(/*[in]*/ JavaVM **vm, /*[out]*/ jint* result) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsISecureEnv*)mpvVFTable, GetJavaVM, mpvThis, vm, result); UP_LEAVE_INT(rc); return rc; } /** * Constructor */ UpSecureEnv(void *pvThis) : UpSupportsBase(pvThis, (nsISecureEnv*)this, kSecureEnvIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIPluginInstance //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// class UpPluginInstance : public nsIPluginInstance, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Initializes a newly created plugin instance, passing to it the plugin * instance peer which it should use for all communication back to the browser. * * @param aPeer - the corresponding plugin instance peer * @result - NS_OK if this operation was successful */ /* void initialize (in nsIPluginInstancePeer aPeer); */ NS_IMETHOD Initialize(nsIPluginInstancePeer *aPeer) { UP_ENTER_RC(); nsIPluginInstancePeer *pDownPeer = aPeer; rc = downCreateWrapper((void**)&pDownPeer, kPluginInstancePeerIID, NS_OK); if (rc == NS_OK) rc = VFTCALL1((VFTnsIPluginInstance*)mpvVFTable, Initialize, mpvThis, pDownPeer); UP_LEAVE_INT(rc); return rc; } /** * Returns a reference back to the plugin instance peer. This method is * used whenever the browser needs to obtain the peer back from a plugin * instance. The implementation of this method should be sure to increment * the reference count on the peer by calling AddRef. * * @param aPeer - the resulting plugin instance peer * @result - NS_OK if this operation was successful */ /* readonly attribute nsIPluginInstancePeer peer; */ NS_IMETHOD GetPeer(nsIPluginInstancePeer * *aPeer) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIPluginInstance*)mpvVFTable, GetPeer, mpvThis, aPeer); rc = upCreateWrapper((void**)aPeer, kPluginInstancePeerIID, rc); UP_LEAVE_INT(rc); return rc; } /** * Called to instruct the plugin instance to start. This will be called after * the plugin is first created and initialized, and may be called after the * plugin is stopped (via the Stop method) if the plugin instance is returned * to in the browser window's history. * * @result - NS_OK if this operation was successful */ /* void start (); */ NS_IMETHOD Start(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIPluginInstance*)mpvVFTable, Start, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Called to instruct the plugin instance to stop, thereby suspending its state. * This method will be called whenever the browser window goes on to display * another page and the page containing the plugin goes into the window's history * list. * * @result - NS_OK if this operation was successful */ /* void stop (); */ NS_IMETHOD Stop(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIPluginInstance*)mpvVFTable, Stop, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Called to instruct the plugin instance to destroy itself. This is called when * it become no longer possible to return to the plugin instance, either because * the browser window's history list of pages is being trimmed, or because the * window containing this page in the history is being closed. * * @result - NS_OK if this operation was successful */ /* void destroy (); */ NS_IMETHOD Destroy(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIPluginInstance*)mpvVFTable, Destroy, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Called when the window containing the plugin instance changes. * * (Corresponds to NPP_SetWindow.) * * @param aWindow - the plugin window structure * @result - NS_OK if this operation was successful */ /* void setWindow (in nsPluginWindowPtr aWindow); */ NS_IMETHOD SetWindow(nsPluginWindow * aWindow) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIPluginInstance*)mpvVFTable, SetWindow, mpvThis, aWindow); UP_LEAVE_INT(rc); return rc; } /** * Called to tell the plugin that the initial src/data stream is * ready. Expects the plugin to return a nsIPluginStreamListener. * * (Corresponds to NPP_NewStream.) * * @param aListener - listener the browser will use to give the plugin the data * @result - NS_OK if this operation was successful */ /* void newStream (out nsIPluginStreamListener aListener); */ NS_IMETHOD NewStream(nsIPluginStreamListener **aListener) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIPluginInstance*)mpvVFTable, NewStream, mpvThis, aListener); rc = upCreateWrapper((void**)aListener, kPluginStreamListenerIID, rc); UP_LEAVE_INT(rc); return rc; } /** * Called to instruct the plugin instance to print itself to a printer. * * (Corresponds to NPP_Print.) * * @param aPlatformPrint - platform-specific printing information * @result - NS_OK if this operation was successful */ /* void print (in nsPluginPrintPtr aPlatformPrint); */ NS_IMETHOD Print(nsPluginPrint * aPlatformPrint) { UP_ENTER_RC(); dprintf(("%s: aPlatformPrint=%p", pszFunction, aPlatformPrint)); if (aPlatformPrint) { if (aPlatformPrint->mode == nsPluginMode_Embedded) dprintf(("%s: Embed: platformPrint=%08x windows: windows=%08x, (x,y,width,height)=(%d,%d,%d,%d) type=%d", pszFunction, aPlatformPrint->print.embedPrint.platformPrint, aPlatformPrint->print.embedPrint.window.window, aPlatformPrint->print.embedPrint.window.x, aPlatformPrint->print.embedPrint.window.y, aPlatformPrint->print.embedPrint.window.width, aPlatformPrint->print.embedPrint.window.height, aPlatformPrint->print.embedPrint.window.type)); else if (aPlatformPrint->mode == nsPluginMode_Full) dprintf(("%s: Full: platformPrint=%08x pluginPrinted=%d printOne=%d", pszFunction, aPlatformPrint->print.fullPrint.platformPrint, aPlatformPrint->print.fullPrint.pluginPrinted, aPlatformPrint->print.fullPrint.printOne)); else dprintf(("%s: Unknown mode!", pszFunction)); } rc = VFTCALL1((VFTnsIPluginInstance*)mpvVFTable, Print, mpvThis, aPlatformPrint); UP_LEAVE_INT(rc); return rc; } /** * Returns the value of a variable associated with the plugin instance. * * @param aVariable - the plugin instance variable to get * @param aValue - the address of where to store the resulting value * @result - NS_OK if this operation was successful */ /* void getValue (in nsPluginInstanceVariable aVariable, in voidPtr aValue); */ NS_IMETHOD GetValue(nsPluginInstanceVariable aVariable, void * aValue) { UP_ENTER_RC(); dprintf(("%s: aVariable=%d, aValue=%p", pszFunction, aVariable, aValue)); rc = VFTCALL2((VFTnsIPluginInstance*)mpvVFTable, GetValue, mpvThis, aVariable, aValue); if (VALID_PTR(aValue)) dprintf(("%s: *aValue=%p", pszFunction, *(void**)aValue)); UP_LEAVE_INT(rc); return rc; } /** * Handles an event. An nsIEventHandler can also get registered with with * nsIPluginManager2::RegisterWindow and will be called whenever an event * comes in for that window. * * Note that for Unix and Mac the nsPluginEvent structure is different * from the old NPEvent structure -- it's no longer the native event * record, but is instead a struct. This was done for future extensibility, * and so that the Mac could receive the window argument too. For Windows * and OS2, it's always been a struct, so there's no change for them. * * (Corresponds to NPP_HandleEvent.) * * @param aEvent - the event to be handled * @param aHandled - set to PR_TRUE if event was handled * @result - NS_OK if this operation was successful */ /* void handleEvent (in nsPluginEventPtr aEvent, out boolean aHandled); */ NS_IMETHOD HandleEvent(nsPluginEvent * aEvent, PRBool *aHandled) { UP_ENTER_RC(); dprintf(("%s: aEvent=%p, aHandled=%p", pszFunction, aEvent, aHandled)); rc = VFTCALL2((VFTnsIPluginInstance*)mpvVFTable, HandleEvent, mpvThis, aEvent, aHandled); if (VALID_PTR(aHandled)) dprintf(("%s: *aHandled=%d", pszFunction, *aHandled)); UP_LEAVE_INT(rc); return rc; } /** * Constructor. */ UpPluginInstance(void *pvThis) : UpSupportsBase(pvThis, (nsIPluginInstance*)this, kPluginInstanceIID) { } /** * Destructor. */ ~UpPluginInstance() { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIPluginInstancePeer //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIPluginInstancePeer Base Wrapper */ class UpPluginInstancePeerBase : public UpSupportsBase { protected: /** * Returns the value of a variable associated with the plugin manager. * * (Corresponds to NPN_GetValue.) * * @param aVariable - the plugin manager variable to get * @param aValue - the address of where to store the resulting value * @result - NS_OK if this operation was successful */ /* void getValue (in nsPluginInstancePeerVariable aVariable, in voidPtr aValue); */ NS_IMETHOD hlpGetValue(nsPluginInstancePeerVariable aVariable, void * aValue) { UP_ENTER_RC(); dprintf(("%s: aVariable=%d, aValue=%p", pszFunction, aVariable, aValue)); rc = VFTCALL2((VFTnsIPluginInstancePeer*)mpvVFTable, GetValue, mpvThis, aVariable, aValue); if (VALID_PTR(aValue)) dprintf(("%s: *aValue=%p", pszFunction, aValue)); UP_LEAVE_INT(rc); return rc; } /** * Returns the MIME type of the plugin instance. * * (Corresponds to NPP_New's MIMEType argument.) * * @param aMIMEType - resulting MIME type * @result - NS_OK if this operation was successful */ /* readonly attribute nsMIMEType MIMEType; */ NS_IMETHOD hlpGetMIMEType(nsMIMEType *aMIMEType) { UP_ENTER_RC(); dprintf(("%s: aMIMEType=%p", pszFunction, aMIMEType)); rc = VFTCALL1((VFTnsIPluginInstancePeer*)mpvVFTable, GetMIMEType, mpvThis, aMIMEType); if (NS_SUCCEEDED(rc) && VALID_PTR(aMIMEType) && VALID_PTR(*aMIMEType)) DPRINTF_STR(*aMIMEType); UP_LEAVE_INT(rc); return rc; } /** * Returns the mode of the plugin instance, i.e. whether the plugin is * embedded in the html, or full page. * * (Corresponds to NPP_New's mode argument.) * * @param result - the resulting mode * @result - NS_OK if this operation was successful */ /* readonly attribute nsPluginMode mode; */ NS_IMETHOD hlpGetMode(nsPluginMode *aMode) { UP_ENTER_RC(); dprintf(("%s: aMode=%p", pszFunction, aMode)); rc = VFTCALL1((VFTnsIPluginInstancePeer*)mpvVFTable, GetMode, mpvThis, aMode); if (NS_SUCCEEDED(rc) && VALID_PTR(aMode)) dprintf(("%s: *aMode=%d", pszFunction, aMode)); UP_LEAVE_INT(rc); return rc; } /** * This operation is called by the plugin instance when it wishes to send * a stream of data to the browser. It constructs a new output stream to which * the plugin may send the data. When complete, the Close and Release methods * should be called on the output stream. * * (Corresponds to NPN_NewStream.) * * @param aType - MIME type of the stream to create * @param aTarget - the target window name to receive the data * @param aResult - the resulting output stream * @result - NS_OK if this operation was successful */ /* void newStream (in nsMIMEType aType, in string aTarget, out nsIOutputStream aResult); */ NS_IMETHOD hlpNewStream(nsMIMEType aType, const char *aTarget, nsIOutputStream **aResult) { //@todo TEXT: aTarget? Doesn't apply to java plugin I think. UP_ENTER_RC(); dprintf(("%s: aResult=%p", pszFunction, aResult)); DPRINTF_STR(aTarget); DPRINTF_STR(aType); rc = VFTCALL3((VFTnsIPluginInstancePeer*)mpvVFTable, NewStream, mpvThis, aType, aTarget, aResult); rc = upCreateWrapper((void**)aResult, kOutputStreamIID, rc); UP_LEAVE_INT(rc); return rc; } /** * This operation causes status information to be displayed on the window * associated with the plugin instance. * * (Corresponds to NPN_Status.) * * @param aMessage - the status message to display * @result - NS_OK if this operation was successful */ /* void showStatus (in string aMessage); */ NS_IMETHOD hlpShowStatus(const char *aMessage) { //@todo TEXT: aMessage? This must be further tested! UP_ENTER_RC(); DPRINTF_STR(aMessage); rc = VFTCALL1((VFTnsIPluginInstancePeer*)mpvVFTable, ShowStatus, mpvThis, aMessage); UP_LEAVE_INT(rc); return rc; } /** * Set the desired size of the window in which the plugin instance lives. * * @param aWidth - new window width * @param aHeight - new window height * @result - NS_OK if this operation was successful */ /* void setWindowSize (in unsigned long aWidth, in unsigned long aHeight); */ NS_IMETHOD hlpSetWindowSize(PRUint32 aWidth, PRUint32 aHeight) { UP_ENTER_RC(); dprintf(("%s: aWidth=%d, aHeight=%d", pszFunction, aWidth, aHeight)); rc = VFTCALL2((VFTnsIPluginInstancePeer*)mpvVFTable, SetWindowSize, mpvThis, aWidth, aHeight); UP_LEAVE_INT(rc); return rc; } /** * Constructor. * * @param pvThis Pointer to the Win32 class. * @param pvInterface Pointer to the interface we implement. Meaning * what's returned on a query interface. * @param iid The Interface ID of the wrapped interface. */ UpPluginInstancePeerBase(void *pvThis, void *pvInterface, REFNSIID iid) : UpSupportsBase(pvThis, pvInterface, iid) { } }; /** * nsIPluginInstancePeer Wrapper */ class UpPluginInstancePeer : public nsIPluginInstancePeer, public UpPluginInstancePeerBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIPLUGININSTANCEPEER(); /** * Constructor */ UpPluginInstancePeer(void *pvThis) : UpPluginInstancePeerBase(pvThis, (nsIPluginInstancePeer*)this, kPluginInstancePeerIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIPluginInstancePeer2 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIPluginInstancePeer2 Wrapper */ class UpPluginInstancePeer2 : public nsIPluginInstancePeer2, public UpPluginInstancePeerBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIPLUGININSTANCEPEER(); /** * Get the JavaScript window object corresponding to this plugin instance. * * @param aJSWindow - the resulting JavaScript window object * @result - NS_OK if this operation was successful */ /* readonly attribute JSObjectPtr JSWindow; */ NS_IMETHOD GetJSWindow(JSObject * *aJSWindow) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIPluginInstancePeer2*)mpvVFTable, GetJSWindow, mpvThis, aJSWindow); if (NS_SUCCEEDED(rc) && VALID_PTR(aJSWindow)) { //@todo wrap aJSWindow? YES (*aJSWindow)->map->ops must be wrapped. // struct JSObjectOps in jsapi.h defines that vtable. dprintf(("%s: aJSWindow=%p - JS Wrapping !!!", pszFunction, aJSWindow)); DebugInt3(); } UP_LEAVE_INT(rc); return rc; } /** * Get the JavaScript execution thread corresponding to this plugin instance. * * @param aJSThread - the resulting JavaScript thread id * @result - NS_OK if this operation was successful */ /* readonly attribute unsigned long JSThread; */ NS_IMETHOD GetJSThread(PRUint32 *aJSThread) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIPluginInstancePeer2*)mpvVFTable, GetJSThread, mpvThis, aJSThread); if (NS_SUCCEEDED(rc) && VALID_PTR(aJSThread)) dprintf(("%s: aJSThread=%u", pszFunction, aJSThread)); UP_LEAVE_INT(rc); return rc; } /** * Get the JavaScript context to this plugin instance. * * @param aJSContext - the resulting JavaScript context * @result - NS_OK if this operation was successful */ /* readonly attribute JSContextPtr JSContext; */ NS_IMETHOD GetJSContext(JSContext * *aJSContext) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIPluginInstancePeer2*)mpvVFTable, GetJSContext, mpvThis, aJSContext); if (NS_SUCCEEDED(rc) && VALID_PTR(aJSContext)) { //@todo wrap aJSContext? YES YES YES YES // struct JSObjectOps in jsapi.h defines that vtable. dprintf(("%s: aJSContext=%p - JS Wrapping !!!", pszFunction, aJSContext)); DebugInt3(); } UP_LEAVE_INT(rc); return rc; } /** * Constructor */ UpPluginInstancePeer2(void *pvThis) : UpPluginInstancePeerBase(pvThis, (nsIPluginInstancePeer2*)this, kPluginInstancePeer2IID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIPluginTagInfo //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// class UpPluginTagInfo : public nsIPluginTagInfo, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * QueryInterface on nsIPluginInstancePeer to get this. * * (Corresponds to NPP_New's argc, argn, and argv arguments.) * Get a ptr to the paired list of attribute names and values, * returns the length of the array. * * Each name or value is a null-terminated string. */ /* void getAttributes (in PRUint16Ref aCount, in constCharStarConstStar aNames, in constCharStarConstStar aValues); */ NS_IMETHOD GetAttributes(PRUint16 & aCount, const char* const* & aNames, const char* const* & aValues) { UP_ENTER_RC(); rc = VFTCALL3((VFTnsIPluginTagInfo*)mpvVFTable, GetAttributes, mpvThis, aCount, aNames, aValues); if (NS_SUCCEEDED(rc)) { dprintf(("%s: aCount=%d", pszFunction, aCount)); for (int i = 0; i < aCount; i++) dprintf(("%s: aNames[%d]='%s' (%p) aValues[%d]='%s' (%p)", pszFunction, i, aNames[i], aNames[i], i, aValues[i], aValues[i])); } UP_LEAVE_INT(rc); return rc; } /** * Gets the value for the named attribute. * * @param aName - the name of the attribute to find * @param aResult - the resulting attribute * @result - NS_OK if this operation was successful, NS_ERROR_FAILURE if * this operation failed. result is set to NULL if the attribute is not found * else to the found value. */ /* void getAttribute (in string aName, out constCharPtr aResult); */ NS_IMETHOD GetAttribute(const char *aName, const char * *aResult) { //@todo TEXT: aName? aResult? I believe that this one works as the text format is that of the document. UP_ENTER_RC(); rc = VFTCALL2((VFTnsIPluginTagInfo*)mpvVFTable, GetAttribute, mpvThis, aName, aResult); if (NS_SUCCEEDED(rc) && VALID_PTR(aResult) && VALID_PTR(*aResult)) DPRINTF_STR(*aResult); UP_LEAVE_INT(rc); return rc; } /** * Constructor. */ UpPluginTagInfo(void *pvThis) : UpSupportsBase(pvThis, (nsIPluginTagInfo*)pvThis, kPluginTagInfoIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIJVMWindow //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Base class for nsIJVMWindow decendants. */ class UpJVMWindowBase : public UpSupportsBase { protected: NS_IMETHOD hlpShow(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIJVMWindow*)mpvVFTable, Show, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD hlpHide(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIJVMWindow*)mpvVFTable, Hide, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD hlpIsVisible(PRBool *result) { UP_ENTER_RC(); rc = VFTCALL1((VFTnsIJVMWindow*)mpvVFTable, IsVisible, mpvThis, result); if (NS_SUCCEEDED(rc) && VALID_PTR(result)) dprintf(("%s: *result=%d", pszFunction, *result)); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpJVMWindowBase(void *pvThis, void *pvInterface, REFNSIID aIID) : UpSupportsBase(pvThis, pvInterface, aIID) { } }; /** * nsIJVMWindow */ class UpJVMWindow : public nsIJVMWindow, public UpJVMWindowBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIJVMWINDOW(); /** Constructor */ UpJVMWindow(void *pvThis) : UpJVMWindowBase(pvThis, (nsIJVMWindow*)this, kJVMWindowIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIJVMConsole //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIJVMConsole */ class UpJVMConsole : public nsIJVMConsole, public UpJVMWindowBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIJVMWINDOW(); // Prints a message to the Java console. The encodingName specifies the // encoding of the message, and if NULL, specifies the default platform // encoding. NS_IMETHOD Print(const char* msg, const char* encodingName = NULL) { UP_ENTER_RC(); DPRINTF_STR(msg); DPRINTF_STRNULL(encodingName); rc = VFTCALL2((VFTnsIJVMConsole*)mpvVFTable, Print, mpvThis, msg, encodingName); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpJVMConsole(void *pvThis) : UpJVMWindowBase(pvThis, (nsIJVMWindow*)this, kJVMConsoleIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIEventHandler //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIEventHandler */ class UpEventHandler : public nsIEventHandler, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Handles an event. An nsIEventHandler can also get registered with with * nsIPluginManager2::RegisterWindow and will be called whenever an event * comes in for that window. * * Note that for Unix and Mac the nsPluginEvent structure is different * from the old NPEvent structure -- it's no longer the native event * record, but is instead a struct. This was done for future extensibility, * and so that the Mac could receive the window argument too. For Windows * and OS2, it's always been a struct, so there's no change for them. * * (Corresponds to NPP_HandleEvent.) * * @param aEvent - the event to be handled * @param aHandled - set to PR_TRUE if event was handled * @result - NS_OK if this operation was successful */ /* void handleEvent (in nsPluginEventPtr aEvent, out boolean aHandled); */ NS_IMETHOD HandleEvent(nsPluginEvent *aEvent, PRBool *aHandled) { UP_ENTER_RC(); rc = VFTCALL2((VFTnsIEventHandler*)mpvVFTable, HandleEvent, mpvThis, aEvent, aHandled); if (NS_SUCCEEDED(rc) && VALID_PTR(aHandled)) dprintf(("%s: *aHandled=%d", pszFunction, *aHandled)); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpEventHandler(void *pvThis) : UpSupportsBase(pvThis, (nsIEventHandler*)this, kEventHandlerIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIRunnable //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIRunnable */ class UpRunnable : public nsIRunnable, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Defines an entry point for a newly created thread. */ NS_IMETHOD Run() { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIRunnable*)mpvVFTable, Run, mpvThis); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpRunnable(void *pvThis) : UpSupportsBase(pvThis, (nsIRunnable*)this, kRunnableIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: UpSecurityContext //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * UpSecurityContext */ class UpSecurityContext : public nsISecurityContext, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Get the security context to be used in LiveConnect. * This is used for JavaScript <--> Java. * * @param target -- Possible target. * @param action -- Possible action on the target. * @return -- NS_OK if the target and action is permitted on the security context. * -- NS_FALSE otherwise. */ NS_IMETHOD Implies(const char* target, const char* action, PRBool *bAllowedAccess) { UP_ENTER_RC(); dprintf(("%s: target=%p action=%p bAllowedAccess=%p", pszFunction, target, action, bAllowedAccess)); DPRINTF_STR(target); DPRINTF_STR(action); rc = VFTCALL3((VFTnsISecurityContext*)mpvVFTable, Implies, mpvThis, target, action, bAllowedAccess); if (NS_SUCCEEDED(rc) && VALID_PTR(bAllowedAccess)) dprintf(("%s: *bAllowedAccess=%d", pszFunction, *bAllowedAccess)); UP_LEAVE_INT(rc); return rc; } /** * Get the origin associated with the context. * * @param buf -- Result buffer (managed by the caller.) * @param len -- Buffer length. * @return -- NS_OK if the codebase string was obtained. * -- NS_FALSE otherwise. */ NS_IMETHOD GetOrigin(char* buf, int len) { UP_ENTER_RC(); dprintf(("%s: buf=%p len=%d ", pszFunction, buf, len)); rc = VFTCALL2((VFTnsISecurityContext*)mpvVFTable, GetOrigin, mpvThis, buf, len); if (NS_SUCCEEDED(rc) && VALID_PTR(buf)) DPRINTF_STR(buf); UP_LEAVE_INT(rc); return rc; } /** * Get the certificate associated with the context. * * @param buf -- Result buffer (managed by the caller.) * @param len -- Buffer length. * @return -- NS_OK if the codebase string was obtained. * -- NS_FALSE otherwise. */ NS_IMETHOD GetCertificateID(char* buf, int len) { UP_ENTER_RC(); dprintf(("%s: buf=%p len=%d ", pszFunction, buf, len)); rc = VFTCALL2((VFTnsISecurityContext*)mpvVFTable, GetCertificateID, mpvThis, buf, len); if (NS_SUCCEEDED(rc) && VALID_PTR(buf)) DPRINTF_STR(*buf); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpSecurityContext(void *pvThis) : UpSupportsBase(pvThis, (nsISecurityContext*)this, kSecurityContextIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIRequestObserver //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Base class for nsIJVMWindow decendants. */ class UpRequestObserverBase : public UpSupportsBase { protected: /** * Called to signify the beginning of an asynchronous request. * * @param aRequest request being observed * @param aContext user defined context * * An exception thrown from onStartRequest has the side-effect of * causing the request to be canceled. */ /* void onStartRequest (in nsIRequest aRequest, in nsISupports aContext); */ NS_IMETHOD hlpOnStartRequest(nsIRequest *aRequest, nsISupports *aContext) { UP_ENTER_RC(); dprintf(("%s: aRequest=%p aContext=%p", pszFunction, aRequest, aContext)); nsIRequest *pDownRequest = aRequest; rc = downCreateWrapper((void**)&pDownRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pDownSupports = aContext; rc = downCreateWrapper((void**)&pDownSupports, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL2((VFTnsIRequestObserver*)mpvVFTable, OnStartRequest, mpvThis, pDownRequest, pDownSupports); } UP_LEAVE_INT(rc); return rc; } /** * Called to signify the end of an asynchronous request. This * call is always preceded by a call to onStartRequest. * * @param aRequest request being observed * @param aContext user defined context * @param aStatusCode reason for stopping (NS_OK if completed successfully) * * An exception thrown from onStopRequest is generally ignored. */ /* void onStopRequest (in nsIRequest aRequest, in nsISupports aContext, in nsresult aStatusCode); */ NS_IMETHOD hlpOnStopRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) { UP_ENTER_RC(); dprintf(("%s: aRequest=%p aContext=%p aStatusCode", pszFunction, aRequest, aContext, aStatusCode)); nsIRequest *pDownRequest = aRequest; rc = downCreateWrapper((void**)&pDownRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pDownSupports = aContext; rc = downCreateWrapper((void**)&pDownSupports, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL3((VFTnsIRequestObserver*)mpvVFTable, OnStopRequest, mpvThis, pDownRequest, pDownSupports, aStatusCode); } UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpRequestObserverBase(void *pvThis, void *pvInterface, REFNSIID aIID) : UpSupportsBase(pvThis, pvInterface, aIID) { } }; /** * nsRequestObserver */ class UpRequestObserver : public nsIRequestObserver, public UpRequestObserverBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIREQUESTOBSERVER(); /** Constructor */ UpRequestObserver(void *pvThis) : UpRequestObserverBase(pvThis, (nsIRequestObserver*)this, kRequestObserverIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIStreamListener //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * UpSecurityContext */ class UpStreamListener : public nsIStreamListener, public UpRequestObserverBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIREQUESTOBSERVER(); /** * Called when the next chunk of data (corresponding to the request) may * be read without blocking the calling thread. The onDataAvailable impl * must read exactly |aCount| bytes of data before returning. * * @param aRequest request corresponding to the source of the data * @param aContext user defined context * @param aInputStream input stream containing the data chunk * @param aOffset current stream position * @param aCount number of bytes available in the stream * * An exception thrown from onDataAvailable has the side-effect of * causing the request to be canceled. */ /* void onDataAvailable (in nsIRequest aRequest, in nsISupports aContext, in nsIInputStream aInputStream, in unsigned long aOffset, in unsigned long aCount); */ NS_IMETHOD OnDataAvailable(nsIRequest *aRequest, nsISupports *aContext, nsIInputStream *aInputStream, PRUint32 aOffset, PRUint32 aCount) { UP_ENTER_RC(); dprintf(("%s: aRequest=%p aContext=%p aInputStream=%p aOffset=%d aCount=%d", pszFunction, aRequest, aContext, aInputStream, aOffset, aCount)); nsIRequest *pDownRequest = aRequest; rc = downCreateWrapper((void**)&pDownRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pDownSupports = aContext; rc = downCreateWrapper((void**)&pDownSupports, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsIInputStream *pDownInputStream = aInputStream; rc = downCreateWrapper((void**)&pDownInputStream, kInputStreamIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL5((VFTnsIStreamListener*)mpvVFTable, OnDataAvailable, mpvThis, pDownRequest, pDownSupports, pDownInputStream, aOffset, aCount); } } UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpStreamListener(void *pvThis) : UpRequestObserverBase(pvThis, (nsIStreamListener*)this, kStreamListenerIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIRequest //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIRequest */ class UpRequestBase : public UpSupportsBase { protected: /** * The name of the request. Often this is the URI of the request. */ /* readonly attribute AUTF8String name; */ NS_IMETHOD hlpGetName(nsACString & aName) { UP_ENTER_RC(); dprintf(("%s: &aName=%p", pszFunction, &aName)); /** @todo Wrap nsACString */ dprintf(("%s: nsACString wrapping isn't supported.", pszFunction)); ReleaseInt3(0xbaddbeef, 32, 0); rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, GetName, mpvThis, aName); UP_LEAVE_INT(rc); return rc; } /** * @return TRUE if the request has yet to reach completion. * @return FALSE if the request has reached completion (e.g., after * OnStopRequest has fired). * Suspended requests are still considered pending. */ /* boolean isPending (); */ NS_IMETHOD hlpIsPending(PRBool *_retval) { UP_ENTER_RC(); dprintf(("%s: _retval=%p", pszFunction, _retval)); rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, IsPending, mpvThis, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d", pszFunction, *_retval)); UP_LEAVE_INT(rc); return rc; } /** * The error status associated with the request. */ /* readonly attribute nsresult status; */ NS_IMETHOD hlpGetStatus(nsresult *aStatus) { UP_ENTER_RC(); dprintf(("%s: aStatus=%p", pszFunction, aStatus)); rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, GetStatus, mpvThis, aStatus); if (VALID_PTR(aStatus)) dprintf(("%s: *aStatus=%d", pszFunction, *aStatus)); UP_LEAVE_INT(rc); return rc; } /** * Cancels the current request. This will close any open input or * output streams and terminate any async requests. Users should * normally pass NS_BINDING_ABORTED, although other errors may also * be passed. The error passed in will become the value of the * status attribute. * * @param aStatus the reason for canceling this request. * * NOTE: most nsIRequest implementations expect aStatus to be a * failure code; however, some implementations may allow aStatus to * be a success code such as NS_OK. In general, aStatus should be * a failure code. */ /* void cancel (in nsresult aStatus); */ NS_IMETHOD hlpCancel(nsresult aStatus) { UP_ENTER_RC(); dprintf(("%s: aStatus=%p", pszFunction, aStatus)); rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, Cancel, mpvThis, aStatus); UP_LEAVE_INT(rc); return rc; } /** * Suspends the current request. This may have the effect of closing * any underlying transport (in order to free up resources), although * any open streams remain logically opened and will continue delivering * data when the transport is resumed. * * NOTE: some implementations are unable to immediately suspend, and * may continue to deliver events already posted to an event queue. In * general, callers should be capable of handling events even after * suspending a request. */ /* void suspend (); */ NS_IMETHOD hlpSuspend(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIRequest*)mpvVFTable, Suspend, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Resumes the current request. This may have the effect of re-opening * any underlying transport and will resume the delivery of data to * any open streams. */ /* void resume (); */ NS_IMETHOD hlpResume(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIRequest*)mpvVFTable, Resume, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * The load group of this request. While pending, the request is a * member of the load group. It is the responsibility of the request * to implement this policy. */ /* attribute nsILoadGroup loadGroup; */ NS_IMETHOD hlpGetLoadGroup(nsILoadGroup * *aLoadGroup) { UP_ENTER_RC(); dprintf(("%s: aLoadGroup=%p\n", pszFunction, aLoadGroup)); rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, GetLoadGroup, mpvThis, aLoadGroup); rc = upCreateWrapper((void**)aLoadGroup, kLoadGroupIID, rc); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD hlpSetLoadGroup(nsILoadGroup * aLoadGroup) { UP_ENTER_RC(); dprintf(("%s: aLoadGroup=%p\n", pszFunction, aLoadGroup)); nsILoadGroup *pDownLoadGroup = aLoadGroup; rc = downCreateWrapper((void**)&pDownLoadGroup, kLoadGroupIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, SetLoadGroup, mpvThis, pDownLoadGroup); UP_LEAVE_INT(rc); return rc; } /** * The load flags of this request. Bits 0-15 are reserved. * * When added to a load group, this request's load flags are merged with * the load flags of the load group. */ /* attribute nsLoadFlags loadFlags; */ NS_IMETHOD hlpGetLoadFlags(nsLoadFlags *aLoadFlags) { UP_ENTER_RC(); dprintf(("%s: aLoadFlags=%p\n", pszFunction, aLoadFlags)); rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, GetLoadFlags, mpvThis, aLoadFlags); if (VALID_PTR(aLoadFlags)) dprintf(("%s: *aLoadFlags=%d", pszFunction, *aLoadFlags)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD hlpSetLoadFlags(nsLoadFlags aLoadFlags) { UP_ENTER_RC(); dprintf(("%s: aLoadFlags=%#x\n", pszFunction, aLoadFlags)); rc = VFTCALL1((VFTnsIRequest*)mpvVFTable, SetLoadFlags, mpvThis, aLoadFlags); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpRequestBase(void *pvThis, void *pvInterface, REFNSIID aIID) : UpSupportsBase(pvThis, pvInterface, aIID) { } }; /** * nsRequest */ class UpRequest : public nsIRequest, public UpRequestBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIREQUEST(); /** Constructor */ UpRequest(void *pvThis) : UpRequestBase(pvThis, (nsIRequest*)this, kRequestIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsILoadGroup //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsILoadGroup */ class UpLoadGroup : public nsILoadGroup, public UpRequestBase { public: UP_IMPL_NSISUPPORTS(); UP_IMPL_NSIREQUEST(); /** * The group observer is notified when requests are added to and removed * from this load group. The groupObserver is weak referenced. */ /* attribute nsIRequestObserver groupObserver; */ NS_IMETHOD GetGroupObserver(nsIRequestObserver * *aGroupObserver) { UP_ENTER_RC(); dprintf(("%s: aGroupObserver=%p\n", pszFunction, aGroupObserver)); rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, GetGroupObserver, mpvThis, aGroupObserver); rc = upCreateWrapper((void**)aGroupObserver, kRequestObserverIID, rc); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetGroupObserver(nsIRequestObserver * aGroupObserver) { UP_ENTER_RC(); dprintf(("%s: aGroupObserver=%p\n", pszFunction, aGroupObserver)); nsIRequestObserver *pDownGroupObserver = aGroupObserver; rc = downCreateWrapper((void**)&pDownGroupObserver, kRequestObserverIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, SetGroupObserver, mpvThis, pDownGroupObserver); UP_LEAVE_INT(rc); return rc; } /** * Accesses the default load request for the group. Each time a number * of requests are added to a group, the defaultLoadRequest may be set * to indicate that all of the requests are related to a base request. * * The load group inherits its load flags from the default load request. * If the default load request is NULL, then the group's load flags are * not changed. */ /* attribute nsIRequest defaultLoadRequest; */ NS_IMETHOD GetDefaultLoadRequest(nsIRequest * *aDefaultLoadRequest) { UP_ENTER_RC(); dprintf(("%s: aDefaultLoadRequest=%p\n", pszFunction, aDefaultLoadRequest)); rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, GetDefaultLoadRequest, mpvThis, aDefaultLoadRequest); rc = upCreateWrapper((void**)aDefaultLoadRequest, kRequestIID, rc); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetDefaultLoadRequest(nsIRequest * aDefaultLoadRequest) { UP_ENTER_RC(); dprintf(("%s: aDefaultLoadRequest=%p\n", pszFunction, aDefaultLoadRequest)); nsIRequest *pDownDefaultLoadRequest = aDefaultLoadRequest; rc = downCreateWrapper((void**)&pDownDefaultLoadRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, SetDefaultLoadRequest, mpvThis, pDownDefaultLoadRequest); UP_LEAVE_INT(rc); return rc; } /** * Adds a new request to the group. This will cause the default load * flags to be applied to the request. If this is a foreground * request then the groupObserver's onStartRequest will be called. * * If the request is the default load request or if the default load * request is null, then the load group will inherit its load flags from * the request. */ /* void addRequest (in nsIRequest aRequest, in nsISupports aContext); */ NS_IMETHOD AddRequest(nsIRequest *aRequest, nsISupports *aContext) { UP_ENTER_RC(); dprintf(("%s: aRequest=%p aContext=%p", pszFunction, aRequest, aContext)); nsIRequest *pDownRequest = aRequest; rc = downCreateWrapper((void**)&pDownRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pDownSupports = aContext; rc = downCreateWrapper((void**)&pDownSupports, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL2((VFTnsILoadGroup*)mpvVFTable, AddRequest, mpvThis, pDownRequest, pDownSupports); } UP_LEAVE_INT(rc); return rc; } /** * Removes a request from the group. If this is a foreground request * then the groupObserver's onStopRequest will be called. */ /* void removeRequest (in nsIRequest aRequest, in nsISupports aContext, in nsresult aStatus); */ NS_IMETHOD RemoveRequest(nsIRequest *aRequest, nsISupports *aContext, nsresult aStatus) { UP_ENTER_RC(); dprintf(("%s: aRequest=%p aContext=%p aStatus=%d", pszFunction, aRequest, aContext, aStatus)); nsIRequest *pDownRequest = aRequest; rc = downCreateWrapper((void**)&pDownRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pDownSupports = aContext; rc = downCreateWrapper((void**)&pDownSupports, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL3((VFTnsILoadGroup*)mpvVFTable, RemoveRequest, mpvThis, pDownRequest, pDownSupports, aStatus); } UP_LEAVE_INT(rc); return rc; } /** * Returns the requests contained directly in this group. * Enumerator element type: nsIRequest. */ /* readonly attribute nsISimpleEnumerator requests; */ NS_IMETHOD GetRequests(nsISimpleEnumerator * *aRequests) { UP_ENTER_RC(); dprintf(("%s: aRequests=%p", pszFunction, aRequests)); rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, GetRequests, mpvThis, aRequests); rc = upCreateWrapper((void**)aRequests, kSimpleEnumeratorIID, rc); UP_LEAVE_INT(rc); return rc; } /** * Returns the count of "active" requests (ie. requests without the * LOAD_BACKGROUND bit set). */ /* readonly attribute unsigned long activeCount; */ NS_IMETHOD GetActiveCount(PRUint32 *aActiveCount) { UP_ENTER_RC(); dprintf(("%s: aActiveCount=%p", pszFunction, aActiveCount)); rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, GetActiveCount, mpvThis, aActiveCount); if (VALID_PTR(aActiveCount)) dprintf(("%s: *aActiveCount=%d", pszFunction, *aActiveCount)); UP_LEAVE_INT(rc); return rc; } /** * Notification callbacks for the load group. */ /* attribute nsIInterfaceRequestor notificationCallbacks; */ NS_IMETHOD GetNotificationCallbacks(nsIInterfaceRequestor * *aNotificationCallbacks) { UP_ENTER_RC(); dprintf(("%s: aNotificationCallbacks=%p", pszFunction, aNotificationCallbacks)); rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, GetNotificationCallbacks, mpvThis, aNotificationCallbacks); rc = upCreateWrapper((void**)aNotificationCallbacks, kInterfaceRequestorIID, rc); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetNotificationCallbacks(nsIInterfaceRequestor * aNotificationCallbacks) { UP_ENTER_RC(); dprintf(("%s: aNotificationCallbacks=%p", pszFunction, aNotificationCallbacks)); nsIInterfaceRequestor *pDownNotificationCallbacks = aNotificationCallbacks; rc = downCreateWrapper((void**)&pDownNotificationCallbacks, kInterfaceRequestorIID, rc); if (NS_SUCCEEDED(rc)) rc = VFTCALL1((VFTnsILoadGroup*)mpvVFTable, SetNotificationCallbacks, mpvThis, pDownNotificationCallbacks); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpLoadGroup(void *pvThis) : UpRequestBase(pvThis, (nsILoadGroup*)this, kLoadGroupIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsISimpleEnumerator //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsISimpleEnumerator */ class UpSimpleEnumerator : public nsISimpleEnumerator, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Called to determine whether or not the enumerator has * any elements that can be returned via getNext(). This method * is generally used to determine whether or not to initiate or * continue iteration over the enumerator, though it can be * called without subsequent getNext() calls. Does not affect * internal state of enumerator. * * @see getNext() * @return PR_TRUE if there are remaining elements in the enumerator. * PR_FALSE if there are no more elements in the enumerator. */ /* boolean hasMoreElements (); */ NS_IMETHOD HasMoreElements(PRBool *_retval) { UP_ENTER_RC(); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = VFTCALL1((VFTnsISimpleEnumerator*)mpvVFTable, HasMoreElements, mpvThis, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d", pszFunction, *_retval)); UP_LEAVE_INT(rc); return rc; } /** * Called to retrieve the next element in the enumerator. The "next" * element is the first element upon the first call. Must be * pre-ceeded by a call to hasMoreElements() which returns PR_TRUE. * This method is generally called within a loop to iterate over * the elements in the enumerator. * * @see hasMoreElements() * @return NS_OK if the call succeeded in returning a non-null * value through the out parameter. * NS_ERROR_FAILURE if there are no more elements * to enumerate. * @return the next element in the enumeration. */ /* nsISupports getNext (); */ NS_IMETHOD GetNext(nsISupports **_retval) { UP_ENTER_RC(); dprintf(("%s: _retval=%p", pszFunction, _retval)); rc = VFTCALL1((VFTnsISimpleEnumerator*)mpvVFTable, GetNext, mpvThis, _retval); rc = upCreateWrapper((void**)_retval, kSupportsIID, rc); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpSimpleEnumerator(void *pvThis) : UpSupportsBase(pvThis, (nsISimpleEnumerator*)this, kSimpleEnumeratorIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIInterfaceRequestor //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIInterfaceRequstor */ class UpInterfaceRequestor : public nsIInterfaceRequestor, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Retrieves the specified interface pointer. * * @param uuid The IID of the interface being requested. * @param result [out] The interface pointer to be filled in if * the interface is accessible. * @return NS_OK - interface was successfully returned. * NS_NOINTERFACE - interface not accessible. * NS_ERROR* - method failure. */ /* void getInterface (in nsIIDRef uuid, [iid_is (uuid), retval] out nsQIResult result); */ NS_IMETHOD GetInterface(const nsIID & uuid, void * *result) { UP_ENTER_RC(); DPRINTF_NSID(uuid); rc = VFTCALL2((VFTnsIInterfaceRequestor*)mpvVFTable, GetInterface, mpvThis, uuid, result); rc = upCreateWrapper(result, uuid, rc); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpInterfaceRequestor(void *pvThis) : UpSupportsBase(pvThis, (nsIInterfaceRequestor*)this, kInterfaceRequestorIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIOutputStream //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Special wrapper function which get called from a little stub we create * in UpOutputStream::WriteSegments. The stub pushed the entry point of * the original function before calling us. */ nsresult __cdecl UpOutputStream_nsReadSegmentWrapper(nsReadSegmentFun pfnOrg, void *pvRet, nsIOutputStream *aOutStream, void *aClosure, char *aToSegment, PRUint32 aFromOffset, PRUint32 aCount, PRUint32 *aReadCount) { DEBUG_FUNCTIONNAME(); nsresult rc; dprintf(("%s: pfnOrg=%p pvRet=%p aOutStream=%p aClosure=%p aToSegment=%p aFromOffset=%d aCount=%d aReadCount=%p\n", pszFunction, pfnOrg, pvRet, aOutStream, aClosure, aToSegment, aFromOffset, aCount, aReadCount)); nsIOutputStream * pupOutStream = aOutStream; rc = upCreateWrapper((void**)&pupOutStream, kOutputStreamIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pfnOrg(pupOutStream, aClosure, aToSegment, aFromOffset, aCount, aReadCount); if (VALID_PTR(aReadCount)) dprintf(("%s: *aReadCount=%d\n", pszFunction, *aReadCount)); } dprintf(("%s: rc=%d\n", pszFunction, rc)); return rc; } /** * nsIOutputStream */ class UpOutputStream : public nsIOutputStream, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Close the stream. Forces the output stream to flush any buffered data. * * @throws NS_BASE_STREAM_WOULD_BLOCK if unable to flush without blocking * the calling thread (non-blocking mode only) */ /* void close (); */ NS_IMETHOD Close(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIOutputStream*)mpvVFTable, Close, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Flush the stream. * * @throws NS_BASE_STREAM_WOULD_BLOCK if unable to flush without blocking * the calling thread (non-blocking mode only) */ /* void flush (); */ NS_IMETHOD Flush(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIOutputStream*)mpvVFTable, Flush, mpvThis); UP_LEAVE_INT(rc); return rc; } /** * Write data into the stream. * * @param aBuf the buffer containing the data to be written * @param aCount the maximum number of bytes to be written * * @return number of bytes written (may be less than aCount) * * @throws NS_BASE_STREAM_WOULD_BLOCK if writing to the output stream would * block the calling thread (non-blocking mode only) * @throws on failure */ /* unsigned long write (in string aBuf, in unsigned long aCount); */ NS_IMETHOD Write(const char *aBuf, PRUint32 aCount, PRUint32 *_retval) { UP_ENTER_RC(); dprintf(("%s: aBuf=%p aCount=%d _retval=%p", pszFunction, aBuf, aCount, _retval)); rc = VFTCALL3((VFTnsIOutputStream*)mpvVFTable, Write, mpvThis, aBuf, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); UP_LEAVE_INT(rc); return rc; } /** * Writes data into the stream from an input stream. * * @param aFromStream the stream containing the data to be written * @param aCount the maximum number of bytes to be written * * @return number of bytes written (may be less than aCount) * * @throws NS_BASE_STREAM_WOULD_BLOCK if writing to the output stream would * block the calling thread (non-blocking mode only) * @throws on failure * * NOTE: This method is defined by this interface in order to allow the * output stream to efficiently copy the data from the input stream into * its internal buffer (if any). If this method was provided as an external * facility, a separate char* buffer would need to be used in order to call * the output stream's other Write method. */ /* unsigned long writeFrom (in nsIInputStream aFromStream, in unsigned long aCount); */ NS_IMETHOD WriteFrom(nsIInputStream *aFromStream, PRUint32 aCount, PRUint32 *_retval) { UP_ENTER_RC(); dprintf(("%s: aFromStream=%p aCount=%d _retval=%p", pszFunction, aFromStream, aCount, _retval)); nsIInputStream *pDownFromStream = aFromStream; rc = downCreateWrapper((void**)&pDownFromStream, kInputStreamIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = VFTCALL3((VFTnsIOutputStream*)mpvVFTable, WriteFrom, mpvThis, pDownFromStream, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); } UP_LEAVE_INT(rc); return rc; } /** * Low-level write method that has access to the stream's underlying buffer. * The reader function may be called multiple times for segmented buffers. * WriteSegments is expected to keep calling the reader until either there * is nothing left to write or the reader returns an error. WriteSegments * should not call the reader with zero bytes to provide. * * @param aReader the "provider" of the data to be written * @param aClosure opaque parameter passed to reader * @param aCount the maximum number of bytes to be written * * @return number of bytes written (may be less than aCount) * * @throws NS_BASE_STREAM_WOULD_BLOCK if writing to the output stream would * block the calling thread (non-blocking mode only) * @throws on failure * * NOTE: this function may be unimplemented if a stream has no underlying * buffer (e.g., socket output stream). */ /* [noscript] unsigned long writeSegments (in nsReadSegmentFun aReader, in voidPtr aClosure, in unsigned long aCount); */ NS_IMETHOD WriteSegments(nsReadSegmentFun aReader, void * aClosure, PRUint32 aCount, PRUint32 *_retval) { UP_ENTER_RC(); dprintf(("%s: aReader=%p aClosure=%p aCount=%d _retval=%p", pszFunction, aReader, aClosure, aCount, _retval)); int i; char achWrapper[32]; /* push aReader */ achWrapper[0] = 0x68; *((unsigned*)&achWrapper[1]) = (unsigned)aReader; i = 5; #if VFT_VAC365 /* optlink - mov [ebp + 08h], eax */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x45; achWrapper[i++] = 0x08; /* optlink - mov [ebp + 0ch], edx */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x55; achWrapper[i++] = 0x0c; /* optlink - mov [ebp + 10h], ecx */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x4d; achWrapper[i++] = 0x10; #endif /* call UpOutputStream_nsReadSegmentWrapper */ achWrapper[i] = 0xe8; *((unsigned*)&achWrapper[i+1]) = (unsigned)UpOutputStream_nsReadSegmentWrapper - (unsigned)&achWrapper[i+5]; i += 5; /* add esp, 4 */ achWrapper[i++] = 0x83; achWrapper[i++] = 0xc4; achWrapper[i++] = 0x04; #if VFT_VAC365 /* _Optlink - ret */ achWrapper[i++] = 0xc3; #elif VFT_VC60 /* __stdcall - ret (6*4) */ achWrapper[i++] = 0xc2; achWrapper[i++] = 6*4; achWrapper[i++] = 0; #else #error fixme! neither VFT_VC60 nor VFT_VAC365 was set. #endif achWrapper[i++] = 0xcc; achWrapper[i] = 0xcc; /* do call - this better not be asynchronous stuff. */ rc = VFTCALL4((VFTnsIOutputStream*)mpvVFTable, WriteSegments, mpvThis, (nsReadSegmentFun)((void*)&achWrapper[0]), aClosure, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); UP_LEAVE_INT(rc); return rc; } /** * @return true if stream is non-blocking * * NOTE: writing to a blocking output stream will block the calling thread * until all given data can be consumed by the stream. */ /* boolean isNonBlocking (); */ NS_IMETHOD IsNonBlocking(PRBool *_retval) { UP_ENTER_RC(); dprintf(("%s: _retval=%p", pszFunction, _retval)); rc = VFTCALL1((VFTnsIOutputStream*)mpvVFTable, IsNonBlocking, mpvThis, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpOutputStream(void *pvThis) : UpSupportsBase(pvThis, (nsIOutputStream*)this, kOutputStreamIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIPluginStreamListener //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIPluginStreamListener */ class UpPluginStreamListener : public nsIPluginStreamListener, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Notify the observer that the URL has started to load. This method is * called only once, at the beginning of a URL load.

* * @param aPluginInfo - plugin stream info * @return - the return value is currently ignored, in the future * it may be used to cancel the URL load.. */ /* void onStartBinding (in nsIPluginStreamInfo aPluginInfo); */ NS_IMETHOD OnStartBinding(nsIPluginStreamInfo *aPluginInfo) { UP_ENTER_RC(); dprintf(("%s: sPluginInfo=%p", pszFunction, aPluginInfo)); nsIPluginStreamInfo *pDownPluginInfo = aPluginInfo; rc = downCreateWrapper((void**)&pDownPluginInfo, kPluginStreamInfoIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL1((VFTnsIPluginStreamListener*)mpvVFTable, OnStartBinding, mpvThis, pDownPluginInfo); UP_LEAVE_INT(rc); return rc; } /** * Notify the client that data is available in the input stream. This * method is called whenver data is written into the input stream by the * networking library...

* * @param aPluginInfo - plugin stream info * @param aInputStream - the input stream containing the data. This stream can * be either a blocking or non-blocking stream. * @param aLength - the amount of data that was just pushed into the stream. * @return - the return value is currently ignored. */ /* void onDataAvailable (in nsIPluginStreamInfo aPluginInfo, in nsIInputStream aInputStream, in unsigned long aLength); */ NS_IMETHOD OnDataAvailable(nsIPluginStreamInfo *aPluginInfo, nsIInputStream *aInputStream, PRUint32 aLength) { UP_ENTER_RC(); dprintf(("%s: sPluginInfo=%p aInputStream=%p aLength=%d", pszFunction, aPluginInfo, aInputStream, aLength)); nsIPluginStreamInfo *pDownPluginInfo = aPluginInfo; rc = downCreateWrapper((void**)&pDownPluginInfo, kPluginStreamInfoIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsIInputStream *pDownInputStream = aInputStream; rc = downCreateWrapper((void**)&pDownInputStream, kInputStreamIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL3((VFTnsIPluginStreamListener*)mpvVFTable, OnDataAvailable, mpvThis, pDownPluginInfo, pDownInputStream, aLength); } UP_LEAVE_INT(rc); return rc; } /** * Notify the client that data is available in the file. * * @param aPluginInfo - plugin stream info * @param aFileName - the name of the file containing the data * @return - the return value is currently ignored. */ /* void onFileAvailable (in nsIPluginStreamInfo aPluginInfo, in string aFileName); */ NS_IMETHOD OnFileAvailable(nsIPluginStreamInfo *aPluginInfo, const char *aFileName) { UP_ENTER_RC(); /** @todo NLS/Codepage Text for aFileName. */ dprintf(("%s: sPluginInfo=%p aFileName=%p", pszFunction, aPluginInfo, aFileName)); DPRINTF_STR(aFileName); nsIPluginStreamInfo *pDownPluginInfo = aPluginInfo; rc = downCreateWrapper((void**)&pDownPluginInfo, kPluginStreamInfoIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL2((VFTnsIPluginStreamListener*)mpvVFTable, OnFileAvailable, mpvThis, pDownPluginInfo, aFileName); UP_LEAVE_INT(rc); return rc; } /** * Notify the observer that the URL has finished loading. This method is * called once when the networking library has finished processing the * URL transaction initiatied via the nsINetService::Open(...) call.

* * This method is called regardless of whether the URL loaded successfully.

* * @param aPluginInfo - plugin stream info * @param aStatus - reason why the stream has been terminated * @return - the return value is currently ignored. */ /* void onStopBinding (in nsIPluginStreamInfo aPluginInfo, in nsresult aStatus); */ NS_IMETHOD OnStopBinding(nsIPluginStreamInfo *aPluginInfo, nsresult aStatus) { UP_ENTER_RC(); dprintf(("%s: sPluginInfo=%p aStatus=%d", pszFunction, aPluginInfo, aStatus)); nsIPluginStreamInfo *pDownPluginInfo = aPluginInfo; rc = downCreateWrapper((void**)&pDownPluginInfo, kPluginStreamInfoIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL2((VFTnsIPluginStreamListener*)mpvVFTable, OnStopBinding, mpvThis, pDownPluginInfo, aStatus); UP_LEAVE_INT(rc); return rc; } /** * Gets the type of the stream * * @param aStreamType - the type of the stream */ /* readonly attribute nsPluginStreamType streamType; */ NS_IMETHOD GetStreamType(nsPluginStreamType *aStreamType) { UP_ENTER_RC(); dprintf(("%s: aStreamType=%p", pszFunction, aStreamType)); rc = VFTCALL1((VFTnsIPluginStreamListener*)mpvVFTable, GetStreamType, mpvThis, aStreamType); if (VALID_PTR(aStreamType)) dprintf(("%s: *aStreamType=%d\n", pszFunction, aStreamType)); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpPluginStreamListener(void *pvThis) : UpSupportsBase(pvThis, (nsIPluginStreamListener*)this, kPluginStreamListenerIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: FlashIObject7 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * FlashIObject7 */ class UpFlashIObject7 : public FlashIObject7, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Notify the observer that the URL has started to load. This method is * called only once, at the beginning of a URL load.

* * @param aPluginInfo - plugin stream info * @return - the return value is currently ignored, in the future * it may be used to cancel the URL load.. */ /* void onStartBinding (in nsIPluginStreamInfo aPluginInfo); */ NS_IMETHOD Evaluate(const char *aString, FlashIObject7 **aFlashObject) { UP_ENTER_RC(); dprintf(("%s: aString=%p aFlashObject=%p", pszFunction, aString, aFlashObject)); DPRINTF_STR(aString); rc = VFTCALL2((VFTFlashIObject7*)mpvVFTable, Evaluate, mpvThis, aString, aFlashObject); rc = upCreateWrapper((void**)aFlashObject, kFlashIObject7IID, NS_OK); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpFlashIObject7(void *pvThis) : UpSupportsBase(pvThis, (FlashIObject7*)this, kFlashIObject7IID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: FlashIScriptablePlugin7 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * FlashIScriptablePlugin (d458fe9c-518c-11d6-84cb-0005029bc257) * Flash version 7r14 */ class UpFlashIScriptablePlugin7 : public FlashIScriptablePlugin7, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); NS_IMETHOD IsPlaying(PRBool *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, IsPlaying, mpvThis, aretval); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Play(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTFlashIScriptablePlugin7*)mpvVFTable, Play, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD StopPlay(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTFlashIScriptablePlugin7*)mpvVFTable, StopPlay, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TotalFrames(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, TotalFrames, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD CurrentFrame(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, CurrentFrame, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GotoFrame(PRInt32 aFrame) { UP_ENTER_RC(); dprintf(("%s: aFrame=%d", pszFunction, aFrame)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, GotoFrame, mpvThis, aFrame); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Rewind(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTFlashIScriptablePlugin7*)mpvVFTable, Rewind, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Back(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTFlashIScriptablePlugin7*)mpvVFTable, Back, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Forward(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTFlashIScriptablePlugin7*)mpvVFTable, Forward, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Pan(PRInt32 aX, PRInt32 aY, PRInt32 aMode) { UP_ENTER_RC(); dprintf(("%s: aX=%d aY=%d aMode=%d", pszFunction, aX, aY, aMode)); rc = VFTCALL3((VFTFlashIScriptablePlugin7*)mpvVFTable, Pan, mpvThis, aX, aY, aMode); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD PercentLoaded(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, PercentLoaded, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD FrameLoaded(PRInt32 aFrame, PRBool *aretval) { UP_ENTER_RC(); dprintf(("%s: aFrame=%d aretval=%p", pszFunction, aFrame, aretval)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, FrameLoaded, mpvThis, aFrame, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD FlashVersion(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, FlashVersion, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Zoom(PRInt32 aZoom) { UP_ENTER_RC(); dprintf(("%s: aZoom=%p", pszFunction, aZoom)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, Zoom, mpvThis, aZoom); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetZoomRect(PRInt32 aLeft, PRInt32 aTop, PRInt32 aRight, PRInt32 aBottom) { UP_ENTER_RC(); dprintf(("%s: aLeft=%d aTop=%d aRight=%d aBottom=%d", pszFunction, aLeft, aTop, aRight, aBottom)); rc = VFTCALL4((VFTFlashIScriptablePlugin7*)mpvVFTable, SetZoomRect, mpvThis, aLeft, aTop, aRight, aBottom); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD LoadMovie(PRInt32 aLayer, PRUnichar *aURL) { UP_ENTER_RC(); dprintf(("%s: aLayer=%d aURL=%ls", pszFunction, aLayer, aURL)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, LoadMovie, mpvThis, aLayer, aURL); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGotoFrame(PRUnichar *aTarget, PRInt32 aFrameNumber) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aFrameNumber=%d", pszFunction, aTarget, aFrameNumber)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, TGotoFrame, mpvThis, aTarget, aFrameNumber); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGotoLabel(PRUnichar *aTarget, PRUnichar *aLabel) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aLabel=%ls", pszFunction, aTarget, aLabel)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, TGotoLabel, mpvThis, aTarget, aLabel); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCurrentFrame(PRUnichar *aTarget, PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aretval=%p", pszFunction, aTarget, aretval)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, TCurrentFrame, mpvThis, aTarget, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCurrentLabel(PRUnichar *aTarget, PRUnichar **aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aretval=%p", pszFunction, aTarget, aretval)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, TCurrentLabel, mpvThis, aTarget, aretval); if (VALID_PTR(aretval) && VALID_PTR(*aretval)) dprintf(("%s: *aretval=%ls", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TPlay(PRUnichar *aTarget) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls", pszFunction, aTarget)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, TPlay, mpvThis, aTarget); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TStopPlay(PRUnichar *aTarget) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls", pszFunction, aTarget)); rc = VFTCALL1((VFTFlashIScriptablePlugin7*)mpvVFTable, TStopPlay, mpvThis, aTarget); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetVariable(PRUnichar *aVariable, PRUnichar *aValue) { UP_ENTER_RC(); dprintf(("%s: aVariable=%ls aValue=%ls", pszFunction, aVariable, aValue)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, SetVariable, mpvThis, aVariable, aValue); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetVariable(PRUnichar *aVariable, PRUnichar **aretval) { UP_ENTER_RC(); dprintf(("%s: aVariable=%ls aretval=%p", pszFunction, aVariable, aretval)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, GetVariable, mpvThis, aVariable, aretval); if (VALID_PTR(aretval) && VALID_PTR(*aretval)) dprintf(("%s: *aretval=%ls", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TSetProperty(PRUnichar *aTarget, PRInt32 aProperty, PRUnichar *aValue) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aProperty=%d aValue=%ls", pszFunction, aTarget, aProperty, aValue)); rc = VFTCALL3((VFTFlashIScriptablePlugin7*)mpvVFTable, TSetProperty, mpvThis, aTarget, aProperty, aValue); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGetProperty(PRUnichar *aTarget, PRInt32 aProperty, PRUnichar **aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aProperty=%d aretval=%p", pszFunction, aTarget, aProperty, aretval)); rc = VFTCALL3((VFTFlashIScriptablePlugin7*)mpvVFTable, TGetProperty, mpvThis, aTarget, aProperty, aretval); if (VALID_PTR(aretval) && VALID_PTR(*aretval)) dprintf(("%s: *aretval=%ls", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGetPropertyAsNumber(PRUnichar *aTarget, PRInt32 aProperty, double **aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aProperty=%d aretval=%p", pszFunction, aTarget, aProperty, aretval)); rc = VFTCALL3((VFTFlashIScriptablePlugin7*)mpvVFTable, TGetPropertyAsNumber, mpvThis, aTarget, aProperty, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%f", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCallLabel(PRUnichar *aTarget, PRUnichar *aLabel) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aLabel=%ls", pszFunction, aTarget, aLabel)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, TCallLabel, mpvThis, aTarget, aLabel); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCallFrame(PRUnichar *aTarget, PRInt32 aFrameNumber) { UP_ENTER_RC(); dprintf(("%s: aTarget=%ls aFrameNumber=%d", pszFunction, aTarget, aFrameNumber)); rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, TCallFrame, mpvThis, aTarget, aFrameNumber); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetWindow(FlashIObject7 *aFlashObject, PRInt32 a1) { UP_ENTER_RC(); dprintf(("%s: aFlashObject=%p a1=%d", pszFunction, aFlashObject, a1)); FlashIObject7 *pDownFlashObject = aFlashObject; rc = downCreateWrapper((void**)&pDownFlashObject, kFlashIObject7IID, NS_OK); if (NS_SUCCEEDED(rc)) rc = VFTCALL2((VFTFlashIScriptablePlugin7*)mpvVFTable, SetWindow, mpvThis, pDownFlashObject, a1); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpFlashIScriptablePlugin7(void *pvThis) : UpSupportsBase(pvThis, (FlashIScriptablePlugin7*)this, kFlashIScriptablePlugin7IID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIFlash5 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIPlugin5 (d27cdb6e-ae6d-11cf-96b8-444553540000) * Flash 5 rXY for OS/2 */ class UpFlash5 : public nsIFlash5, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); NS_IMETHOD IsPlaying(PRBool *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, IsPlaying, mpvThis, aretval); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Play(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIFlash5*)mpvVFTable, Play, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD StopPlay(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIFlash5*)mpvVFTable, StopPlay, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TotalFrames(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, TotalFrames, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD CurrentFrame(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, CurrentFrame, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GotoFrame(PRInt32 aFrame) { UP_ENTER_RC(); dprintf(("%s: aFrame=%d", pszFunction, aFrame)); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, GotoFrame, mpvThis, aFrame); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Rewind(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIFlash5*)mpvVFTable, Rewind, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Back(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIFlash5*)mpvVFTable, Back, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Forward(void) { UP_ENTER_RC(); rc = VFTCALL0((VFTnsIFlash5*)mpvVFTable, Forward, mpvThis); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD PercentLoaded(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, PercentLoaded, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD FrameLoaded(PRInt32 aFrame, PRBool *aretval) { UP_ENTER_RC(); dprintf(("%s: aFrame=%d aretval=%p", pszFunction, aFrame, aretval)); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, FrameLoaded, mpvThis, aFrame, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD FlashVersion(PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aretval=%p", pszFunction, aretval)); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, FlashVersion, mpvThis, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Pan(PRInt32 aX, PRInt32 aY, PRInt32 aMode) { UP_ENTER_RC(); dprintf(("%s: aX=%d aY=%d aMode=%d", pszFunction, aX, aY, aMode)); rc = VFTCALL3((VFTnsIFlash5*)mpvVFTable, Pan, mpvThis, aX, aY, aMode); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD Zoom(PRInt32 aZoom) { UP_ENTER_RC(); dprintf(("%s: aZoom=%p", pszFunction, aZoom)); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, Zoom, mpvThis, aZoom); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetZoomRect(PRInt32 aLeft, PRInt32 aTop, PRInt32 aRight, PRInt32 aBottom) { UP_ENTER_RC(); dprintf(("%s: aLeft=%d aTop=%d aRight=%d aBottom=%d", pszFunction, aLeft, aTop, aRight, aBottom)); rc = VFTCALL4((VFTnsIFlash5*)mpvVFTable, SetZoomRect, mpvThis, aLeft, aTop, aRight, aBottom); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD LoadMovie(PRInt32 aLayer, const char *aURL) { UP_ENTER_RC(); dprintf(("%s: aLayer=%d aURL=%p", pszFunction, aLayer, aURL)); DPRINTF_STR(aURL); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, LoadMovie, mpvThis, aLayer, aURL); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGotoFrame(const char *aTarget, PRInt32 aFrameNumber) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aFrameNumber=%d", pszFunction, aTarget, aFrameNumber)); DPRINTF_STR(aTarget); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, TGotoFrame, mpvThis, aTarget, aFrameNumber); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGotoLabel(const char *aTarget, const char *aLabel) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aLabel=%p", pszFunction, aTarget, aLabel)); DPRINTF_STR(aTarget); DPRINTF_STR(aLabel); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, TGotoLabel, mpvThis, aTarget, aLabel); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCurrentFrame(const char *aTarget, PRInt32 *aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aretval=%p", pszFunction, aTarget, aretval)); DPRINTF_STR(aTarget); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, TCurrentFrame, mpvThis, aTarget, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%d", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCurrentLabel(const char *aTarget, char **aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aretval=%p", pszFunction, aTarget, aretval)); DPRINTF_STR(aTarget); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, TCurrentLabel, mpvThis, aTarget, aretval); if (VALID_PTR(aretval)) DPRINTF_STR(*aretval); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TPlay(const char *aTarget) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p", pszFunction, aTarget)); DPRINTF_STR(aTarget); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, TPlay, mpvThis, aTarget); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TStopPlay(const char *aTarget) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p", pszFunction, aTarget)); DPRINTF_STR(aTarget); rc = VFTCALL1((VFTnsIFlash5*)mpvVFTable, TStopPlay, mpvThis, aTarget); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD SetVariable(const char *aVariable, const char *aValue) { UP_ENTER_RC(); dprintf(("%s: aVariable=%p aValue=%p", pszFunction, aVariable, aValue)); DPRINTF_STR(aVariable); DPRINTF_STR(aValue); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, SetVariable, mpvThis, aVariable, aValue); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD GetVariable(const char *aVariable, char **aretval) { UP_ENTER_RC(); dprintf(("%s: aVariable=%p aretval=%p", pszFunction, aVariable, aretval)); DPRINTF_STR(aVariable); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, GetVariable, mpvThis, aVariable, aretval); if (VALID_PTR(aretval) && VALID_PTR(*aretval)) DPRINTF_STR(aretval); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TSetProperty(const char *aTarget, PRInt32 aProperty, const char *aValue) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aProperty=%d aValue=%p", pszFunction, aTarget, aProperty, aValue)); DPRINTF_STR(aTarget); DPRINTF_STR(aValue); rc = VFTCALL3((VFTnsIFlash5*)mpvVFTable, TSetProperty, mpvThis, aTarget, aProperty, aValue); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGetProperty(const char *aTarget, PRInt32 aProperty, char **aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aProperty=%d aretval=%p", pszFunction, aTarget, aProperty, aretval)); DPRINTF_STR(aTarget); rc = VFTCALL3((VFTnsIFlash5*)mpvVFTable, TGetProperty, mpvThis, aTarget, aProperty, aretval); if (VALID_PTR(aretval)) DPRINTF_STR(*aretval); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCallFrame(const char *aTarget, PRInt32 aFrame) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aFrameNumber=%d", pszFunction, aTarget, aFrame)); DPRINTF_STR(aTarget); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, TCallFrame, mpvThis, aTarget, aFrame); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TCallLabel(const char *aTarget, const char *aLabel) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aLabel=%p", pszFunction, aTarget, aLabel)); DPRINTF_STR(aTarget); DPRINTF_STR(aLabel); rc = VFTCALL2((VFTnsIFlash5*)mpvVFTable, TCallLabel, mpvThis, aTarget, aLabel); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TGetPropertyAsNumber(const char *aTarget, PRInt32 aProperty, double *aretval) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aProperty=%d aretval=%p", pszFunction, aTarget, aProperty, aretval)); DPRINTF_STR(aTarget); rc = VFTCALL3((VFTnsIFlash5*)mpvVFTable, TGetPropertyAsNumber, mpvThis, aTarget, aProperty, aretval); if (VALID_PTR(aretval)) dprintf(("%s: *aretval=%f", pszFunction, *aretval)); UP_LEAVE_INT(rc); return rc; } NS_IMETHOD TSetPropertyAsNumber(const char *aTarget, PRInt32 aProperty, double aValue) { UP_ENTER_RC(); dprintf(("%s: aTarget=%p aProperty=%d aValue=%f", pszFunction, aTarget, aProperty, aValue)); DPRINTF_STR(aTarget); rc = VFTCALL3((VFTnsIFlash5*)mpvVFTable, TSetPropertyAsNumber, mpvThis, aTarget, aProperty, aValue); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpFlash5(void *pvThis) : UpSupportsBase(pvThis, (nsIFlash5*)this, kFlash5IID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIClassInfo //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * nsIClassInfo */ class UpClassInfo : public nsIClassInfo, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Get an ordered list of the interface ids that instances of the class * promise to implement. Note that nsISupports is an implicit member * of any such list and need not be included. * * Should set *count = 0 and *array = null and return NS_OK if getting the * list is not supported. */ /* void getInterfaces (out PRUint32 count, [array, size_is (count), retval] out nsIIDPtr array); */ NS_IMETHOD GetInterfaces(PRUint32 *count, nsIID * **array) { UP_ENTER_RC(); dprintf(("%s: count=%p array=%p", pszFunction, count, array)); rc = VFTCALL2((VFTnsIClassInfo*)mpvVFTable, GetInterfaces, mpvThis, count, array); if (NS_SUCCEEDED(rc) && VALID_PTR(count) && VALID_PTR(array) && VALID_PTR(*array)) { dprintf(("%s: *count=%d\n", *count)); for (unsigned i = 0; i < *count; i++) DPRINTF_NSID(*((*array)[i])); } UP_LEAVE_INT(rc); return rc; } /** * Get a language mapping specific helper object that may assist in using * objects of this class in a specific lanaguage. For instance, if asked * for the helper for nsIProgrammingLanguage::JAVASCRIPT this might return * an object that can be QI'd into the nsIXPCScriptable interface to assist * XPConnect in supplying JavaScript specific behavior to callers of the * instance object. * * see: nsIProgrammingLanguage.idl * * Should return null if no helper available for given language. */ /* nsISupports getHelperForLanguage (in PRUint32 language); */ NS_IMETHOD GetHelperForLanguage(PRUint32 language, nsISupports **_retval) { UP_ENTER_RC(); dprintf(("%s: language=%d _retval=%p", pszFunction, language, _retval)); rc = VFTCALL2((VFTnsIClassInfo*)mpvVFTable, GetHelperForLanguage, mpvThis, language, _retval); rc = upCreateWrapper((void**)_retval, kSupportsIID, rc); UP_LEAVE_INT(rc); return rc; } /** * A contract ID through which an instance of this class can be created * (or accessed as a service, if |flags & SINGLETON|), or null. */ /* readonly attribute string contractID; */ NS_IMETHOD GetContractID(char * *aContractID) { UP_ENTER_RC(); dprintf(("%s: aContractID=%p", pszFunction, aContractID)); rc = VFTCALL1((VFTnsIClassInfo*)mpvVFTable, GetContractID, mpvThis, aContractID); DPRINTF_STRNULL(aContractID); UP_LEAVE_INT(rc); return rc; } /** * A human readable string naming the class, or null. */ /* readonly attribute string classDescription; */ NS_IMETHOD GetClassDescription(char * *aClassDescription) { UP_ENTER_RC(); dprintf(("%s: aClassDescription=%p", pszFunction, aClassDescription)); rc = VFTCALL1((VFTnsIClassInfo*)mpvVFTable, GetClassDescription, mpvThis, aClassDescription); DPRINTF_STRNULL(aClassDescription); UP_LEAVE_INT(rc); return rc; } /** * A class ID through which an instance of this class can be created * (or accessed as a service, if |flags & SINGLETON|), or null. */ /* readonly attribute nsCIDPtr classID; */ NS_IMETHOD GetClassID(nsCID * *aClassID) { UP_ENTER_RC(); dprintf(("%s: aClassID=%p", pszFunction, aClassID)); rc = VFTCALL1((VFTnsIClassInfo*)mpvVFTable, GetClassID, mpvThis, aClassID); DPRINTF_NSID(**aClassID); UP_LEAVE_INT(rc); return rc; } /** * Return language type from list in nsIProgrammingLanguage */ /* readonly attribute PRUint32 implementationLanguage; */ NS_IMETHOD GetImplementationLanguage(PRUint32 *aImplementationLanguage) { UP_ENTER_RC(); dprintf(("%s: aImplementationLanguage=%p", pszFunction, aImplementationLanguage)); rc = VFTCALL1((VFTnsIClassInfo*)mpvVFTable, GetImplementationLanguage, mpvThis, aImplementationLanguage); if (VALID_PTR(aImplementationLanguage)) dprintf(("%s: *aImplementationLanguage=%d", pszFunction, *aImplementationLanguage)); UP_LEAVE_INT(rc); return rc; } /* readonly attribute PRUint32 flags; */ NS_IMETHOD GetFlags(PRUint32 *aFlags) { UP_ENTER_RC(); dprintf(("%s: aFlags=%p", pszFunction, aFlags)); rc = VFTCALL1((VFTnsIClassInfo*)mpvVFTable, GetFlags, mpvThis, aFlags); if (VALID_PTR(aFlags)) dprintf(("%s: *aFlags=%d", pszFunction, *aFlags)); UP_LEAVE_INT(rc); return rc; } /** * Also a class ID through which an instance of this class can be created * (or accessed as a service, if |flags & SINGLETON|). If the class does * not have a CID, it should return NS_ERROR_NOT_AVAILABLE. This attribute * exists so C++ callers can avoid allocating and freeing a CID, as would * happen if they used classID. */ /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */ NS_IMETHOD GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) { UP_ENTER_RC(); dprintf(("%s: aClassIDNoAlloc=%p", pszFunction, aClassIDNoAlloc)); rc = VFTCALL1((VFTnsIClassInfo*)mpvVFTable, GetClassIDNoAlloc, mpvThis, aClassIDNoAlloc); DPRINTF_NSID(*aClassIDNoAlloc); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpClassInfo(void *pvThis) : UpSupportsBase(pvThis, (nsIClassInfo*)this, kClassInfoIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP: nsIHTTPHeaderListener //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// class UpHTTPHeaderListener : public nsIHTTPHeaderListener, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Called for each HTTP Response header. * NOTE: You must copy the values of the params. */ /* void newResponseHeader (in string headerName, in string headerValue); */ NS_IMETHOD NewResponseHeader(const char *headerName, const char *headerValue) { UP_ENTER_RC(); DPRINTF_STR(headerName); DPRINTF_STR(headerValue); rc = VFTCALL2((VFTnsIHTTPHeaderListener *)mpvVFTable, NewResponseHeader, mpvThis, headerName, headerValue); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpHTTPHeaderListener(void *pvThis) : UpSupportsBase(pvThis, (nsIHTTPHeaderListener *)this, kHTTPHeaderListenerIID) { } nsresult StatusLine(const char *line) { return NS_ERROR_NOT_IMPLEMENTED; } }; class UpMemory : public nsIMemory, public UpSupportsBase { public: UP_IMPL_NSISUPPORTS(); /** * Allocates a block of memory of a particular size. If the memory * cannot be allocated (because of an out-of-memory condition), null * is returned. * * @param size - the size of the block to allocate * @result the block of memory */ /* [noscript, notxpcom] voidPtr alloc (in size_t size); */ NS_IMETHOD_(void *) Alloc(size_t size) { UP_ENTER(); dprintf(("%s: size=%d", pszFunction, size)); void * pv = VFTCALL1((VFTnsIMemory*)mpvVFTable, Alloc, mpvThis, size); UP_LEAVE_INT((unsigned)pv); return pv; } /** * Reallocates a block of memory to a new size. * * @param ptr - the block of memory to reallocate * @param size - the new size * @result the reallocated block of memory * * If ptr is null, this function behaves like malloc. * If s is the size of the block to which ptr points, the first * min(s, size) bytes of ptr's block are copied to the new block. * If the allocation succeeds, ptr is freed and a pointer to the * new block returned. If the allocation fails, ptr is not freed * and null is returned. The returned value may be the same as ptr. */ /* [noscript, notxpcom] voidPtr realloc (in voidPtr ptr, in size_t newSize); */ NS_IMETHOD_(void *) Realloc(void * ptr, size_t newSize) { UP_ENTER(); dprintf(("%s: ptr=%p newSize=%d", pszFunction, ptr, newSize)); void * pv = VFTCALL2((VFTnsIMemory*)mpvVFTable, Realloc, mpvThis, ptr, newSize); UP_LEAVE_INT((unsigned)pv); return pv; } /** * Frees a block of memory. Null is a permissible value, in which case * nothing happens. * * @param ptr - the block of memory to free */ /* [noscript, notxpcom] void free (in voidPtr ptr); */ NS_IMETHOD_(void) Free(void * ptr) { UP_ENTER(); dprintf(("%s: ptr=%d", pszFunction, ptr)); VFTCALL1((VFTnsIMemory*)mpvVFTable, Free, mpvThis, ptr); UP_LEAVE(); return; } /** * Attempts to shrink the heap. * @param immediate - if true, heap minimization will occur * immediately if the call was made on the main thread. If * false, the flush will be scheduled to happen when the app is * idle. * @return NS_ERROR_FAILURE if 'immediate' is set an the call * was not on the application's main thread. */ /* void heapMinimize (in boolean immediate); */ NS_IMETHOD HeapMinimize(PRBool immediate) { UP_ENTER_RC(); dprintf(("%s: immediate=%d", pszFunction, immediate)); rc = VFTCALL1((VFTnsIMemory*)mpvVFTable, HeapMinimize, mpvThis, immediate); UP_LEAVE_INT(rc); return rc; } /** * This predicate can be used to determine if we're in a low-memory * situation (what constitutes low-memory is platform dependent). This * can be used to trigger the memory pressure observers. */ /* boolean isLowMemory (); */ NS_IMETHOD IsLowMemory(PRBool *_retval) { UP_ENTER_RC(); dprintf(("%s: immediate=%p", pszFunction, _retval)); rc = VFTCALL1((VFTnsIMemory*)mpvVFTable, IsLowMemory, mpvThis, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", *_retval)); UP_LEAVE_INT(rc); return rc; } /** Constructor */ UpMemory(void *pvThis) : UpSupportsBase(pvThis, (nsIMemory *)this, kMemoryIID) { } }; //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // UP Helpers //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Check if the specified interface is supported by the 'UP' type wrapper. * @returns TRUE if supported. * @returns FALSE if not supported. * @param aIID Interface ID in question. */ BOOL upIsSupportedInterface(REFNSIID aIID) { static const nsID * aIIDs[] = { &kSupportsIID, &kFactoryIID, &kPluginIID, &kJVMPluginIID, &kSecureEnvIID, &kPluginInstanceIID, &kPluginInstancePeerIID, &kPluginInstancePeer2IID, &kPluginTagInfoIID, &kJVMWindowIID, &kJVMConsoleIID, &kEventHandlerIID, &kJVMPluginInstanceIID, &kRunnableIID, &kSecurityContextIID, &kRequestObserverIID, &kStreamListenerIID, &kRequestIID, &kLoadGroupIID, &kSimpleEnumeratorIID, &kInterfaceRequestorIID, &kOutputStreamIID, &kPluginStreamListenerIID, &kFlashIObject7IID, &kFlashIScriptablePlugin7IID, &kFlash5IID, &kClassInfoIID, &kHTTPHeaderListenerIID, &kMemoryIID, }; for (unsigned iInterface = 0; iInterface < sizeof(aIIDs) / sizeof(aIIDs[0]); iInterface++) if (aIIDs[iInterface]->Equals(aIID)) return TRUE; return FALSE; } /** * Create a wrapper for an Interface. * * @returns Pointer to the crated interface wrapper. * @returns NULL on if unsupported interface. * @returns NULL on failure. * @returns NULL if pvThis is NULL. * @param pvThis Pointer to the interface. * @param aIID Reference to Interface ID. */ nsresult upCreateWrapper(void **ppvResult, REFNSIID aIID, nsresult rc) { DEBUG_FUNCTIONNAME(); dprintf(("%s: pvvResult=%x,,rc=%x", pszFunction, ppvResult, rc)); DPRINTF_NSID(aIID); if (VALID_PTR(ppvResult)) { if (VALID_PTR(*ppvResult)) { dprintf(("%s: *pvvResult=%x", pszFunction, *ppvResult)); if (NS_SUCCEEDED(rc)) { void *pvThis = *ppvResult; /* * First try check if there is an existing down wrapper for * this object, if so no wrapping is needed at all. */ void *pvNoWrapper = UpWrapperBase::findDownWrapper(pvThis); if (pvNoWrapper) { dprintf(("%s: COOL! pvThis(%x) is an down wrapper, no wrapping needed. returns real obj=%x", pszFunction, pvThis, pvNoWrapper)); *ppvResult = pvNoWrapper; return rc; } #if 1 // did this to minimize heap access. /* * Now lock the list and search it for existing wrapper. */ UpWrapperBase::upLock(); UpWrapperBase *pExisting = UpWrapperBase::findUpWrapper(pvThis, aIID); UpWrapperBase::upUnLock(); if (pExisting) { dprintf(("%s: Reusing existing wrapper %p/%p for %p!", pszFunction, pExisting, pExisting->getInterfacePointer(), pvThis)); *ppvResult = pExisting->getInterfacePointer(); return rc; } #endif /* * Third, try check if we've allready have created a wrapper for this object. * * Now, to do make sure we will never see duplicates here, we will: * * Create a wrapper object. * Lock the up list. * Check if there is an existing wrapper. * If so Then * Use it. * Destroy the one we've just created. * Else * Insert the wrapper we've created. * EndIf * Unlock the up list. * return the resulting wrapper. * */ /* * Create the wrapper. * * IMPORTANT!!! DON'T FORGET UPDATING THE TABLE IN upIsSupportedInterface() TOO!!!! */ BOOL fFound = TRUE; UpWrapperBase * pWrapper = NULL; if (aIID.Equals(kSupportsIID)) pWrapper = new UpSupports(pvThis); else if (aIID.Equals(kFactoryIID)) pWrapper = new UpFactory(pvThis); else if (aIID.Equals(kPluginIID)) pWrapper = new UpPlugin(pvThis); else if (aIID.Equals(kJVMPluginIID)) pWrapper = new UpJVMPlugin(pvThis); else if (aIID.Equals(kSecureEnvIID)) pWrapper = new UpSecureEnv(pvThis); else if (aIID.Equals(kPluginInstanceIID)) pWrapper = new UpPluginInstance(pvThis); else if (aIID.Equals(kPluginInstancePeerIID)) pWrapper = new UpPluginInstancePeer(pvThis); else if (aIID.Equals(kPluginInstancePeer2IID)) pWrapper = new UpPluginInstancePeer2(pvThis); else if (aIID.Equals(kPluginTagInfoIID)) pWrapper = new UpPluginTagInfo(pvThis); else if (aIID.Equals(kJVMWindowIID)) pWrapper = new UpJVMWindow(pvThis); else if (aIID.Equals(kJVMConsoleIID)) pWrapper = new UpJVMConsole(pvThis); else if (aIID.Equals(kEventHandlerIID)) pWrapper = new UpEventHandler(pvThis); else if (aIID.Equals(kJVMPluginInstanceIID)) pWrapper = new UpJVMPluginInstance(pvThis); else if (aIID.Equals(kRunnableIID)) pWrapper = new UpRunnable(pvThis); else if (aIID.Equals(kSecurityContextIID)) pWrapper = new UpSecurityContext(pvThis); else if (aIID.Equals(kRequestObserverIID)) pWrapper = new UpRequestObserver(pvThis); else if (aIID.Equals(kStreamListenerIID)) pWrapper = new UpStreamListener(pvThis); else if (aIID.Equals(kRequestIID)) pWrapper = new UpRequest(pvThis); else if (aIID.Equals(kLoadGroupIID)) pWrapper = new UpLoadGroup(pvThis); else if (aIID.Equals(kSimpleEnumeratorIID)) pWrapper = new UpSimpleEnumerator(pvThis); else if (aIID.Equals(kInterfaceRequestorIID)) pWrapper = new UpInterfaceRequestor(pvThis); else if (aIID.Equals(kOutputStreamIID)) pWrapper = new UpOutputStream(pvThis); else if (aIID.Equals(kPluginStreamListenerIID)) pWrapper = new UpPluginStreamListener(pvThis); else if (aIID.Equals(kFlashIScriptablePlugin7IID)) pWrapper = new UpFlashIScriptablePlugin7(pvThis); else if (aIID.Equals(kFlashIObject7IID)) pWrapper = new UpFlashIObject7(pvThis); else if (aIID.Equals(kFlash5IID)) pWrapper = new UpFlash5(pvThis); else if (aIID.Equals(kClassInfoIID)) pWrapper = new UpClassInfo(pvThis); else if (aIID.Equals(kHTTPHeaderListenerIID)) pWrapper = new UpHTTPHeaderListener(pvThis); else if (aIID.Equals(kMemoryIID)) pWrapper = new UpMemory(pvThis); else fFound = FALSE; /* * Successfully create wrapper? */ if (fFound && pWrapper) { /* * Now lock the list and search it for existing wrapper. */ UpWrapperBase::upLock(); UpWrapperBase *pExisting2 = UpWrapperBase::findUpWrapper(pvThis, aIID); if (pExisting2) { UpWrapperBase::upUnLock(); delete pWrapper; pWrapper = pExisting2; dprintf(("%s: Reusing existing wrapper %p/%p for %p!", pszFunction, pWrapper, pWrapper->getInterfacePointer(), pvThis)); } else { pWrapper->upInsertWrapper(); UpWrapperBase::upUnLock(); dprintf(("%s: Successfully create wrapper %p/%p for %p!", pszFunction, pWrapper, pWrapper->getInterfacePointer(), pvThis)); } *ppvResult = pWrapper->getInterfacePointer(); return rc; } /* * What's wrong? */ if (!fFound) { ReleaseInt3(0xbaddbeef, 11, aIID.m0); dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_ERROR_NOT_IMPLEMENTED; } else { dprintf(("%s: new failed! (how is that possible?)", pszFunction)); rc = NS_ERROR_OUT_OF_MEMORY; } } else dprintf(("%s: The passed in rc means failure (rc=%x)", pszFunction, rc)); *ppvResult = nsnull; } else dprintf(("%s: *ppvResult (=%p) is invalid (rc=%x)", pszFunction, *ppvResult, rc)); } else dprintf(("%s: ppvResult (=%p) is invalid (rc=%x)", pszFunction, ppvResult, rc)); return rc; } /** * Create a wrapper for an Interface - simple version. * * @returns Pointer to the crated interface wrapper. * @returns NULL on if unsupported interface. * @returns NULL on failure. * @returns NULL if pvThis is NULL. * @param pvThis Pointer to the interface. * @param aIID Reference to Interface ID. */ void * upCreateWrapper2(void *pvThis, REFNSIID aIID) { // DEBUG_FUNCTIONNAME(); void * pvResult = pvThis; nsresult rc = upCreateWrapper(&pvResult, aIID, NS_OK); if (NS_SUCCEEDED(rc)) return pvResult; return NULL; } /** * Create a JNIEnv wrapper for sending up to mozilla. * @returns rc on success * @returns rc or othere error code on failure. * @param ppJNIEnv Where to get and store the JNIEnv wrapper. * @param rc Current rc. */ int upCreateJNIEnvWrapper(JNIEnv **ppJNIEnv, int rc) { DEBUG_FUNCTIONNAME(); dprintf(("%s: ppJNIEnv=%x, rc=%x", pszFunction, ppJNIEnv, rc)); if (VALID_PTR(ppJNIEnv)) { if (VALID_PTR(*ppJNIEnv)) { if (NS_SUCCEEDED(rc)) { /* * Success! */ return rc; } else dprintf(("%s: The query method failed with rc=%x", pszFunction, rc)); *ppJNIEnv = nsnull; } else if (*ppJNIEnv || rc != NS_OK) /* don't complain about the obvious.. we use this combination. */ dprintf(("%s: *ppJNIEnv (=%p) is invalid (rc=%x)", pszFunction, *ppJNIEnv, rc)); } else dprintf(("%s: ppJNIEnv (=%p) is invalid (rc=%x)", pszFunction, ppJNIEnv, rc)); return rc; } //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsISupports //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// nsresult VFTCALL downQueryInterface(void *pvThis, REFNSIID aIID, void** aInstancePtr) { DOWN_ENTER_RC(pvThis, nsISupports); DPRINTF_NSID(aIID); /* * Is this a supported interface? */ const void *pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { dprintf(("%s: Supported interface. Calling the real QueryInterface...", pszFunction)); rc = pMozI->QueryInterface(aIID, aInstancePtr); rc = downCreateWrapper(aInstancePtr, pvVFT, rc); } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; if (aInstancePtr) *aInstancePtr = nsnull; ReleaseInt3(0xbaddbeef, 1, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * nsISupport::AddRef() wrapper. */ nsrefcnt VFTCALL downAddRef(void *pvThis) { DOWN_ENTER(pvThis, nsISupports); nsrefcnt c = pMozI->AddRef(); DOWN_LEAVE_INT(pvThis, c); return c; } /** * nsISupport::Release() wrapper. */ nsrefcnt VFTCALL downRelease(void *pvThis) { DOWN_ENTER(pvThis, nsISupports); nsrefcnt c = pMozI->Release(); if (!c) { dprintf(("%s: c=0! deleting wrapper structure!", pszFunction)); #ifdef DO_DELETE /** * Unchain the wrapper first. */ DOWN_LOCK(); int fUnchained; PDOWNTHIS pDown, pPrev; for (pDown = (PDOWNTHIS)gpDownHead, pPrev = NULL, fUnchained = 0; pDown; pPrev = pDown, pDown = (PDOWNTHIS)pDown->pNext) { if (pDown == pvThis) { if (pPrev) pPrev->pNext = pDown->pNext; else gpDownHead = pDown->pNext; #ifdef DEBUG /* paranoid as always */ if (fUnchained) { dprintf(("%s: pvThis=%x was linked twice!", pszFunction, pvThis)); DebugInt3(); } fUnchained = 1; #else fUnchained = 1; break; #endif } } DOWN_UNLOCK(); if (fUnchained) { /** @todo concider a delayed freeing, meaning we inster the them in * a FIFO and at a certain threshold we'll start killing them. * This will require the up/downCreateWrapper to also search the FIFO * before creating the a new wrapper. */ pDown = (PDOWNTHIS)pvThis; memset(pDown, 0, sizeof(*pDown)); delete pDown; } else { /* * Allready unchained? This shouldn't ever happen... * The only possible case is that two threads calls hlpRelease() * a the same time. So, we will *not* touch this node now. */ dprintf(("%s: pvThis=%p not found in the list !!!!", pszFunction, pvThis)); DebugInt3(); } #endif pvThis = NULL; } DOWN_LEAVE_INT(pvThis, c); return c; } /** VFT for the nsISupports Wrapper. */ MAKE_SAFE_VFT(VFTnsISupports, downVFTnsISupports) { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIServiceManager //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * getServiceByContractID * * Returns the instance that implements aClass or aContractID and the * interface aIID. This may result in the instance being created. * * @param aClass or aContractID : aClass or aContractID of object * instance requested * @param aIID : IID of interface requested * @param result : resulting service */ /* void getService (in nsCIDRef aClass, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */ nsresult VFTCALL downGetService(void *pvThis, const nsCID & aClass, const nsIID & aIID, void * *result) { DOWN_ENTER_RC(pvThis, nsIServiceManager); DPRINTF_NSID(aClass); DPRINTF_NSID(aIID); /* * Is this a supported interface? */ const void *pvVFT = downIsSupportedInterface(&aIID ? aIID : kSupportsIID); if (pvVFT) { dprintf(("%s: Supported interface. Calling the real GetService...", pszFunction)); rc = pMozI->GetService(aClass, aIID, result); rc = downCreateWrapper(result, pvVFT, rc); } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; if (result) *result = nsnull; ReleaseInt3(0xbaddbeef, 2, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /* void getServiceByContractID (in string aContractID, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */ nsresult VFTCALL downGetServiceByContractID(void *pvThis, const char *aContractID, const nsIID & aIID, void * *result) { //@todo Check UNICODE vs. UTF8 vs. Codepage issues here. DOWN_ENTER_RC(pvThis, nsIServiceManager); DPRINTF_CONTRACTID(aContractID); DPRINTF_NSID(aIID); /* * Is this a supported interface? */ const void *pvVFT = downIsSupportedInterface(&aIID ? aIID : kSupportsIID); if (pvVFT) { dprintf(("%s: Supported interface. Calling the real GetServiceByContractID...", pszFunction)); rc = pMozI->GetServiceByContractID(aContractID, aIID, result); rc = downCreateWrapper(result, pvVFT, rc); } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; if (result) *result = nsnull; ReleaseInt3(0xbaddbeef, 3, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * isServiceInstantiated * * isServiceInstantiated will return a true if the service has already * been created, otherwise false * * @param aClass or aContractID : aClass or aContractID of object * instance requested * @param aIID : IID of interface requested * @param aIID : IID of interface requested */ /* boolean isServiceInstantiated (in nsCIDRef aClass, in nsIIDRef aIID); */ nsresult VFTCALL downIsServiceInstantiated(void *pvThis, const nsCID & aClass, const nsIID & aIID, PRBool *_retval) { DOWN_ENTER_RC(pvThis, nsIServiceManager); DPRINTF_NSID(aClass); DPRINTF_NSID(aIID); rc = pMozI->IsServiceInstantiated(aClass, aIID, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /* boolean isServiceInstantiatedByContractID (in string aContractID, in nsIIDRef aIID); */ nsresult VFTCALL downIsServiceInstantiatedByContractID(void *pvThis, const char *aContractID, const nsIID & aIID, PRBool *_retval) { //@todo Check UNICODE vs. UTF8 vs. Codepage issues here. DOWN_ENTER_RC(pvThis, nsIServiceManager); DPRINTF_CONTRACTID(aContractID); DPRINTF_NSID(aIID); rc = pMozI->IsServiceInstantiatedByContractID(aContractID, aIID, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** VFT for the nsIServerManager Wrapper. */ MAKE_SAFE_VFT(VFTnsIServiceManager, downVFTnsIServiceManager) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downGetService, VFTDELTA_VAL() downGetServiceByContractID, VFTDELTA_VAL() downIsServiceInstantiated, VFTDELTA_VAL() downIsServiceInstantiatedByContractID, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIServiceManagerObsolete //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * RegisterService may be called explicitly to register a service * with the service manager. If a service is not registered explicitly, * the component manager will be used to create an instance according * to the class ID specified. */ nsresult VFTCALL downISMORegisterService(void *pvThis, const nsCID& aClass, nsISupports* aService) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_NSID(aClass); nsISupports *pupService = aService; rc = upCreateWrapper((void**)&pupService, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->RegisterService(aClass, pupService); else dprintf(("%s: Unable to create wrapper for nsISupports!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Requests a service to be shut down, possibly unloading its DLL. * * @returns NS_OK - if shutdown was successful and service was unloaded, * @returns NS_ERROR_SERVICE_NOT_FOUND - if shutdown failed because * the service was not currently loaded * @returns NS_ERROR_SERVICE_IN_USE - if shutdown failed because some * user of the service wouldn't voluntarily release it by using * a shutdown listener. */ nsresult VFTCALL downISMOUnregisterService(void *pvThis, const nsCID& aClass) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_NSID(aClass); rc = pMozI->UnregisterService(aClass); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downISMOGetService(void *pvThis, const nsCID& aClass, const nsIID& aIID, nsISupports* *result, nsIShutdownListener* shutdownListener/* = nsnull*/) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_NSID(aIID); /* * Is this a supported interface? */ const void *pvVFT = downIsSupportedInterface(&aIID ? aIID : kSupportsIID); if (pvVFT) { dprintf(("%s: Supported interface. Calling the real downISMOGetService...", pszFunction)); nsIShutdownListener *pupShutdownListener = shutdownListener; rc = upCreateWrapper((void**)&pupShutdownListener, kShutdownListenerIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->GetService(aClass, aIID, result, pupShutdownListener); rc = downCreateWrapper((void**)result, pvVFT, rc); } else dprintf(("%s: Unable to create 'UP' wrapper for nsIShutdownListener!", pszFunction)); } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; if (result) *result = nsnull; ReleaseInt3(0xbaddbeef, 4, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /* OBSOLETE: use NS_RELEASE(service) instead. */ nsresult VFTCALL downISMOReleaseService(void *pvThis, const nsCID& aClass, nsISupports* service, nsIShutdownListener* shutdownListener/* = nsnull*/) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_NSID(aClass); nsISupports *pupService = service; rc = upCreateWrapper((void**)&pupService, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsIShutdownListener *pupShutdownListener = shutdownListener; rc = upCreateWrapper((void**)&pupShutdownListener, kShutdownListenerIID, rc); if (NS_SUCCEEDED(rc)) rc = pMozI->ReleaseService(aClass, pupService, pupShutdownListener); else dprintf(("%s: Unable to create 'UP' wrapper for nsIShutdownListener!", pszFunction)); } else dprintf(("%s: Unable to create 'UP' wrapper for nsISupports!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } //////////////////////////////////////////////////////////////////////////// // let's do it again, this time with ContractIDs... nsresult VFTCALL downISMORegisterServiceByContractID(void *pvThis, const char* aContractID, nsISupports* aService) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_CONTRACTID(aContractID); nsISupports *pupService = aService; rc = upCreateWrapper((void**)&pupService, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->RegisterService(aContractID, pupService); else dprintf(("%s: Unable to create wrapper for nsISupports!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downISMOUnregisterServiceByContractID(void *pvThis, const char* aContractID) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_CONTRACTID(aContractID); rc = pMozI->UnregisterService(aContractID); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downISMOGetServiceByContractID(void *pvThis, const char* aContractID, const nsIID& aIID, nsISupports* *result, nsIShutdownListener* shutdownListener/* = nsnull */) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_CONTRACTID(aContractID); DPRINTF_NSID(aIID); /* * Is this a supported interface? */ const void *pvVFT = downIsSupportedInterface(&aIID ? aIID : kSupportsIID); if (pvVFT) { nsIShutdownListener *pupShutdownListener = shutdownListener; rc = upCreateWrapper((void**)&pupShutdownListener, kShutdownListenerIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->GetService(aContractID, aIID, result, pupShutdownListener); rc = downCreateWrapper((void**)result, pvVFT, rc); } else dprintf(("%s: Unable to create 'UP' wrapper for nsIShutdownListener!", pszFunction)); } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 5, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /* OBSOLETE */ nsresult VFTCALL downISMOReleaseServiceByContractID(void *pvThis, const char* aContractID, nsISupports* service, nsIShutdownListener* shutdownListener/* = nsnull*/) { DOWN_ENTER_RC(pvThis, nsIServiceManagerObsolete); DPRINTF_CONTRACTID(aContractID); nsISupports *pupService = service; rc = upCreateWrapper((void**)&pupService, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsIShutdownListener *pupShutdownListener = shutdownListener; rc = upCreateWrapper((void**)&pupShutdownListener, kShutdownListenerIID, rc); if (NS_SUCCEEDED(rc)) rc = pMozI->ReleaseService(aContractID, pupService, pupShutdownListener); else dprintf(("%s: Unable to create 'UP' wrapper for nsIShutdownListener!", pszFunction)); } else dprintf(("%s: Unable to create 'UP' wrapper for nsISupports!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIServiceManagerObsolete, downVFTnsIServiceManagerObsolete) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, #ifdef VFT_VAC365 downISMORegisterService, VFTDELTA_VAL() downISMORegisterServiceByContractID, VFTDELTA_VAL() downISMOUnregisterService, VFTDELTA_VAL() downISMOUnregisterServiceByContractID, VFTDELTA_VAL() downISMOGetService, VFTDELTA_VAL() downISMOGetServiceByContractID, VFTDELTA_VAL() downISMOReleaseService, VFTDELTA_VAL() downISMOReleaseServiceByContractID, VFTDELTA_VAL() #else downISMORegisterServiceByContractID, VFTDELTA_VAL() downISMORegisterService, VFTDELTA_VAL() downISMOUnregisterServiceByContractID, VFTDELTA_VAL() downISMOUnregisterService, VFTDELTA_VAL() downISMOGetServiceByContractID, VFTDELTA_VAL() downISMOGetService, VFTDELTA_VAL() downISMOReleaseServiceByContractID, VFTDELTA_VAL() downISMOReleaseService, VFTDELTA_VAL() #endif } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIPluginManager //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Returns the value of a variable associated with the plugin manager. * * (Corresponds to NPN_GetValue.) * * @param variable - the plugin manager variable to get * @param value - the address of where to store the resulting value * @result - NS_OK if this operation was successful */ /* [noscript] void GetValue (in nsPluginManagerVariable variable, in nativeVoid value); */ nsresult VFTCALL downIPMGetValue(void *pvThis, nsPluginManagerVariable variable, void * value) { /* kso: this is not doing anything on NO_X11 platforms */ DOWN_ENTER_RC(pvThis, nsIPluginManager); dprintf(("%s: variable=%d value=%x", pszFunction, variable, value)); rc = pMozI->GetValue(variable, value); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Causes the plugins directory to be searched again for new plugin * libraries. * * (Corresponds to NPN_ReloadPlugins.) * * @param reloadPages - indicates whether currently visible pages should * also be reloaded */ /* void reloadPlugins (in boolean reloadPages); */ nsresult VFTCALL downIPMReloadPlugins(void *pvThis, PRBool reloadPages) { DOWN_ENTER_RC(pvThis, nsIPluginManager); dprintf(("%s: reloadPages=%d", pszFunction, reloadPages)); rc = pMozI->ReloadPlugins(reloadPages); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the user agent string for the browser. * * (Corresponds to NPN_UserAgent.) * * @param resultingAgentString - the resulting user agent string */ /* [noscript] void UserAgent (in nativeChar resultingAgentString); */ nsresult VFTCALL downIPMUserAgent(void *pvThis, const char * * resultingAgentString) { DOWN_ENTER_RC(pvThis, nsIPluginManager); dprintf(("%s: resultingAgentString=%p", pszFunction, resultingAgentString)); rc = pMozI->UserAgent(resultingAgentString); if (NS_SUCCEEDED(rc) && VALID_PTR(resultingAgentString)) DPRINTF_STR(*resultingAgentString); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Fetches a URL. * * (Corresponds to NPN_GetURL and NPN_GetURLNotify.) * * @param pluginInst - the plugin making the request. If NULL, the URL * is fetched in the background. * @param url - the URL to fetch * @param target - the target window into which to load the URL, or NULL if * the data should be returned to the plugin via streamListener. * @param streamListener - a stream listener to be used to return data to * the plugin. May be NULL if target is not NULL. * @param altHost - an IP-address string that will be used instead of the * host specified in the URL. This is used to prevent DNS-spoofing * attacks. Can be defaulted to NULL meaning use the host in the URL. * @param referrer - the referring URL (may be NULL) * @param forceJSEnabled - forces JavaScript to be enabled for 'javascript:' * URLs, even if the user currently has JavaScript disabled (usually * specify PR_FALSE) * @result - NS_OK if this operation was successful */ nsresult VFTCALL downIPMGetURL(void *pvThis, nsISupports* pluginInst, const char* url, const char* target = NULL, nsIPluginStreamListener* streamListener = NULL, const char* altHost = NULL, const char* referrer = NULL, PRBool forceJSEnabled = PR_FALSE) { DOWN_ENTER_RC(pvThis, nsIPluginManager); dprintf(("%s: pluginInst=%x streamListener=%p forceJSEnabled=%d", pszFunction, pluginInst, streamListener, forceJSEnabled)); DPRINTF_STR(url); DPRINTF_STR(target); DPRINTF_STR(altHost); DPRINTF_STR(referrer); nsIPluginStreamListener *pupStreamListener = streamListener; rc = upCreateWrapper((void**)&pupStreamListener, kPluginStreamListenerIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports * pupPluginInst = pluginInst; rc = upCreateWrapper((void**)&pupPluginInst, kSupportsIID, rc); if (rc == NS_OK) rc = pMozI->GetURL(pupPluginInst, url, target, pupStreamListener, altHost, referrer, forceJSEnabled); else dprintf(("%s: Failed to create wrapper for nsISupports (pluginInst=%p)!!!!", pszFunction, pluginInst)); } else dprintf(("%s: Failed to create wrapper for nsIPluginStreamListener!!!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Posts to a URL with post data and/or post headers. * * (Corresponds to NPN_PostURL and NPN_PostURLNotify.) * * @param pluginInst - the plugin making the request. If NULL, the URL * is fetched in the background. * @param url - the URL to fetch * @param postDataLength - the length of postData (if non-NULL) * @param postData - the data to POST. NULL specifies that there is not post * data * @param isFile - whether the postData specifies the name of a file to * post instead of data. The file will be deleted afterwards. * @param target - the target window into which to load the URL, or NULL if * the data should be returned to the plugin via streamListener. * @param streamListener - a stream listener to be used to return data to * the plugin. May be NULL if target is not NULL. * @param altHost - an IP-address string that will be used instead of the * host specified in the URL. This is used to prevent DNS-spoofing * attacks. Can be defaulted to NULL meaning use the host in the URL. * @param referrer - the referring URL (may be NULL) * @param forceJSEnabled - forces JavaScript to be enabled for 'javascript:' * URLs, even if the user currently has JavaScript disabled (usually * specify PR_FALSE) * @param postHeadersLength - the length of postHeaders (if non-NULL) * @param postHeaders - the headers to POST. Must be in the form of * "HeaderName: HeaderValue\r\n". Each header, including the last, * must be followed by "\r\n". NULL specifies that there are no * post headers * @result - NS_OK if this operation was successful */ nsresult VFTCALL downIPMPostURL(void *pvThis, nsISupports* pluginInst, const char* url, PRUint32 postDataLen, const char* postData, PRBool isFile = PR_FALSE, const char* target = NULL, nsIPluginStreamListener* streamListener = NULL, const char* altHost = NULL, const char* referrer = NULL, PRBool forceJSEnabled = PR_FALSE, PRUint32 postHeadersLength = 0, const char* postHeaders = NULL) { DOWN_ENTER_RC(pvThis, nsIPluginManager); dprintf(("%s: pluginInst=%x postDataLen=%d postData='%.*s' (%p) isFile=%d, streamListener=%p", pszFunction, pluginInst, postDataLen, postDataLen, postData, postData, isFile, streamListener)); dprintf(("%s: forceJSEnabled=%d postHeadersLength=%d postHeaders='%*.s' (%p)", pszFunction, forceJSEnabled, postHeadersLength, postHeadersLength, postHeaders, postHeaders)); DPRINTF_STR(url); DPRINTF_STR(target); DPRINTF_STR(altHost); DPRINTF_STR(referrer); nsIPluginStreamListener *pupStreamListener = streamListener; rc = upCreateWrapper((void**)&pupStreamListener, kPluginStreamListenerIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports * pupPluginInst = pluginInst; rc = upCreateWrapper((void**)&pupPluginInst, kSupportsIID, rc); if (rc == NS_OK) rc = pMozI->PostURL(pupPluginInst, url, postDataLen, postData, isFile, target, pupStreamListener, altHost, referrer, forceJSEnabled, postHeadersLength, postHeaders); else dprintf(("%s: Failed to create wrapper for nsISupports (pluginInst=%p)!!!!", pszFunction, pluginInst)); } else dprintf(("%s: Failed to create wrapper for nsIPluginStreamListener!!!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Persistently register a plugin with the plugin * manager. aMimeTypes, aMimeDescriptions, and aFileExtensions are * parallel arrays that contain information about the MIME types * that the plugin supports. * * @param aCID - the plugin's CID * @param aPluginName - the plugin's name * @param aDescription - a description of the plugin * @param aMimeTypes - an array of MIME types that the plugin * is prepared to handle * @param aMimeDescriptions - an array of descriptions for the * MIME types that the plugin can handle. * @param aFileExtensions - an array of file extensions for * the MIME types that the plugin can handle. * @param aCount - the number of elements in the aMimeTypes, * aMimeDescriptions, and aFileExtensions arrays. * @result - NS_OK if the operation was successful. */ /* [noscript] void RegisterPlugin (in REFNSIID aCID, in string aPluginName, in string aDescription, in nativeChar aMimeTypes, in nativeChar aMimeDescriptions, in nativeChar aFileExtensions, in long aCount); */ nsresult VFTCALL downIPMRegisterPlugin(void *pvThis, REFNSIID aCID, const char *aPluginName, const char *aDescription, const char * * aMimeTypes, const char * * aMimeDescriptions, const char * * aFileExtensions, PRInt32 aCount) { //@todo TEXT: aMimeDescriptions? aDescription? Doesn't apply to java plugin I think. DOWN_ENTER_RC(pvThis, nsIPluginManager); dprintf(("%s: aCount=%d", pszFunction, aCount)); DPRINTF_NSID(aCID); DPRINTF_STR(aPluginName); DPRINTF_STR(aDescription); for (int i = 0; i < aCount; i++) dprintf(("%s: aMimeTypes[%d]='%s' (%p) aMimeDescriptions[%d]='%s' (%p) aFileExtensions[%d]='%s' (%p)", pszFunction, i, aMimeTypes[i], aMimeTypes[i], i, aMimeDescriptions[i], aMimeDescriptions[i], i, aFileExtensions[i], aFileExtensions[i])); rc = pMozI->RegisterPlugin(aCID, aPluginName, aDescription, aMimeTypes, aMimeDescriptions, aFileExtensions, aCount); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Unregister a plugin from the plugin manager * * @param aCID the CID of the plugin to unregister. * @result - NS_OK if the operation was successful. */ /* [noscript] void UnregisterPlugin (in REFNSIID aCID); */ nsresult VFTCALL downIPMUnregisterPlugin(void *pvThis, REFNSIID aCID) { DOWN_ENTER_RC(pvThis, nsIPluginManager); DPRINTF_NSID(aCID); rc = pMozI->UnregisterPlugin(aCID); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Fetches a URL, with Headers * @see GetURL. Identical except for additional params headers and * headersLen * @param getHeadersLength - the length of getHeaders (if non-NULL) * @param getHeaders - the headers to GET. Must be in the form of * "HeaderName: HeaderValue\r\n". Each header, including the last, * must be followed by "\r\n". NULL specifies that there are no * get headers * @result - NS_OK if this operation was successful */ nsresult VFTCALL downIPMGetURLWithHeaders(void *pvThis, nsISupports* pluginInst, const char* url, const char* target = NULL, nsIPluginStreamListener* streamListener = NULL, const char* altHost = NULL, const char* referrer = NULL, PRBool forceJSEnabled = PR_FALSE, PRUint32 getHeadersLength = 0, const char* getHeaders = NULL) { DOWN_ENTER_RC(pvThis, nsIPluginManager); dprintf(("%s: pluginInst=%x streamListener=%p forceJSEnabled=%d getHeadersLength=%d getHeaders='%.*s' (%p)", pszFunction, pluginInst, streamListener, forceJSEnabled, getHeadersLength, getHeadersLength, getHeaders, getHeaders)); DPRINTF_STR(url); DPRINTF_STR(target); DPRINTF_STR(altHost); DPRINTF_STR(referrer); nsIPluginStreamListener *pupStreamListener = streamListener; rc = upCreateWrapper((void**)&pupStreamListener, kPluginStreamListenerIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports * pupPluginInst = pluginInst; rc = upCreateWrapper((void**)&pupPluginInst, kSupportsIID, rc); if (rc == NS_OK) rc = pMozI->GetURLWithHeaders(pupPluginInst, url, target, pupStreamListener, altHost, referrer, forceJSEnabled, getHeadersLength, getHeaders); else dprintf(("%s: Failed to create wrapper for nsISupports (pluginInst=%p)!!!!", pszFunction, pluginInst)); } else dprintf(("%s: Failed to create wrapper for nsIPluginStreamListener!!!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIPluginManager, downVFTnsIPluginManager) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downIPMGetValue, VFTDELTA_VAL() downIPMReloadPlugins, VFTDELTA_VAL() downIPMUserAgent, VFTDELTA_VAL() downIPMGetURL, VFTDELTA_VAL() downIPMPostURL, VFTDELTA_VAL() downIPMRegisterPlugin, VFTDELTA_VAL() downIPMUnregisterPlugin, VFTDELTA_VAL() downIPMGetURLWithHeaders, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIPluginManager2 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Puts up a wait cursor. * * @result - NS_OK if this operation was successful */ /* void beginWaitCursor (); */ nsresult VFTCALL downIPM2BeginWaitCursor(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); rc = pMozI->BeginWaitCursor(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Restores the previous (non-wait) cursor. * * @result - NS_OK if this operation was successful */ /* void endWaitCursor (); */ nsresult VFTCALL downIPM2EndWaitCursor(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); rc = pMozI->EndWaitCursor(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns true if a URL protocol (e.g. "http") is supported. * * @param aProtocol - the protocol name * @param aResult - true if the protocol is supported * @result - NS_OK if this operation was successful */ /* void supportsURLProtocol (in string aProtocol, out boolean aResult); */ nsresult VFTCALL downIPM2SupportsURLProtocol(void *pvThis, const char *aProtocol, PRBool *aResult) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); DPRINTF_STR(aProtocol); rc = pMozI->SupportsURLProtocol(aProtocol, aResult); if (NS_SUCCEEDED(rc) && VALID_PTR(aResult)) dprintf(("%s: *aResult=%d", pszFunction, *aResult)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * This method may be called by the plugin to indicate that an error * has occurred, e.g. that the plugin has failed or is shutting down * spontaneously. This allows the browser to clean up any plugin-specific * state. * * @param aPlugin - the plugin whose status is changing * @param aStatus - the error status value * @result - NS_OK if this operation was successful */ /* void notifyStatusChange (in nsIPlugin aPlugin, in nsresult aStatus); */ nsresult VFTCALL downIPM2NotifyStatusChange(void *pvThis, nsIPlugin *aPlugin, nsresult aStatus) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); dprintf(("%s: aPlugin=%x aStatus=%d", pszFunction, aPlugin, aStatus)); nsIPlugin * pupPlugin = aPlugin; rc = upCreateWrapper((void**)&pupPlugin, kPluginIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->NotifyStatusChange(pupPlugin, aStatus); else dprintf(("%s: failed to create up wrapper for aPlugin=%x!!!", pszFunction, aPlugin)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the proxy info for a given URL. The caller is required to * free the resulting memory with nsIMalloc::Free. The result will be in the * following format * * i) "DIRECT" -- no proxy * ii) "PROXY xxx.xxx.xxx.xxx" -- use proxy * iii) "SOCKS xxx.xxx.xxx.xxx" -- use SOCKS * iv) Mixed. e.g. "PROXY 111.111.111.111;PROXY 112.112.112.112", * "PROXY 111.111.111.111;SOCKS 112.112.112.112".... * * Which proxy/SOCKS to use is determined by the plugin. */ /* void findProxyForURL (in string aURL, out string aResult); */ nsresult VFTCALL downIPM2FindProxyForURL(void *pvThis, const char *aURL, char **aResult) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); DPRINTF_STR(aURL); rc = pMozI->FindProxyForURL(aURL, aResult); if (NS_SUCCEEDED(rc) && VALID_PTR(aResult) && VALID_PTR(*aResult)) { DPRINTF_STR(*aResult); /* I have a feeling that the ibm plugin is cheating here. or that nsIMalloc::Free * isn't well implemented... * * !!HACKALLERT!! * For npoji16.dll we will allocate this string using it's own CRT. * First we must detect if this is npoji16.dll */ char szModName[9]; HMODULE hmod; ULONG iObj; ULONG offObj; if (!DosQueryModFromEIP(&hmod, &iObj, sizeof(szModName), &szModName[0], &offObj, ((unsigned *)(void*)&pvThis)[-1])) { if (!stricmp(szModName, "NPOJI6")) { if (!DosQueryModuleHandle("JV12MI36", &hmod)) { char *(*_Optlink pfnstrdup)(const char *); /* we might have to dosloadmodule (verb) the stupid thing */ int rc2 = DosQueryProcAddr(hmod, 0, "strdup", (PFN*)&pfnstrdup); if ( rc2 == ERROR_INVALID_HANDLE && !DosLoadModule(NULL, 0, "JV12MI36", &hmod)) rc2 = DosQueryProcAddr(hmod, 0, "strdup", (PFN*)&pfnstrdup); if (!rc2) { char *psz = pfnstrdup(*aResult); if (psz) { free(*aResult); /* We're using the right CRT.. */ *aResult = psz; } } } } } } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Registers a top-level window with the browser. Events received by that * window will be dispatched to the event handler specified. * * @param aHandler - the event handler for the window * @param aWindow - the platform window reference * @result - NS_OK if this operation was successful */ /* void registerWindow (in nsIEventHandler aHandler, in nsPluginPlatformWindowRef aWindow); */ nsresult VFTCALL downIPM2RegisterWindow(void *pvThis, nsIEventHandler *aHandler, nsPluginPlatformWindowRef aWindow) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); dprintf(("%s: Incomplete!!!", pszFunction)); dprintf(("%s: aHandler=%p aWindow=%x", pszFunction, aHandler, aWindow)); nsIEventHandler * pupHandler = aHandler; rc = upCreateWrapper((void**)&pupHandler, kEventHandlerIID, NS_OK); if (NS_SUCCEEDED(rc)) { //@todo wrap window handle somehow... DebugInt3(); nsPluginPlatformWindowRef os2Window = aWindow; if (NS_SUCCEEDED(rc)) { rc = pMozI->RegisterWindow(pupHandler, os2Window); } else dprintf(("%s: failed to create window handle wrapper for %x!!!", pszFunction, aWindow)); } else dprintf(("%s: failed to create up wrapper for nsIEventHandler %x!!!", pszFunction, aHandler)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Unregisters a top-level window with the browser. The handler and window pair * should be the same as that specified to RegisterWindow. * * @param aHandler - the event handler for the window * @param aWindow - the platform window reference * @result - NS_OK if this operation was successful */ /* void unregisterWindow (in nsIEventHandler aHandler, in nsPluginPlatformWindowRef aWindow); */ nsresult VFTCALL downIPM2UnregisterWindow(void *pvThis, nsIEventHandler *aHandler, nsPluginPlatformWindowRef aWindow) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); dprintf(("%s: Incomplete!!!", pszFunction)); dprintf(("%s: aHandler=%p aWindow=%x", pszFunction, aHandler, aWindow)); nsIEventHandler * pupHandler = aHandler; rc = upCreateWrapper((void**)&pupHandler, kEventHandlerIID, NS_OK); if (NS_SUCCEEDED(rc)) { //@todo wrap window handle somehow... DebugInt3(); nsPluginPlatformWindowRef os2Window = aWindow; if (NS_SUCCEEDED(rc)) { rc = pMozI->UnregisterWindow(pupHandler, os2Window); } else dprintf(("%s: failed to create window handle wrapper for %x!!!", pszFunction, aWindow)); } else dprintf(("%s: failed to create up wrapper for nsIEventHandler %x!!!", pszFunction, aHandler)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Allocates a new menu ID (for the Mac). * * @param aHandler - the event handler for the window * @param aIsSubmenu - whether this is a sub-menu ID or not * @param aResult - the resulting menu ID * @result - NS_OK if this operation was successful */ /* void allocateMenuID (in nsIEventHandler aHandler, in boolean aIsSubmenu, out short aResult); */ nsresult VFTCALL downIPM2AllocateMenuID(void *pvThis, nsIEventHandler *aHandler, PRBool aIsSubmenu, PRInt16 *aResult) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); dprintf(("%s: Incomplete!!!", pszFunction)); dprintf(("%s: aHandler=%p aIsSubmenu=%d aResult=%p", pszFunction, aHandler, aIsSubmenu, aResult)); nsIEventHandler * pupHandler = aHandler; rc = upCreateWrapper((void**)&pupHandler, kEventHandlerIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->AllocateMenuID(pupHandler, aIsSubmenu, aResult); if (NS_SUCCEEDED(rc) && VALID_PTR(aResult)) dprintf(("%s: *aResult=%d (0x%x)", pszFunction, *aResult, *aResult)); } else dprintf(("%s: failed to create up wrapper for nsIEventHandler %x !!!", pszFunction, aHandler)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Deallocates a menu ID (for the Mac). * * @param aHandler - the event handler for the window * @param aMenuID - the menu ID * @result - NS_OK if this operation was successful */ /* void deallocateMenuID (in nsIEventHandler aHandler, in short aMenuID); */ nsresult VFTCALL downIPM2DeallocateMenuID(void *pvThis, nsIEventHandler *aHandler, PRInt16 aMenuID) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); dprintf(("%s: aHandler=%p aMenuID=%d", pszFunction, aHandler, aMenuID)); nsIEventHandler * pupHandler = aHandler; rc = upCreateWrapper((void**)&pupHandler, kEventHandlerIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->DeallocateMenuID(pupHandler, aMenuID); else dprintf(("%s: failed to create up wrapper for nsIEventHandler %x !!!", pszFunction, aHandler)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Indicates whether this event handler has allocated the given menu ID. * * @param aHandler - the event handler for the window * @param aMenuID - the menu ID * @param aResult - returns PR_TRUE if the menu ID is allocated * @result - NS_OK if this operation was successful */ /* void hasAllocatedMenuID (in nsIEventHandler aHandler, in short aMenuID, out boolean aResult); */ nsresult VFTCALL downIPM2HasAllocatedMenuID(void *pvThis, nsIEventHandler *aHandler, PRInt16 aMenuID, PRBool *aResult) { DOWN_ENTER_RC(pvThis, nsIPluginManager2); dprintf(("%s: aHandler=%p aMenuID=%d aResult=%p", pszFunction, aHandler, aMenuID, aResult)); nsIEventHandler * pupHandler = aHandler; rc = upCreateWrapper((void**)&pupHandler, kEventHandlerIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->HasAllocatedMenuID(pupHandler, aMenuID, aResult); if (NS_SUCCEEDED(rc) && VALID_PTR(aResult)) dprintf(("%s: *aResult=%d", pszFunction, *aResult)); } else dprintf(("%s: failed to create up wrapper for nsIEventHandler %x !!!", pszFunction, aHandler)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIPluginManager2, downVFTnsIPluginManager2) { { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downIPMGetValue, VFTDELTA_VAL() downIPMReloadPlugins, VFTDELTA_VAL() downIPMUserAgent, VFTDELTA_VAL() downIPMGetURL, VFTDELTA_VAL() downIPMPostURL, VFTDELTA_VAL() downIPMRegisterPlugin, VFTDELTA_VAL() downIPMUnregisterPlugin, VFTDELTA_VAL() downIPMGetURLWithHeaders, VFTDELTA_VAL() }, downIPM2BeginWaitCursor, VFTDELTA_VAL() downIPM2EndWaitCursor, VFTDELTA_VAL() downIPM2SupportsURLProtocol, VFTDELTA_VAL() downIPM2NotifyStatusChange, VFTDELTA_VAL() downIPM2FindProxyForURL, VFTDELTA_VAL() downIPM2RegisterWindow, VFTDELTA_VAL() downIPM2UnregisterWindow, VFTDELTA_VAL() downIPM2AllocateMenuID, VFTDELTA_VAL() downIPM2DeallocateMenuID, VFTDELTA_VAL() downIPM2HasAllocatedMenuID, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIPluginInstancePeer //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Returns the value of a variable associated with the plugin manager. * * (Corresponds to NPN_GetValue.) * * @param aVariable - the plugin manager variable to get * @param aValue - the address of where to store the resulting value * @result - NS_OK if this operation was successful */ /* void getValue (in nsPluginInstancePeerVariable aVariable, in voidPtr aValue); */ nsresult VFTCALL downIPIPGetValue(void *pvThis, nsPluginInstancePeerVariable aVariable, void * aValue) { DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer); dprintf(("%s: aVariable=%d aValue=%p", pszFunction, aVariable, aValue)); rc = pMozI->GetValue(aVariable, aValue); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the MIME type of the plugin instance. * * (Corresponds to NPP_New's MIMEType argument.) * * @param aMIMEType - resulting MIME type * @result - NS_OK if this operation was successful */ /* readonly attribute nsMIMEType MIMEType; */ nsresult VFTCALL downIPIPGetMIMEType(void *pvThis, nsMIMEType *aMIMEType) { DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer); dprintf(("%s: aMIMEType=%p", pszFunction, aMIMEType)); rc = pMozI->GetMIMEType(aMIMEType); if (NS_SUCCEEDED(rc) && VALID_PTR(aMIMEType) && VALID_PTR(*aMIMEType)) DPRINTF_STR(*aMIMEType); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the mode of the plugin instance, i.e. whether the plugin is * embedded in the html, or full page. * * (Corresponds to NPP_New's mode argument.) * * @param result - the resulting mode * @result - NS_OK if this operation was successful */ /* readonly attribute nsPluginMode mode; */ nsresult VFTCALL downIPIPGetMode(void *pvThis, nsPluginMode *aMode) { DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer); dprintf(("%s: aMode=%p", pszFunction, aMode)); rc = pMozI->GetMode(aMode); if (NS_SUCCEEDED(rc) && VALID_PTR(aMode)) dprintf(("%s: *aMode=%d", pszFunction, *aMode)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * This operation is called by the plugin instance when it wishes to send * a stream of data to the browser. It constructs a new output stream to which * the plugin may send the data. When complete, the Close and Release methods * should be called on the output stream. * * (Corresponds to NPN_NewStream.) * * @param aType - MIME type of the stream to create * @param aTarget - the target window name to receive the data * @param aResult - the resulting output stream * @result - NS_OK if this operation was successful */ /* void newStream (in nsMIMEType aType, in string aTarget, out nsIOutputStream aResult); */ nsresult VFTCALL downIPIPNewStream(void *pvThis, nsMIMEType aType, const char *aTarget, nsIOutputStream **aResult) { //@todo TEXT: aTarget? Doesn't apply to java plugin I think. DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer); dprintf(("%s: aResult=%p", pszFunction, aResult)); DPRINTF_STR(aType); DPRINTF_STR(aTarget); const void *pvVFT = downIsSupportedInterface(kOutputStreamIID); if (pvVFT) { rc = pMozI->NewStream(aType, aTarget, aResult); rc = downCreateWrapper((void**)aResult, pvVFT, rc); } else { dprintf(("%s: Unsupported Interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 21, kOutputStreamIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * This operation causes status information to be displayed on the window * associated with the plugin instance. * * (Corresponds to NPN_Status.) * * @param aMessage - the status message to display * @result - NS_OK if this operation was successful */ /* void showStatus (in string aMessage); */ nsresult VFTCALL downIPIPShowStatus(void *pvThis, const char *aMessage) { //@todo TEXT: aMessage? This must be further tested! DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer); DPRINTF_STR(aMessage); verifyAndFixUTF8String(aMessage, XPFUNCTION); rc = pMozI->ShowStatus(aMessage); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Set the desired size of the window in which the plugin instance lives. * * @param aWidth - new window width * @param aHeight - new window height * @result - NS_OK if this operation was successful */ /* void setWindowSize (in unsigned long aWidth, in unsigned long aHeight); */ nsresult VFTCALL downIPIPSetWindowSize(void *pvThis, PRUint32 aWidth, PRUint32 aHeight) { DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer); dprintf(("%s: aWidth=%d aHeight=%d", pszFunction, aWidth, aHeight)); rc = pMozI->SetWindowSize(aWidth, aHeight); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIPluginInstancePeer, downVFTnsIPluginInstancePeer) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downIPIPGetValue, VFTDELTA_VAL() downIPIPGetMIMEType, VFTDELTA_VAL() downIPIPGetMode, VFTDELTA_VAL() downIPIPNewStream, VFTDELTA_VAL() downIPIPShowStatus, VFTDELTA_VAL() downIPIPSetWindowSize, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIPluginInstancePeer2 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Get the JavaScript window object corresponding to this plugin instance. * * @param aJSWindow - the resulting JavaScript window object * @result - NS_OK if this operation was successful */ /* readonly attribute JSObjectPtr JSWindow; */ nsresult VFTCALL downIPIP2GetJSWindow(void *pvThis, JSObject * *aJSWindow) { DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer2); rc = pMozI->GetJSWindow(aJSWindow); if (NS_SUCCEEDED(rc) && VALID_PTR(aJSWindow)) { //@todo wrap aJSWindow? dprintf(("%s: aJSWindow=%p - not really wrapped !!!", pszFunction, aJSWindow)); DebugInt3(); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the JavaScript execution thread corresponding to this plugin instance. * * @param aJSThread - the resulting JavaScript thread id * @result - NS_OK if this operation was successful */ /* readonly attribute unsigned long JSThread; */ nsresult VFTCALL downIPIP2GetJSThread(void *pvThis, PRUint32 *aJSThread) { DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer2); rc = pMozI->GetJSThread(aJSThread); if (NS_SUCCEEDED(rc) && VALID_PTR(aJSThread)) dprintf(("%s: aJSThread=%u", pszFunction, aJSThread)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the JavaScript context to this plugin instance. * * @param aJSContext - the resulting JavaScript context * @result - NS_OK if this operation was successful */ /* readonly attribute JSContextPtr JSContext; */ nsresult VFTCALL downIPIP2GetJSContext(void *pvThis, JSContext * *aJSContext) { DOWN_ENTER_RC(pvThis, nsIPluginInstancePeer2); rc = pMozI->GetJSContext(aJSContext); if (NS_SUCCEEDED(rc) && VALID_PTR(aJSContext)) { //@todo wrap aJSContext? dprintf(("%s: aJSContext=%p - not really wrapped !!!", pszFunction, aJSContext)); DebugInt3(); } DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIPluginInstancePeer2, downVFTnsIPluginInstancePeer2) { { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downIPIPGetValue, VFTDELTA_VAL() downIPIPGetMIMEType, VFTDELTA_VAL() downIPIPGetMode, VFTDELTA_VAL() downIPIPNewStream, VFTDELTA_VAL() downIPIPShowStatus, VFTDELTA_VAL() downIPIPSetWindowSize, VFTDELTA_VAL() }, downIPIP2GetJSWindow, VFTDELTA_VAL() downIPIP2GetJSThread, VFTDELTA_VAL() downIPIP2GetJSContext, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * QueryInterface on nsIPluginInstancePeer to get this. * * (Corresponds to NPP_New's argc, argn, and argv arguments.) * Get a ptr to the paired list of attribute names and values, * returns the length of the array. * * Each name or value is a null-terminated string. */ /* void getAttributes (in PRUint16Ref aCount, in constCharStarConstStar aNames, in constCharStarConstStar aValues); */ nsresult VFTCALL downIPTIGetAttributes(void *pvThis, PRUint16 & aCount, const char* const* & aNames, const char* const* & aValues) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo); rc = pMozI->GetAttributes(aCount, aNames, aValues); if (NS_SUCCEEDED(rc)) { dprintf(("%s: aCount=%d", pszFunction, aCount)); for (int i = 0; i < aCount; i++) dprintf(("%s: aNames[%d]='%s' (%p) aValues[%d]='%s' (%p)", pszFunction, i, aNames[i], aNames[i], i, aValues[i], aValues[i])); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Gets the value for the named attribute. * * @param aName - the name of the attribute to find * @param aResult - the resulting attribute * @result - NS_OK if this operation was successful, NS_ERROR_FAILURE if * this operation failed. result is set to NULL if the attribute is not found * else to the found value. */ /* void getAttribute (in string aName, out constCharPtr aResult); */ nsresult VFTCALL downIPTIGetAttribute(void *pvThis, const char *aName, const char * *aResult) { //@todo TEXT: aName? aResult? I believe that this one works as the text format is that of the document. DOWN_ENTER_RC(pvThis, nsIPluginTagInfo); DPRINTF_STR(aName); rc = pMozI->GetAttribute(aName, aResult); if (NS_SUCCEEDED(rc) && VALID_PTR(aResult) && VALID_PTR(*aResult)) DPRINTF_STR(*aResult); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIPluginTagInfo, downVFTnsIPluginTagInfo) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downIPTIGetAttributes, VFTDELTA_VAL() downIPTIGetAttribute, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Get the type of the HTML tag that was used ot instantiate this * plugin. Currently supported tags are EMBED, OBJECT and APPLET. */ /* readonly attribute nsPluginTagType tagType; */ nsresult VFTCALL downIPTI2GetTagType(void *pvThis, nsPluginTagType *aTagType) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetTagType(aTagType); if (NS_SUCCEEDED(rc) && VALID_PTR(aTagType)) dprintf(("%s: *aTagType=%d", pszFunction, *aTagType)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the complete text of the HTML tag that was used to instantiate this plugin. */ /* void getTagText (out constCharPtr aTagText); */ nsresult VFTCALL downIPTI2GetTagText(void *pvThis, const char * *aTagText) { //@todo TEXT: aTagText? Can't find any usage, but I guess this is also in the format of the document. DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetTagText(aTagText); if (NS_SUCCEEDED(rc) && VALID_PTR(aTagText) && VALID_PTR(*aTagText)) DPRINTF_STR(*aTagText); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get a ptr to the paired list of parameter names and values, * returns the length of the array. * * Each name or value is a null-terminated string. */ /* void getParameters (in PRUint16Ref aCount, in constCharStarConstStar aNames, in constCharStarConstStar aValues); */ nsresult VFTCALL downIPTI2GetParameters(void *pvThis, PRUint16 & aCount, const char* const* & aNames, const char* const* & aValues) { //@todo TEXT: aNames? aValues? I believe that this one works as the text format is that of the document. // kmelektronik uses this successfully. DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetParameters(aCount, aNames, aValues); if (NS_SUCCEEDED(rc)) { dprintf(("%s: aCount=%d", pszFunction, aCount)); for (int i = 0; i < aCount; i++) dprintf(("%s: aNames[%d]='%s' (%p) aValues[%d]='%s' (%p)", pszFunction, i, aNames[i], aNames[i], i, aValues[i], aValues[i])); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the value for the named parameter. Returns null * if the parameter was not set. * * @param aName - name of the parameter * @param aResult - parameter value * @result - NS_OK if this operation was successful */ /* void getParameter (in string aName, out constCharPtr aResult); */ nsresult VFTCALL downIPTI2GetParameter(void *pvThis, const char *aName, const char * *aResult) { //@todo TEXT: aName? aResult? Can't find any usage, but I guess this is also in the format of the document. DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); DPRINTF_STR(aName); rc = pMozI->GetParameter(aName, aResult); if (NS_SUCCEEDED(rc) && VALID_PTR(aResult) && VALID_PTR(*aResult)) DPRINTF_STR(*aResult); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the document base */ /* void getDocumentBase (out constCharPtr aDocumentBase); */ nsresult VFTCALL downIPTI2GetDocumentBase(void *pvThis, const char * *aDocumentBase) { //@todo TEXT: aDocumentBase? This is just getting the URL. Need further investigation. DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetDocumentBase(aDocumentBase); if (NS_SUCCEEDED(rc) && VALID_PTR(aDocumentBase) && VALID_PTR(*aDocumentBase)) DPRINTF_STR(*aDocumentBase); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Return an encoding whose name is specified in: * http://java.sun.com/products/jdk/1.1/docs/guide/intl/intl.doc.html#25303 */ /* void getDocumentEncoding (out constCharPtr aDocumentEncoding); */ nsresult VFTCALL downIPTI2GetDocumentEncoding(void *pvThis, const char * *aDocumentEncoding) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetDocumentEncoding(aDocumentEncoding); if (NS_SUCCEEDED(rc) && VALID_PTR(aDocumentEncoding) && VALID_PTR(*aDocumentEncoding)) DPRINTF_STR(*aDocumentEncoding); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get object alignment */ /* void getAlignment (out constCharPtr aElignment); */ nsresult VFTCALL downIPTI2GetAlignment(void *pvThis, const char * *aElignment) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetAlignment(aElignment); if (NS_SUCCEEDED(rc) && VALID_PTR(aElignment) && VALID_PTR(*aElignment)) DPRINTF_STR(*aElignment); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get object width */ /* readonly attribute unsigned long width; */ nsresult VFTCALL downIPTI2GetWidth(void *pvThis, PRUint32 *aWidth) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetWidth(aWidth); if (NS_SUCCEEDED(rc) && VALID_PTR(aWidth)) dprintf(("%s: *aWidth=%d", pszFunction, *aWidth)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get object height */ /* readonly attribute unsigned long height; */ nsresult VFTCALL downIPTI2GetHeight(void *pvThis, PRUint32 *aHeight) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetHeight(aHeight); if (NS_SUCCEEDED(rc) && VALID_PTR(aHeight)) dprintf(("%s: *aHeight=%d", pszFunction, *aHeight)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get border vertical space */ /* readonly attribute unsigned long borderVertSpace; */ nsresult VFTCALL downIPTI2GetBorderVertSpace(void *pvThis, PRUint32 *aBorderVertSpace) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetBorderVertSpace(aBorderVertSpace); if (NS_SUCCEEDED(rc) && VALID_PTR(aBorderVertSpace)) dprintf(("%s: *aBorderVertSpace=%d", pszFunction, *aBorderVertSpace)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get border horizontal space */ /* readonly attribute unsigned long borderHorizSpace; */ nsresult VFTCALL downIPTI2GetBorderHorizSpace(void *pvThis, PRUint32 *aBorderHorizSpace) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetBorderHorizSpace(aBorderHorizSpace); if (NS_SUCCEEDED(rc) && VALID_PTR(aBorderHorizSpace)) dprintf(("%s: *aBorderHorizSpace=%d", pszFunction, *aBorderHorizSpace)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns a unique id for the current document containing plugin */ /* readonly attribute unsigned long uniqueID; */ nsresult VFTCALL downIPTI2GetUniqueID(void *pvThis, PRUint32 *aUniqueID) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); rc = pMozI->GetUniqueID(aUniqueID); if (NS_SUCCEEDED(rc) && VALID_PTR(aUniqueID)) dprintf(("%s: *aUniqueID=%d", pszFunction, *aUniqueID)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the DOM element corresponding to the tag which references * this plugin in the document. * * @param aDOMElement - resulting DOM element * @result - NS_OK if this operation was successful */ /* readonly attribute nsIDOMElement DOMElement; */ nsresult VFTCALL downIPTI2GetDOMElement(void *pvThis, nsIDOMElement * *aDOMElement) { DOWN_ENTER_RC(pvThis, nsIPluginTagInfo2); const void *pvVFT = downIsSupportedInterface(kDOMElementIID); if (pvVFT) { rc = pMozI->GetDOMElement(aDOMElement); rc = downCreateWrapper((void**)aDOMElement, pvVFT, rc); } else { dprintf(("%s: Unsupported Interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 14, kDOMElementIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIPluginTagInfo2, downVFTnsIPluginTagInfo2) { { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downIPTIGetAttributes, VFTDELTA_VAL() downIPTIGetAttribute, VFTDELTA_VAL() }, downIPTI2GetTagType, VFTDELTA_VAL() downIPTI2GetTagText, VFTDELTA_VAL() downIPTI2GetParameters, VFTDELTA_VAL() downIPTI2GetParameter, VFTDELTA_VAL() downIPTI2GetDocumentBase, VFTDELTA_VAL() downIPTI2GetDocumentEncoding, VFTDELTA_VAL() downIPTI2GetAlignment, VFTDELTA_VAL() downIPTI2GetWidth, VFTDELTA_VAL() downIPTI2GetHeight, VFTDELTA_VAL() downIPTI2GetBorderVertSpace, VFTDELTA_VAL() downIPTI2GetBorderHorizSpace, VFTDELTA_VAL() downIPTI2GetUniqueID, VFTDELTA_VAL() downIPTI2GetDOMElement, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsICookieStorage //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Retrieves a cookie from the browser's persistent cookie store. * @param aCookieURL - URL string to look up cookie with. * @param aCookieBuffer - buffer large enough to accomodate cookie data. * @param aCookieSize - on input, size of the cookie buffer, on output cookie's size. */ /* void getCookie (in string aCookieURL, in voidPtr aCookieBuffer, in PRUint32Ref aCookieSize); */ nsresult VFTCALL downICSGetCookie(void *pvThis, const char *aCookieURL, void * aCookieBuffer, PRUint32 & aCookieSize) { DOWN_ENTER_RC(pvThis, nsICookieStorage); dprintf(("%s: aCookieURL=%x aCookieBuffer=%x aCookieSize=%x", pszFunction, aCookieURL, aCookieBuffer, VALID_REF(aCookieSize) ? aCookieSize : 0xdeadbeef)); DPRINTF_STR(aCookieURL); rc = pMozI->GetCookie(aCookieURL, aCookieBuffer, aCookieSize); if (NS_SUCCEEDED(rc) && VALID_REF(aCookieSize)) dprintf(("%s: aCookieSize=%d", pszFunction, aCookieSize)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Stores a cookie in the browser's persistent cookie store. * @param aCookieURL - URL string store cookie with. * @param aCookieBuffer - buffer containing cookie data. * @param aCookieSize - specifies size of cookie data. */ /* void setCookie (in string aCookieURL, in constVoidPtr aCookieBuffer, in unsigned long aCookieSize); */ nsresult VFTCALL downICSSetCookie(void *pvThis, const char *aCookieURL, const void * aCookieBuffer, PRUint32 aCookieSize) { DOWN_ENTER_RC(pvThis, nsICookieStorage); dprintf(("%s: aCookieURL=%x aCookieBuffer=%x aCookieSize=%x", pszFunction, aCookieURL, aCookieBuffer, aCookieSize)); DPRINTF_STR(aCookieURL); rc = pMozI->SetCookie(aCookieURL, aCookieBuffer, aCookieSize); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsICookieStorage, downVFTnsICookieStorage) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downICSGetCookie, VFTDELTA_VAL() downICSSetCookie, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIJVMThreadManager //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Returns a unique identifier for the "current" system thread. */ #ifdef IPLUGINW_OUTOFTREE nsresult VFTCALL downITMGetCurrentThread(void *pvThis, nsPluginThread* *threadID) #else nsresult VFTCALL downITMGetCurrentThread(void *pvThis, PRThread **threadID) #endif { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); rc = pMozI->GetCurrentThread(threadID); if (NS_SUCCEEDED(rc) && VALID_PTR(threadID)) dprintf(("%s: *threadID=%d (0x%x)", pszFunction, *threadID, *threadID)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Pauses the current thread for the specified number of milliseconds. * If milli is zero, then merely yields the CPU if another thread of * greater or equal priority. */ nsresult VFTCALL downITMSleep(void *pvThis, PRUint32 milli/* = 0*/) { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: milli=%d", pszFunction, milli)); rc = pMozI->Sleep(milli); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Creates a unique monitor for the specified address, and makes the * current system thread the owner of the monitor. */ nsresult VFTCALL downITMEnterMonitor(void *pvThis, void* address) { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: address=%p", pszFunction, address)); rc = pMozI->EnterMonitor(address); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Exits the monitor associated with the address. */ nsresult VFTCALL downITMExitMonitor(void *pvThis, void* address) { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: address=%p", pszFunction, address)); rc = pMozI->ExitMonitor(address); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Waits on the monitor associated with the address (must be entered already). * If milli is 0, wait indefinitely. */ nsresult VFTCALL downITMWait(void *pvThis, void* address, PRUint32 milli/* = 0*/) { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: address=%p milli=%u", pszFunction, address, milli)); rc = pMozI->Wait(address, milli); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Notifies a single thread waiting on the monitor associated with the address (must be entered already). */ nsresult VFTCALL downITMNotify(void *pvThis, void* address) { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: address=%p", pszFunction, address)); rc = pMozI->Notify(address); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Notifies all threads waiting on the monitor associated with the address (must be entered already). */ nsresult VFTCALL downITMNotifyAll(void *pvThis, void* address) { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: address=%p", pszFunction, address)); rc = pMozI->NotifyAll(address); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Creates a new thread, calling the specified runnable's Run method (a la Java). */ #ifdef IPLUGINW_OUTOFTREE nsresult VFTCALL downITMCreateThread(void *pvThis, PRUint32* threadID, nsIRunnable* runnable) #else nsresult VFTCALL downITMCreateThread(void *pvThis, PRThread **threadID, nsIRunnable* runnable) #endif { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: threadID=%p runnable=%p", pszFunction, threadID, runnable)); nsIRunnable * pupRunnable = runnable; rc = upCreateWrapper((void**)&pupRunnable, kRunnableIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->CreateThread(threadID, pupRunnable); if (NS_SUCCEEDED(rc) && VALID_PTR(threadID)) dprintf(("%s: *threadID=%d", pszFunction, *threadID)); } else dprintf(("%s: failed to create up wrapper for nsIRunnable %x !!!", pszFunction, runnable)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Posts an event to specified thread, calling the runnable from that thread. * @param threadID thread to call runnable from * @param runnable object to invoke from thread * @param async if true, won't block current thread waiting for result */ #ifdef IPLUGINW_OUTOFTREE nsresult VFTCALL downITMPostEvent(void *pvThis, PRUint32 threadID, nsIRunnable* runnable, PRBool async) #else nsresult VFTCALL downITMPostEvent(void *pvThis, PRThread *threadID, nsIRunnable* runnable, PRBool async) #endif { DOWN_ENTER_RC(pvThis, nsIJVMThreadManager); dprintf(("%s: threadID=%d runnable=%p async=%d", pszFunction, threadID, runnable, async)); nsIRunnable * pupRunnable = runnable; rc = upCreateWrapper((void**)&pupRunnable, kRunnableIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->PostEvent(threadID, pupRunnable, async); else dprintf(("%s: failed to create up wrapper for nsIRunnable %x !!!", pszFunction, runnable)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIJVMThreadManager, downVFTnsIJVMThreadManager) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downITMGetCurrentThread, VFTDELTA_VAL() downITMSleep, VFTDELTA_VAL() downITMEnterMonitor, VFTDELTA_VAL() downITMExitMonitor, VFTDELTA_VAL() downITMWait, VFTDELTA_VAL() downITMNotify, VFTDELTA_VAL() downITMNotifyAll, VFTDELTA_VAL() downITMCreateThread, VFTDELTA_VAL() downITMPostEvent, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIJVMManager //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Creates a proxy JNI with an optional secure environment (which can be NULL). * There is a one-to-one correspondence between proxy JNIs and threads, so * calling this method multiple times from the same thread will return * the same proxy JNI. */ nsresult VFTCALL downCreateProxyJNI(void *pvThis, nsISecureEnv *secureEnv, JNIEnv * *outProxyEnv) { DOWN_ENTER_RC(pvThis, nsIJVMManager); nsISecureEnv *pupSecureEnv = secureEnv; rc = upCreateWrapper((void**)&pupSecureEnv, kSecureEnvIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->CreateProxyJNI(pupSecureEnv, outProxyEnv); rc = downCreateJNIEnvWrapper(outProxyEnv, rc); } else dprintf(("%s: failed to create up wrapper for kSecureEnvIID %x !!!", pszFunction, secureEnv)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the proxy JNI associated with the current thread, or NULL if no * such association exists. */ nsresult VFTCALL downGetProxyJNI(void *pvThis, JNIEnv * *outProxyEnv) { DOWN_ENTER_RC(pvThis, nsIJVMManager); rc = pMozI->GetProxyJNI(outProxyEnv); rc = downCreateJNIEnvWrapper(outProxyEnv, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Called from Java Console menu item. */ nsresult VFTCALL downShowJavaConsole(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIJVMManager); dprintf(("%s", pszFunction)); rc = pMozI->ShowJavaConsole(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * isAllPermissionGranted [Deprecated Sep-10-2000] */ nsresult VFTCALL downIsAllPermissionGranted(void *pvThis, const char *lastFingerprint, const char *lastCommonName, const char *rootFingerprint, const char *rootCommonName, PRBool *_retval) { //@todo TEXT: lastFingerprint? lastFingerprint? lastCommonName? rootCommonName? No idea. Need find usage. DOWN_ENTER_RC(pvThis, nsIJVMManager); dprintf(("%s _retval=%x", pszFunction, _retval)); DPRINTF_STR(lastFingerprint); DPRINTF_STR(lastCommonName); DPRINTF_STR(rootFingerprint); DPRINTF_STR(rootCommonName); rc = pMozI->IsAllPermissionGranted(lastFingerprint, lastCommonName, rootFingerprint, rootCommonName, _retval); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * isAppletTrusted */ nsresult VFTCALL downIsAppletTrusted(void *pvThis, const char *aRSABuf, PRUint32 aRSABufLen, const char *aPlaintext, PRUint32 aPlaintextLen, PRBool *isTrusted, nsIPrincipal **_retval) { //@todo TEXT: aRSABuf? aPlaintext? No idea. Need find usage. DOWN_ENTER_RC(pvThis, nsIJVMManager); dprintf(("%s aRSABuf=%x aRSABufLen=%d aPlaintext=%x aPlaintextLen=%d isTrusted=%x _retval=%x", pszFunction, aRSABuf, aRSABufLen, aPlaintext, aPlaintextLen, isTrusted, _retval)); rc = pMozI->IsAppletTrusted(aRSABuf, aRSABufLen, aPlaintext, aPlaintextLen, isTrusted, _retval); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * The JavaEnabled variable to see if Java is Enabled or not */ nsresult VFTCALL downGetJavaEnabled(void *pvThis, PRBool *aJavaEnabled) { DOWN_ENTER_RC(pvThis, nsIJVMManager); dprintf(("%s aJavaEnabled=%x", pszFunction, aJavaEnabled)); rc = pMozI->GetJavaEnabled(aJavaEnabled); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIJVMManager, downVFTnsIJVMManager) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downCreateProxyJNI, VFTDELTA_VAL() downGetProxyJNI, VFTDELTA_VAL() downShowJavaConsole, VFTDELTA_VAL() downIsAllPermissionGranted, VFTDELTA_VAL() downIsAppletTrusted, VFTDELTA_VAL() downGetJavaEnabled, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsILiveconnect //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * get member of a Native JSObject for a given name. * * @param obj - A Native JS Object. * @param name - Name of a member. * @param pjobj - return parameter as a java object representing * the member. If it is a basic data type it is converted to * a corresponding java type. If it is a NJSObject, then it is * wrapped up as java wrapper netscape.javascript.JSObject. */ nsresult VFTCALL downGetMember(void *pvThis, JNIEnv *jEnv, jsobject jsobj, const jchar *name, jsize length, void* principalsArray[], int numPrincipals, nsISupports *securitySupports, jobject *pjobj) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p name=%p length=%d principalsArray=%p numPrincipals=%d securitySupports=%p pjobj=%p", pszFunction, jEnv, jsobj, name, length, principalsArray, numPrincipals, securitySupports, pjobj)); if (VALID_PTR(name)) dprintf(("%s: name=%ls", pszFunction, name)); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 7); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) { rc = pMozI->GetMember(pupJNIEnv, jsobj, name, length, principalsArray, numPrincipals, pupSecuritySupports, pjobj); if (NS_SUCCEEDED(rc) && VALID_PTR(pjobj)) dprintf(("%s: *pjobj=%p", pszFunction, *pjobj)); } else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * get member of a Native JSObject for a given index. * * @param obj - A Native JS Object. * @param slot - Index of a member. * @param pjobj - return parameter as a java object representing * the member. */ nsresult VFTCALL downGetSlot(void *pvThis, JNIEnv *jEnv, jsobject jsobj, jint slot, void* principalsArray[], int numPrincipals, nsISupports *securitySupports, jobject *pjobj) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p slot=%p principalsArray=%p numPrincipals=%d securitySupports=%p pjobj=%p", pszFunction, jEnv, jsobj, slot, principalsArray, numPrincipals, securitySupports, pjobj)); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 8); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) { rc = pMozI->GetSlot(pupJNIEnv, jsobj, slot, principalsArray, numPrincipals, pupSecuritySupports, pjobj); if (NS_SUCCEEDED(rc) && VALID_PTR(pjobj)) dprintf(("%s: *pjobj=%p", pszFunction, *pjobj)); } else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * set member of a Native JSObject for a given name. * * @param obj - A Native JS Object. * @param name - Name of a member. * @param jobj - Value to set. If this is a basic data type, it is converted * using standard JNI calls but if it is a wrapper to a JSObject * then a internal mapping is consulted to convert to a NJSObject. */ nsresult VFTCALL downSetMember(void *pvThis, JNIEnv *jEnv, jsobject jsobj, const jchar* name, jsize length, jobject jobj, void* principalsArray[], int numPrincipals, nsISupports *securitySupports) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p name=%p length=%d jobj=%p principalsArray=%p numPrincipals=%d securitySupports=%p", pszFunction, jEnv, jsobj, name, length, jobj, principalsArray, numPrincipals, securitySupports)); DPRINTF_STR(name); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 9); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) rc = pMozI->SetMember(pupJNIEnv, jsobj, name, length, jobj, principalsArray, numPrincipals, pupSecuritySupports); else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * set member of a Native JSObject for a given index. * * @param obj - A Native JS Object. * @param index - Index of a member. * @param jobj - Value to set. If this is a basic data type, it is converted * using standard JNI calls but if it is a wrapper to a JSObject * then a internal mapping is consulted to convert to a NJSObject. */ nsresult VFTCALL downSetSlot(void *pvThis, JNIEnv *jEnv, jsobject jsobj, jint slot, jobject jobj, void* principalsArray[], int numPrincipals, nsISupports *securitySupports) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p slot=%p jobj=%p principalsArray=%p numPrincipals=%d securitySupports=%p", pszFunction, jEnv, jsobj, slot, jobj, principalsArray, numPrincipals, securitySupports)); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 8); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) rc = pMozI->SetSlot(pupJNIEnv, jsobj, slot, jobj, principalsArray, numPrincipals, pupSecuritySupports); else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * remove member of a Native JSObject for a given name. * * @param obj - A Native JS Object. * @param name - Name of a member. */ nsresult VFTCALL downRemoveMember(void *pvThis, JNIEnv *jEnv, jsobject jsobj, const jchar* name, jsize length, void* principalsArray[], int numPrincipals, nsISupports *securitySupports) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p name=%p length=%d principalsArray=%p numPrincipals=%d securitySupports=%p", pszFunction, jEnv, jsobj, name, length, principalsArray, numPrincipals, securitySupports)); if (VALID_PTR(name)) dprintf(("%s: name=%ls", pszFunction, name)); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 10); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) rc = pMozI->RemoveMember(pupJNIEnv, jsobj, name, length, principalsArray, numPrincipals, pupSecuritySupports); else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * call a method of Native JSObject. * * @param obj - A Native JS Object. * @param name - Name of a method. * @param jobjArr - Array of jobjects representing parameters of method being caled. * @param pjobj - return value. */ nsresult VFTCALL downCall(void *pvThis, JNIEnv *jEnv, jsobject jsobj, const jchar* name, jsize length, jobjectArray jobjArr, void* principalsArray[], int numPrincipals, nsISupports *securitySupports, jobject *pjobj) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p name=%p length=%d jobjArr=%p principalsArray=%p numPrincipals=%d securitySupports=%p pjobj=%p", pszFunction, jEnv, jsobj, name, length, jobjArr, principalsArray, numPrincipals, securitySupports, pjobj)); if (VALID_PTR(name)) dprintf(("%s: name=%ls", pszFunction, name)); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 11); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) { rc = pMozI->Call(pupJNIEnv, jsobj, name, length, jobjArr, principalsArray, numPrincipals, pupSecuritySupports, pjobj); if (NS_SUCCEEDED(rc) && VALID_PTR(pjobj)) dprintf(("%s: *pjobj=%p", pszFunction, *pjobj)); } else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Evaluate a script with a Native JS Object representing scope. * * @param jsobj - A Native JS Object. * @param principalsArray - Array of principals to be used to compare privileges. * @param numPrincipals - Number of principals being passed. * @param script - Script to be executed. * @param pjobj - return value. */ nsresult VFTCALL downEval(void *pvThis, JNIEnv *jEnv, jsobject jsobj, const jchar *script, jsize length, void* principalsArray[], int numPrincipals, nsISupports *securitySupports, jobject *pjobj) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p script=%p length=%d principalsArray=%p numPrincipals=%d securitySupports=%p pjobj=%p", pszFunction, jEnv, jsobj, script, length, principalsArray, numPrincipals, securitySupports, pjobj)); if (VALID_PTR(script)) dprintf(("%s: script=%ls", pszFunction, script)); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 12); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) { rc = pMozI->Eval(pupJNIEnv, jsobj, script, length, principalsArray, numPrincipals, pupSecuritySupports, pjobj); if (NS_SUCCEEDED(rc) && VALID_PTR(pjobj)) dprintf(("%s: *pjobj=%p", pszFunction, *pjobj)); } else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the window object for a plugin instance. * * @param pJavaObject - Either a jobject or a pointer to a plugin instance * representing the java object. * @param pjobj - return value. This is a native js object * representing the window object of a frame * in which a applet/bean resides. */ nsresult VFTCALL downGetWindow(void *pvThis, JNIEnv *jEnv, void *pJavaObject, void* principalsArray[], int numPrincipals, nsISupports *securitySupports, jsobject *pobj) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p pJavaObject=%p principalsArray=%p numPrincipals=%d securitySupports=%p pObj=%p", pszFunction, jEnv, pJavaObject, principalsArray, numPrincipals, securitySupports, pobj)); if (numPrincipals) { //@todo check out what this array contains. (not used by oji plugin I believe) dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 6); } /* * JNI Wrapper */ JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pupSecuritySupports = securitySupports; rc = upCreateWrapper((void**)&pupSecuritySupports, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) { /** * @todo: how can we distinguish between a java and instance object?? * the java plugin seems to only use an instance pointer for calling * this function * kso: Good question, but it seems like assuming nsIPluginInstance should * work for us. At least looking at the code path of GetWindow. * It ends up casting the pJavaObject to nsIPluginInstance in * map_jsj_thread_to_js_context_impl() mozilla\modules\oji\src\Icglue.cpp. */ nsIPluginInstance *pupIPluginInstance = (nsIPluginInstance *)pJavaObject; rc = upCreateWrapper((void**)&pupIPluginInstance, kPluginInstanceIID, rc); if (NS_SUCCEEDED(rc)) { rc = pMozI->GetWindow(pupJNIEnv, pupIPluginInstance, principalsArray, numPrincipals, pupSecuritySupports, pobj); if (NS_SUCCEEDED(rc) && VALID_PTR(pobj)) //@todo ilink crash with this code! f**k ilink/icc!!! //dprintf(("%s: *pobj=%d (0x%x)", pszFunction, *pobj, *pobj)); dprintf(("%s: *pobj=%d (0x%x)", XPFUNCTION, *pobj, *pobj)); } else dprintf(("%s: Failed to create up wrapper for nsISupports %p !!!", pszFunction, securitySupports)); } else dprintf(("%s: Failed to create up wrapper for nsISupports %p !!!", pszFunction, securitySupports)); } else { dprintf(("%s: Failed to make up wrapper for JNIEnv !!!", pszFunction)); rc = NS_ERROR_UNEXPECTED; } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the window object for a plugin instance. * * @param jEnv - JNIEnv on which the call is being made. * @param obj - A Native JS Object. */ nsresult VFTCALL downFinalizeJSObject(void *pvThis, JNIEnv *jEnv, jsobject jsobj) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p jsobj=%p", pszFunction, jEnv, jsobj)); JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->FinalizeJSObject(pupJNIEnv, jsobj); else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the window object for a plugin instance. * * @param jEnv - JNIEnv on which the call is being made. * @param obj - A Native JS Object. * @param jstring - Return value as a jstring representing a JS object. */ nsresult VFTCALL downToString(void *pvThis, JNIEnv *jEnv, jsobject obj, jstring *pjstring) { DOWN_ENTER_RC(pvThis, nsILiveconnect); dprintf(("%s: jEnv=%p obj=%p pjstring=%p", pszFunction, jEnv, obj, pjstring)); JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->ToString(pupJNIEnv, obj, pjstring); if (NS_SUCCEEDED(rc) && VALID_PTR(pjstring)) dprintf(("%s: *pjstring=%p", pszFunction, pjstring)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsILiveconnect, downVFTnsILiveconnect) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downGetMember, VFTDELTA_VAL() downGetSlot, VFTDELTA_VAL() downSetMember, VFTDELTA_VAL() downSetSlot, VFTDELTA_VAL() downRemoveMember, VFTDELTA_VAL() downCall, VFTDELTA_VAL() downEval, VFTDELTA_VAL() downGetWindow, VFTDELTA_VAL() downFinalizeJSObject, VFTDELTA_VAL() downToString, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsISecureLiveconnect //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Evaluate a script with a Native JS Object representing scope. * * @param jEnv - JNIEnv pointer * @param jsobj - A Native JS Object. * @param script - JavaScript to be executed. * @param pNSIPrincipaArray - Array of principals to be used to compare privileges. * @param numPrincipals - Number of principals being passed. * @param context - Security context. * @param pjobj - return value. */ nsresult VFTCALL downSecureLiveConnectEval( void *pvThis, JNIEnv *jEnv, jsobject jsobj, const jchar *script, jsize length, void **pNSIPrincipaArray, int numPrincipals, void *pNSISecurityContext, jobject *pjobj) { DOWN_ENTER_RC(pvThis, nsISecureLiveconnect); dprintf(("%s: jEnv=%p jsobj=%p script=%p length=%d principalsArray=%p numPrincipals=%d pNSISecurityContext=%p pjobj=%p", pszFunction, jEnv, jsobj, script, length, pNSIPrincipaArray, numPrincipals, pNSISecurityContext, pjobj)); if (VALID_PTR(script)) dprintf(("%s: script=%ls", pszFunction, script)); /**@todo I believe this interface isn't implemented in Mozilla (yet). Can't find * any references to use of it. So, I'm very curious about a few details. */ DebugInt3(); if (numPrincipals) { /** @todo check out what this array contains. (not used by oji plugin I believe) * Guess it's of type nsIPrincipal or some decendant, can't see mozilla caring much about it... */ dprintf(("%s: numPrincipals/princiapalsArray isn't supported !!!", pszFunction)); ReleaseInt3(0xdead0000, 0, 14); } JNIEnv * pupJNIEnv = jEnv; rc = upCreateJNIEnvWrapper(&pupJNIEnv, NS_OK); if (NS_SUCCEEDED(rc)) { DebugInt3(); //@todo check that following wrapper is correct!!! nsISecurityContext *pupSecurityContext = (nsISecurityContext*)pNSISecurityContext; rc = upCreateWrapper((void**)&pupSecurityContext, kSecurityContextIID, rc); if (NS_SUCCEEDED(rc)) { rc = pMozI->Eval(pupJNIEnv, jsobj, script, length, pNSIPrincipaArray, numPrincipals, pupSecurityContext, pjobj); if (NS_SUCCEEDED(rc) && VALID_PTR(pjobj)) dprintf(("%s: *pjobj=%p", pszFunction, *pjobj)); } else dprintf(("%s: Failed make up wrapper for nsISupports !!!", pszFunction)); } else dprintf(("%s: Failed make up wrapper for JNIEnv !!!", pszFunction)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsISecureLiveconnect, downVFTnsISecureLiveconnect) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downSecureLiveConnectEval, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsISecurityContext //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Get the security context to be used in LiveConnect. * This is used for JavaScript <--> Java. * * @param target -- Possible target. * @param action -- Possible action on the target. * @return -- NS_OK if the target and action is permitted on the security context. * -- NS_FALSE otherwise. */ nsresult VFTCALL downImplies(void *pvThis, const char* target, const char* action, PRBool *bAllowedAccess) { DOWN_ENTER_RC(pvThis, nsISecurityContext); dprintf(("%s: target=%x action=%x bAllowedAccess=%x", pszFunction, target, action, bAllowedAccess)); DPRINTF_STR(target); DPRINTF_STR(action); rc = pMozI->Implies(target, action, bAllowedAccess); if (/*NS_SUCCEEDED(rc) && */VALID_PTR(bAllowedAccess)) dprintf(("%s: *bAllowedAccess=%d", pszFunction, *bAllowedAccess)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the origin associated with the context. * * @param buf -- Result buffer (managed by the caller.) * @param len -- Buffer length. * @return -- NS_OK if the codebase string was obtained. * -- NS_FALSE otherwise. */ nsresult VFTCALL downGetOrigin(void *pvThis, char* buf, int len) { DOWN_ENTER_RC(pvThis, nsISecurityContext); dprintf(("%s: buf=%p len=%d", pszFunction, buf, len)); rc = pMozI->GetOrigin(buf, len); if (NS_SUCCEEDED(rc) && VALID_PTR(buf)) DPRINTF_STR(buf); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Get the certificate associated with the context. * * @param buf -- Result buffer (managed by the caller.) * @param len -- Buffer length. * @return -- NS_OK if the codebase string was obtained. * -- NS_FALSE otherwise. */ nsresult VFTCALL downGetCertificateID(void *pvThis, char* buf, int len) { DOWN_ENTER_RC(pvThis, nsISecurityContext); dprintf(("%s: buf=%p len=%d", pszFunction, buf, len)); rc = pMozI->GetCertificateID(buf, len); if (NS_SUCCEEDED(rc) && VALID_PTR(buf)) DPRINTF_STR(buf); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsISecurityContext, downVFTnsISecurityContext) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downImplies, VFTDELTA_VAL() downGetOrigin, VFTDELTA_VAL() downGetCertificateID, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIComponentManagerObsolete //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * findFactory * * Returns the factory object that can be used to create instances of * CID aClass * * @param aClass The classid of the factory that is being requested */ /* nsIFactory findFactory (in nsCIDRef aClass); */ nsresult VFTCALL downFindFactory(void *pvThis, const nsCID & aClass, nsIFactory **_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); const void * pvVFT = downIsSupportedInterface(kFactoryIID); if (pvVFT) { rc = pMozI->FindFactory(aClass, _retval); rc = downCreateWrapper((void**)_retval, pvVFT, rc); } else { dprintf(("%s: Unsupported down interface kFactoryIID!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 29, kFactoryIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * getClassObject * * @param aClass : CID of the class whose class object is requested * @param aIID : IID of an interface that the class object is known to * to implement. nsISupports and nsIFactory are known to * be implemented by the class object. */ /* [noscript] voidPtr getClassObject (in nsCIDRef aClass, in nsIIDRef aIID); */ nsresult VFTCALL downGetClassObject(void *pvThis, const nsCID & aClass, const nsIID & aIID, void * *_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_NSID(aIID); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { rc = pMozI->GetClassObject(aClass, aIID, _retval); rc = downCreateWrapper(_retval, pvVFT, rc); } else { dprintf(("%s: Unsupported down interface !!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 27, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * contractIDToClassID * * Get the ClassID for a given ContractID. Many ClassIDs may implement a * ContractID. In such a situation, this returns the preferred ClassID, which * happens to be the last registered ClassID. * * @param aContractID : Contractid for which ClassID is requested * @return aClass : ClassID return */ /* [notxpcom] nsresult contractIDToClassID (in string aContractID, out nsCID aClass); */ nsresult VFTCALL downContractIDToClassID(void *pvThis, const char *aContractID, nsCID *aClass) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_CONTRACTID(aContractID); rc = pMozI->ContractIDToClassID(aContractID, aClass); if (NS_SUCCEEDED(rc)) DPRINTF_NSID(*aClass); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * classIDToContractid * * Get the ContractID for a given ClassID. A ClassIDs may implement multiple * ContractIDs. This function return the last registered ContractID. * * @param aClass : ClassID for which ContractID is requested. * @return aClassName : returns class name asssociated with aClass * @return : ContractID last registered for aClass */ /* string CLSIDToContractID (in nsCIDRef aClass, out string aClassName); */ nsresult VFTCALL downCLSIDToContractID(void *pvThis, const nsCID & aClass, char **aClassName, char **_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); rc = pMozI->CLSIDToContractID(aClass, aClassName, _retval); if (NS_SUCCEEDED(rc)) { if (VALID_PTR(aClassName)) DPRINTF_STR(aClassName); if (VALID_PTR(_retval)) DPRINTF_STR(_retval); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * createInstance * * Create an instance of the CID aClass and return the interface aIID. * * @param aClass : ClassID of object instance requested * @param aDelegate : Used for aggregation * @param aIID : IID of interface requested */ /* [noscript] voidPtr createInstance (in nsCIDRef aClass, in nsISupports aDelegate, in nsIIDRef aIID); */ nsresult VFTCALL downCreateInstance(void *pvThis, const nsCID & aClass, nsISupports *aDelegate, const nsIID & aIID, void * *_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_NSID(aIID); dprintf(("%s: aDelegate=%p _retval=%p", pszFunction, aDelegate, _retval)); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { /* * Wrap the aDelegate. * (Pray this isn't supposed to be the same kind of wrapper as nsIID. * Haven't found any examples using aDelegate unfortunately.) */ nsISupports * pupOuter = aDelegate; rc = upCreateWrapper((void**)&pupOuter, kSupportsIID, NS_OK); if (rc == NS_OK) { rc = pMozI->CreateInstance(aClass, pupOuter, aIID, _retval); rc = downCreateWrapper(_retval, pvVFT, rc); } else dprintf(("%s: failed to create up wrapper for kSupportsIID %x !!!", pszFunction, aDelegate)); } else { dprintf(("%s: Unsupported down interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 9, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * createInstanceByContractID * * Create an instance of the CID that implements aContractID and return the * interface aIID. This is a convenience function that effectively does * ContractIDToClassID() followed by CreateInstance(). * * @param aContractID : aContractID of object instance requested * @param aDelegate : Used for aggregation * @param aIID : IID of interface requested */ /* [noscript] voidPtr createInstanceByContractID (in string aContractID, in nsISupports aDelegate, in nsIIDRef IID); */ nsresult VFTCALL downCreateInstanceByContractID(void *pvThis, const char *aContractID, nsISupports *aDelegate, const nsIID & aIID, void * *_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_CONTRACTID(aContractID); DPRINTF_NSID(aIID); dprintf(("%s: aDelegate=%p _retval=%p", pszFunction, aDelegate, _retval)); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { /* * Wrap the aDelegate. * (Pray this isn't supposed to be the same kind of wrapper as nsIID. * Haven't found any examples using aDelegate unfortunately.) */ nsISupports * pupOuter = aDelegate; rc = upCreateWrapper((void**)&pupOuter, kSupportsIID, NS_OK); if (rc == NS_OK) { rc = pMozI->CreateInstanceByContractID(aContractID, pupOuter, aIID, _retval); rc = downCreateWrapper(_retval, pvVFT, rc); } else dprintf(("%s: failed to create up wrapper for kSupportsIID %x !!!", pszFunction, aDelegate)); } else { dprintf(("%s: Unsupported down interface!!!", pszFunction)); ReleaseInt3(0xbaddbeef, 30, aIID.m0); rc = NS_NOINTERFACE; } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * registryLocationForSpec * * Given a file specification, return the registry representation of * the filename. Files that are found relative to the components * directory will have a registry representation * "rel:" while filenames that are not, will have * "abs:". */ /* string registryLocationForSpec (in nsIFile aSpec); */ nsresult VFTCALL downRegistryLocationForSpec(void *pvThis, nsIFile *aSpec, char **_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); dprintf(("%s: aSpec=%p _retval=%p", pszFunction, aSpec, _retval)); nsIFile * pupFile = aSpec; rc = upCreateWrapper((void**)&pupFile, kFileIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->RegistryLocationForSpec(pupFile, _retval); if (NS_SUCCEEDED(rc) && VALID_PTR(_retval) && VALID_PTR(*_retval)) DPRINTF_STR(*_retval); } else { dprintf(("%s: Unsupported up interface nsIFile !!!", pszFunction)); ReleaseInt3(0xbaddbeef, 20, kFileIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * specForRegistyLocation * * Create a file specification for the registry representation (rel:/abs:) * got via registryLocationForSpec. */ /* nsIFile specForRegistryLocation (in string aLocation); */ nsresult VFTCALL downSpecForRegistryLocation(void *pvThis, const char *aLocation, nsIFile **_retval) { //@todo TEXT: aLocation? Yes. Do java use this? //Sources say: i18n: assuming aLocation is encoded for the current locale DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_STR(aLocation); dprintf(("%s: _retval=%p", pszFunction, _retval)); const void *pvVFT = downIsSupportedInterface(kFileIID); if (pvVFT) { rc = pMozI->SpecForRegistryLocation(aLocation, _retval); rc = downCreateWrapper((void**)_retval, pvVFT, rc); } else { dprintf(("%s: Unsupported down interface nsIFile !!!", pszFunction)); ReleaseInt3(0xbaddbeef, 22, kFileIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * registerFactory * * Register a factory and ContractID associated with CID aClass * * @param aClass : CID of object * @param aClassName : Class Name of CID * @param aContractID : ContractID associated with CID aClass * @param aFactory : Factory that will be registered for CID aClass * @param aReplace : Boolean that indicates whether to replace a previous * registration for the CID aClass. */ /* void registerFactory (in nsCIDRef aClass, in string aClassName, in string aContractID, in nsIFactory aFactory, in boolean aReplace); */ nsresult VFTCALL downRegisterFactory(void *pvThis, const nsCID & aClass, const char *aClassName, const char *aContractID, nsIFactory *aFactory, PRBool aReplace) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_CONTRACTID(aContractID); DPRINTF_STR(aClassName); dprintf(("%s: aFactory=%p aReplace=%d", pszFunction, aFactory, aReplace)); nsIFactory *pupFactory = aFactory; rc = upCreateWrapper((void**)&pupFactory, kFactoryIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->RegisterFactory(aClass, aClassName, aContractID, pupFactory, aReplace); else { dprintf(("%s: Failed to make up wrapper for nsIFactoryIID %p !!!", pszFunction, aFactory)); ReleaseInt3(0xbaddbeef, 13, kFactoryIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * registerComponent * * Register a native dll module via its registry representation as returned * by registryLocationForSpec() as the container of CID implemenation * aClass and associate aContractID and aClassName to the CID aClass. Native * dll component type is assumed. * * @param aClass : CID implemenation contained in module * @param aClassName : Class name associated with CID aClass * @param aContractID : ContractID associated with CID aClass * @param aLocation : Location of module (dll). Format of this is the * registry representation as returned by * registryLocationForSpec() * @param aReplace : Boolean that indicates whether to replace a previous * module registration for aClass. * @param aPersist : Remember this registration across sessions. */ /* void registerComponent (in nsCIDRef aClass, in string aClassName, in string aContractID, in string aLocation, in boolean aReplace, in boolean aPersist); */ nsresult VFTCALL downRegisterComponent(void *pvThis, const nsCID & aClass, const char *aClassName, const char *aContractID, const char *aLocation, PRBool aReplace, PRBool aPersist) { //@todo TEXT: location? Yes. Don't think java uses this. DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_CONTRACTID(aContractID); DPRINTF_STR(aClassName); DPRINTF_STR(aLocation); dprintf(("%s: aReplace=%d aPersist=%d", pszFunction, aReplace, aPersist)); rc = pMozI->RegisterComponent(aClass, aClassName, aContractID, aLocation, aReplace, aPersist); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * registerComponentWithType * * Register a module's location via its registry representation * as returned by registryLocationForSpec() as the container of CID implemenation * aClass of type aType and associate aContractID and aClassName to the CID aClass. * * @param aClass : CID implemenation contained in module * @param aClassName : Class name associated with CID aClass * @param aContractID : ContractID associated with CID aClass * @param aSpec : Filename spec for module's location. * @param aLocation : Location of module of type aType. Format of this string * is the registry representation as returned by * registryLocationForSpec() * @param aReplace : Boolean that indicates whether to replace a previous * loader registration for aClass. * @param aPersist : Remember this registration across sessions. * @param aType : Component Type of CID aClass. */ /* void registerComponentWithType (in nsCIDRef aClass, in string aClassName, in string aContractID, in nsIFile aSpec, in string aLocation, in boolean aReplace, in boolean aPersist, in string aType); */ nsresult VFTCALL downRegisterComponentWithType(void *pvThis, const nsCID & aClass, const char *aClassName, const char *aContractID, nsIFile *aSpec, const char *aLocation, PRBool aReplace, PRBool aPersist, const char *aType) { //@todo TEXT: aLocation? Yes. Don't think java uses this. DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_CONTRACTID(aContractID); DPRINTF_STR(aClassName); DPRINTF_STR(aLocation); DPRINTF_STR(aType); dprintf(("%s: aReplace=%d aPersist=%d", pszFunction, aReplace, aPersist)); rc = pMozI->RegisterComponentWithType(aClass, aClassName, aContractID, aSpec, aLocation, aReplace, aPersist, aType); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * registerComponentSpec * * Register a native dll module via its file specification as the container * of CID implemenation aClass and associate aContractID and aClassName to the * CID aClass. Native dll component type is assumed. * * @param aClass : CID implemenation contained in module * @param aClassName : Class name associated with CID aClass * @param aContractID : ContractID associated with CID aClass * @param aLibrary : File specification Location of module (dll). * @param aReplace : Boolean that indicates whether to replace a previous * module registration for aClass. * @param aPersist : Remember this registration across sessions. */ /* void registerComponentSpec (in nsCIDRef aClass, in string aClassName, in string aContractID, in nsIFile aLibrary, in boolean aReplace, in boolean aPersist); */ nsresult VFTCALL downRegisterComponentSpec(void *pvThis, const nsCID & aClass, const char *aClassName, const char *aContractID, nsIFile *aLibrary, PRBool aReplace, PRBool aPersist) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_CONTRACTID(aContractID); DPRINTF_STR(aClassName); DPRINTF_STR(aLibrary); dprintf(("%s: aReplace=%d aPersist=%d", pszFunction, aReplace, aPersist)); nsIFile *pupLibrary = aLibrary; rc = upCreateWrapper((void**)&pupLibrary, kFileIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->RegisterComponentSpec(aClass, aClassName, aContractID, pupLibrary, aReplace, aPersist); else { dprintf(("%s: Failed to make up wrapper for nsIFile %p !!!", pszFunction, aLibrary)); ReleaseInt3(0xbaddbeef, 23, kFileIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * registerComponentLib * * Register a native dll module via its dll name (not full path) as the * container of CID implemenation aClass and associate aContractID and aClassName * to the CID aClass. Native dll component type is assumed and the system * services will be used to load this dll. * * @param aClass : CID implemenation contained in module * @param aClassName : Class name associated with CID aClass * @param aContractID : ContractID associated with CID aClass * @param aDllNameLocation : Dll name of module. * @param aReplace : Boolean that indicates whether to replace a previous * module registration for aClass. * @param aPersist : Remember this registration across sessions. */ /* void registerComponentLib (in nsCIDRef aClass, in string aClassName, in string aContractID, in string aDllName, in boolean aReplace, in boolean aPersist); */ nsresult VFTCALL downRegisterComponentLib(void *pvThis, const nsCID & aClass, const char *aClassName, const char *aContractID, const char *aDllName, PRBool aReplace, PRBool aPersist) { //@todo TEXT: aDllName? Yes. Don't think java uses this. DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_CONTRACTID(aContractID); DPRINTF_STR(aClassName); DPRINTF_STR(aDllName); dprintf(("%s: aReplace=%d aPersist=%d", pszFunction, aReplace, aPersist)); rc = pMozI->RegisterComponentLib(aClass, aClassName, aContractID, aDllName, aReplace, aPersist); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * unregisterFactory * * Unregister a factory associated with CID aClass. * * @param aClass : ClassID being unregistered * @param aFactory : Factory previously registered to create instances of * ClassID aClass. */ /* void unregisterFactory (in nsCIDRef aClass, in nsIFactory aFactory); */ nsresult VFTCALL downUnregisterFactory(void *pvThis, const nsCID & aClass, nsIFactory *aFactory) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); dprintf(("%s: aFactory=%p", pszFunction, aFactory)); nsIFactory *pupFactory = aFactory; rc = upCreateWrapper((void**)&pupFactory, kFactoryIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->UnregisterFactory(aClass, pupFactory); else { dprintf(("%s: Failed to make up wrapper for nsIFactory %p !!!", pszFunction, aFactory)); ReleaseInt3(0xbaddbeef, 15, kFactoryIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * unregisterComponent * * Disassociate module aLocation represented as registry location as returned * by registryLocationForSpec() as containing ClassID aClass. * * @param aClass : ClassID being unregistered * @param aLocation : Location of module. Format of this is the registry * representation as returned by registryLocationForSpec(). * Components of any type will be unregistered. */ /* void unregisterComponent (in nsCIDRef aClass, in string aLocation); */ nsresult VFTCALL downUnregisterComponent(void *pvThis, const nsCID & aClass, const char *aLocation) { //@todo TEXT: aLocation? Yes. Don't think java uses this. DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); DPRINTF_STR(aLocation); rc = pMozI->UnregisterComponent(aClass, aLocation); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * unregisterComponentSpec * * Disassociate module references by file specification aLibrarySpec as * containing ClassID aClass. */ /* void unregisterComponentSpec (in nsCIDRef aClass, in nsIFile aLibrarySpec); */ nsresult VFTCALL downUnregisterComponentSpec(void *pvThis, const nsCID & aClass, nsIFile *aLibrarySpec) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); dprintf(("%s: aLibrarySpec=%p", pszFunction, aLibrarySpec)); nsIFile * pupLibrarySpec = aLibrarySpec; rc = upCreateWrapper((void**)&pupLibrarySpec, kFileIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->UnregisterComponentSpec(aClass, pupLibrarySpec); else { dprintf(("%s: Failed to make up wrapper for nsIFile %p !!!", pszFunction, aLibrarySpec)); ReleaseInt3(0xbaddbeef, 16, kFileIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * freeLibraries * * Enumerates all loaded modules and unloads unused modules. */ /* void freeLibraries (); */ nsresult VFTCALL downFreeLibraries(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); rc = pMozI->FreeLibraries(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * autoRegister * * Enumerates directory looking for modules of all types and registers * modules who have changed (modtime or size) since the last time * autoRegister() was invoked. * * @param when : ID values of when the call is being made. * @param directory : Directory the will be enumerated. */ /* void autoRegister (in long when, in nsIFile directory); */ nsresult VFTCALL downAutoRegister(void *pvThis, PRInt32 when, nsIFile *directory) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); dprintf(("%s: when=%d directory=%p", pszFunction, when, directory)); nsIFile * pupDirectory = directory; rc = upCreateWrapper((void**)&pupDirectory, kFileIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->AutoRegister(when, pupDirectory); else { dprintf(("%s: Failed to make up wrapper for nsIFile %p !!!", pszFunction, directory)); ReleaseInt3(0xbaddbeef, 24, kFileIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * autoRegisterComponent * * Loads module using appropriate loader and gives it an opportunity to * register its CIDs if module's modtime or size changed since the last * time this was called. * * @param when : ID values of when the call is being made. * @param aFileLocation : File specification of module. */ /* void autoRegisterComponent (in long when, in nsIFile aFileLocation); */ nsresult VFTCALL downAutoRegisterComponent(void *pvThis, PRInt32 when, nsIFile *aFileLocation) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); dprintf(("%s: when=%d aFileLocation=%p", pszFunction, when, aFileLocation)); nsIFile * pupFileLocation = aFileLocation; rc = upCreateWrapper((void**)&pupFileLocation, kFileIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->AutoRegisterComponent(when, pupFileLocation); else { dprintf(("%s: Failed to make up wrapper for nsIFile %p !!!", pszFunction, aFileLocation)); ReleaseInt3(0xbaddbeef, 25, kFileIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * autoUnregisterComponent * * Loads module using approriate loader and gives it an opportunity to * unregister its CIDs */ /* void autoUnregisterComponent (in long when, in nsIFile aFileLocation); */ nsresult VFTCALL downAutoUnregisterComponent(void *pvThis, PRInt32 when, nsIFile *aFileLocation) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); dprintf(("%s: when=%d aFileLocation=%p", pszFunction, when, aFileLocation)); nsIFile * pupFileLocation = aFileLocation; rc = upCreateWrapper((void**)&pupFileLocation, kFileIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->AutoUnregisterComponent(when, aFileLocation); else { dprintf(("%s: Failed to make up wrapper for nsIFile %p !!!", pszFunction, aFileLocation)); ReleaseInt3(0xbaddbeef, 26, kFileIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * isRegistered * * Returns true if a factory or module is registered for CID aClass. * * @param aClass : ClassID queried for registeration * @return : true if a factory or module is registered for CID aClass. * false otherwise. */ /* boolean isRegistered (in nsCIDRef aClass); */ nsresult VFTCALL downIsRegistered(void *pvThis, const nsCID & aClass, PRBool *_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); DPRINTF_NSID(aClass); rc = pMozI->IsRegistered(aClass, _retval); if (NS_SUCCEEDED(rc) && VALID_PTR(_retval)) dprintf(("%s: _retval=%d", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * enumerateCLSIDs * * Enumerate the list of all registered ClassIDs. * * @return : enumerator for ClassIDs. */ /* nsIEnumerator enumerateCLSIDs (); */ nsresult VFTCALL downEnumerateCLSIDs(void *pvThis, nsIEnumerator **_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); const void *pvVFT = downIsSupportedInterface(kEnumeratorIID); if (pvVFT) { rc = pMozI->EnumerateCLSIDs(_retval); rc = downCreateWrapper((void**)_retval, pvVFT, rc); } else { dprintf(("%s: Unsupported down interface nsIEnumerator !!!", pszFunction)); ReleaseInt3(0xbaddbeef, 17, kEnumeratorIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * enumerateContractIDs * * Enumerate the list of all registered ContractIDs. * * @return : enumerator for ContractIDs. */ /* nsIEnumerator enumerateContractIDs (); */ nsresult VFTCALL downEnumerateContractIDs(void *pvThis, nsIEnumerator **_retval) { DOWN_ENTER_RC(pvThis, nsIComponentManagerObsolete); const void *pvVFT = downIsSupportedInterface(kEnumeratorIID); if (pvVFT) { rc = pMozI->EnumerateContractIDs(_retval); rc = downCreateWrapper((void**)_retval, pvVFT, rc); } else { dprintf(("%s: Unsupported down interface nsIEnumerator !!!", pszFunction)); ReleaseInt3(0xbaddbeef, 18, kEnumeratorIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIComponentManagerObsolete, downVFTnsIComponentManagerObsolete) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downFindFactory, VFTDELTA_VAL() downGetClassObject, VFTDELTA_VAL() downContractIDToClassID, VFTDELTA_VAL() downCLSIDToContractID, VFTDELTA_VAL() downCreateInstance, VFTDELTA_VAL() downCreateInstanceByContractID, VFTDELTA_VAL() downRegistryLocationForSpec, VFTDELTA_VAL() downSpecForRegistryLocation, VFTDELTA_VAL() downRegisterFactory, VFTDELTA_VAL() downRegisterComponent, VFTDELTA_VAL() downRegisterComponentWithType, VFTDELTA_VAL() downRegisterComponentSpec, VFTDELTA_VAL() downRegisterComponentLib, VFTDELTA_VAL() downUnregisterFactory, VFTDELTA_VAL() downUnregisterComponent, VFTDELTA_VAL() downUnregisterComponentSpec, VFTDELTA_VAL() downFreeLibraries, VFTDELTA_VAL() downAutoRegister, VFTDELTA_VAL() downAutoRegisterComponent, VFTDELTA_VAL() downAutoUnregisterComponent, VFTDELTA_VAL() downIsRegistered, VFTDELTA_VAL() downEnumerateCLSIDs, VFTDELTA_VAL() downEnumerateContractIDs, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIComponentManager //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * getClassObject * * Returns the factory object that can be used to create instances of * CID aClass * * @param aClass The classid of the factory that is being requested */ /* void getClassObject (in nsCIDRef aClass, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */ nsresult VFTCALL downCMGetClassObject(void *pvThis, const nsCID & aClass, const nsIID & aIID, void * *result) { DOWN_ENTER_RC(pvThis, nsIComponentManager); DPRINTF_NSID(aClass); DPRINTF_NSID(aIID); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { rc = pMozI->GetClassObject(aClass, aIID, result); rc = downCreateWrapper(result, pvVFT, rc); } else { dprintf(("%s: Unsupported down interface !!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 28, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * getClassObjectByContractID * * Returns the factory object that can be used to create instances of * CID aClass * * @param aClass The classid of the factory that is being requested */ /* void getClassObjectByContractID (in string aContractID, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */ nsresult VFTCALL downCMGetClassObjectByContractID(void *pvThis, const char *aContractID, const nsIID & aIID, void * *result) { DOWN_ENTER_RC(pvThis, nsIComponentManager); DPRINTF_CONTRACTID(aContractID); DPRINTF_NSID(aIID); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { rc = pMozI->GetClassObjectByContractID(aContractID, aIID, result); rc = downCreateWrapper(result, pvVFT, rc); } else { dprintf(("%s: Unsupported down interface !!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 19, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * createInstance * * Create an instance of the CID aClass and return the interface aIID. * * @param aClass : ClassID of object instance requested * @param aDelegate : Used for aggregation * @param aIID : IID of interface requested */ /* void createInstance (in nsCIDRef aClass, in nsISupports aDelegate, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */ nsresult VFTCALL downCMCreateInstance(void *pvThis, const nsCID & aClass, nsISupports *aDelegate, const nsIID & aIID, void * *result) { DOWN_ENTER_RC(pvThis, nsIComponentManager); DPRINTF_NSID(aClass); DPRINTF_NSID(aIID); dprintf(("%s: aDelegate=%p result=%p", pszFunction, aDelegate, result)); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { /* * Wrap the aDelegate. * (Pray this isn't supposed to be the same kind of wrapper as nsIID. * Haven't found any examples using aDelegate unfortunately.) */ nsISupports * pupOuter = aDelegate; rc = upCreateWrapper((void**)&pupOuter, kSupportsIID, NS_OK); if (rc == NS_OK) { rc = pMozI->CreateInstance(aClass, pupOuter, aIID, result); rc = downCreateWrapper(result, pvVFT, rc); } else dprintf(("%s: failed to create up wrapper for kSupportsIID %x !!!", pszFunction, aDelegate)); } else { dprintf(("%s: Unsupported down interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 31, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * createInstanceByContractID * * Create an instance of the CID that implements aContractID and return the * interface aIID. * * @param aContractID : aContractID of object instance requested * @param aDelegate : Used for aggregation * @param aIID : IID of interface requested */ /* void createInstanceByContractID (in string aContractID, in nsISupports aDelegate, in nsIIDRef aIID, [iid_is (aIID), retval] out nsQIResult result); */ nsresult VFTCALL downCMCreateInstanceByContractID(void *pvThis, const char *aContractID, nsISupports *aDelegate, const nsIID & aIID, void * *result) { DOWN_ENTER_RC(pvThis, nsIComponentManager); DPRINTF_CONTRACTID(aContractID); DPRINTF_NSID(aIID); dprintf(("%s: aDelegate=%p result=%p", pszFunction, aDelegate, result)); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(aIID); if (pvVFT) { /* * Wrap the aDelegate. * (Pray this isn't supposed to be the same kind of wrapper as nsIID. * Haven't found any examples using aDelegate unfortunately.) */ nsISupports * pupOuter = aDelegate; rc = upCreateWrapper((void**)&pupOuter, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->CreateInstanceByContractID(aContractID, pupOuter, aIID, result); rc = downCreateWrapper(result, pvVFT, rc); } else dprintf(("%s: failed to create up wrapper for kSupportsIID %x !!!", pszFunction, aDelegate)); } else { dprintf(("%s: Unsupported down interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 10, aIID.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIComponentManager, downVFTnsIComponentManager) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downCMGetClassObject, VFTDELTA_VAL() downCMGetClassObjectByContractID, VFTDELTA_VAL() downCMCreateInstance, VFTDELTA_VAL() downCMCreateInstanceByContractID, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIEnumerator //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** First will reset the list. will return NS_FAILED if no items */ /* void first (); */ nsresult VFTCALL downEFirst(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIEnumerator); rc = pMozI->First(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** Next will advance the list. will return failed if already at end */ /* void next (); */ nsresult VFTCALL downENext(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIEnumerator); rc = pMozI->Next(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** CurrentItem will return the CurrentItem item it will fail if the * list is empty */ /* nsISupports currentItem (); */ nsresult VFTCALL downECurrentItem(void *pvThis, nsISupports **_retval) { DOWN_ENTER_RC(pvThis, nsIEnumerator); rc = pMozI->First(); rc = downCreateWrapper((void**)_retval, kSupportsIID, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** return if the collection is at the end. that is the beginning following * a call to Prev and it is the end of the list following a call to next */ /* void isDone (); */ nsresult VFTCALL downEIsDone(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIEnumerator); rc = pMozI->IsDone(); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIEnumerator, downVFTnsIEnumerator) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downEFirst, VFTDELTA_VAL() downENext, VFTDELTA_VAL() downECurrentItem, VFTDELTA_VAL() downEIsDone, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIFactory //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Creates an instance of a component. * * @param aOuter Pointer to a component that wishes to be aggregated * in the resulting instance. This will be nsnull if no * aggregation is requested. * @param iid The IID of the interface being requested in * the component which is being currently created. * @param result [out] Pointer to the newly created instance, if successful. * @return NS_OK - Component successfully created and the interface * being requested was successfully returned in result. * NS_NOINTERFACE - Interface not accessible. * NS_ERROR_NO_AGGREGATION - if an 'outer' object is supplied, but the * component is not aggregatable. * NS_ERROR* - Method failure. */ /* void createInstance (in nsISupports aOuter, in nsIIDRef iid, [iid_is (iid), retval] out nsQIResult result); */ nsresult VFTCALL downFactory_CreateInstance(void *pvThis, nsISupports *aOuter, const nsIID & iid, void * *result) { DOWN_ENTER_RC(pvThis, nsIFactory); dprintf(("%s: aOuter result=%p", pszFunction, aOuter, result)); DPRINTF_NSID(iid); /* * Supported interface requested? */ const void * pvVFT = downIsSupportedInterface(iid); if (pvVFT) { /* * Wrap the aOuter. * (Pray this isn't supposed to be the same kind of wrapper as nsIID. * Haven't found any examples using aDelegate unfortunately.) */ nsISupports * pupOuter = aOuter; rc = upCreateWrapper((void**)&pupOuter, kSupportsIID, NS_OK); if (rc == NS_OK) { rc = pMozI->CreateInstance(pupOuter, iid, result); rc = downCreateWrapper(result, pvVFT, rc); } else dprintf(("%s: failed to create up wrapper for kSupportsIID %x !!!", pszFunction, aOuter)); } else { dprintf(("%s: Unsupported down interface!!!", pszFunction)); rc = NS_NOINTERFACE; ReleaseInt3(0xbaddbeef, 33, iid.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * LockFactory provides the client a way to keep the component * in memory until it is finished with it. The client can call * LockFactory(PR_TRUE) to lock the factory and LockFactory(PR_FALSE) * to release the factory. * * @param lock - Must be PR_TRUE or PR_FALSE * @return NS_OK - If the lock operation was successful. * NS_ERROR* - Method failure. */ /* void lockFactory (in PRBool lock); */ nsresult VFTCALL downFactory_LockFactory(void *pvThis, PRBool lock) { DOWN_ENTER_RC(pvThis, nsIFactory); dprintf(("%s: lock=%d\n", pszFunction, lock)); rc = pMozI->LockFactory(lock); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIFactory, downVFTnsIFactory) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downFactory_CreateInstance, VFTDELTA_VAL() downFactory_LockFactory, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIInputStream //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// nsresult VFTCALL downInputStream_Close(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIInputStream); rc = pMozI->Close(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * @return number of bytes currently available in the stream */ /* unsigned long available (); */ nsresult VFTCALL downInputStream_Available(void *pvThis, PRUint32 *_retval) { DOWN_ENTER_RC(pvThis, nsIInputStream); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = pMozI->Available(_retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Read data from the stream. * * @param aBuf the buffer into which the data is to be read * @param aCount the maximum number of bytes to be read * * @return number of bytes read (may be less than aCount). * @return 0 if reached end of file * * @throws NS_BASE_STREAM_WOULD_BLOCK if reading from the input stream would * block the calling thread (non-blocking mode only) * @throws on failure */ /* [noscript] unsigned long read (in charPtr aBuf, in unsigned long aCount); */ nsresult VFTCALL downInputStream_Read(void *pvThis, char * aBuf, PRUint32 aCount, PRUint32 *_retval) { DOWN_ENTER_RC(pvThis, nsIInputStream); dprintf(("%s: aBuf=%p aCount=%d _retval=%p\n", pszFunction, aBuf, aCount, _retval)); rc = pMozI->Read(aBuf, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Special wrapper function which get called from a little stub we create * in downInputStream_ReadSegments. The stub pushed the entry point of * the original function before calling us. */ nsresult __cdecl downOutputStream_nsWriteSegmentWrapper( nsresult (VFTCALL pfnOrg)(nsIInputStream *aInStream, void *aClosure, const char *aFromSegment, PRUint32 aToOffset, PRUint32 aCount, PRUint32 *aWriteCount), void *pvRet, nsIInputStream *aInStream, void *aClosure, const char *aFromSegment, PRUint32 aToOffset, PRUint32 aCount, PRUint32 *aWriteCount) { DEBUG_FUNCTIONNAME(); nsresult rc; dprintf(("%s: pfnOrg=%p pvRet=%p aInStream=%p aClosure=%p aFromSegment=%p aToOffset=%d aCount=%d aWriteCount=%p\n", pszFunction, pfnOrg, pvRet, aInStream, aClosure, aFromSegment, aToOffset, aCount, aWriteCount)); nsIInputStream * pDownInStream = aInStream; rc = downCreateWrapper((void**)&pDownInStream, kInputStreamIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pfnOrg(pDownInStream, aClosure, aFromSegment, aToOffset, aCount, aWriteCount); if (VALID_PTR(aWriteCount)) dprintf(("%s: *aWriteCount=%d\n", pszFunction, *aWriteCount)); } dprintf(("%s: rc=%d\n", pszFunction, rc)); return rc; } /** * Low-level read method that has access to the stream's underlying buffer. * The writer function may be called multiple times for segmented buffers. * ReadSegments is expected to keep calling the writer until either there is * nothing left to read or the writer returns an error. ReadSegments should * not call the writer with zero bytes to consume. * * @param aWriter the "consumer" of the data to be read * @param aClosure opaque parameter passed to writer * @param aCount the maximum number of bytes to be read * * @return number of bytes read (may be less than aCount) * @return 0 if reached end of file (or if aWriter refused to consume data) * * @throws NS_BASE_STREAM_WOULD_BLOCK if reading from the input stream would * block the calling thread (non-blocking mode only) * @throws on failure * * NOTE: this function may be unimplemented if a stream has no underlying * buffer (e.g., socket input stream). */ /* [noscript] unsigned long readSegments (in nsWriteSegmentFun aWriter, in voidPtr aClosure, in unsigned long aCount); */ nsresult VFTCALL downInputStream_ReadSegments(void *pvThis, nsWriteSegmentFun aWriter, void * aClosure, PRUint32 aCount, PRUint32 *_retval) { DOWN_ENTER_RC(pvThis, nsIInputStream); dprintf(("%s: aWriter=%p aClosure=%p aCount=%d _retval=%p", pszFunction, aWriter, aClosure, aCount, _retval)); int i; char achWrapper[32]; /* push aReader */ achWrapper[0] = 0x68; *((unsigned*)&achWrapper[1]) = (unsigned)aWriter; i = 5; #ifdef __IBMCPP__ /* optlink - mov [ebp + 08h], eax */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x45; achWrapper[i++] = 0x08; /* optlink - mov [ebp + 0ch], edx */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x55; achWrapper[i++] = 0x0c; /* optlink - mov [ebp + 10h], ecx */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x4d; achWrapper[i++] = 0x10; #endif /* call UpOutputStream_nsReadSegmentWrapper */ achWrapper[i] = 0xe8; *((unsigned*)&achWrapper[i+1]) = (unsigned)downOutputStream_nsWriteSegmentWrapper - (unsigned)&achWrapper[i+5]; i += 5; /* add esp, 4 */ achWrapper[i++] = 0x83; achWrapper[i++] = 0xc4; achWrapper[i++] = 0x04; /* ret */ achWrapper[i++] = 0xc3; achWrapper[i] = 0xcc; achWrapper[i] = 0xcc; /* do call - this better not be asynchronous stuff. */ rc = pMozI->ReadSegments((nsWriteSegmentFun)((void*)&achWrapper[0]), aClosure, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * @return true if stream is non-blocking */ /* boolean isNonBlocking (); */ nsresult VFTCALL downInputStream_IsNonBlocking(void *pvThis, PRBool *_retval) { DOWN_ENTER_RC(pvThis, nsIInputStream); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = pMozI->IsNonBlocking(_retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIInputStream, downVFTnsIInputStream) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downInputStream_Close, VFTDELTA_VAL() downInputStream_Available, VFTDELTA_VAL() downInputStream_Read, VFTDELTA_VAL() downInputStream_ReadSegments, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIOutputStream //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Close the stream. Forces the output stream to flush any buffered data. * * @throws NS_BASE_STREAM_WOULD_BLOCK if unable to flush without blocking * the calling thread (non-blocking mode only) */ /* void close (); */ nsresult VFTCALL downOutputStream_Close(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIOutputStream); rc = pMozI->Close(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Flush the stream. * * @throws NS_BASE_STREAM_WOULD_BLOCK if unable to flush without blocking * the calling thread (non-blocking mode only) */ /* void flush (); */ nsresult VFTCALL downOutputStream_Flush(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIOutputStream); rc = pMozI->Flush(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Write data into the stream. * * @param aBuf the buffer containing the data to be written * @param aCount the maximum number of bytes to be written * * @return number of bytes written (may be less than aCount) * * @throws NS_BASE_STREAM_WOULD_BLOCK if writing to the output stream would * block the calling thread (non-blocking mode only) * @throws on failure */ /* unsigned long write (in string aBuf, in unsigned long aCount); */ nsresult VFTCALL downOutputStream_Write(void *pvThis, const char *aBuf, PRUint32 aCount, PRUint32 *_retval) { DOWN_ENTER_RC(pvThis, nsIOutputStream); dprintf(("%s: aBuf=%p aCount=%d _retval=%p\n", pszFunction, aBuf, aCount, _retval)); rc = pMozI->Write(aBuf, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Writes data into the stream from an input stream. * * @param aFromStream the stream containing the data to be written * @param aCount the maximum number of bytes to be written * * @return number of bytes written (may be less than aCount) * * @throws NS_BASE_STREAM_WOULD_BLOCK if writing to the output stream would * block the calling thread (non-blocking mode only) * @throws on failure * * NOTE: This method is defined by this interface in order to allow the * output stream to efficiently copy the data from the input stream into * its internal buffer (if any). If this method was provided as an external * facility, a separate char* buffer would need to be used in order to call * the output stream's other Write method. */ /* unsigned long writeFrom (in nsIInputStream aFromStream, in unsigned long aCount); */ nsresult VFTCALL downOutputStream_WriteFrom(void *pvThis, nsIInputStream *aFromStream, PRUint32 aCount, PRUint32 *_retval) { DOWN_ENTER_RC(pvThis, nsIOutputStream); dprintf(("%s: aFromStream=%p aCount=%d _retval=%p\n", pszFunction, aFromStream, aCount, _retval)); nsIInputStream *pUpFromStream = aFromStream; rc = upCreateWrapper((void**)&pUpFromStream, kInputStreamIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pMozI->WriteFrom(pUpFromStream, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Special wrapper function which get called from a little stub we create * in UpOutputStream::WriteSegments. The stub pushed the entry point of * the original function before calling us. */ nsresult __cdecl downOutputStream_nsReadSegmentWrapper(nsReadSegmentFun pfnOrg, void *pvRet, nsIOutputStream *aOutStream, void *aClosure, char *aToSegment, PRUint32 aFromOffset, PRUint32 aCount, PRUint32 *aReadCount) { DEBUG_FUNCTIONNAME(); nsresult rc; dprintf(("%s: pfnOrg=%p pvRet=%p aOutStream=%p aClosure=%p aToSegment=%p aFromOffset=%d aCount=%d aReadCount=%p\n", pszFunction, pfnOrg, pvRet, aOutStream, aClosure, aToSegment, aFromOffset, aCount, aReadCount)); nsIOutputStream * pupOutStream = aOutStream; rc = upCreateWrapper((void**)&pupOutStream, kOutputStreamIID, NS_OK); if (NS_SUCCEEDED(rc)) { rc = pfnOrg(pupOutStream, aClosure, aToSegment, aFromOffset, aCount, aReadCount); if (VALID_PTR(aReadCount)) dprintf(("%s: *aReadCount=%d\n", pszFunction, *aReadCount)); } dprintf(("%s: rc=%d\n", pszFunction, rc)); return rc; } /** * Low-level write method that has access to the stream's underlying buffer. * The reader function may be called multiple times for segmented buffers. * WriteSegments is expected to keep calling the reader until either there * is nothing left to write or the reader returns an error. WriteSegments * should not call the reader with zero bytes to provide. * * @param aReader the "provider" of the data to be written * @param aClosure opaque parameter passed to reader * @param aCount the maximum number of bytes to be written * * @return number of bytes written (may be less than aCount) * * @throws NS_BASE_STREAM_WOULD_BLOCK if writing to the output stream would * block the calling thread (non-blocking mode only) * @throws on failure * * NOTE: this function may be unimplemented if a stream has no underlying * buffer (e.g., socket output stream). */ /* [noscript] unsigned long writeSegments (in nsReadSegmentFun aReader, in voidPtr aClosure, in unsigned long aCount); */ nsresult VFTCALL downOutputStream_WriteSegments(void *pvThis, nsReadSegmentFun aReader, void * aClosure, PRUint32 aCount, PRUint32 *_retval) { DOWN_ENTER_RC(pvThis, nsIOutputStream); dprintf(("%s: aReader=%p aClosure=%p aCount=%d _retval=%p", pszFunction, aReader, aClosure, aCount, _retval)); int i; char achWrapper[32]; /* push aReader */ achWrapper[0] = 0x68; *((unsigned*)&achWrapper[1]) = (unsigned)aReader; i = 5; #ifdef __IBMCPP__ /* optlink - mov [ebp + 08h], eax */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x45; achWrapper[i++] = 0x08; /* optlink - mov [ebp + 0ch], edx */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x55; achWrapper[i++] = 0x0c; /* optlink - mov [ebp + 10h], ecx */ achWrapper[i++] = 0x89; achWrapper[i++] = 0x4d; achWrapper[i++] = 0x10; #endif /* call UpOutputStream_nsReadSegmentWrapper */ achWrapper[i] = 0xe8; *((unsigned*)&achWrapper[i+1]) = (unsigned)downOutputStream_nsReadSegmentWrapper - (unsigned)&achWrapper[i+5]; i += 5; /* add esp, 4 */ achWrapper[i++] = 0x83; achWrapper[i++] = 0xc4; achWrapper[i++] = 0x04; /* _Optlink - ret */ achWrapper[i++] = 0xc3; achWrapper[i++] = 0xcc; achWrapper[i] = 0xcc; /* do call - this better not be asynchronous stuff. */ rc = pMozI->WriteSegments((nsReadSegmentFun)((void*)&achWrapper[0]), aClosure, aCount, _retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * @return true if stream is non-blocking * * NOTE: writing to a blocking output stream will block the calling thread * until all given data can be consumed by the stream. */ /* boolean isNonBlocking (); */ nsresult VFTCALL downOutputStream_IsNonBlocking(void *pvThis, PRBool *_retval) { DOWN_ENTER_RC(pvThis, nsIOutputStream); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = pMozI->IsNonBlocking(_retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIOutputStream, downVFTnsIOutputStream) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downOutputStream_Close, VFTDELTA_VAL() downOutputStream_Flush, VFTDELTA_VAL() downOutputStream_Write, VFTDELTA_VAL() downOutputStream_WriteFrom, VFTDELTA_VAL() downOutputStream_WriteSegments, VFTDELTA_VAL() downOutputStream_IsNonBlocking, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIInterfaceRequestor //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Retrieves the specified interface pointer. * * @param uuid The IID of the interface being requested. * @param result [out] The interface pointer to be filled in if * the interface is accessible. * @return NS_OK - interface was successfully returned. * NS_NOINTERFACE - interface not accessible. * NS_ERROR* - method failure. */ /* void getInterface (in nsIIDRef uuid, [iid_is (uuid), retval] out nsQIResult result); */ nsresult VFTCALL downInterfaceRequestor_GetInterface(void *pvThis, const nsIID & uuid, void * *result) { DOWN_ENTER_RC(pvThis, nsIInterfaceRequestor); DPRINTF_NSID(uuid); /* * Is this a supported interface? */ const void *pvVFT = downIsSupportedInterface(uuid); if (pvVFT) { rc = pMozI->GetInterface(uuid, result); rc = downCreateWrapper(result, pvVFT, rc); } else { dprintf(("%s: Unsupported interface!!!", pszFunction)); rc = NS_NOINTERFACE; if (result) *result = nsnull; ReleaseInt3(0xbaddbeef, 34, uuid.m0); } DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIInterfaceRequestor, downVFTnsIInterfaceRequestor) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downInterfaceRequestor_GetInterface, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIRequest //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * The name of the request. Often this is the URI of the request. */ /* readonly attribute AUTF8String name; */ nsresult VFTCALL downRequest_GetName(void *pvThis, nsACString & aName) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: &aName=%p", pszFunction, &aName)); /** @todo Wrap nsACString */ dprintf(("%s: nsACString wrapping isn't supported.", pszFunction)); ReleaseInt3(0xbaddbeef, 35, 0); rc = pMozI->GetName(aName); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * @return TRUE if the request has yet to reach completion. * @return FALSE if the request has reached completion (e.g., after * OnStopRequest has fired). * Suspended requests are still considered pending. */ /* boolean isPending (); */ nsresult VFTCALL downRequest_IsPending(void *pvThis, PRBool *_retval) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = pMozI->IsPending(_retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * The error status associated with the request. */ /* readonly attribute nsresult status; */ nsresult VFTCALL downRequest_GetStatus(void *pvThis, nsresult *aStatus) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: aStatus=%p\n", pszFunction, aStatus)); rc = pMozI->GetStatus(aStatus); if (VALID_PTR(aStatus)) dprintf(("%s: *aStatus=%#x\n", pszFunction, *aStatus)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Cancels the current request. This will close any open input or * output streams and terminate any async requests. Users should * normally pass NS_BINDING_ABORTED, although other errors may also * be passed. The error passed in will become the value of the * status attribute. * * @param aStatus the reason for canceling this request. * * NOTE: most nsIRequest implementations expect aStatus to be a * failure code; however, some implementations may allow aStatus to * be a success code such as NS_OK. In general, aStatus should be * a failure code. */ /* void cancel (in nsresult aStatus); */ nsresult VFTCALL downRequest_Cancel(void *pvThis, nsresult aStatus) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: aStatus=%#x\n", pszFunction, aStatus)); rc = pMozI->Cancel(aStatus); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Suspends the current request. This may have the effect of closing * any underlying transport (in order to free up resources), although * any open streams remain logically opened and will continue delivering * data when the transport is resumed. * * NOTE: some implementations are unable to immediately suspend, and * may continue to deliver events already posted to an event queue. In * general, callers should be capable of handling events even after * suspending a request. */ /* void suspend (); */ nsresult VFTCALL downRequest_Suspend(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIRequest); rc = pMozI->Suspend(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Resumes the current request. This may have the effect of re-opening * any underlying transport and will resume the delivery of data to * any open streams. */ /* void resume (); */ nsresult VFTCALL downRequest_Resume(void *pvThis) { DOWN_ENTER_RC(pvThis, nsIRequest); rc = pMozI->Resume(); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * The load group of this request. While pending, the request is a * member of the load group. It is the responsibility of the request * to implement this policy. */ /* attribute nsILoadGroup loadGroup; */ nsresult VFTCALL downRequest_GetLoadGroup(void *pvThis, nsILoadGroup * *aLoadGroup) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: aLoadGroup=%p\n", pszFunction, aLoadGroup)); rc = pMozI->GetLoadGroup(aLoadGroup); rc = downCreateWrapper((void**)aLoadGroup, kLoadGroupIID, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downRequest_SetLoadGroup(void *pvThis, nsILoadGroup * aLoadGroup) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: aLoadGroup=%p\n", pszFunction, aLoadGroup)); nsILoadGroup * pUpLoadGroup = aLoadGroup; rc = upCreateWrapper((void**)&pUpLoadGroup, kLoadGroupIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->SetLoadGroup(pUpLoadGroup); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * The load flags of this request. Bits 0-15 are reserved. * * When added to a load group, this request's load flags are merged with * the load flags of the load group. */ /* attribute nsLoadFlags loadFlags; */ nsresult VFTCALL downRequest_GetLoadFlags(void *pvThis, nsLoadFlags *aLoadFlags) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: aLoadFlags=%p\n", pszFunction, aLoadFlags)); rc = pMozI->GetLoadFlags(aLoadFlags); if (VALID_PTR(aLoadFlags)) dprintf(("%s: *aLoadFlags=%#x\n", pszFunction, *aLoadFlags)); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downRequest_SetLoadFlags(void *pvThis, nsLoadFlags aLoadFlags) { DOWN_ENTER_RC(pvThis, nsIRequest); dprintf(("%s: aLoadFlags=%p\n", pszFunction, aLoadFlags)); rc = pMozI->SetLoadFlags(aLoadFlags); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIRequest, downVFTnsIRequest) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downRequest_GetName, VFTDELTA_VAL() downRequest_IsPending, VFTDELTA_VAL() downRequest_GetStatus, VFTDELTA_VAL() downRequest_Cancel, VFTDELTA_VAL() downRequest_Suspend, VFTDELTA_VAL() downRequest_Resume, VFTDELTA_VAL() downRequest_GetLoadGroup, VFTDELTA_VAL() downRequest_SetLoadGroup, VFTDELTA_VAL() downRequest_GetLoadFlags, VFTDELTA_VAL() downRequest_SetLoadFlags, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsILoadGroup //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * The group observer is notified when requests are added to and removed * from this load group. The groupObserver is weak referenced. */ /* attribute nsIRequestObserver groupObserver; */ nsresult VFTCALL downLoadGroup_GetGroupObserver(void *pvThis, nsIRequestObserver * *aGroupObserver) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aGroupObserver=%p\n", pszFunction, aGroupObserver)); rc = pMozI->GetGroupObserver(aGroupObserver); rc = downCreateWrapper((void**)aGroupObserver, kRequestObserverIID, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downLoadGroup_SetGroupObserver(void *pvThis, nsIRequestObserver * aGroupObserver) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aGroupObserver=%p\n", pszFunction, aGroupObserver)); nsIRequestObserver * pUpGroupObserver = aGroupObserver; rc = upCreateWrapper((void**)&pUpGroupObserver, kRequestObserverIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->SetGroupObserver(pUpGroupObserver); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Accesses the default load request for the group. Each time a number * of requests are added to a group, the defaultLoadRequest may be set * to indicate that all of the requests are related to a base request. * * The load group inherits its load flags from the default load request. * If the default load request is NULL, then the group's load flags are * not changed. */ /* attribute nsIRequest defaultLoadRequest; */ nsresult VFTCALL downLoadGroup_GetDefaultLoadRequest(void *pvThis, nsIRequest * *aDefaultLoadRequest) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aDefaultLoadRequest=%p\n", pszFunction, aDefaultLoadRequest)); rc = pMozI->GetDefaultLoadRequest(aDefaultLoadRequest); rc = downCreateWrapper((void**)aDefaultLoadRequest, kRequestIID, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downLoadGroup_SetDefaultLoadRequest(void *pvThis, nsIRequest * aDefaultLoadRequest) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aDefaultLoadRequest=%p\n", pszFunction, aDefaultLoadRequest)); nsIRequest * pUpDefaultLoadRequest = aDefaultLoadRequest; rc = upCreateWrapper((void**)&pUpDefaultLoadRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->SetDefaultLoadRequest(pUpDefaultLoadRequest); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Adds a new request to the group. This will cause the default load * flags to be applied to the request. If this is a foreground * request then the groupObserver's onStartRequest will be called. * * If the request is the default load request or if the default load * request is null, then the load group will inherit its load flags from * the request. */ /* void addRequest (in nsIRequest aRequest, in nsISupports aContext); */ nsresult VFTCALL downLoadGroup_AddRequest(void *pvThis, nsIRequest *aRequest, nsISupports *aContext) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aRequest=%p aContext=%p\n", pszFunction, aRequest, aContext)); nsIRequest * pUpRequest = aRequest; rc = upCreateWrapper((void**)&pUpRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports * pUpContext = aContext; rc = upCreateWrapper((void**)&pUpContext, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) rc = pMozI->AddRequest(pUpRequest, pUpContext); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Removes a request from the group. If this is a foreground request * then the groupObserver's onStopRequest will be called. */ /* void removeRequest (in nsIRequest aRequest, in nsISupports aContext, in nsresult aStatus); */ nsresult VFTCALL downLoadGroup_RemoveRequest(void *pvThis, nsIRequest *aRequest, nsISupports *aContext, nsresult aStatus) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aRequest=%p aContext=%p aStatus=%#x\n", pszFunction, aRequest, aContext, aStatus)); nsIRequest * pUpRequest = aRequest; rc = upCreateWrapper((void**)&pUpRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports * pUpContext = aContext; rc = upCreateWrapper((void**)&pUpContext, kSupportsIID, rc); if (NS_SUCCEEDED(rc)) rc = pMozI->RemoveRequest(pUpRequest, pUpContext, aStatus); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the requests contained directly in this group. * Enumerator element type: nsIRequest. */ /* readonly attribute nsISimpleEnumerator requests; */ nsresult VFTCALL downLoadGroup_GetRequests(void *pvThis, nsISimpleEnumerator * *aRequests) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aRequests=%p\n", pszFunction, aRequests)); rc = pMozI->GetRequests(aRequests); rc = downCreateWrapper((void**)aRequests, kSimpleEnumeratorIID, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Returns the count of "active" requests (ie. requests without the * LOAD_BACKGROUND bit set). */ /* readonly attribute unsigned long activeCount; */ nsresult VFTCALL downLoadGroup_GetActiveCount(void *pvThis, PRUint32 *aActiveCount) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aActiveCount=%p\n", pszFunction, aActiveCount)); rc = pMozI->GetActiveCount(aActiveCount); if (VALID_PTR(aActiveCount)) dprintf(("%s: *aActiveCount=%d\n", pszFunction, aActiveCount)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Notification callbacks for the load group. */ /* attribute nsIInterfaceRequestor notificationCallbacks; */ nsresult VFTCALL downLoadGroup_GetNotificationCallbacks(void *pvThis, nsIInterfaceRequestor * *aNotificationCallbacks) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aNotificationCallbacks=%p\n", pszFunction, aNotificationCallbacks)); rc = pMozI->GetNotificationCallbacks(aNotificationCallbacks); rc = downCreateWrapper((void**)aNotificationCallbacks, kInterfaceRequestorIID, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downLoadGroup_SetNotificationCallbacks(void *pvThis, nsIInterfaceRequestor * aNotificationCallbacks) { DOWN_ENTER_RC(pvThis, nsILoadGroup); dprintf(("%s: aNotificationCallbacks=%p\n", pszFunction, aNotificationCallbacks)); nsIInterfaceRequestor * pUpNotificationCallbacks = aNotificationCallbacks; rc = upCreateWrapper((void**)&pUpNotificationCallbacks, kInterfaceRequestorIID, rc); rc = pMozI->SetNotificationCallbacks(pUpNotificationCallbacks); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsILoadGroup, downVFTnsILoadGroup) { { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, /* */ downRequest_GetName, VFTDELTA_VAL() downRequest_IsPending, VFTDELTA_VAL() downRequest_GetStatus, VFTDELTA_VAL() downRequest_Cancel, VFTDELTA_VAL() downRequest_Suspend, VFTDELTA_VAL() downRequest_Resume, VFTDELTA_VAL() downRequest_GetLoadGroup, VFTDELTA_VAL() downRequest_SetLoadGroup, VFTDELTA_VAL() downRequest_GetLoadFlags, VFTDELTA_VAL() downRequest_SetLoadFlags, VFTDELTA_VAL() }, downLoadGroup_GetGroupObserver, VFTDELTA_VAL() downLoadGroup_SetGroupObserver, VFTDELTA_VAL() downLoadGroup_GetDefaultLoadRequest, VFTDELTA_VAL() downLoadGroup_SetDefaultLoadRequest, VFTDELTA_VAL() downLoadGroup_AddRequest, VFTDELTA_VAL() downLoadGroup_RemoveRequest, VFTDELTA_VAL() downLoadGroup_GetRequests, VFTDELTA_VAL() downLoadGroup_GetActiveCount, VFTDELTA_VAL() downLoadGroup_GetNotificationCallbacks, VFTDELTA_VAL() downLoadGroup_SetNotificationCallbacks, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIPluginStreamInfo //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /* readonly attribute nsMIMEType contentType; */ nsresult VFTCALL downPluginStreamInfo_GetContentType(void *pvThis, nsMIMEType *aContentType) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aContentType=%p\n", pszFunction, aContentType)); rc = pMozI->GetContentType(aContentType); if (VALID_PTR(aContentType)) DPRINTF_STR(*aContentType); DOWN_LEAVE_INT(pvThis, rc); return rc; } /* void isSeekable (out boolean aSeekable); */ nsresult VFTCALL downPluginStreamInfo_IsSeekable(void *pvThis, PRBool *aSeekable) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aSeekable=%p\n", pszFunction, aSeekable)); rc = pMozI->IsSeekable(aSeekable); if (VALID_PTR(aSeekable)) dprintf(("%s: *aSeekable=%d\n", pszFunction, *aSeekable)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /* readonly attribute unsigned long length; */ nsresult VFTCALL downPluginStreamInfo_GetLength(void *pvThis, PRUint32 *aLength) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aLength=%p\n", pszFunction, aLength)); rc = pMozI->GetLength(aLength); if (VALID_PTR(aLength)) dprintf(("%s: *aLength=%d\n", pszFunction, *aLength)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /* readonly attribute unsigned long lastModified; */ nsresult VFTCALL downPluginStreamInfo_GetLastModified(void *pvThis, PRUint32 *aLastModified) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aLastModified=%p\n", pszFunction, aLastModified)); rc = pMozI->GetLastModified(aLastModified); if (VALID_PTR(aLastModified)) dprintf(("%s: *aLastModified=%d\n", pszFunction, *aLastModified)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /* void getURL (out constCharPtr aURL); */ nsresult VFTCALL downPluginStreamInfo_GetURL(void *pvThis, const char * *aURL) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aURL=%p\n", pszFunction, aURL)); rc = pMozI->GetURL(aURL); if (VALID_PTR(aURL)) DPRINTF_STR(*aURL); DOWN_LEAVE_INT(pvThis, rc); return rc; } /* void requestRead (in nsByteRangePtr aRangeList); */ nsresult VFTCALL downPluginStreamInfo_RequestRead(void *pvThis, nsByteRange * aRangeList) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aRangeList=%p\n", pszFunction, aRangeList)); rc = pMozI->RequestRead(aRangeList); DOWN_LEAVE_INT(pvThis, rc); return rc; } /* attribute long streamOffset; */ nsresult VFTCALL downPluginStreamInfo_GetStreamOffset(void *pvThis, PRInt32 *aStreamOffset) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aStreamOffset=%p\n", pszFunction, aStreamOffset)); rc = pMozI->GetStreamOffset(aStreamOffset); if (VALID_PTR(aStreamOffset)) dprintf(("%s: *aStreamOffset=%p\n", pszFunction, *aStreamOffset)); DOWN_LEAVE_INT(pvThis, rc); return rc; } nsresult VFTCALL downPluginStreamInfo_SetStreamOffset(void *pvThis, PRInt32 aStreamOffset) { DOWN_ENTER_RC(pvThis, nsIPluginStreamInfo); dprintf(("%s: aStreamOffset=%d\n", pszFunction, aStreamOffset)); rc = pMozI->SetStreamOffset(aStreamOffset); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIPluginStreamInfo, downVFTnsIPluginStreamInfo) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downPluginStreamInfo_GetContentType, VFTDELTA_VAL() downPluginStreamInfo_IsSeekable, VFTDELTA_VAL() downPluginStreamInfo_GetLength, VFTDELTA_VAL() downPluginStreamInfo_GetLastModified, VFTDELTA_VAL() downPluginStreamInfo_GetURL, VFTDELTA_VAL() downPluginStreamInfo_RequestRead, VFTDELTA_VAL() downPluginStreamInfo_GetStreamOffset, VFTDELTA_VAL() downPluginStreamInfo_SetStreamOffset, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIRequestObserver //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Called to signify the beginning of an asynchronous request. * * @param aRequest request being observed * @param aContext user defined context * * An exception thrown from onStartRequest has the side-effect of * causing the request to be canceled. */ /* void onStartRequest (in nsIRequest aRequest, in nsISupports aContext); */ nsresult VFTCALL downRequestObserver_OnStartRequest(void *pvThis, nsIRequest *aRequest, nsISupports *aContext) { DOWN_ENTER_RC(pvThis, nsIRequestObserver); dprintf(("%s: aRequest=%p aContext=%p\n", pszFunction, aRequest, aContext)); nsIRequest *pUpRequest = aRequest; rc = upCreateWrapper((void**)&pUpRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pUpContext = aContext; rc = upCreateWrapper((void**)&pUpContext, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->OnStartRequest(pUpRequest, pUpContext); } DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Called to signify the end of an asynchronous request. This * call is always preceded by a call to onStartRequest. * * @param aRequest request being observed * @param aContext user defined context * @param aStatusCode reason for stopping (NS_OK if completed successfully) * * An exception thrown from onStopRequest is generally ignored. */ /* void onStopRequest (in nsIRequest aRequest, in nsISupports aContext, in nsresult aStatusCode); */ nsresult VFTCALL downRequestObserver_OnStopRequest(void *pvThis, nsIRequest *aRequest, nsISupports *aContext, nsresult aStatusCode) { DOWN_ENTER_RC(pvThis, nsIRequestObserver); dprintf(("%s: aRequest=%p aContext=%p aStatusCode=%d\n", pszFunction, aRequest, aContext, aStatusCode)); nsIRequest *pUpRequest = aRequest; rc = upCreateWrapper((void**)&pUpRequest, kRequestIID, NS_OK); if (NS_SUCCEEDED(rc)) { nsISupports *pUpContext = aContext; rc = upCreateWrapper((void**)&pUpContext, kSupportsIID, NS_OK); if (NS_SUCCEEDED(rc)) rc = pMozI->OnStopRequest(pUpRequest, pUpContext, aStatusCode); } DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIRequestObserver, downVFTnsIRequestObserver) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downRequestObserver_OnStartRequest, VFTDELTA_VAL() downRequestObserver_OnStopRequest, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsISimpleEnumerator //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Called to determine whether or not the enumerator has * any elements that can be returned via getNext(). This method * is generally used to determine whether or not to initiate or * continue iteration over the enumerator, though it can be * called without subsequent getNext() calls. Does not affect * internal state of enumerator. * * @see getNext() * @return PR_TRUE if there are remaining elements in the enumerator. * PR_FALSE if there are no more elements in the enumerator. */ /* boolean hasMoreElements (); */ nsresult VFTCALL downSimpleEnumerator_HasMoreElements(void *pvThis, PRBool *_retval) { DOWN_ENTER_RC(pvThis, nsISimpleEnumerator); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = pMozI->HasMoreElements(_retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d\n", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * Called to retrieve the next element in the enumerator. The "next" * element is the first element upon the first call. Must be * pre-ceeded by a call to hasMoreElements() which returns PR_TRUE. * This method is generally called within a loop to iterate over * the elements in the enumerator. * * @see hasMoreElements() * @return NS_OK if the call succeeded in returning a non-null * value through the out parameter. * NS_ERROR_FAILURE if there are no more elements * to enumerate. * @return the next element in the enumeration. */ /* nsISupports getNext (); */ nsresult VFTCALL downSimpleEnumerator_GetNext(void *pvThis, nsISupports **_retval) { DOWN_ENTER_RC(pvThis, nsISimpleEnumerator); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = pMozI->GetNext(_retval); rc = downCreateWrapper((void**)_retval, kSupportsIID, rc); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsISimpleEnumerator, downVFTnsISimpleEnumerator) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downSimpleEnumerator_HasMoreElements, VFTDELTA_VAL() downSimpleEnumerator_GetNext, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: FlashIObject7 //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Notify the observer that the URL has started to load. This method is * called only once, at the beginning of a URL load.

* * @param aPluginInfo - plugin stream info * @return - the return value is currently ignored, in the future * it may be used to cancel the URL load.. */ /* void onStartBinding (in nsIPluginStreamInfo aPluginInfo); */ nsresult VFTCALL downFlashIObject7_Evaluate(void *pvThis, const char *aString, FlashIObject7 **aFlashObject) { DOWN_ENTER_RC(pvThis, FlashIObject7); dprintf(("%s: aString=%p aFlashObject=%p", pszFunction, aString, aFlashObject)); DPRINTF_STR(aString); rc = pMozI->Evaluate(aString, aFlashObject); rc = downCreateWrapper((void**)aFlashObject, kFlashIObject7IID, NS_OK); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTFlashIObject7, downVFTFlashIObject7) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downFlashIObject7_Evaluate, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIHTTPHeaderListener //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Called for each HTTP Response header. * NOTE: You must copy the values of the params. */ /* void newResponseHeader (in string headerName, in string headerValue); */ nsresult VFTCALL downHTTPHeaderListener_NewResponseHeader(void *pvThis, const char *headerName, const char *headerValue) { DOWN_ENTER_RC(pvThis, nsIHTTPHeaderListener); DPRINTF_STR(headerName); DPRINTF_STR(headerValue); rc = pMozI->NewResponseHeader(headerName, headerValue); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIHTTPHeaderListener, downVFTnsIHTTPHeaderListener) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downHTTPHeaderListener_NewResponseHeader, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN: nsIMemory //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Allocates a block of memory of a particular size. If the memory * cannot be allocated (because of an out-of-memory condition), null * is returned. * * @param size - the size of the block to allocate * @result the block of memory */ /* [noscript, notxpcom] voidPtr alloc (in size_t size); */ void * VFTCALL downMemory_Alloc(void *pvThis, size_t size) { DOWN_ENTER_NORET(pvThis, nsIMemory); dprintf(("%s: size=%d\n", pszFunction, size)); void *pv = pMozI->Alloc(size); DOWN_LEAVE_INT(pvThis, (unsigned)pv); return pv; } /** * Reallocates a block of memory to a new size. * * @param ptr - the block of memory to reallocate * @param size - the new size * @result the reallocated block of memory * * If ptr is null, this function behaves like malloc. * If s is the size of the block to which ptr points, the first * min(s, size) bytes of ptr's block are copied to the new block. * If the allocation succeeds, ptr is freed and a pointer to the * new block returned. If the allocation fails, ptr is not freed * and null is returned. The returned value may be the same as ptr. */ /* [noscript, notxpcom] voidPtr realloc (in voidPtr ptr, in size_t newSize); */ void * VFTCALL downMemory_Realloc(void *pvThis, void * ptr, size_t newSize) { DOWN_ENTER_NORET(pvThis, nsIMemory); dprintf(("%s: ptr=%p newSize=%d\n", pszFunction, ptr, newSize)); void *pv = pMozI->Realloc(ptr, newSize); DOWN_LEAVE_INT(pvThis, (unsigned)pv); return pv; } /** * Frees a block of memory. Null is a permissible value, in which case * nothing happens. * * @param ptr - the block of memory to free */ /* [noscript, notxpcom] void free (in voidPtr ptr); */ void VFTCALL downMemory_Free(void *pvThis, void * ptr) { DOWN_ENTER_NORET(pvThis, nsIMemory); dprintf(("%s: ptr=%p\n", pszFunction, ptr)); pMozI->Free(ptr); DOWN_LEAVE(pvThis); return; } /** * Attempts to shrink the heap. * @param immediate - if true, heap minimization will occur * immediately if the call was made on the main thread. If * false, the flush will be scheduled to happen when the app is * idle. * @return NS_ERROR_FAILURE if 'immediate' is set an the call * was not on the application's main thread. */ /* void heapMinimize (in boolean immediate); */ nsresult VFTCALL downMemory_HeapMinimize(void *pvThis, PRBool immediate) { DOWN_ENTER_RC(pvThis, nsIMemory); dprintf(("%s: immediate=%d\n", pszFunction, immediate)); rc = pMozI->HeapMinimize(immediate); DOWN_LEAVE_INT(pvThis, rc); return rc; } /** * This predicate can be used to determine if we're in a low-memory * situation (what constitutes low-memory is platform dependent). This * can be used to trigger the memory pressure observers. */ /* boolean isLowMemory (); */ nsresult VFTCALL downMemory_IsLowMemory(void *pvThis, PRBool *_retval) { DOWN_ENTER_RC(pvThis, nsIMemory); dprintf(("%s: _retval=%p\n", pszFunction, _retval)); rc = pMozI->IsLowMemory(_retval); if (VALID_PTR(_retval)) dprintf(("%s: *_retval=%d", pszFunction, *_retval)); DOWN_LEAVE_INT(pvThis, rc); return rc; } MAKE_SAFE_VFT(VFTnsIMemory, downVFTnsIMemory) { { VFTFIRST_VAL() downQueryInterface, VFTDELTA_VAL() downAddRef, VFTDELTA_VAL() downRelease, VFTDELTA_VAL() }, downMemory_Alloc, VFTDELTA_VAL() downMemory_Realloc, VFTDELTA_VAL() downMemory_Free, VFTDELTA_VAL() downMemory_HeapMinimize, VFTDELTA_VAL() downMemory_IsLowMemory, VFTDELTA_VAL() } SAFE_VFT_ZEROS(); //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // DOWN Helpers //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** Supported Interface for downQueryInterface(). */ static struct SupportedInterface_Down { /** Interface ID. */ const nsIID * pIID; /** Virtual Function Table. */ const void * pvVFT; } aDownInterfaces[] = { { &kServiceManagerIID, &downVFTnsIServiceManager }, { &kServiceManagerObsoleteIID, &downVFTnsIServiceManagerObsolete }, { &kSupportsIID, &downVFTnsISupports }, { &kPluginManagerIID, &downVFTnsIPluginManager }, { &kPluginManager2IID, &downVFTnsIPluginManager2 }, { &kPluginInstancePeerIID, &downVFTnsIPluginInstancePeer }, { &kPluginInstancePeer2IID, &downVFTnsIPluginInstancePeer2 }, { &kPluginTagInfoIID, &downVFTnsIPluginTagInfo }, { &kPluginTagInfo2IID, &downVFTnsIPluginTagInfo2 }, { &kCookieStorageIID, &downVFTnsICookieStorage }, { &kJVMThreadManagerIID, &downVFTnsIJVMThreadManager }, { &kJVMManagerIID, &downVFTnsIJVMManager }, { &kLiveconnectIID, &downVFTnsILiveconnect }, { &kSecureLiveconnectIID, &downVFTnsISecureLiveconnect }, { &kComponentManagerIID, &downVFTnsIComponentManager }, { &kComponentManagerObsoleteIID,&downVFTnsIComponentManagerObsolete }, { &kSecurityContextIID, &downVFTnsISecurityContext }, { &kEnumeratorIID, &downVFTnsIEnumerator }, { &kFactoryIID, &downVFTnsIFactory }, { &kInputStreamIID, &downVFTnsIInputStream }, { &kOutputStreamIID, &downVFTnsIOutputStream }, { &kInterfaceRequestorIID, &downVFTnsIInterfaceRequestor }, { &kRequestIID, &downVFTnsIRequest }, { &kLoadGroupIID, &downVFTnsILoadGroup }, { &kPluginStreamInfoIID, &downVFTnsIPluginStreamInfo }, { &kRequestObserverIID, &downVFTnsIRequestObserver }, { &kSimpleEnumeratorIID, &downVFTnsISimpleEnumerator }, { &kFlashIObject7IID, &downVFTFlashIObject7 }, { &kHTTPHeaderListenerIID, &downVFTnsIHTTPHeaderListener }, { &kMemoryIID, &downVFTnsIMemory }, }; /** * Checks if the specified Interface ID is supported by the 'down' * wrappers. * * @returns Pointer to the virtual function table for the wrapper if supported. * @returns NULL if not supported. * @param aIID Reference to the Interface ID. * */ const void * downIsSupportedInterface(REFNSIID aIID) { for (unsigned iInterface = 0; iInterface < sizeof(aDownInterfaces) / sizeof(aDownInterfaces[0]); iInterface++) if (aDownInterfaces[iInterface].pIID->Equals(aIID)) return aDownInterfaces[iInterface].pvVFT; return NULL; } /** * Creates a 'down' wrapper - a wrapper object which is presented down to the * Win32 plugin. * * @returns rcOrg on success. * @returns Appropriate error message on failure. * * @param pvVFT Pointer to the wrapper VFT. * @param ppvResult Where the caller have requested the interface pointer * to be stored. * On entry this is the pointer to create wrapper for. * On exit this will point to the created wrapper. * @param rc The RC returned by the original method, this is * returned on success. */ nsresult downCreateWrapper(void **ppvResult, const void *pvVFT, nsresult rc) { DEBUG_FUNCTIONNAME(); dprintf(("%s: pvvResult=%x, pvVFT=%x, rc=%x", pszFunction, pvVFT, ppvResult, rc)); #ifdef DEBUG for (unsigned iInterface = 0; iInterface < sizeof(aDownInterfaces) / sizeof(aDownInterfaces[0]); iInterface++) if (aDownInterfaces[iInterface].pvVFT == pvVFT) { DPRINTF_NSID(*aDownInterfaces[iInterface].pIID); break; } #endif if (VALID_PTR(ppvResult)) { if (VALID_PTR(*ppvResult)) { if (pvVFT) { if (NS_SUCCEEDED(rc)) { void *pvThis = *ppvResult; /* * First check if the object returned actually is an up wrapper. */ void *pvNoWrapper = UpWrapperBase::findUpWrapper(pvThis); if (pvNoWrapper) { dprintf(("%s: COOL! pvThis(%x) is an up wrapper, no wrapping needed. returns real obj=%x", pszFunction, pvThis, pvNoWrapper)); *ppvResult = pvNoWrapper; return rc; } #if 1 //did this to minimize heap calls /* * Check if exists before trying to create one. */ DOWN_LOCK(); for (PDOWNTHIS pDown = (PDOWNTHIS)gpDownHead; pDown; pDown = (PDOWNTHIS)pDown->pNext) if (pDown->pvThis == pvThis) { if (pDown->pvVFT == pvVFT) { DOWN_UNLOCK(); dprintf(("%s: Found existing wrapper %x for %x.", pszFunction, pDown, pvThis)); *ppvResult = pDown; return rc; } } DOWN_UNLOCK(); #endif /* * Create the wrapper. * See upCreateWrapper for explanation of why this is done this way. */ PDOWNTHIS pWrapper = new DOWNTHIS; if (pWrapper) { pWrapper->initialize(pvThis, pvVFT); /* * Check if there is any existing down wrapper for this object/pvVFT. */ DOWN_LOCK(); for (PDOWNTHIS pDown = (PDOWNTHIS)gpDownHead; pDown; pDown = (PDOWNTHIS)pDown->pNext) if (pDown->pvThis == pvThis) { if (pDown->pvVFT == pvVFT) { DOWN_UNLOCK(); delete pWrapper; dprintf(("%s: Found existing wrapper %x for %x. (2)", pszFunction, pDown, pvThis)); *ppvResult = pDown; return rc; } } /* * Ok, no existing wrapper, insert the new one. */ pWrapper->pNext = gpDownHead; gpDownHead = pWrapper; DOWN_UNLOCK(); dprintf(("%s: Created wrapper %x for %x.", pszFunction, pWrapper, pvThis)); *ppvResult = pWrapper; return rc; } dprintf(("new failed!!")); rc = NS_ERROR_OUT_OF_MEMORY; } else dprintf(("%s: Passed in rc means failure, (rc=%x)", pszFunction, rc)); } else { dprintf(("%s: No VFT, that can only mean that it's an Unsupported interface!!!", pszFunction)); rc = NS_ERROR_NOT_IMPLEMENTED; ReleaseInt3(0xbaddbeef, 6, 0); } *ppvResult = nsnull; } else if (*ppvResult || rc != NS_OK) /* don't complain about the obvious.. we use this combination. */ dprintf(("%s: *ppvResult (=%p) is invalid (rc=%x)", pszFunction, *ppvResult, rc)); } else dprintf(("%s: ppvResult (=%p) is invalid (rc=%x)", pszFunction, ppvResult, rc)); return rc; } /** * Create down wrapper by Interface Id. */ nsresult downCreateWrapper(void **ppvResult, REFNSIID aIID, nsresult rc) { return downCreateWrapper(ppvResult, downIsSupportedInterface(aIID), rc); } /** * Create a JNIEnv wrapper for sending down to the plugin. * @returns rc on success * @returns rc or othere error code on failure. * @param ppJNIEnv Where to get and store the JNIEnv wrapper. * @param rc Current rc. */ int downCreateJNIEnvWrapper(JNIEnv **ppJNIEnv, int rc) { DEBUG_FUNCTIONNAME(); dprintf(("%s: ppJNIEnv=%x, rc=%x", pszFunction, ppJNIEnv, rc)); if (VALID_PTR(ppJNIEnv)) { if (VALID_PTR(*ppJNIEnv)) { if (NS_SUCCEEDED(rc)) { /* * Success! */ return rc; } else dprintf(("%s: The query method failed with rc=%x", pszFunction, rc)); *ppJNIEnv = nsnull; } else if (*ppJNIEnv || rc != NS_OK) /* don't complain about the obvious.. we use this combination. */ dprintf(("%s: *ppJNIEnv (=%p) is invalid (rc=%x)", pszFunction, *ppJNIEnv, rc)); } else dprintf(("%s: ppJNIEnv (=%p) is invalid (rc=%x)", pszFunction, ppJNIEnv, rc)); return rc; } /** * Lock the down wrapper list. */ void downLock(void) { DEBUG_FUNCTIONNAME(); if (!ghmtxDown) { int rc = DosCreateMutexSem(NULL, &ghmtxDown, 0, TRUE); if (rc) { dprintf(("%s: DosCreateMutexSem failed with rc=%d.", pszFunction, rc)); ReleaseInt3(0xdeadbee1, 0xd000, rc); } } else { int rc = DosRequestMutexSem(ghmtxDown, SEM_INDEFINITE_WAIT); if (rc) { dprintf(("%s: DosRequestMutexSem failed with rc=%d.", pszFunction, rc)); ReleaseInt3(0xdeadbee1, 0xd001, rc); } //@todo handle cases with the holder dies. } } /** * UnLock the down wrapper list. */ void downUnLock(void) { DEBUG_FUNCTIONNAME(); int rc = DosReleaseMutexSem(ghmtxDown); if (rc) { dprintf(("%s: DosRequestMutexSem failed with rc=%d.", pszFunction, rc)); ReleaseInt3(0xdeadbee1, 0xd002, rc); } //@todo handle cases with the holder dies. } //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // Misc Helpers //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// /** * Looks up the understable name corresponding to the specified nsID. * @returns name string if found. * @returns "" if not found. * @param aIIDorCID IID or CID to lookup. */ const char * getIIDCIDName(REFNSIID aIIDorCID) { for (unsigned i = 0; i < sizeof(aIDNameLookup) / sizeof(aIDNameLookup[0]); i++) if (aIDNameLookup[i].pID->Equals(aIIDorCID)) return aIDNameLookup[i].pszName; return ""; } /** * Get NSID from string. * * @returns pointer to NSID. * @returns NULL if not found. * @param aIIDorCID IID or CID to lookup. */ const nsID * getIIDCIDFromName(const char *pszStrID) { for (unsigned i = 0; i < sizeof(aIDStrIDLookup) / sizeof(aIDStrIDLookup[0]); i++) if (!stricmp(aIDStrIDLookup[i].pszStrID, pszStrID)) return aIDStrIDLookup[i].pID; return NULL; } /** * This is a hack to fix problems occuring when a plugin send the browser a non * UTF-8 when a UTF-8 string is expected. * * This is only experimental stuff. * * @param pszString String to validate and hack. * @param pszFunction Function we're called from. */ void verifyAndFixUTF8String(const char *pszString, const char *pszFunction) { /* Fix for stupid Mozilla+IBM: * The interface doesn't say UTF8, but mozilla expects it. * The IBM guys didn't check the mozilla sources and sends it * a string in the current code page. * We'll work around this by spacing out all characaters which * aren't valid UTF8. */ unsigned char *pszString2 = *(unsigned char**)((void*)&pszString); for (unsigned char *pch = pszString2; *pch; pch++) { unsigned ch = *pch; if (ch > 0x7f) { /* U-00000000 - U-0000007F: 0xxxxxxx U-00000080 - U-000007FF: 110xxxxx 10xxxxxx U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ unsigned val; unsigned min; unsigned c; unsigned i; if ((ch & 0xe0) == 0xc0) { c = 1; min = 0x80; val = ch & ~0xc0; } else if ((ch & 0xf0) == 0xe0) { c = 2; min = 0x800; val = ch & ~0xe0; } else if ((ch & 0xf8) == 0xf0) { c = 3; min = 0x1000; val = ch & ~0xf0; } else if ((ch & 0xfc) == 0xf8) { c = 4; min = 0x20000; val = ch & ~0xf8; } else if ((ch & 0xfe) == 0xfc) { c = 5; min = 0x400000; val = ch & ~0xfc; } else goto invalid; for (i = 1; i <= c; i++) { unsigned chPart = pch[i]; if ((chPart & 0xc0) != 0x80) goto invalid; val <<= 6; val |= chPart & 0x3f; } if (val < min) goto invalid; pch += c; continue; invalid: *pch = ' '; } } } //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// // Exported Generic Plugin Wrapper interfaces. //\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\//\\// nsresult npXPCOMGenericGetFactory(nsIServiceManagerObsolete *aServMgr, REFNSIID aClass, const char *aClassName, const char *aContractID, PRLibrary * aLibrary, nsIPlugin **aResult) { DEBUG_FUNCTIONNAME(); typedef nsresult (* _Optlink nsLegacyFactorProc)(PDOWNTHIS aServMgr, const nsCID &aClass, const char *aClassName, const char *aContractID, nsIPlugin **aResult); nsresult rc; nsLegacyFactorProc pfnGetFactory; dprintf(("%s: enter", pszFunction)); DPRINTF_STR(aClassName); DPRINTF_NSID(aClass); DPRINTF_CONTRACTID(aContractID); /* * find the NSGetFactory() export. */ pfnGetFactory = (nsLegacyFactorProc)PR_FindSymbol(aLibrary, "NSGetFactory"); if (!pfnGetFactory) { dprintf(("%s: Could not find NSGetFactory.", pszFunction)); return NS_ERROR_FAILURE; } /* * Make wrapper for the aServMgr argument. */ PDOWNTHIS pDownServMgr = (PDOWNTHIS)aServMgr; rc = downCreateWrapper((void**)&pDownServMgr, downIsSupportedInterface(kSupportsIID), NS_OK); if (NS_FAILED(rc)) { dprintf(("%s: NSGetFactory failed.", pszFunction)); *aResult = nsnull; return rc; } /* * Call the legacy NSGetFactory. */ rc = pfnGetFactory(pDownServMgr, aClass, aClassName, aContractID, aResult); if (NS_FAILED(rc)) { dprintf(("%s: NSGetFactory failed.", pszFunction)); *aResult = nsnull; return rc; } /* * Make wrapper for the plugin factory interface (aResult). */ dprintf(("%s: pfnNSGetFactory succeeded!", pszFunction)); rc = upCreateWrapper((void**)aResult, kPluginIID, rc); return rc; } /** * Create a wrapper for the given interface if it's a legacy interface. * @returns NS_OK on success. * @returns NS_ERROR_NO_INTERFACE if aIID isn't supported. aOut is nsnull. * @returns NS_ERROR_FAILURE on other error. aOut undefined. * @param aIID Interface Identifier of aIn and aOut. * @param aIn Interface of type aIID which may be a legacy interface * requiring a wrapper. * @param aOut The native interface. * If aIn is a legacy interface, this will be a wrappre. * If aIn is not a legacy interface, this is aIn. * @remark Typically used for the flash plugin. */ nsresult npXPCOMGenericMaybeWrap(REFNSIID aIID, nsISupports *aIn, nsISupports **aOut) { DEBUG_FUNCTIONNAME(); dprintf(("%s: Enter. aIn=%p aOut=%p", pszFunction, aIn, aOut)); DPRINTF_NSID(aIID); /* * Is this an VAC interface? * * We'll verify this by checking the AddRef(), Release() and QueryInterface() * entries of the VFT. The first two entries in the VFT is usually NULL I think, * but we don't relie on them because we don't know. We'll just check that every * second entry starting [2] is code, and every second entry starting [3] is an * not pointing to valid code. * * Code is range 0x10000 to 0xc0000000 (Damed be anyone who implements module loading * above 3GB). * */ if (!VALID_PTR(aIn)) { dprintf(("%s: Invalid aIn pointer %p!!!", pszFunction, aIn)); return NS_ERROR_FAILURE; } VFTnsISupports * pVFT = (VFTnsISupports *)(*(void**)aIn); if ( VALID_PTR(pVFT->QueryInterface) && !VALID_PTR(pVFT->uDeltaQueryInterface) && VALID_PTR(pVFT->AddRef) && !VALID_PTR(pVFT->uDeltaAddRef) && VALID_PTR(pVFT->Release) && !VALID_PTR(pVFT->uDeltaRelease) ) { dprintf(("%s: Detected VAC VFT.", pszFunction)); /* * Is the interface supported? * @todo: It seems that our flash 5 plugin doesn't do this right. * So, I'm not going to support this interface (nsIFlash) till we * know it's right or can work around the problem in a good manner. */ if (1) //if (upIsSupportedInterface(aIID)) //@todo: remove hack! { *aOut = aIn; nsresult rc = upCreateWrapper((void**)aOut, /*aIID*/ kSupportsIID, NS_OK); /* @todo: fix aIID hack */ if (NS_SUCCEEDED(rc)) { dprintf(("%s: Successfully created wrapper.", pszFunction)); } else { dprintf(("%s: failed to create wrapper for known interface!!!", pszFunction)); ReleaseInt3(0xdeadbee2, 0xdead0001, rc); return rc; } } else { dprintf(("%s: Unsupported Interface !!!", pszFunction)); *aOut = nsnull; ReleaseInt3(0xdeadbee2, aIID.m0, aIID.m1); return NS_ERROR_NO_INTERFACE; } } else { dprintf(("%s: Not a VAC VFT assuming native VFT which doesn't need wrapping!", pszFunction)); *aOut = aIn; } return NS_OK; } /** * Initiates the semaphores we use. * This function cannot fail. */ void npXPCOMInitSems(void) { DOWN_LOCK(); DOWN_UNLOCK(); UpWrapperBase::upLock(); UpWrapperBase::upUnLock(); }