Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

440 lines
13 KiB

//****************************************************************************
//
// Copyright (c) 2001-2002, Microsoft Corporation
//
// File: AccessibleWrapper.cpp
//
// Copied from nt\shell\themes\themeui\SettingsPg.h
//
//****************************************************************************
#include "stdafx.h"
#include "SchedMat.h"
#include "AccessibleWrapper.h"
#include "SchedBas.h"
// Pointer to IAccessible object must not be NULL.
CAccessibleWrapper::CAccessibleWrapper (HWND hwnd, IAccessible * pAcc)
: m_ref( 1 ),
m_pAcc( pAcc ),
m_hwnd( hwnd )
{
ASSERT( m_pAcc );
m_pAcc->AddRef();
}
CAccessibleWrapper::~CAccessibleWrapper()
{
m_pAcc->Release();
}
// IUnknown
// Implement refcounting ourselves
// Also implement QI ourselves, so that we return a ptr back to the wrapper.
STDMETHODIMP CAccessibleWrapper::QueryInterface(REFIID riid, void** ppv)
{
*ppv = NULL;
if ((riid == IID_IUnknown) ||
(riid == IID_IDispatch) ||
(riid == IID_IAccessible))
{
*ppv = (IAccessible *) this;
}
else
return(E_NOINTERFACE);
AddRef();
return(NOERROR);
}
STDMETHODIMP_(ULONG) CAccessibleWrapper::AddRef()
{
return ++m_ref;
}
STDMETHODIMP_(ULONG) CAccessibleWrapper::Release()
{
ULONG ulRet = --m_ref;
if( ulRet == 0 )
delete this;
return ulRet;
}
// IDispatch
// - pass all through m_pAcc
STDMETHODIMP CAccessibleWrapper::GetTypeInfoCount(UINT* pctinfo)
{
return m_pAcc->GetTypeInfoCount(pctinfo);
}
STDMETHODIMP CAccessibleWrapper::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
return m_pAcc->GetTypeInfo(itinfo, lcid, pptinfo);
}
STDMETHODIMP CAccessibleWrapper::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames, UINT cNames,
LCID lcid, DISPID* rgdispid)
{
return m_pAcc->GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
}
STDMETHODIMP CAccessibleWrapper::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS* pdispparams, VARIANT* pvarResult, EXCEPINFO* pexcepinfo,
UINT* puArgErr)
{
return m_pAcc->Invoke(dispidMember, riid, lcid, wFlags,
pdispparams, pvarResult, pexcepinfo,
puArgErr);
}
// IAccessible
// - pass all through m_pAcc
STDMETHODIMP CAccessibleWrapper::get_accParent(IDispatch ** ppdispParent)
{
return m_pAcc->get_accParent(ppdispParent);
}
STDMETHODIMP CAccessibleWrapper::get_accChildCount(long* pChildCount)
{
return m_pAcc->get_accChildCount(pChildCount);
}
STDMETHODIMP CAccessibleWrapper::get_accChild(VARIANT varChild, IDispatch ** ppdispChild)
{
return m_pAcc->get_accChild(varChild, ppdispChild);
}
STDMETHODIMP CAccessibleWrapper::get_accName(VARIANT varChild, BSTR* pszName)
{
if ( !pszName )
return E_POINTER;
if ( VT_I4 == varChild.vt && CHILDID_SELF == varChild.lVal )
{
const size_t bufLen = 256;
WCHAR szName[bufLen];
if ( 0 == SendMessage (m_hwnd, SCHEDMSG_GETSELDESCRIPTION, bufLen,
(LPARAM) szName) )
{
*pszName = SysAllocString (szName);
if ( *pszName )
return S_OK;
else
return E_OUTOFMEMORY;
}
else
return E_FAIL;
}
else
return m_pAcc->get_accName(varChild, pszName);
}
// NOTICE-2002/02/18-artm CString methods can throw out of memory exceptions.
//
// There is not a good way to handle these exceptions at this level. The caller
// is responsible for handling these exceptions.
STDMETHODIMP CAccessibleWrapper::get_accValue(VARIANT varChild, BSTR* pszValue)
{
// varChild.lVal specifies which sub-part of the component
// is being queried.
// CHILDID_SELF (0) specifies the overall component - other
// non-0 values specify a child.
if ( !pszValue )
return E_POINTER;
if( varChild.vt == VT_I4 && varChild.lVal == CHILDID_SELF )
{
LRESULT nPercentage = SendMessage (m_hwnd, SCHEDMSG_GETPERCENTAGE,
0, 0L);
CString szValue;
// FUTURE-2002/02/18-artm Check return value from LoadString().
// The code is "okay" as is b/c a failed LoadString() sets the CString
// to the empty string (if the failure comes from not finding the resource).
// Therefore, SysAllocString() at the end of the function will return
// NULL when the resource string cannot be found, and this function
// will report E_OUTOFMEMORY.
//
// However, this behavior relies heavily on undocumented behavior of CString
// and is not immediately obvious. Should be changed in future to check the
// return values.
if ( -1 == nPercentage )
{
szValue.LoadString (IDS_MATRIX_ACC_VALUE_MULTIPLE_CELLS);
}
else
{
HWND hwndParent = GetParent (m_hwnd);
if ( hwndParent )
{
LRESULT nIDD = SendMessage (hwndParent, BASEDLGMSG_GETIDD, 0, 0);
switch ( nIDD )
{
case IDD_REPLICATION_SCHEDULE:
if ( 0 == nPercentage )
szValue.LoadString (IDS_REPLICATION_NOT_AVAILABLE);
else
szValue.LoadString (IDS_REPLICATION_AVAILABLE);
break;
case IDD_DS_SCHEDULE:
switch (nPercentage)
{
case 0:
szValue.LoadString (IDS_DO_NOT_REPLICATE);
break;
case 25:
szValue.LoadString (IDS_REPLICATE_ONCE_PER_HOUR);
break;
case 50:
szValue.LoadString (IDS_REPLICATE_TWICE_PER_HOUR);
break;
case 100:
szValue.LoadString (IDS_REPLICATE_FOUR_TIMES_PER_HOUR);
break;
default:
break;
}
break;
case IDD_DIRSYNC_SCHEDULE:
if ( 0 == nPercentage )
szValue.LoadString (IDS_DONT_SYNCHRONIZE);
else
szValue.LoadString (IDS_SYNCHRONIZE);
break;
case IDD_DIALIN_HOURS:
case IDD_LOGON_HOURS:
if ( 0 == nPercentage )
szValue.LoadString (IDS_LOGON_DENIED);
else
szValue.LoadString (IDS_LOGON_PERMITTED);
break;
default:
break;
}
}
}
*pszValue = SysAllocString (szValue);
if ( *pszValue )
return S_OK;
else
return E_OUTOFMEMORY;
}
else
{
// Pass requests about the sub-components to the
// 'original' IAccessible for us).
return m_pAcc->get_accValue(varChild, pszValue);
}
}
// NOTICE-2002/02/18-artm CString methods can throw out of memory exceptions.
//
// There is not a good way to handle these exceptions at this level. The caller
// is responsible for handling these exceptions.
STDMETHODIMP CAccessibleWrapper::get_accDescription(VARIANT varChild, BSTR* pbstrDescription)
{
if ( !pbstrDescription )
return E_POINTER;
// NTRAID#NTBUG-547327-2002/02/19-artm Need to check that have a valid pointer.
if ( varChild.vt == VT_I4 && varChild.lVal == CHILDID_SELF )
{
CString szDescription;
HWND hwndParent = GetParent (m_hwnd);
if ( hwndParent )
{
// FUTURE-2002/02/18-artm Check return value from LoadString().
// The code is "okay" as is b/c a failed LoadString() sets the CString
// to the empty string (if the failure comes from not finding the resource).
// Therefore, SysAllocString() at the end of the function will return
// NULL when the resource string cannot be found, and this function
// will report E_OUTOFMEMORY.
//
// However, this behavior relies heavily on undocumented behavior of CString
// and is not immediately obvious. Should be changed in future to check the
// return values.
LRESULT nIDD = SendMessage (hwndParent, BASEDLGMSG_GETIDD, 0, 0);
switch ( nIDD )
{
case IDD_REPLICATION_SCHEDULE:
szDescription.LoadString (IDS_REPLICATION_SCHEDULE_ACC_DESCRIPTION);
break;
case IDD_DS_SCHEDULE:
szDescription.LoadString (IDS_DS_SCHEDULE_ACC_DESCRIPTION);
break;
case IDD_DIRSYNC_SCHEDULE:
szDescription.LoadString (IDS_DIRSYNC_SCHEDULE_ACC_DESCRIPTION);
break;
case IDD_DIALIN_HOURS:
szDescription.LoadString (IDS_DIALIN_HOURS_ACC_DESCRIPTION);
break;
case IDD_LOGON_HOURS:
szDescription.LoadString (IDS_LOGON_HOURS_ACC_DESCRIPTION);
break;
default:
break;
}
}
*pbstrDescription = SysAllocString (szDescription);
if ( *pbstrDescription )
return S_OK;
else
return E_OUTOFMEMORY;
}
else
{
return m_pAcc->get_accDescription(varChild, pbstrDescription);
}
}
STDMETHODIMP CAccessibleWrapper::get_accRole(VARIANT varChild, VARIANT *pvarRole)
{
if ( !pvarRole )
return E_POINTER;
if ( VT_I4 == varChild.vt && CHILDID_SELF == varChild.lVal )
{
// reset the out variable
V_VT(pvarRole) = VT_EMPTY;
V_VT(pvarRole) = VT_I4;
V_I4(pvarRole) = ROLE_SYSTEM_TABLE;
return S_OK;
}
else
return m_pAcc->get_accRole(varChild, pvarRole);
}
STDMETHODIMP CAccessibleWrapper::get_accState(VARIANT varChild, VARIANT *pvarState)
{
if ( !pvarState )
return E_POINTER;
if ( VT_I4 == varChild.vt && CHILDID_SELF == varChild.lVal )
{
// reset the out variable
V_VT(pvarState) = VT_EMPTY;
V_VT(pvarState) = VT_I4;
V_I4(pvarState) = STATE_SYSTEM_FOCUSED | STATE_SYSTEM_FOCUSABLE |
STATE_SYSTEM_MULTISELECTABLE | STATE_SYSTEM_SELECTABLE |
STATE_SYSTEM_SELECTED;
return S_OK;
}
else
return m_pAcc->get_accState(varChild, pvarState);
}
STDMETHODIMP CAccessibleWrapper::get_accHelp(VARIANT varChild, BSTR* pszHelp)
{
return m_pAcc->get_accHelp(varChild, pszHelp);
}
STDMETHODIMP CAccessibleWrapper::get_accHelpTopic(BSTR* pszHelpFile, VARIANT varChild, long* pidTopic)
{
return m_pAcc->get_accHelpTopic(pszHelpFile, varChild, pidTopic);
}
STDMETHODIMP CAccessibleWrapper::get_accKeyboardShortcut(VARIANT varChild, BSTR* pszKeyboardShortcut)
{
return m_pAcc->get_accKeyboardShortcut(varChild, pszKeyboardShortcut);
}
STDMETHODIMP CAccessibleWrapper::get_accFocus(VARIANT * pvarFocusChild)
{
return m_pAcc->get_accFocus(pvarFocusChild);
}
STDMETHODIMP CAccessibleWrapper::get_accSelection(VARIANT * pvarSelectedChildren)
{
return m_pAcc->get_accSelection(pvarSelectedChildren);
}
STDMETHODIMP CAccessibleWrapper::get_accDefaultAction(VARIANT varChild, BSTR* pszDefaultAction)
{
return m_pAcc->get_accDefaultAction(varChild, pszDefaultAction);
}
STDMETHODIMP CAccessibleWrapper::accSelect(long flagsSel, VARIANT varChild)
{
return m_pAcc->accSelect(flagsSel, varChild);
}
STDMETHODIMP CAccessibleWrapper::accLocation(long* pxLeft, long* pyTop, long* pcxWidth, long* pcyHeight, VARIANT varChild)
{
return m_pAcc->accLocation(pxLeft, pyTop, pcxWidth, pcyHeight, varChild);
}
STDMETHODIMP CAccessibleWrapper::accNavigate(long navDir, VARIANT varStart, VARIANT * pvarEndUpAt)
{
return m_pAcc->accNavigate(navDir, varStart, pvarEndUpAt);
}
STDMETHODIMP CAccessibleWrapper::accHitTest(long xLeft, long yTop, VARIANT * pvarChildAtPoint)
{
return m_pAcc->accHitTest(xLeft, yTop, pvarChildAtPoint);
}
STDMETHODIMP CAccessibleWrapper::accDoDefaultAction(VARIANT varChild)
{
return m_pAcc->accDoDefaultAction(varChild);
}
STDMETHODIMP CAccessibleWrapper::put_accName(VARIANT varChild, BSTR szName)
{
return m_pAcc->put_accName(varChild, szName);
}
STDMETHODIMP CAccessibleWrapper::put_accValue(VARIANT varChild, BSTR pszValue)
{
return m_pAcc->put_accValue(varChild, pszValue);
}