accessible/src/windows/msaa/EnumVariant.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:244d97e2bbd8
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 * You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "EnumVariant.h"
8
9 using namespace mozilla;
10 using namespace mozilla::a11y;
11
12 ////////////////////////////////////////////////////////////////////////////////
13 // ChildrenEnumVariant
14 ////////////////////////////////////////////////////////////////////////////////
15
16 IMPL_IUNKNOWN_QUERY_HEAD(ChildrenEnumVariant)
17 IMPL_IUNKNOWN_QUERY_IFACE(IEnumVARIANT);
18 IMPL_IUNKNOWN_QUERY_IFACE(IUnknown);
19 IMPL_IUNKNOWN_QUERY_AGGR_COND(mAnchorAcc, !mAnchorAcc->IsDefunct());
20 IMPL_IUNKNOWN_QUERY_TAIL
21
22 STDMETHODIMP
23 ChildrenEnumVariant::Next(ULONG aCount, VARIANT FAR* aItems,
24 ULONG FAR* aCountFetched)
25 {
26 A11Y_TRYBLOCK_BEGIN
27
28 if (!aItems || !aCountFetched)
29 return E_INVALIDARG;
30
31 *aCountFetched = 0;
32
33 if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc)
34 return CO_E_OBJNOTCONNECTED;
35
36 ULONG countFetched = 0;
37 for (; mCurAcc && countFetched < aCount; countFetched++) {
38 VariantInit(aItems + countFetched);
39 aItems[countFetched].pdispVal = AccessibleWrap::NativeAccessible(mCurAcc);
40 aItems[countFetched].vt = VT_DISPATCH;
41
42 mCurIndex++;
43 mCurAcc = mAnchorAcc->GetChildAt(mCurIndex);
44 }
45
46 (*aCountFetched) = countFetched;
47
48 return countFetched < aCount ? S_FALSE : S_OK;
49
50 A11Y_TRYBLOCK_END
51 }
52
53 STDMETHODIMP
54 ChildrenEnumVariant::Skip(ULONG aCount)
55 {
56 A11Y_TRYBLOCK_BEGIN
57
58 if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc)
59 return CO_E_OBJNOTCONNECTED;
60
61 mCurIndex += aCount;
62 mCurAcc = mAnchorAcc->GetChildAt(mCurIndex);
63
64 return mCurAcc ? S_OK : S_FALSE;
65
66 A11Y_TRYBLOCK_END
67 }
68
69 STDMETHODIMP
70 ChildrenEnumVariant::Reset()
71 {
72 A11Y_TRYBLOCK_BEGIN
73
74 if (mAnchorAcc->IsDefunct())
75 return CO_E_OBJNOTCONNECTED;
76
77 mCurIndex = 0;
78 mCurAcc = mAnchorAcc->GetChildAt(0);
79
80 return S_OK;
81
82 A11Y_TRYBLOCK_END
83 }
84
85 STDMETHODIMP
86 ChildrenEnumVariant::Clone(IEnumVARIANT** aEnumVariant)
87 {
88 A11Y_TRYBLOCK_BEGIN
89
90 if (!aEnumVariant)
91 return E_INVALIDARG;
92
93 *aEnumVariant = new ChildrenEnumVariant(*this);
94 (*aEnumVariant)->AddRef();
95
96 return S_OK;
97
98 A11Y_TRYBLOCK_END
99 }

mercurial