210 lines
8.6 KiB
C
210 lines
8.6 KiB
C
|
// Copyright (c) 2000-2000 Microsoft Corporation
|
||
|
|
||
|
// --------------------------------------------------------------------------
|
||
|
//
|
||
|
// wrap_base
|
||
|
//
|
||
|
// Base class for IAccessible wrapping.
|
||
|
// Derived classes implement annotation, caching, and other cool features.
|
||
|
//
|
||
|
// --------------------------------------------------------------------------
|
||
|
|
||
|
#include "fwd_macros.h"
|
||
|
|
||
|
|
||
|
// Private QI'ing to return the base IUnknown. Does not work across apartments.
|
||
|
DEFINE_GUID( IIS_AccWrapBase_GetIUnknown, 0x33f139ee, 0xe509, 0x47f7, 0xbf, 0x39, 0x83, 0x76, 0x44, 0xf7, 0x45, 0x76);
|
||
|
|
||
|
|
||
|
class AccWrap_Base: public IAccessible,
|
||
|
public IOleWindow,
|
||
|
public IEnumVARIANT,
|
||
|
public IAccIdentity,
|
||
|
public IServiceProvider
|
||
|
{
|
||
|
// We need to do our own refcounting for this wrapper object
|
||
|
ULONG m_ref;
|
||
|
|
||
|
// Need ptr to the IAccessible - also keep around ptrs to EnumVar and
|
||
|
// OleWindow as part of this object, so we can filter those interfaces
|
||
|
// and trap their QI's...
|
||
|
// ( We leave pEnumVar and OleWin as NULL until we need them )
|
||
|
IUnknown * m_pUnknown;
|
||
|
|
||
|
IAccessible * m_pAcc;
|
||
|
IEnumVARIANT * m_pEnumVar;
|
||
|
IOleWindow * m_pOleWin;
|
||
|
IAccIdentity * m_pAccID;
|
||
|
IServiceProvider * m_pSvcPdr;
|
||
|
|
||
|
DWORD m_QIMask; // Remembers what we've QI'd for, so we don't try again
|
||
|
|
||
|
|
||
|
ITypeInfo * m_pTypeInfo;
|
||
|
|
||
|
|
||
|
HRESULT InitTypeInfo();
|
||
|
|
||
|
|
||
|
// These process [out] params, and wrap them where necessary.
|
||
|
|
||
|
HRESULT ProcessIUnknown( IUnknown ** ppUnk );
|
||
|
HRESULT ProcessIDispatch( IDispatch ** ppdisp );
|
||
|
HRESULT ProcessIEnumVARIANT( IEnumVARIANT ** ppEnum );
|
||
|
HRESULT ProcessVariant( VARIANT * pvar, BOOL CanBeCollection = FALSE );
|
||
|
HRESULT ProcessEnum( VARIANT * pvar, ULONG * pceltFetched );
|
||
|
|
||
|
IUnknown * Wrap( IUnknown * pUnk );
|
||
|
|
||
|
HRESULT CheckForInterface( IUnknown * punk, REFIID riid, int QIIndex, void ** pDst );
|
||
|
|
||
|
protected:
|
||
|
|
||
|
// Only derived classes should have access to this - sould call through
|
||
|
// in their ctors.
|
||
|
AccWrap_Base( IUnknown * pUnk );
|
||
|
|
||
|
public:
|
||
|
|
||
|
|
||
|
static BOOL AlreadyWrapped( IUnknown * punk );
|
||
|
|
||
|
|
||
|
virtual ~AccWrap_Base( );
|
||
|
|
||
|
|
||
|
|
||
|
// Override in derived classes so that propogated values get wrapped appropriately.
|
||
|
virtual IUnknown * WrapFactory( IUnknown * pUnk ) = 0;
|
||
|
|
||
|
|
||
|
|
||
|
// IUnknown
|
||
|
// ( We do our own ref counting )
|
||
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, void ** ppv );
|
||
|
virtual ULONG STDMETHODCALLTYPE AddRef( );
|
||
|
virtual ULONG STDMETHODCALLTYPE Release( );
|
||
|
|
||
|
// IServiceProvider
|
||
|
virtual HRESULT STDMETHODCALLTYPE QueryService( REFGUID guidService, REFIID riid, void **ppv );
|
||
|
|
||
|
// IDispatch
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( UINT * pctinfo );
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( UINT itinfo, LCID lcid, ITypeInfo ** pptinfo );
|
||
|
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( REFIID riid, OLECHAR ** rgszNames, UINT cNames,
|
||
|
LCID lcid, DISPID * rgdispid );
|
||
|
virtual HRESULT STDMETHODCALLTYPE Invoke( DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
|
||
|
DISPPARAMS * pdispparams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo,
|
||
|
UINT * puArgErr );
|
||
|
|
||
|
|
||
|
|
||
|
// Forwarding macro:
|
||
|
//
|
||
|
// ptr is the member pointer to forward this call though - a different
|
||
|
// one is used for each interface we support,
|
||
|
//
|
||
|
// name is the name of the method,
|
||
|
//
|
||
|
// c, params are the count of parameters, and the parameters; in (type1,var1,
|
||
|
// type2,var2...typeN,varN) format.
|
||
|
//
|
||
|
// expr is an expression to evaluate after making the forwarded call. It
|
||
|
// will typically contain a call to one of the methods to fixup and
|
||
|
// wrap any outgoing params. Will be 0 (no-op) if not needed.
|
||
|
|
||
|
#define FORWARD( ptr, name, c, params, expr ) /**/\
|
||
|
HRESULT STDMETHODCALLTYPE AccWrap_Base:: name AS_DECL( c, params )\
|
||
|
{\
|
||
|
HRESULT hr = ptr -> name AS_CALL( c, params );\
|
||
|
if( hr != S_OK )\
|
||
|
return hr;\
|
||
|
expr;\
|
||
|
return hr;\
|
||
|
}
|
||
|
|
||
|
|
||
|
// IAccessible
|
||
|
|
||
|
FORWARD( m_pAcc, get_accParent, 1, ( IDispatch **, ppdispParent ), ProcessIDispatch( ppdispParent ) )
|
||
|
|
||
|
FORWARD( m_pAcc, get_accChildCount, 1, ( long *, pChildCount ), 0 )
|
||
|
|
||
|
FORWARD( m_pAcc, get_accChild, 2, ( VARIANT, varChild,
|
||
|
IDispatch **, ppdispChild ), ProcessIDispatch( ppdispChild ) )
|
||
|
|
||
|
|
||
|
FORWARD( m_pAcc, get_accName, 2, ( VARIANT, varChild, BSTR *, pbstr ), 0 )
|
||
|
FORWARD( m_pAcc, get_accValue, 2, ( VARIANT, varChild, BSTR *, pbstr ), 0 )
|
||
|
FORWARD( m_pAcc, get_accDescription, 2, ( VARIANT, varChild, BSTR *, pbstr ), 0 )
|
||
|
FORWARD( m_pAcc, get_accHelp, 2, ( VARIANT, varChild, BSTR *, pbstr ), 0 )
|
||
|
FORWARD( m_pAcc, get_accKeyboardShortcut, 2, ( VARIANT, varChild, BSTR *, pbstr ), 0 )
|
||
|
FORWARD( m_pAcc, get_accDefaultAction, 2, ( VARIANT, varChild, BSTR *, pbstr ), 0 )
|
||
|
|
||
|
FORWARD( m_pAcc, get_accRole, 2, ( VARIANT, varChild, VARIANT *, pvarRole ), 0 )
|
||
|
FORWARD( m_pAcc, get_accState, 2, ( VARIANT, varChild, VARIANT *, pvarState ), 0 )
|
||
|
|
||
|
FORWARD( m_pAcc, get_accHelpTopic, 3, ( BSTR *, pszHelpFile,
|
||
|
VARIANT, varChild,
|
||
|
long *, pidTopic ), 0 )
|
||
|
|
||
|
|
||
|
FORWARD( m_pAcc, get_accFocus, 1, ( VARIANT *, pvarChild ), ProcessVariant( pvarChild ) )
|
||
|
|
||
|
FORWARD( m_pAcc, get_accSelection, 1, ( VARIANT *, pvarChildren ), ProcessVariant( pvarChildren, TRUE ) )
|
||
|
|
||
|
FORWARD( m_pAcc, accSelect, 2, ( long, flagsSel,
|
||
|
VARIANT, varChild ), 0 )
|
||
|
|
||
|
FORWARD( m_pAcc, accLocation, 5, ( long *, pxLeft,
|
||
|
long *, pyTop,
|
||
|
long *, pcxWidth,
|
||
|
long *, pcyHeight,
|
||
|
VARIANT, varChild ), 0 )
|
||
|
|
||
|
FORWARD( m_pAcc, accNavigate, 3, ( long, navDir,
|
||
|
VARIANT, varStart,
|
||
|
VARIANT *, pvarEndUpAt ), ProcessVariant( pvarEndUpAt ) )
|
||
|
|
||
|
FORWARD( m_pAcc, accHitTest, 3, ( long, xLeft,
|
||
|
long, yTop,
|
||
|
VARIANT *, pvarChildAtPoint ), ProcessVariant( pvarChildAtPoint ) )
|
||
|
|
||
|
FORWARD( m_pAcc, accDoDefaultAction, 1, ( VARIANT, varChild ), 0 )
|
||
|
|
||
|
FORWARD( m_pAcc, put_accName, 2, ( VARIANT, varChild,
|
||
|
BSTR, bstr ), 0 )
|
||
|
|
||
|
FORWARD( m_pAcc, put_accValue, 2, ( VARIANT, varChild,
|
||
|
BSTR, bstr ), 0 )
|
||
|
|
||
|
|
||
|
// IEnumVARIANT
|
||
|
|
||
|
FORWARD( m_pEnumVar, Next, 3, ( ULONG, celt,
|
||
|
VARIANT *, rgvar,
|
||
|
ULONG *, pceltFetched ), ProcessEnum( rgvar, pceltFetched ) )
|
||
|
|
||
|
FORWARD( m_pEnumVar, Skip, 1, ( ULONG, celt ), 0 )
|
||
|
|
||
|
|
||
|
FORWARD( m_pEnumVar, Reset, 0, ( ), 0 )
|
||
|
|
||
|
|
||
|
FORWARD( m_pEnumVar, Clone, 1, ( IEnumVARIANT **, ppenum ), ProcessIEnumVARIANT( ppenum ) )
|
||
|
|
||
|
|
||
|
// IOleWindow
|
||
|
|
||
|
FORWARD( m_pOleWin, GetWindow, 1, ( HWND *, phwnd ), 0 )
|
||
|
|
||
|
FORWARD( m_pOleWin, ContextSensitiveHelp, 1, ( BOOL, fEnterMode ), 0 )
|
||
|
|
||
|
|
||
|
// IAccIdentity
|
||
|
|
||
|
FORWARD( m_pAccID, GetIdentityString, 3, ( DWORD, dwIDChild,
|
||
|
BYTE **, ppIDString,
|
||
|
DWORD *, pdwIDStringLen ), 0 )
|
||
|
};
|