2008-05-01 14:03:36 -07:00
/* ***** 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 < mozilla @ weilbacher . org >
*
* 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 <os2.h>
# include <float.h>
/* the headers */
# include "npapi.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=<NULL> " , 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 < b > NS_OK < / b > if the interface is supported by the associated
* instance , < b > NS_NOINTERFACE < / b > if it is not .
* < b > NS_ERROR_INVALID_POINTER < / b > if < i > aInstancePtr < / i > is < b > NULL < / b > .
*/
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 ;
}
2009-01-30 00:59:26 -08:00
/**
* Drop our reference to our owner .
*/
NS_IMETHOD InvalidateOwner ( ) { return NS_ERROR_NOT_IMPLEMENTED ; }
2008-05-01 14:03:36 -07:00
/**
* 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 < other - error > 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 < other - error > 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 < other - error > 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 . < BR > < BR >
*
* @ 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 . . . < BR > < BR >
*
* @ 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 . < BR > < BR >
*
* This method is called regardless of whether the URL loaded successfully . < BR > < BR >
*
* @ 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 . < BR > < BR >
*
* @ 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 - 518 c - 11 d6 - 84 cb - 000502 9 bc257 )
* Flash version 7 r14
*/
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 - 11 cf - 96 b8 - 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:<relative-native-path> " while filenames that are not , will have
* " abs:<full-native-path> " .
*/
/* 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 < other - error > 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 < other - error > 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 < other - error > 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 < other - error > 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 < other - error > 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 . < BR > < BR >
*
* @ 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 " <unknown> " 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 " <unknown> " ;
}
/**
* 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 : 0 xxxxxxx
U - 000000 80 - U - 000007FF : 110 xxxxx 10 xxxxxx
U - 00000 800 - U - 0000FF FF : 1110 xxxx 10 xxxxxx 10 xxxxxx
U - 00010000 - U - 001FF FFF : 11110 xxx 10 xxxxxx 10 xxxxxx 10 xxxxxx
U - 00200000 - U - 03FF FFFF : 111110 xx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx
U - 04000000 - U - 7FF FFFFF : 1111110 x 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx 10 xxxxxx
*/
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 3 GB ) .
*
*/
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 ( ) ;
}