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_stoc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "base.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski namespace stoc_corefl
30*b1cdbd2cSJim Jagielski {
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski //==================================================================================================
33*b1cdbd2cSJim Jagielski class IdlEnumFieldImpl
34*b1cdbd2cSJim Jagielski 	: public IdlMemberImpl
35*b1cdbd2cSJim Jagielski 	, public XIdlField
36*b1cdbd2cSJim Jagielski 	, public XIdlField2
37*b1cdbd2cSJim Jagielski {
38*b1cdbd2cSJim Jagielski 	sal_Int32				_nValue;
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski public:
IdlEnumFieldImpl(IdlReflectionServiceImpl * pReflection,const OUString & rName,typelib_TypeDescription * pTypeDescr,sal_Int32 nValue)41*b1cdbd2cSJim Jagielski 	IdlEnumFieldImpl( IdlReflectionServiceImpl * pReflection, const OUString & rName,
42*b1cdbd2cSJim Jagielski 					  typelib_TypeDescription * pTypeDescr, sal_Int32 nValue )
43*b1cdbd2cSJim Jagielski 		: IdlMemberImpl( pReflection, rName, pTypeDescr, pTypeDescr )
44*b1cdbd2cSJim Jagielski 		, _nValue( nValue )
45*b1cdbd2cSJim Jagielski 		{}
46*b1cdbd2cSJim Jagielski 	virtual ~IdlEnumFieldImpl();
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 	// XInterface
49*b1cdbd2cSJim Jagielski 	virtual Any SAL_CALL queryInterface( const Type & rType ) throw(::com::sun::star::uno::RuntimeException);
50*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL acquire() throw();
51*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL release() throw();
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski 	// XTypeProvider
54*b1cdbd2cSJim Jagielski 	virtual Sequence< Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException);
55*b1cdbd2cSJim Jagielski 	virtual Sequence< sal_Int8 > SAL_CALL getImplementationId() throw (::com::sun::star::uno::RuntimeException);
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski 	// XIdlMember
58*b1cdbd2cSJim Jagielski     virtual Reference< XIdlClass > SAL_CALL getDeclaringClass() throw(::com::sun::star::uno::RuntimeException);
59*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL getName() throw(::com::sun::star::uno::RuntimeException);
60*b1cdbd2cSJim Jagielski 	// XIdlField
61*b1cdbd2cSJim Jagielski     virtual Reference< XIdlClass > SAL_CALL getType() throw(::com::sun::star::uno::RuntimeException);
62*b1cdbd2cSJim Jagielski     virtual FieldAccessMode SAL_CALL getAccessMode() throw(::com::sun::star::uno::RuntimeException);
63*b1cdbd2cSJim Jagielski     virtual Any SAL_CALL get( const Any & rObj ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException);
64*b1cdbd2cSJim Jagielski     virtual void SAL_CALL set( const Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
65*b1cdbd2cSJim Jagielski 	// XIdlField2: getType, getAccessMode and get are equal to XIdlField
66*b1cdbd2cSJim Jagielski     virtual void SAL_CALL set( Any & rObj, const Any & rValue ) throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException);
67*b1cdbd2cSJim Jagielski };
68*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
~IdlEnumFieldImpl()69*b1cdbd2cSJim Jagielski IdlEnumFieldImpl::~IdlEnumFieldImpl()
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski }
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski // XInterface
74*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
queryInterface(const Type & rType)75*b1cdbd2cSJim Jagielski Any IdlEnumFieldImpl::queryInterface( const Type & rType )
76*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
77*b1cdbd2cSJim Jagielski {
78*b1cdbd2cSJim Jagielski 	Any aRet( ::cppu::queryInterface( rType,
79*b1cdbd2cSJim Jagielski     								  static_cast< XIdlField * >( this ),
80*b1cdbd2cSJim Jagielski                                       static_cast< XIdlField2 * >( this ) ) );
81*b1cdbd2cSJim Jagielski 	return (aRet.hasValue() ? aRet : IdlMemberImpl::queryInterface( rType ));
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
acquire()84*b1cdbd2cSJim Jagielski void IdlEnumFieldImpl::acquire() throw()
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski 	IdlMemberImpl::acquire();
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
release()89*b1cdbd2cSJim Jagielski void IdlEnumFieldImpl::release() throw()
90*b1cdbd2cSJim Jagielski {
91*b1cdbd2cSJim Jagielski 	IdlMemberImpl::release();
92*b1cdbd2cSJim Jagielski }
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski // XTypeProvider
95*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getTypes()96*b1cdbd2cSJim Jagielski Sequence< Type > IdlEnumFieldImpl::getTypes()
97*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
98*b1cdbd2cSJim Jagielski {
99*b1cdbd2cSJim Jagielski 	static OTypeCollection * s_pTypes = 0;
100*b1cdbd2cSJim Jagielski 	if (! s_pTypes)
101*b1cdbd2cSJim Jagielski 	{
102*b1cdbd2cSJim Jagielski 		MutexGuard aGuard( getMutexAccess() );
103*b1cdbd2cSJim Jagielski 		if (! s_pTypes)
104*b1cdbd2cSJim Jagielski 		{
105*b1cdbd2cSJim Jagielski 			static OTypeCollection s_aTypes(
106*b1cdbd2cSJim Jagielski 				::getCppuType( (const Reference< XIdlField2 > *)0 ),
107*b1cdbd2cSJim Jagielski 				::getCppuType( (const Reference< XIdlField > *)0 ),
108*b1cdbd2cSJim Jagielski 				IdlMemberImpl::getTypes() );
109*b1cdbd2cSJim Jagielski 			s_pTypes = &s_aTypes;
110*b1cdbd2cSJim Jagielski 		}
111*b1cdbd2cSJim Jagielski 	}
112*b1cdbd2cSJim Jagielski 	return s_pTypes->getTypes();
113*b1cdbd2cSJim Jagielski }
114*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getImplementationId()115*b1cdbd2cSJim Jagielski Sequence< sal_Int8 > IdlEnumFieldImpl::getImplementationId()
116*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
117*b1cdbd2cSJim Jagielski {
118*b1cdbd2cSJim Jagielski 	static OImplementationId * s_pId = 0;
119*b1cdbd2cSJim Jagielski 	if (! s_pId)
120*b1cdbd2cSJim Jagielski 	{
121*b1cdbd2cSJim Jagielski 		MutexGuard aGuard( getMutexAccess() );
122*b1cdbd2cSJim Jagielski 		if (! s_pId)
123*b1cdbd2cSJim Jagielski 		{
124*b1cdbd2cSJim Jagielski 			static OImplementationId s_aId;
125*b1cdbd2cSJim Jagielski 			s_pId = &s_aId;
126*b1cdbd2cSJim Jagielski 		}
127*b1cdbd2cSJim Jagielski 	}
128*b1cdbd2cSJim Jagielski 	return s_pId->getImplementationId();
129*b1cdbd2cSJim Jagielski }
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski // XIdlMember
132*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getDeclaringClass()133*b1cdbd2cSJim Jagielski Reference< XIdlClass > IdlEnumFieldImpl::getDeclaringClass()
134*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	return IdlMemberImpl::getDeclaringClass();
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getName()139*b1cdbd2cSJim Jagielski OUString IdlEnumFieldImpl::getName()
140*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski 	return IdlMemberImpl::getName();
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski // XIdlField
146*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getType()147*b1cdbd2cSJim Jagielski Reference< XIdlClass > IdlEnumFieldImpl::getType()
148*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski 	return getDeclaringClass();
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getAccessMode()153*b1cdbd2cSJim Jagielski FieldAccessMode IdlEnumFieldImpl::getAccessMode()
154*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
155*b1cdbd2cSJim Jagielski {
156*b1cdbd2cSJim Jagielski     return FieldAccessMode_READONLY;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
get(const Any &)159*b1cdbd2cSJim Jagielski Any IdlEnumFieldImpl::get( const Any & )
160*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski 	return Any( &_nValue, getTypeDescr() );
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
set(const Any &,const Any &)165*b1cdbd2cSJim Jagielski void IdlEnumFieldImpl::set( const Any &, const Any & )
166*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException)
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski 	throw IllegalAccessException(
169*b1cdbd2cSJim Jagielski 		OUString( RTL_CONSTASCII_USTRINGPARAM("enum field is constant!") ),
170*b1cdbd2cSJim Jagielski 		(XWeak *)(OWeakObject *)this );
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
set(Any &,const Any &)173*b1cdbd2cSJim Jagielski void IdlEnumFieldImpl::set( Any &, const Any & )
174*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::IllegalAccessException, ::com::sun::star::uno::RuntimeException)
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski 	throw IllegalAccessException(
177*b1cdbd2cSJim Jagielski 		OUString( RTL_CONSTASCII_USTRINGPARAM("enum field is constant!") ),
178*b1cdbd2cSJim Jagielski 		(XWeak *)(OWeakObject *)this );
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski //##################################################################################################
182*b1cdbd2cSJim Jagielski //##################################################################################################
183*b1cdbd2cSJim Jagielski //##################################################################################################
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
~EnumIdlClassImpl()187*b1cdbd2cSJim Jagielski EnumIdlClassImpl::~EnumIdlClassImpl()
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski 	delete _pFields;
190*b1cdbd2cSJim Jagielski }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski // IdlClassImpl modifications
193*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getField(const OUString & rName)194*b1cdbd2cSJim Jagielski Reference< XIdlField > EnumIdlClassImpl::getField( const OUString & rName )
195*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	if (! _pFields)
198*b1cdbd2cSJim Jagielski 		getFields(); // init members
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 	const OUString2Field::const_iterator iFind( _aName2Field.find( rName ) );
201*b1cdbd2cSJim Jagielski 	if (iFind != _aName2Field.end())
202*b1cdbd2cSJim Jagielski 		return (*iFind).second;
203*b1cdbd2cSJim Jagielski 	else
204*b1cdbd2cSJim Jagielski 		return Reference< XIdlField >();
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getFields()207*b1cdbd2cSJim Jagielski Sequence< Reference< XIdlField > > EnumIdlClassImpl::getFields()
208*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
209*b1cdbd2cSJim Jagielski {
210*b1cdbd2cSJim Jagielski 	if (! _pFields)
211*b1cdbd2cSJim Jagielski 	{
212*b1cdbd2cSJim Jagielski 		MutexGuard aGuard( getMutexAccess() );
213*b1cdbd2cSJim Jagielski 		if (! _pFields)
214*b1cdbd2cSJim Jagielski 		{
215*b1cdbd2cSJim Jagielski 			sal_Int32 nFields = getTypeDescr()->nEnumValues;
216*b1cdbd2cSJim Jagielski 			Sequence< Reference< XIdlField > > * pFields =
217*b1cdbd2cSJim Jagielski 				new Sequence< Reference< XIdlField > >( nFields );
218*b1cdbd2cSJim Jagielski 			Reference< XIdlField > * pSeq = pFields->getArray();
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 			while (nFields--)
221*b1cdbd2cSJim Jagielski 			{
222*b1cdbd2cSJim Jagielski 				OUString aName( getTypeDescr()->ppEnumNames[nFields] );
223*b1cdbd2cSJim Jagielski 				_aName2Field[aName] = pSeq[nFields] = new IdlEnumFieldImpl(
224*b1cdbd2cSJim Jagielski 					getReflection(), aName, IdlClassImpl::getTypeDescr(), getTypeDescr()->pEnumValues[nFields] );
225*b1cdbd2cSJim Jagielski 			}
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 			_pFields = pFields;
228*b1cdbd2cSJim Jagielski 		}
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski 	return *_pFields;
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
createObject(Any & rObj)233*b1cdbd2cSJim Jagielski void EnumIdlClassImpl::createObject( Any & rObj )
234*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski 	sal_Int32 eVal =
237*b1cdbd2cSJim Jagielski         ((typelib_EnumTypeDescription *)IdlClassImpl::getTypeDescr())->nDefaultEnumValue;
238*b1cdbd2cSJim Jagielski 	rObj.setValue( &eVal, IdlClassImpl::getTypeDescr() );
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski }
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski 
244