1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_unotools.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include "unotools/accessiblestatesethelper.hxx"
29*b1cdbd2cSJim Jagielski #include <rtl/uuid.h>
30*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #if 0
33*b1cdbd2cSJim Jagielski #include <bitset>
34*b1cdbd2cSJim Jagielski #endif
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski // defines how many states the bitfield can contain
37*b1cdbd2cSJim Jagielski // it has the size of 64 because I use a uInt64
38*b1cdbd2cSJim Jagielski #define BITFIELDSIZE 64
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski using namespace	::utl;
41*b1cdbd2cSJim Jagielski using namespace	::rtl;
42*b1cdbd2cSJim Jagielski using namespace	::com::sun::star;
43*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::accessibility;
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski class AccessibleStateSetHelperImpl
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski public:
48*b1cdbd2cSJim Jagielski 	AccessibleStateSetHelperImpl();
49*b1cdbd2cSJim Jagielski 	AccessibleStateSetHelperImpl(const AccessibleStateSetHelperImpl& rImpl);
50*b1cdbd2cSJim Jagielski 	~AccessibleStateSetHelperImpl();
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski 	sal_Bool IsEmpty ()
53*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException);
54*b1cdbd2cSJim Jagielski 	sal_Bool Contains (sal_Int16 aState)
55*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException);
56*b1cdbd2cSJim Jagielski     uno::Sequence<sal_Int16> GetStates()
57*b1cdbd2cSJim Jagielski         throw (uno::RuntimeException);
58*b1cdbd2cSJim Jagielski 	void AddState(sal_Int16 aState)
59*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException);
60*b1cdbd2cSJim Jagielski 	void RemoveState(sal_Int16 aState)
61*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException);
62*b1cdbd2cSJim Jagielski 	sal_Bool Compare(const AccessibleStateSetHelperImpl* pComparativeValue,
63*b1cdbd2cSJim Jagielski 						AccessibleStateSetHelperImpl* pOldStates,
64*b1cdbd2cSJim Jagielski 						AccessibleStateSetHelperImpl* pNewStates)
65*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException);
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 	inline void	AddStates( const sal_Int64 _nStates ) SAL_THROW( ( ) );
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski private:
70*b1cdbd2cSJim Jagielski #if 0
71*b1cdbd2cSJim Jagielski 	::std::bitset<BITFIELDSIZE> maStates; //Bitfield
72*b1cdbd2cSJim Jagielski #endif
73*b1cdbd2cSJim Jagielski 	sal_uInt64 maStates;
74*b1cdbd2cSJim Jagielski };
75*b1cdbd2cSJim Jagielski 
AccessibleStateSetHelperImpl()76*b1cdbd2cSJim Jagielski AccessibleStateSetHelperImpl::AccessibleStateSetHelperImpl()
77*b1cdbd2cSJim Jagielski 	: maStates(0)
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski }
80*b1cdbd2cSJim Jagielski 
AccessibleStateSetHelperImpl(const AccessibleStateSetHelperImpl & rImpl)81*b1cdbd2cSJim Jagielski AccessibleStateSetHelperImpl::AccessibleStateSetHelperImpl(const AccessibleStateSetHelperImpl& rImpl)
82*b1cdbd2cSJim Jagielski 	: maStates(rImpl.maStates)
83*b1cdbd2cSJim Jagielski {
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski 
~AccessibleStateSetHelperImpl()86*b1cdbd2cSJim Jagielski AccessibleStateSetHelperImpl::~AccessibleStateSetHelperImpl()
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski 
IsEmpty()90*b1cdbd2cSJim Jagielski inline sal_Bool AccessibleStateSetHelperImpl::IsEmpty ()
91*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski #if 0
94*b1cdbd2cSJim Jagielski 	return maStates.none();
95*b1cdbd2cSJim Jagielski #endif
96*b1cdbd2cSJim Jagielski 	return maStates == 0;
97*b1cdbd2cSJim Jagielski }
98*b1cdbd2cSJim Jagielski 
Contains(sal_Int16 aState)99*b1cdbd2cSJim Jagielski inline sal_Bool AccessibleStateSetHelperImpl::Contains (sal_Int16 aState)
100*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
101*b1cdbd2cSJim Jagielski {
102*b1cdbd2cSJim Jagielski 	DBG_ASSERT(aState < BITFIELDSIZE, "the statesset is too small");
103*b1cdbd2cSJim Jagielski #if 0
104*b1cdbd2cSJim Jagielski 	return maStates.test(aState);
105*b1cdbd2cSJim Jagielski #endif
106*b1cdbd2cSJim Jagielski 	sal_uInt64 aTempBitSet(1);
107*b1cdbd2cSJim Jagielski 	aTempBitSet <<= aState;
108*b1cdbd2cSJim Jagielski 	return ((aTempBitSet & maStates) != 0);
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski 
GetStates()111*b1cdbd2cSJim Jagielski inline uno::Sequence<sal_Int16> AccessibleStateSetHelperImpl::GetStates()
112*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
113*b1cdbd2cSJim Jagielski {
114*b1cdbd2cSJim Jagielski     uno::Sequence<sal_Int16> aRet(BITFIELDSIZE);
115*b1cdbd2cSJim Jagielski     sal_Int16* pSeq = aRet.getArray();
116*b1cdbd2cSJim Jagielski     sal_Int16 nStateCount(0);
117*b1cdbd2cSJim Jagielski     for (sal_Int16 i = 0; i < BITFIELDSIZE; ++i)
118*b1cdbd2cSJim Jagielski         if (Contains(i))
119*b1cdbd2cSJim Jagielski         {
120*b1cdbd2cSJim Jagielski             *pSeq = i;
121*b1cdbd2cSJim Jagielski             ++pSeq;
122*b1cdbd2cSJim Jagielski             ++nStateCount;
123*b1cdbd2cSJim Jagielski         }
124*b1cdbd2cSJim Jagielski     aRet.realloc(nStateCount);
125*b1cdbd2cSJim Jagielski     return aRet;
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
AddStates(const sal_Int64 _nStates)128*b1cdbd2cSJim Jagielski inline void AccessibleStateSetHelperImpl::AddStates( const sal_Int64 _nStates ) SAL_THROW( ( ) )
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski 	maStates |= _nStates;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski 
AddState(sal_Int16 aState)133*b1cdbd2cSJim Jagielski inline void AccessibleStateSetHelperImpl::AddState(sal_Int16 aState)
134*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	DBG_ASSERT(aState < BITFIELDSIZE, "the statesset is too small");
137*b1cdbd2cSJim Jagielski #if 0
138*b1cdbd2cSJim Jagielski 	maStates.set(aState);
139*b1cdbd2cSJim Jagielski #endif
140*b1cdbd2cSJim Jagielski 	sal_uInt64 aTempBitSet(1);
141*b1cdbd2cSJim Jagielski 	aTempBitSet <<= aState;
142*b1cdbd2cSJim Jagielski 	maStates |= aTempBitSet;
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
RemoveState(sal_Int16 aState)145*b1cdbd2cSJim Jagielski inline void AccessibleStateSetHelperImpl::RemoveState(sal_Int16 aState)
146*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski 	DBG_ASSERT(aState < BITFIELDSIZE, "the statesset is too small");
149*b1cdbd2cSJim Jagielski #if 0
150*b1cdbd2cSJim Jagielski 	maStates.set(aState, 0);
151*b1cdbd2cSJim Jagielski #endif
152*b1cdbd2cSJim Jagielski 	sal_uInt64 aTempBitSet(1);
153*b1cdbd2cSJim Jagielski 	aTempBitSet <<= aState;
154*b1cdbd2cSJim Jagielski 	aTempBitSet = ~aTempBitSet;
155*b1cdbd2cSJim Jagielski 	maStates &= aTempBitSet;
156*b1cdbd2cSJim Jagielski }
157*b1cdbd2cSJim Jagielski 
Compare(const AccessibleStateSetHelperImpl * pComparativeValue,AccessibleStateSetHelperImpl * pOldStates,AccessibleStateSetHelperImpl * pNewStates)158*b1cdbd2cSJim Jagielski inline sal_Bool AccessibleStateSetHelperImpl::Compare(
159*b1cdbd2cSJim Jagielski 	const AccessibleStateSetHelperImpl* pComparativeValue,
160*b1cdbd2cSJim Jagielski 		AccessibleStateSetHelperImpl* pOldStates,
161*b1cdbd2cSJim Jagielski 		AccessibleStateSetHelperImpl* pNewStates)
162*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski 	sal_Bool bResult(sal_False);
165*b1cdbd2cSJim Jagielski 	if (pComparativeValue && pOldStates && pNewStates)
166*b1cdbd2cSJim Jagielski 	{
167*b1cdbd2cSJim Jagielski 		if (maStates == pComparativeValue->maStates)
168*b1cdbd2cSJim Jagielski 			bResult = sal_True;
169*b1cdbd2cSJim Jagielski 		else
170*b1cdbd2cSJim Jagielski 		{
171*b1cdbd2cSJim Jagielski #if 0
172*b1cdbd2cSJim Jagielski 			std::bitset<BITFIELDSIZE> aTempBitSet(maStates);
173*b1cdbd2cSJim Jagielski #endif
174*b1cdbd2cSJim Jagielski 			sal_uInt64 aTempBitSet(maStates);
175*b1cdbd2cSJim Jagielski 			aTempBitSet ^= pComparativeValue->maStates;
176*b1cdbd2cSJim Jagielski 			pOldStates->maStates = aTempBitSet;
177*b1cdbd2cSJim Jagielski 			pOldStates->maStates &= maStates;
178*b1cdbd2cSJim Jagielski 			pNewStates->maStates = aTempBitSet;
179*b1cdbd2cSJim Jagielski 			pNewStates->maStates &= pComparativeValue->maStates;
180*b1cdbd2cSJim Jagielski 		}
181*b1cdbd2cSJim Jagielski 	}
182*b1cdbd2cSJim Jagielski 	return bResult;
183*b1cdbd2cSJim Jagielski }
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski //=====  internal  ============================================================
187*b1cdbd2cSJim Jagielski 
AccessibleStateSetHelper()188*b1cdbd2cSJim Jagielski AccessibleStateSetHelper::AccessibleStateSetHelper ()
189*b1cdbd2cSJim Jagielski 	: mpHelperImpl(NULL)
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski 	mpHelperImpl = new AccessibleStateSetHelperImpl();
192*b1cdbd2cSJim Jagielski }
193*b1cdbd2cSJim Jagielski 
AccessibleStateSetHelper(const sal_Int64 _nInitialStates)194*b1cdbd2cSJim Jagielski AccessibleStateSetHelper::AccessibleStateSetHelper ( const sal_Int64 _nInitialStates )
195*b1cdbd2cSJim Jagielski 	: mpHelperImpl(NULL)
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	mpHelperImpl = new AccessibleStateSetHelperImpl();
198*b1cdbd2cSJim Jagielski 	mpHelperImpl->AddStates( _nInitialStates );
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski 
AccessibleStateSetHelper(const AccessibleStateSetHelper & rHelper)201*b1cdbd2cSJim Jagielski AccessibleStateSetHelper::AccessibleStateSetHelper (const AccessibleStateSetHelper& rHelper)
202*b1cdbd2cSJim Jagielski 	: cppu::WeakImplHelper1<XAccessibleStateSet>()
203*b1cdbd2cSJim Jagielski     , mpHelperImpl(NULL)
204*b1cdbd2cSJim Jagielski {
205*b1cdbd2cSJim Jagielski 	if (rHelper.mpHelperImpl)
206*b1cdbd2cSJim Jagielski 		mpHelperImpl = new AccessibleStateSetHelperImpl(*rHelper.mpHelperImpl);
207*b1cdbd2cSJim Jagielski 	else
208*b1cdbd2cSJim Jagielski 		mpHelperImpl = new AccessibleStateSetHelperImpl();
209*b1cdbd2cSJim Jagielski }
210*b1cdbd2cSJim Jagielski 
~AccessibleStateSetHelper(void)211*b1cdbd2cSJim Jagielski AccessibleStateSetHelper::~AccessibleStateSetHelper(void)
212*b1cdbd2cSJim Jagielski {
213*b1cdbd2cSJim Jagielski 	delete mpHelperImpl;
214*b1cdbd2cSJim Jagielski }
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski //=====  XAccessibleStateSet  ==============================================
217*b1cdbd2cSJim Jagielski 
218*b1cdbd2cSJim Jagielski     /** Checks whether the current state set is empty.
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski         @return
221*b1cdbd2cSJim Jagielski             Returns <TRUE/> if there is no state in this state set and
222*b1cdbd2cSJim Jagielski             <FALSE/> if there is at least one state set in it.
223*b1cdbd2cSJim Jagielski     */
isEmpty()224*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleStateSetHelper::isEmpty ()
225*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard (maMutex);
228*b1cdbd2cSJim Jagielski 	return mpHelperImpl->IsEmpty();
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski     /** Checks if the given state is a member of the state set of this
232*b1cdbd2cSJim Jagielski         object.
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski         @param aState
235*b1cdbd2cSJim Jagielski             The state for which to check membership.  This has to be one of
236*b1cdbd2cSJim Jagielski             the constants of <type>AccessibleStateType</type>.
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski         @return
239*b1cdbd2cSJim Jagielski             Returns <TRUE/> if the given state is a memeber of this object's
240*b1cdbd2cSJim Jagielski             state set and <FALSE/> otherwise.
241*b1cdbd2cSJim Jagielski     */
contains(sal_Int16 aState)242*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleStateSetHelper::contains (sal_Int16 aState)
243*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard (maMutex);
246*b1cdbd2cSJim Jagielski 	return mpHelperImpl->Contains(aState);
247*b1cdbd2cSJim Jagielski }
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski     /** Checks if all of the given states are in this object's state
250*b1cdbd2cSJim Jagielski         set.
251*b1cdbd2cSJim Jagielski 
252*b1cdbd2cSJim Jagielski         @param aStateSet
253*b1cdbd2cSJim Jagielski             This sequence of states is interpreted as set and every of its
254*b1cdbd2cSJim Jagielski             members, duplicates are ignored, is checked for membership in
255*b1cdbd2cSJim Jagielski             this object's state set.  Each state has to be one of the
256*b1cdbd2cSJim Jagielski             constants of <type>AccessibleStateType</type>.
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski         @return
259*b1cdbd2cSJim Jagielski             Returns <TRUE/> if all states of the given state set are members
260*b1cdbd2cSJim Jagielski             of this object's state set.  <FALSE/> is returned if at least
261*b1cdbd2cSJim Jagielski             one of the states in the given state is not a member of this
262*b1cdbd2cSJim Jagielski             object's state set.
263*b1cdbd2cSJim Jagielski     */
containsAll(const uno::Sequence<sal_Int16> & rStateSet)264*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleStateSetHelper::containsAll
265*b1cdbd2cSJim Jagielski 	(const uno::Sequence<sal_Int16>& rStateSet)
266*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
267*b1cdbd2cSJim Jagielski {
268*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard (maMutex);
269*b1cdbd2cSJim Jagielski 	sal_Int32 nCount(rStateSet.getLength());
270*b1cdbd2cSJim Jagielski 	const sal_Int16* pStates = rStateSet.getConstArray();
271*b1cdbd2cSJim Jagielski 	sal_Int32 i = 0;
272*b1cdbd2cSJim Jagielski 	sal_Bool bFound(sal_True);
273*b1cdbd2cSJim Jagielski 	while (i < nCount)
274*b1cdbd2cSJim Jagielski 	{
275*b1cdbd2cSJim Jagielski 		bFound = mpHelperImpl->Contains(pStates[i]);
276*b1cdbd2cSJim Jagielski 		i++;
277*b1cdbd2cSJim Jagielski 	}
278*b1cdbd2cSJim Jagielski 	return bFound;
279*b1cdbd2cSJim Jagielski }
280*b1cdbd2cSJim Jagielski 
getStates()281*b1cdbd2cSJim Jagielski uno::Sequence<sal_Int16> SAL_CALL AccessibleStateSetHelper::getStates()
282*b1cdbd2cSJim Jagielski     throw (uno::RuntimeException)
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard(maMutex);
285*b1cdbd2cSJim Jagielski     return mpHelperImpl->GetStates();
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski 
AddState(sal_Int16 aState)288*b1cdbd2cSJim Jagielski void AccessibleStateSetHelper::AddState(sal_Int16 aState)
289*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
290*b1cdbd2cSJim Jagielski {
291*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard (maMutex);
292*b1cdbd2cSJim Jagielski 	mpHelperImpl->AddState(aState);
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
RemoveState(sal_Int16 aState)295*b1cdbd2cSJim Jagielski void AccessibleStateSetHelper::RemoveState(sal_Int16 aState)
296*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
297*b1cdbd2cSJim Jagielski {
298*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard (maMutex);
299*b1cdbd2cSJim Jagielski 	mpHelperImpl->RemoveState(aState);
300*b1cdbd2cSJim Jagielski }
301*b1cdbd2cSJim Jagielski 
Compare(const AccessibleStateSetHelper & rComparativeValue,AccessibleStateSetHelper & rOldStates,AccessibleStateSetHelper & rNewStates)302*b1cdbd2cSJim Jagielski sal_Bool AccessibleStateSetHelper::Compare(
303*b1cdbd2cSJim Jagielski 	const AccessibleStateSetHelper& rComparativeValue,
304*b1cdbd2cSJim Jagielski 		AccessibleStateSetHelper& rOldStates,
305*b1cdbd2cSJim Jagielski 		AccessibleStateSetHelper& rNewStates)
306*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard (maMutex);
309*b1cdbd2cSJim Jagielski 	return mpHelperImpl->Compare(rComparativeValue.mpHelperImpl,
310*b1cdbd2cSJim Jagielski 		rOldStates.mpHelperImpl, rNewStates.mpHelperImpl);
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski //=====  XTypeProvider  =======================================================
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski uno::Sequence< ::com::sun::star::uno::Type>
getTypes(void)316*b1cdbd2cSJim Jagielski 	AccessibleStateSetHelper::getTypes (void)
317*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski 	const ::com::sun::star::uno::Type aTypeList[] = {
320*b1cdbd2cSJim Jagielski     	::getCppuType((const uno::Reference<
321*b1cdbd2cSJim Jagielski         	XAccessibleStateSet>*)0),
322*b1cdbd2cSJim Jagielski     	::getCppuType((const uno::Reference<
323*b1cdbd2cSJim Jagielski         	lang::XTypeProvider>*)0)
324*b1cdbd2cSJim Jagielski 		};
325*b1cdbd2cSJim Jagielski 	::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type>
326*b1cdbd2cSJim Jagielski     	aTypeSequence (aTypeList, 2);
327*b1cdbd2cSJim Jagielski 	return aTypeSequence;
328*b1cdbd2cSJim Jagielski }
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski uno::Sequence<sal_Int8> SAL_CALL
getImplementationId(void)331*b1cdbd2cSJim Jagielski 	AccessibleStateSetHelper::getImplementationId (void)
332*b1cdbd2cSJim Jagielski     throw (::com::sun::star::uno::RuntimeException)
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski     ::vos::OGuard aGuard (maMutex);
335*b1cdbd2cSJim Jagielski 	static uno::Sequence<sal_Int8> aId;
336*b1cdbd2cSJim Jagielski 	if (aId.getLength() == 0)
337*b1cdbd2cSJim Jagielski 	{
338*b1cdbd2cSJim Jagielski 		aId.realloc (16);
339*b1cdbd2cSJim Jagielski 		rtl_createUuid ((sal_uInt8 *)aId.getArray(), 0, sal_True);
340*b1cdbd2cSJim Jagielski 	}
341*b1cdbd2cSJim Jagielski 	return aId;
342*b1cdbd2cSJim Jagielski }
343