windows-nt/Source/XPSP1/NT/enduser/windows.com/wuau/wuauclt/customlbacc.cpp
2020-09-26 16:20:57 +08:00

168 lines
3.8 KiB
C++

//=======================================================================
//
// Copyright (c) 2001 Microsoft Corporation. All Rights Reserved.
//
// File: customlbacc.cpp
//
// Creator: weiw
//
// Purpose: custom list box accessibility file
//
//=======================================================================
#include <pch.h>
#pragma hdrstop
BSTR GetMYLBItemTitle(DWORD idChild)
{
//DEBUGMSG("GetMYLBItemTitle() called");
static LPCTSTR tszDefItemTitle = _T("");
LRESULT lr = SendMessage(ghWndList, LB_GETITEMDATA, idChild, 0);
if (LB_ERR == lr)
{
return SysAllocString(tszDefItemTitle);
}
LBITEM *pItem = (LBITEM*) lr;
return SysAllocString(pItem->szTitle);
}
BSTR GetMYLBItemDesc(DWORD idChild)
{
//DEBUGMSG("GetMYLBItemDesc() called");
static LPCTSTR tszDefItemDesc = _T("");
_bstr_t bstrItemDesc;
BSTR bsRet = NULL;
LRESULT lr = SendMessage(ghWndList, LB_GETITEMDATA, idChild, 0);
try
{
if (LB_ERR == lr)
{
bstrItemDesc = _bstr_t(tszDefItemDesc);
}
else
{
LBITEM *pItem = (LBITEM*) lr;
bstrItemDesc = _bstr_t(pItem->pszDescription);
if (pItem->bRTF)
{
DEBUGMSG("GetMYLBItemDesc() Item got RTF, adding %S", gtszRTFShortcut);
bstrItemDesc += _bstr_t(gtszRTFShortcut);
}
}
bsRet = bstrItemDesc.copy();
}
catch (...)
{
DEBUGMSG("GetMYLBItemDesc() got _bstr_t exception");
}
return bsRet;
}
DWORD GetMYLBItemState(DWORD idChild)
{
//DEBUGMSG("GetMYLBItemState() called");
DWORD dwState = STATE_SYSTEM_FOCUSABLE|STATE_SYSTEM_SELECTABLE;
LRESULT lr = SendMessage(ghWndList, LB_GETITEMDATA, idChild, 0);
if (LB_ERR == lr)
{
goto done;
}
LBITEM *pItem = (LBITEM*) lr;
if (pItem->bSelect)
{
dwState |= STATE_SYSTEM_CHECKED;
}
if (idChild == gFocusItemId)
{
dwState |= STATE_SYSTEM_FOCUSED|STATE_SYSTEM_SELECTED;
}
done:
return dwState;
}
HRESULT STDMETHODCALLTYPE MYLBAccPropServer::GetPropValue (
const BYTE * pIDString,
DWORD dwIDStringLen,
MSAAPROPID idProp,
VARIANT * pvarValue,
BOOL * pfGotProp )
{
HRESULT hr = S_OK;
BOOL fHoldMYLB = FALSE;
//DEBUGMSG("MYLBAccPropServer::GetPropValue() starts");
if (NULL == pvarValue || NULL == pfGotProp)
{
hr = E_INVALIDARG;
goto done;
}
pvarValue->vt = VT_EMPTY;
*pfGotProp = FALSE;
if (!(fHoldMYLB = TryEnterCriticalSection(&gcsClient))||
! IsWindow( ghWndList ) ||
GetProp( ghWndList, MYLBALIVEPROP) != (HANDLE)TRUE )
{
DEBUGMSG("GetPropValue() MYLB is not alive any more");
hr = RPC_E_DISCONNECTED;
goto done;
}
HWND hwnd;
DWORD idObject;
DWORD idChild;
if( S_OK != m_pAccPropSvc->DecomposeHwndIdentityString( pIDString, dwIDStringLen,
& hwnd, & idObject, & idChild ) )
{
// problem decomposing identity string - return early...
goto done;
}
if( idChild != CHILDID_SELF )
{
DEBUGMSG("MYLBAccPropServer::GetPropValue() for child Id %lu", idChild);
if (PROPID_ACC_NAME == idProp)
{
pvarValue->bstrVal = GetMYLBItemTitle(idChild-1);
if (NULL == pvarValue->bstrVal)
{
goto done;
}
pvarValue->vt = VT_BSTR;
*pfGotProp = TRUE;
}
else if (PROPID_ACC_STATE == idProp)
{
pvarValue->vt = VT_I4;
pvarValue->lVal = GetMYLBItemState(idChild-1);
*pfGotProp = TRUE;
}
else if (PROPID_ACC_ROLE == idProp)
{
pvarValue->vt = VT_I4;
pvarValue->lVal = ROLE_SYSTEM_CHECKBUTTON;
*pfGotProp = TRUE;
}
else if (PROPID_ACC_DESCRIPTION == idProp)
{
pvarValue->bstrVal = GetMYLBItemDesc(idChild-1);
if (NULL == pvarValue->bstrVal)
{
goto done;
}
pvarValue->vt = VT_BSTR;
*pfGotProp = TRUE;
}
}
done:
if (fHoldMYLB)
{
LeaveCriticalSection(&gcsClient);
}
//DEBUGMSG("MYLBAccPropServer::GetPropValue() ends");
return hr;
}