michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim: set ts=2 et sw=2 tw=80: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "EnumVariant.h" michael@0: michael@0: using namespace mozilla; michael@0: using namespace mozilla::a11y; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // ChildrenEnumVariant michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: IMPL_IUNKNOWN_QUERY_HEAD(ChildrenEnumVariant) michael@0: IMPL_IUNKNOWN_QUERY_IFACE(IEnumVARIANT); michael@0: IMPL_IUNKNOWN_QUERY_IFACE(IUnknown); michael@0: IMPL_IUNKNOWN_QUERY_AGGR_COND(mAnchorAcc, !mAnchorAcc->IsDefunct()); michael@0: IMPL_IUNKNOWN_QUERY_TAIL michael@0: michael@0: STDMETHODIMP michael@0: ChildrenEnumVariant::Next(ULONG aCount, VARIANT FAR* aItems, michael@0: ULONG FAR* aCountFetched) michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: if (!aItems || !aCountFetched) michael@0: return E_INVALIDARG; michael@0: michael@0: *aCountFetched = 0; michael@0: michael@0: if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc) michael@0: return CO_E_OBJNOTCONNECTED; michael@0: michael@0: ULONG countFetched = 0; michael@0: for (; mCurAcc && countFetched < aCount; countFetched++) { michael@0: VariantInit(aItems + countFetched); michael@0: aItems[countFetched].pdispVal = AccessibleWrap::NativeAccessible(mCurAcc); michael@0: aItems[countFetched].vt = VT_DISPATCH; michael@0: michael@0: mCurIndex++; michael@0: mCurAcc = mAnchorAcc->GetChildAt(mCurIndex); michael@0: } michael@0: michael@0: (*aCountFetched) = countFetched; michael@0: michael@0: return countFetched < aCount ? S_FALSE : S_OK; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: } michael@0: michael@0: STDMETHODIMP michael@0: ChildrenEnumVariant::Skip(ULONG aCount) michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: if (mAnchorAcc->IsDefunct() || mAnchorAcc->GetChildAt(mCurIndex) != mCurAcc) michael@0: return CO_E_OBJNOTCONNECTED; michael@0: michael@0: mCurIndex += aCount; michael@0: mCurAcc = mAnchorAcc->GetChildAt(mCurIndex); michael@0: michael@0: return mCurAcc ? S_OK : S_FALSE; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: } michael@0: michael@0: STDMETHODIMP michael@0: ChildrenEnumVariant::Reset() michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: if (mAnchorAcc->IsDefunct()) michael@0: return CO_E_OBJNOTCONNECTED; michael@0: michael@0: mCurIndex = 0; michael@0: mCurAcc = mAnchorAcc->GetChildAt(0); michael@0: michael@0: return S_OK; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: } michael@0: michael@0: STDMETHODIMP michael@0: ChildrenEnumVariant::Clone(IEnumVARIANT** aEnumVariant) michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: if (!aEnumVariant) michael@0: return E_INVALIDARG; michael@0: michael@0: *aEnumVariant = new ChildrenEnumVariant(*this); michael@0: (*aEnumVariant)->AddRef(); michael@0: michael@0: return S_OK; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: }