michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim:expandtab:shiftwidth=2:tabstop=2: michael@0: */ 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 michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "ia2AccessibleValue.h" michael@0: michael@0: #include "AccessibleValue_i.c" michael@0: michael@0: #include "AccessibleWrap.h" michael@0: #include "Accessible-inl.h" michael@0: #include "IUnknownImpl.h" michael@0: michael@0: #include "mozilla/FloatingPoint.h" michael@0: michael@0: using namespace mozilla::a11y; michael@0: michael@0: // IUnknown michael@0: michael@0: STDMETHODIMP michael@0: ia2AccessibleValue::QueryInterface(REFIID iid, void** ppv) michael@0: { michael@0: if (!ppv) michael@0: return E_INVALIDARG; michael@0: michael@0: *ppv = nullptr; michael@0: michael@0: if (IID_IAccessibleValue == iid) { michael@0: AccessibleWrap* valueAcc = static_cast(this); michael@0: if (valueAcc->HasNumericValue()) { michael@0: *ppv = static_cast(this); michael@0: valueAcc->AddRef(); michael@0: return S_OK; michael@0: } michael@0: michael@0: return E_NOINTERFACE; michael@0: } michael@0: michael@0: return E_NOINTERFACE; michael@0: } michael@0: michael@0: // IAccessibleValue michael@0: michael@0: STDMETHODIMP michael@0: ia2AccessibleValue::get_currentValue(VARIANT* aCurrentValue) michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: if (!aCurrentValue) michael@0: return E_INVALIDARG; michael@0: michael@0: VariantInit(aCurrentValue); michael@0: michael@0: AccessibleWrap* valueAcc = static_cast(this); michael@0: if (valueAcc->IsDefunct()) michael@0: return CO_E_OBJNOTCONNECTED; michael@0: michael@0: double currentValue = valueAcc->CurValue(); michael@0: if (IsNaN(currentValue)) michael@0: return S_FALSE; michael@0: michael@0: aCurrentValue->vt = VT_R8; michael@0: aCurrentValue->dblVal = currentValue; michael@0: return S_OK; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: } michael@0: michael@0: STDMETHODIMP michael@0: ia2AccessibleValue::setCurrentValue(VARIANT aValue) michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: AccessibleWrap* valueAcc = static_cast(this); michael@0: if (valueAcc->IsDefunct()) michael@0: return CO_E_OBJNOTCONNECTED; michael@0: michael@0: if (aValue.vt != VT_R8) michael@0: return E_INVALIDARG; michael@0: michael@0: return valueAcc->SetCurValue(aValue.dblVal) ? S_OK : E_FAIL; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: } michael@0: michael@0: STDMETHODIMP michael@0: ia2AccessibleValue::get_maximumValue(VARIANT* aMaximumValue) michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: if (!aMaximumValue) michael@0: return E_INVALIDARG; michael@0: michael@0: VariantInit(aMaximumValue); michael@0: michael@0: AccessibleWrap* valueAcc = static_cast(this); michael@0: if (valueAcc->IsDefunct()) michael@0: return CO_E_OBJNOTCONNECTED; michael@0: michael@0: double maximumValue = valueAcc->MaxValue(); michael@0: if (IsNaN(maximumValue)) michael@0: return S_FALSE; michael@0: michael@0: aMaximumValue->vt = VT_R8; michael@0: aMaximumValue->dblVal = maximumValue; michael@0: return S_OK; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: } michael@0: michael@0: STDMETHODIMP michael@0: ia2AccessibleValue::get_minimumValue(VARIANT* aMinimumValue) michael@0: { michael@0: A11Y_TRYBLOCK_BEGIN michael@0: michael@0: if (!aMinimumValue) michael@0: return E_INVALIDARG; michael@0: michael@0: VariantInit(aMinimumValue); michael@0: michael@0: AccessibleWrap* valueAcc = static_cast(this); michael@0: if (valueAcc->IsDefunct()) michael@0: return CO_E_OBJNOTCONNECTED; michael@0: michael@0: double minimumValue = valueAcc->MinValue(); michael@0: if (IsNaN(minimumValue)) michael@0: return S_FALSE; michael@0: michael@0: aMinimumValue->vt = VT_R8; michael@0: aMinimumValue->dblVal = minimumValue; michael@0: return S_OK; michael@0: michael@0: A11Y_TRYBLOCK_END michael@0: } michael@0: