1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/src/windows/ia2/ia2AccessibleValue.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,137 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim:expandtab:shiftwidth=2:tabstop=2: 1.6 + */ 1.7 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.8 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.9 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.10 + 1.11 +#include "ia2AccessibleValue.h" 1.12 + 1.13 +#include "AccessibleValue_i.c" 1.14 + 1.15 +#include "AccessibleWrap.h" 1.16 +#include "Accessible-inl.h" 1.17 +#include "IUnknownImpl.h" 1.18 + 1.19 +#include "mozilla/FloatingPoint.h" 1.20 + 1.21 +using namespace mozilla::a11y; 1.22 + 1.23 +// IUnknown 1.24 + 1.25 +STDMETHODIMP 1.26 +ia2AccessibleValue::QueryInterface(REFIID iid, void** ppv) 1.27 +{ 1.28 + if (!ppv) 1.29 + return E_INVALIDARG; 1.30 + 1.31 + *ppv = nullptr; 1.32 + 1.33 + if (IID_IAccessibleValue == iid) { 1.34 + AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this); 1.35 + if (valueAcc->HasNumericValue()) { 1.36 + *ppv = static_cast<IAccessibleValue*>(this); 1.37 + valueAcc->AddRef(); 1.38 + return S_OK; 1.39 + } 1.40 + 1.41 + return E_NOINTERFACE; 1.42 + } 1.43 + 1.44 + return E_NOINTERFACE; 1.45 +} 1.46 + 1.47 +// IAccessibleValue 1.48 + 1.49 +STDMETHODIMP 1.50 +ia2AccessibleValue::get_currentValue(VARIANT* aCurrentValue) 1.51 +{ 1.52 + A11Y_TRYBLOCK_BEGIN 1.53 + 1.54 + if (!aCurrentValue) 1.55 + return E_INVALIDARG; 1.56 + 1.57 + VariantInit(aCurrentValue); 1.58 + 1.59 + AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this); 1.60 + if (valueAcc->IsDefunct()) 1.61 + return CO_E_OBJNOTCONNECTED; 1.62 + 1.63 + double currentValue = valueAcc->CurValue(); 1.64 + if (IsNaN(currentValue)) 1.65 + return S_FALSE; 1.66 + 1.67 + aCurrentValue->vt = VT_R8; 1.68 + aCurrentValue->dblVal = currentValue; 1.69 + return S_OK; 1.70 + 1.71 + A11Y_TRYBLOCK_END 1.72 +} 1.73 + 1.74 +STDMETHODIMP 1.75 +ia2AccessibleValue::setCurrentValue(VARIANT aValue) 1.76 +{ 1.77 + A11Y_TRYBLOCK_BEGIN 1.78 + 1.79 + AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this); 1.80 + if (valueAcc->IsDefunct()) 1.81 + return CO_E_OBJNOTCONNECTED; 1.82 + 1.83 + if (aValue.vt != VT_R8) 1.84 + return E_INVALIDARG; 1.85 + 1.86 + return valueAcc->SetCurValue(aValue.dblVal) ? S_OK : E_FAIL; 1.87 + 1.88 + A11Y_TRYBLOCK_END 1.89 +} 1.90 + 1.91 +STDMETHODIMP 1.92 +ia2AccessibleValue::get_maximumValue(VARIANT* aMaximumValue) 1.93 +{ 1.94 + A11Y_TRYBLOCK_BEGIN 1.95 + 1.96 + if (!aMaximumValue) 1.97 + return E_INVALIDARG; 1.98 + 1.99 + VariantInit(aMaximumValue); 1.100 + 1.101 + AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this); 1.102 + if (valueAcc->IsDefunct()) 1.103 + return CO_E_OBJNOTCONNECTED; 1.104 + 1.105 + double maximumValue = valueAcc->MaxValue(); 1.106 + if (IsNaN(maximumValue)) 1.107 + return S_FALSE; 1.108 + 1.109 + aMaximumValue->vt = VT_R8; 1.110 + aMaximumValue->dblVal = maximumValue; 1.111 + return S_OK; 1.112 + 1.113 + A11Y_TRYBLOCK_END 1.114 +} 1.115 + 1.116 +STDMETHODIMP 1.117 +ia2AccessibleValue::get_minimumValue(VARIANT* aMinimumValue) 1.118 +{ 1.119 + A11Y_TRYBLOCK_BEGIN 1.120 + 1.121 + if (!aMinimumValue) 1.122 + return E_INVALIDARG; 1.123 + 1.124 + VariantInit(aMinimumValue); 1.125 + 1.126 + AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this); 1.127 + if (valueAcc->IsDefunct()) 1.128 + return CO_E_OBJNOTCONNECTED; 1.129 + 1.130 + double minimumValue = valueAcc->MinValue(); 1.131 + if (IsNaN(minimumValue)) 1.132 + return S_FALSE; 1.133 + 1.134 + aMinimumValue->vt = VT_R8; 1.135 + aMinimumValue->dblVal = minimumValue; 1.136 + return S_OK; 1.137 + 1.138 + A11Y_TRYBLOCK_END 1.139 +} 1.140 +