2014-12-24 19:15:45 -06:00
// 24 december 2014
struct tableAcc {
2014-12-25 13:32:49 -06:00
IAccessibleVtbl * vtbl ;
2014-12-24 19:15:45 -06:00
ULONG refcount ;
struct table * t ;
2015-01-04 00:13:35 -06:00
IAccessible * std ;
2015-02-12 20:40:54 -06:00
2015-02-12 22:47:32 -06:00
LONG role ;
2015-02-12 20:40:54 -06:00
intptr_t row ;
intptr_t column ;
2014-12-24 19:15:45 -06:00
} ;
2015-01-03 23:54:38 -06:00
# define TA ((struct tableAcc *) this)
2014-12-24 19:55:13 -06:00
static HRESULT STDMETHODCALLTYPE tableAccQueryInterface ( IAccessible * this , REFIID riid , void * * ppvObject )
2014-12-24 19:15:45 -06:00
{
if ( ppvObject = = NULL )
return E_POINTER ;
2014-12-24 20:53:30 -06:00
if ( IsEqualIID ( riid , & IID_IUnknown ) | |
IsEqualIID ( riid , & IID_IDispatch ) | |
IsEqualIID ( riid , & IID_IAccessible ) ) {
2015-01-03 23:58:28 -06:00
// TODO figure out what pointer to use here
2015-01-03 23:54:38 -06:00
TA - > vtbl - > AddRef ( TA ) ;
2014-12-24 19:15:45 -06:00
* ppvObject = ( void * ) this ;
return S_OK ;
}
* ppvObject = NULL ;
return E_NOINTERFACE ;
}
// TODO use InterlockedIncrement()/InterlockedDecrement() for these?
2014-12-24 19:55:13 -06:00
static ULONG STDMETHODCALLTYPE tableAccAddRef ( IAccessible * this )
2014-12-24 19:15:45 -06:00
{
TA - > refcount + + ;
2014-12-25 14:56:06 -06:00
// TODO correct?
2014-12-24 19:15:45 -06:00
return TA - > refcount ;
}
2014-12-24 19:55:13 -06:00
static ULONG STDMETHODCALLTYPE tableAccRelease ( IAccessible * this )
2014-12-24 19:15:45 -06:00
{
TA - > refcount - - ;
if ( TA - > refcount = = 0 ) {
2015-01-04 00:13:35 -06:00
IAccessible_Release ( TA - > std ) ;
2015-01-03 23:58:28 -06:00
tableFree ( TA , " error freeing Table accessibility object " ) ;
2014-12-24 19:15:45 -06:00
return 0 ;
}
return TA - > refcount ;
}
2014-12-24 19:55:13 -06:00
// disregard IDispatch: http://msdn.microsoft.com/en-us/library/windows/desktop/cc307844.aspx
// TODO DISP_E_MEMBERNOTFOUND? http://blogs.msdn.com/b/saraford/archive/2004/08/20/which-controls-support-which-msaa-properties-and-how-these-controls-implement-msaa-properties.aspx
2015-01-04 01:58:13 -06:00
// TODO relegate these to the standard object?
2014-12-24 19:55:13 -06:00
static HRESULT STDMETHODCALLTYPE tableAccGetTypeInfoCount ( IAccessible * this , UINT * pctinfo )
{
if ( pctinfo = = NULL )
2014-12-24 20:27:39 -06:00
return E_INVALIDARG ;
2014-12-24 19:55:13 -06:00
// TODO assign something to *pctinfo?
return E_NOTIMPL ;
}
static HRESULT STDMETHODCALLTYPE tableAccGetTypeInfo ( IAccessible * this , UINT iTInfo , LCID lcid , ITypeInfo * * ppTInfo )
{
if ( ppTInfo = = NULL )
return E_INVALIDARG ;
* ppTInfo = NULL ;
return E_NOTIMPL ;
}
static HRESULT STDMETHODCALLTYPE tableAccGetIDsOfNames ( IAccessible * this , REFIID riid , LPOLESTR * rgszNames , UINT cNames , LCID lcid , DISPID * rgDispId )
{
// TODO verify this one
if ( rgDispId = = NULL )
return E_INVALIDARG ;
2014-12-24 20:27:39 -06:00
// TODO overwrite rgDispId?
2014-12-24 19:55:13 -06:00
return E_NOTIMPL ;
}
static HRESULT STDMETHODCALLTYPE tableAccInvoke ( IAccessible * this , DISPID dispIdMember , REFIID riid , LCID lcid , WORD wFlags , DISPPARAMS * pDispParams , VARIANT * pVarResult , EXCEPINFO * pExcepInfo , UINT * puArgErr )
{
// TODO check this one
return E_NOTIMPL ;
}
// IAccessible
static HRESULT STDMETHODCALLTYPE tableAccget_accParent ( IAccessible * this , IDispatch * * ppdispParent )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accChildCount ( IAccessible * this , long * pcountChildren )
{
2015-02-12 22:47:32 -06:00
if ( pcountChildren = = NULL )
// TODO really?
return E_POINTER ;
2015-02-12 20:40:54 -06:00
switch ( TA - > role ) {
case ROLE_SYSTEM_TABLE :
// TODO +1?
2015-02-12 22:47:32 -06:00
* pcountChildren = ( long ) ( TA - > t - > count ) ;
return S_OK ;
2015-02-12 20:40:54 -06:00
case ROLE_SYSTEM_ROW :
// TODO what to do about row 0 if +1?
2015-02-12 22:47:32 -06:00
* pcountChildren = ( long ) ( TA - > t - > nColumns ) ;
return S_OK ;
2015-02-12 20:40:54 -06:00
}
2015-02-12 22:47:32 -06:00
// TODO really?
* pcountChildren = 0 ;
return S_OK ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accChild ( IAccessible * this , VARIANT varChild , IDispatch * * ppdispChild )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accName ( IAccessible * this , VARIANT varChild , BSTR * pszName )
{
2014-12-25 13:32:49 -06:00
printf ( " tableAccget_accName() \n " ) ;
2014-12-25 08:53:45 -06:00
// TODO check pointer
if ( varChild . vt ! = VT_I4 ) {
2015-01-04 00:13:35 -06:00
printf ( " invalid arg \n " ) ;
2014-12-25 08:53:45 -06:00
* pszName = NULL ;
return E_INVALIDARG ;
}
if ( varChild . lVal = = CHILDID_SELF )
; // TODO standard accessible object
// TODO actually get the real name
2015-01-04 00:13:35 -06:00
printf ( " returning name \n " ) ;
2015-01-04 00:26:48 -06:00
* pszName = SysAllocString ( L " This is a test of the accessibility interface. " ) ;
2014-12-25 08:53:45 -06:00
// TODO check null pointer
return S_OK ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accValue ( IAccessible * this , VARIANT varChild , BSTR * pszValue )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accDescription ( IAccessible * this , VARIANT varChild , BSTR * pszDescription )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accRole ( IAccessible * this , VARIANT varChild , VARIANT * pvarRole )
{
2015-02-12 22:47:32 -06:00
LONG cid ;
2015-02-12 20:40:54 -06:00
2015-02-12 22:47:32 -06:00
if ( pvarRole = = NULL )
// TODO really?
return E_POINTER ;
if ( varChild . vt ! = VT_I4 )
goto invalid ;
cid = varChild . lVal ;
2015-02-12 20:40:54 -06:00
if ( cid = = CHILDID_SELF ) {
2015-02-12 22:47:32 -06:00
pvarRole - > vt = VT_I4 ;
pvarRole - > lVal = TA - > role ;
return S_OK ;
2015-02-12 20:40:54 -06:00
}
cid - - ;
2015-02-12 22:47:32 -06:00
if ( cid < 0 )
goto invalid ;
switch ( TA - > role ) {
case ROLE_SYSTEM_TABLE :
// TODO +1?
if ( cid > = TA - > t - > count )
goto invalid ;
pvarRole - > vt = VT_I4 ;
pvarRole - > lVal = ROLE_SYSTEM_ROW ;
return S_OK ;
case ROLE_SYSTEM_ROW :
// TODO what to do about row 0 if +1?
if ( cid > = TA - > t - > nColumns )
goto invalid ;
pvarRole - > vt = VT_I4 ;
pvarRole - > lVal = ROLE_SYSTEM_CELL ;
return S_OK ;
}
// TODO CELL?
// otherwise, fall through
invalid :
pvarRole - > vt = VT_EMPTY ;
return E_INVALIDARG ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accState ( IAccessible * this , VARIANT varChild , VARIANT * pvarState )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accHelp ( IAccessible * this , VARIANT varChild , BSTR * pszHelp )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accHelpTopic ( IAccessible * this , BSTR * pszHelpFile , VARIANT varChild , long * pidTopic )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accKeyboardShortcut ( IAccessible * this , VARIANT varChild , BSTR * pszKeyboardShortcut )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accFocus ( IAccessible * this , VARIANT * pvarChild )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accSelection ( IAccessible * this , VARIANT * pvarChildren )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccget_accDefaultAction ( IAccessible * this , VARIANT varChild , BSTR * pszDefaultAction )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccaccSelect ( IAccessible * this , long flagsSelect , VARIANT varChild )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccaccLocation ( IAccessible * this , long * pxLeft , long * pyTop , long * pcxWidth , long * pcyHeight , VARIANT varChild )
{
// TODO
2015-01-04 00:13:35 -06:00
return IAccessible_accLocation ( TA - > std , pxLeft , pyTop , pcxWidth , pcyHeight , varChild ) ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccaccNavigate ( IAccessible * this , long navDir , VARIANT varStart , VARIANT * pvarEndUpAt )
{
// TODO
2015-01-04 00:13:35 -06:00
return IAccessible_accNavigate ( TA - > std , navDir , varStart , pvarEndUpAt ) ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccaccHitTest ( IAccessible * this , long xLeft , long yTop , VARIANT * pvarChild )
{
// TODO
2015-01-04 00:13:35 -06:00
return IAccessible_accHitTest ( TA - > std , xLeft , yTop , pvarChild ) ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccaccDoDefaultAction ( IAccessible * this , VARIANT varChild )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccput_accName ( IAccessible * this , VARIANT varChild , BSTR szName )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
static HRESULT STDMETHODCALLTYPE tableAccput_accValue ( IAccessible * this , VARIANT varChild , BSTR szValue )
{
// TODO
2014-12-24 20:27:39 -06:00
return DISP_E_MEMBERNOTFOUND ;
2014-12-24 19:55:13 -06:00
}
2014-12-24 19:15:45 -06:00
static const IAccessibleVtbl tableAccVtbl = {
. QueryInterface = tableAccQueryInterface ,
. AddRef = tableAccAddRef ,
. Release = tableAccRelease ,
2014-12-24 19:55:13 -06:00
. GetTypeInfoCount = tableAccGetTypeInfoCount ,
. GetTypeInfo = tableAccGetTypeInfo ,
. GetIDsOfNames = tableAccGetIDsOfNames ,
. Invoke = tableAccInvoke ,
. get_accParent = tableAccget_accParent ,
. get_accChildCount = tableAccget_accChildCount ,
. get_accChild = tableAccget_accChild ,
. get_accName = tableAccget_accName ,
. get_accValue = tableAccget_accValue ,
. get_accDescription = tableAccget_accDescription ,
. get_accRole = tableAccget_accRole ,
. get_accState = tableAccget_accState ,
. get_accHelp = tableAccget_accHelp ,
. get_accHelpTopic = tableAccget_accHelpTopic ,
. get_accKeyboardShortcut = tableAccget_accKeyboardShortcut ,
. get_accFocus = tableAccget_accFocus ,
. get_accSelection = tableAccget_accSelection ,
. get_accDefaultAction = tableAccget_accDefaultAction ,
. accSelect = tableAccaccSelect ,
. accLocation = tableAccaccLocation ,
. accNavigate = tableAccaccNavigate ,
. accHitTest = tableAccaccHitTest ,
. accDoDefaultAction = tableAccaccDoDefaultAction ,
. put_accName = tableAccput_accName ,
. put_accValue = tableAccput_accValue ,
2014-12-24 19:15:45 -06:00
} ;
static struct tableAcc * newTableAcc ( struct table * t )
{
struct tableAcc * ta ;
2015-01-04 00:13:35 -06:00
HRESULT hr ;
IAccessible * std ;
2014-12-24 19:15:45 -06:00
ta = ( struct tableAcc * ) tableAlloc ( sizeof ( struct tableAcc ) , " error creating Table accessibility object " ) ;
2014-12-25 13:32:49 -06:00
ta - > vtbl = & tableAccVtbl ;
ta - > vtbl - > AddRef ( ta ) ;
2014-12-24 19:15:45 -06:00
ta - > t = t ;
2015-01-04 00:13:35 -06:00
hr = CreateStdAccessibleObject ( t - > hwnd , OBJID_CLIENT , & IID_IAccessible , & std ) ;
if ( hr ! = S_OK )
// TODO panichresult
panic ( " error creating standard accessible object for Table " ) ;
ta - > std = std ;
2015-02-12 20:40:54 -06:00
ta - > role = ROLE_SYSTEM_TABLE ;
ta - > row = - 1 ;
ta - > column = - 1 ;
2014-12-24 19:15:45 -06:00
return ta ;
}
static void freeTableAcc ( struct tableAcc * ta )
{
ta - > t = NULL ;
2014-12-25 13:32:49 -06:00
ta - > vtbl - > Release ( ta ) ;
2014-12-24 19:15:45 -06:00
}
HANDLER ( accessibilityHandler )
{
if ( uMsg ! = WM_GETOBJECT )
return FALSE ;
2014-12-25 13:32:49 -06:00
if ( ( ( DWORD ) lParam ) ! = OBJID_CLIENT )
2014-12-24 19:15:45 -06:00
return FALSE ;
2014-12-24 20:53:30 -06:00
* lResult = LresultFromObject ( & IID_IAccessible , wParam , t - > ta ) ;
2014-12-24 19:15:45 -06:00
// TODO check *lResult
return TRUE ;
}