accessible/src/windows/ia2/ia2AccessibleValue.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:69197f06109e
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:expandtab:shiftwidth=2:tabstop=2:
3 */
4 /* This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7
8 #include "ia2AccessibleValue.h"
9
10 #include "AccessibleValue_i.c"
11
12 #include "AccessibleWrap.h"
13 #include "Accessible-inl.h"
14 #include "IUnknownImpl.h"
15
16 #include "mozilla/FloatingPoint.h"
17
18 using namespace mozilla::a11y;
19
20 // IUnknown
21
22 STDMETHODIMP
23 ia2AccessibleValue::QueryInterface(REFIID iid, void** ppv)
24 {
25 if (!ppv)
26 return E_INVALIDARG;
27
28 *ppv = nullptr;
29
30 if (IID_IAccessibleValue == iid) {
31 AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this);
32 if (valueAcc->HasNumericValue()) {
33 *ppv = static_cast<IAccessibleValue*>(this);
34 valueAcc->AddRef();
35 return S_OK;
36 }
37
38 return E_NOINTERFACE;
39 }
40
41 return E_NOINTERFACE;
42 }
43
44 // IAccessibleValue
45
46 STDMETHODIMP
47 ia2AccessibleValue::get_currentValue(VARIANT* aCurrentValue)
48 {
49 A11Y_TRYBLOCK_BEGIN
50
51 if (!aCurrentValue)
52 return E_INVALIDARG;
53
54 VariantInit(aCurrentValue);
55
56 AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this);
57 if (valueAcc->IsDefunct())
58 return CO_E_OBJNOTCONNECTED;
59
60 double currentValue = valueAcc->CurValue();
61 if (IsNaN(currentValue))
62 return S_FALSE;
63
64 aCurrentValue->vt = VT_R8;
65 aCurrentValue->dblVal = currentValue;
66 return S_OK;
67
68 A11Y_TRYBLOCK_END
69 }
70
71 STDMETHODIMP
72 ia2AccessibleValue::setCurrentValue(VARIANT aValue)
73 {
74 A11Y_TRYBLOCK_BEGIN
75
76 AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this);
77 if (valueAcc->IsDefunct())
78 return CO_E_OBJNOTCONNECTED;
79
80 if (aValue.vt != VT_R8)
81 return E_INVALIDARG;
82
83 return valueAcc->SetCurValue(aValue.dblVal) ? S_OK : E_FAIL;
84
85 A11Y_TRYBLOCK_END
86 }
87
88 STDMETHODIMP
89 ia2AccessibleValue::get_maximumValue(VARIANT* aMaximumValue)
90 {
91 A11Y_TRYBLOCK_BEGIN
92
93 if (!aMaximumValue)
94 return E_INVALIDARG;
95
96 VariantInit(aMaximumValue);
97
98 AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this);
99 if (valueAcc->IsDefunct())
100 return CO_E_OBJNOTCONNECTED;
101
102 double maximumValue = valueAcc->MaxValue();
103 if (IsNaN(maximumValue))
104 return S_FALSE;
105
106 aMaximumValue->vt = VT_R8;
107 aMaximumValue->dblVal = maximumValue;
108 return S_OK;
109
110 A11Y_TRYBLOCK_END
111 }
112
113 STDMETHODIMP
114 ia2AccessibleValue::get_minimumValue(VARIANT* aMinimumValue)
115 {
116 A11Y_TRYBLOCK_BEGIN
117
118 if (!aMinimumValue)
119 return E_INVALIDARG;
120
121 VariantInit(aMinimumValue);
122
123 AccessibleWrap* valueAcc = static_cast<AccessibleWrap*>(this);
124 if (valueAcc->IsDefunct())
125 return CO_E_OBJNOTCONNECTED;
126
127 double minimumValue = valueAcc->MinValue();
128 if (IsNaN(minimumValue))
129 return S_FALSE;
130
131 aMinimumValue->vt = VT_R8;
132 aMinimumValue->dblVal = minimumValue;
133 return S_OK;
134
135 A11Y_TRYBLOCK_END
136 }
137

mercurial