1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/src/windows/msaa/EnumVariant.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,99 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim: set ts=2 et sw=2 tw=80: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.8 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "EnumVariant.h" 1.11 + 1.12 +using namespace mozilla; 1.13 +using namespace mozilla::a11y; 1.14 + 1.15 +//////////////////////////////////////////////////////////////////////////////// 1.16 +// ChildrenEnumVariant 1.17 +//////////////////////////////////////////////////////////////////////////////// 1.18 + 1.19 +IMPL_IUNKNOWN_QUERY_HEAD(ChildrenEnumVariant) 1.20 +IMPL_IUNKNOWN_QUERY_IFACE(IEnumVARIANT); 1.21 +IMPL_IUNKNOWN_QUERY_IFACE(IUnknown); 1.22 +IMPL_IUNKNOWN_QUERY_AGGR_COND(mAnchorAcc, !mAnchorAcc->IsDefunct()); 1.23 +IMPL_IUNKNOWN_QUERY_TAIL 1.24 + 1.25 +STDMETHODIMP 1.26 +ChildrenEnumVariant::Next(ULONG aCount, VARIANT FAR* aItems, 1.27 + ULONG FAR* aCountFetched) 1.28 +{ 1.29 + A11Y_TRYBLOCK_BEGIN 1.30 + 1.31 + if (!aItems || !aCountFetched) 1.32 + return E_INVALIDARG; 1.33 + 1.34 + *aCountFetched = 0; 1.35 + 1.36 + if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc) 1.37 + return CO_E_OBJNOTCONNECTED; 1.38 + 1.39 + ULONG countFetched = 0; 1.40 + for (; mCurAcc && countFetched < aCount; countFetched++) { 1.41 + VariantInit(aItems + countFetched); 1.42 + aItems[countFetched].pdispVal = AccessibleWrap::NativeAccessible(mCurAcc); 1.43 + aItems[countFetched].vt = VT_DISPATCH; 1.44 + 1.45 + mCurIndex++; 1.46 + mCurAcc = mAnchorAcc->GetChildAt(mCurIndex); 1.47 + } 1.48 + 1.49 + (*aCountFetched) = countFetched; 1.50 + 1.51 + return countFetched < aCount ? S_FALSE : S_OK; 1.52 + 1.53 + A11Y_TRYBLOCK_END 1.54 +} 1.55 + 1.56 +STDMETHODIMP 1.57 +ChildrenEnumVariant::Skip(ULONG aCount) 1.58 +{ 1.59 + A11Y_TRYBLOCK_BEGIN 1.60 + 1.61 + if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc) 1.62 + return CO_E_OBJNOTCONNECTED; 1.63 + 1.64 + mCurIndex += aCount; 1.65 + mCurAcc = mAnchorAcc->GetChildAt(mCurIndex); 1.66 + 1.67 + return mCurAcc ? S_OK : S_FALSE; 1.68 + 1.69 + A11Y_TRYBLOCK_END 1.70 +} 1.71 + 1.72 +STDMETHODIMP 1.73 +ChildrenEnumVariant::Reset() 1.74 +{ 1.75 + A11Y_TRYBLOCK_BEGIN 1.76 + 1.77 + if (mAnchorAcc->IsDefunct()) 1.78 + return CO_E_OBJNOTCONNECTED; 1.79 + 1.80 + mCurIndex = 0; 1.81 + mCurAcc = mAnchorAcc->GetChildAt(0); 1.82 + 1.83 + return S_OK; 1.84 + 1.85 + A11Y_TRYBLOCK_END 1.86 +} 1.87 + 1.88 +STDMETHODIMP 1.89 +ChildrenEnumVariant::Clone(IEnumVARIANT** aEnumVariant) 1.90 +{ 1.91 + A11Y_TRYBLOCK_BEGIN 1.92 + 1.93 + if (!aEnumVariant) 1.94 + return E_INVALIDARG; 1.95 + 1.96 + *aEnumVariant = new ChildrenEnumVariant(*this); 1.97 + (*aEnumVariant)->AddRef(); 1.98 + 1.99 + return S_OK; 1.100 + 1.101 + A11Y_TRYBLOCK_END 1.102 +}