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 #include <typelib/typedescription.h>
27*b1cdbd2cSJim Jagielski #include <uno/data.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "base.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski namespace stoc_corefl
33*b1cdbd2cSJim Jagielski {
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski // XInterface
36*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
queryInterface(const Type & rType)37*b1cdbd2cSJim Jagielski Any ArrayIdlClassImpl::queryInterface( const Type & rType )
38*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
39*b1cdbd2cSJim Jagielski {
40*b1cdbd2cSJim Jagielski 	Any aRet( ::cppu::queryInterface( rType, static_cast< XIdlArray * >( this ) ) );
41*b1cdbd2cSJim Jagielski 	return (aRet.hasValue() ? aRet : IdlClassImpl::queryInterface( rType ));
42*b1cdbd2cSJim Jagielski }
43*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
acquire()44*b1cdbd2cSJim Jagielski void ArrayIdlClassImpl::acquire() throw()
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski 	IdlClassImpl::acquire();
47*b1cdbd2cSJim Jagielski }
48*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
release()49*b1cdbd2cSJim Jagielski void ArrayIdlClassImpl::release() throw()
50*b1cdbd2cSJim Jagielski {
51*b1cdbd2cSJim Jagielski 	IdlClassImpl::release();
52*b1cdbd2cSJim Jagielski }
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski // XTypeProvider
55*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getTypes()56*b1cdbd2cSJim Jagielski Sequence< Type > ArrayIdlClassImpl::getTypes()
57*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
58*b1cdbd2cSJim Jagielski {
59*b1cdbd2cSJim Jagielski 	static OTypeCollection * s_pTypes = 0;
60*b1cdbd2cSJim Jagielski 	if (! s_pTypes)
61*b1cdbd2cSJim Jagielski 	{
62*b1cdbd2cSJim Jagielski 		MutexGuard aGuard( getMutexAccess() );
63*b1cdbd2cSJim Jagielski 		if (! s_pTypes)
64*b1cdbd2cSJim Jagielski 		{
65*b1cdbd2cSJim Jagielski 			static OTypeCollection s_aTypes(
66*b1cdbd2cSJim Jagielski 				::getCppuType( (const Reference< XIdlArray > *)0 ),
67*b1cdbd2cSJim Jagielski 				IdlClassImpl::getTypes() );
68*b1cdbd2cSJim Jagielski 			s_pTypes = &s_aTypes;
69*b1cdbd2cSJim Jagielski 		}
70*b1cdbd2cSJim Jagielski 	}
71*b1cdbd2cSJim Jagielski 	return s_pTypes->getTypes();
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getImplementationId()74*b1cdbd2cSJim Jagielski Sequence< sal_Int8 > ArrayIdlClassImpl::getImplementationId()
75*b1cdbd2cSJim Jagielski 	throw (::com::sun::star::uno::RuntimeException)
76*b1cdbd2cSJim Jagielski {
77*b1cdbd2cSJim Jagielski 	static OImplementationId * s_pId = 0;
78*b1cdbd2cSJim Jagielski 	if (! s_pId)
79*b1cdbd2cSJim Jagielski 	{
80*b1cdbd2cSJim Jagielski 		MutexGuard aGuard( getMutexAccess() );
81*b1cdbd2cSJim Jagielski 		if (! s_pId)
82*b1cdbd2cSJim Jagielski 		{
83*b1cdbd2cSJim Jagielski 			static OImplementationId s_aId;
84*b1cdbd2cSJim Jagielski 			s_pId = &s_aId;
85*b1cdbd2cSJim Jagielski 		}
86*b1cdbd2cSJim Jagielski 	}
87*b1cdbd2cSJim Jagielski 	return s_pId->getImplementationId();
88*b1cdbd2cSJim Jagielski }
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski // XIdlArray
91*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
realloc(Any & rArray,sal_Int32 nLen)92*b1cdbd2cSJim Jagielski void ArrayIdlClassImpl::realloc( Any & rArray, sal_Int32 nLen )
93*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski 	TypeClass eTC = rArray.getValueTypeClass();
96*b1cdbd2cSJim Jagielski 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
97*b1cdbd2cSJim Jagielski 	{
98*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException(
99*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
100*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this, 0 );
101*b1cdbd2cSJim Jagielski 	}
102*b1cdbd2cSJim Jagielski 	if (nLen < 0)
103*b1cdbd2cSJim Jagielski 	{
104*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException(
105*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal length given!") ),
106*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this, 1 );
107*b1cdbd2cSJim Jagielski 	}
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 	uno_Sequence ** ppSeq = (uno_Sequence **)rArray.getValue();
110*b1cdbd2cSJim Jagielski 	uno_sequence_realloc( ppSeq, (typelib_TypeDescription *)getTypeDescr(),
111*b1cdbd2cSJim Jagielski 						  nLen,
112*b1cdbd2cSJim Jagielski                           reinterpret_cast< uno_AcquireFunc >(cpp_acquire),
113*b1cdbd2cSJim Jagielski                           reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
114*b1cdbd2cSJim Jagielski 	rArray.pData = ppSeq;
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getLen(const Any & rArray)117*b1cdbd2cSJim Jagielski sal_Int32 ArrayIdlClassImpl::getLen( const Any & rArray )
118*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
119*b1cdbd2cSJim Jagielski {
120*b1cdbd2cSJim Jagielski 	TypeClass eTC = rArray.getValueTypeClass();
121*b1cdbd2cSJim Jagielski 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
122*b1cdbd2cSJim Jagielski 	{
123*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException(
124*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
125*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this, 0 );
126*b1cdbd2cSJim Jagielski 	}
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 	return (*(uno_Sequence **)rArray.getValue())->nElements;
129*b1cdbd2cSJim Jagielski }
130*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
get(const Any & rArray,sal_Int32 nIndex)131*b1cdbd2cSJim Jagielski Any ArrayIdlClassImpl::get( const Any & rArray, sal_Int32 nIndex )
132*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::ArrayIndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
133*b1cdbd2cSJim Jagielski {
134*b1cdbd2cSJim Jagielski 	TypeClass eTC = rArray.getValueTypeClass();
135*b1cdbd2cSJim Jagielski 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
136*b1cdbd2cSJim Jagielski 	{
137*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException(
138*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
139*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this, 0 );
140*b1cdbd2cSJim Jagielski 	}
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	uno_Sequence * pSeq = *(uno_Sequence **)rArray.getValue();
143*b1cdbd2cSJim Jagielski 	if (pSeq->nElements <= nIndex)
144*b1cdbd2cSJim Jagielski 	{
145*b1cdbd2cSJim Jagielski 		throw ArrayIndexOutOfBoundsException(
146*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal index given!") ),
147*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this );
148*b1cdbd2cSJim Jagielski 	}
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 	Any aRet;
151*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pElemTypeDescr = 0;
152*b1cdbd2cSJim Jagielski 	TYPELIB_DANGER_GET( &pElemTypeDescr, getTypeDescr()->pType );
153*b1cdbd2cSJim Jagielski 	uno_any_destruct( &aRet, reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
154*b1cdbd2cSJim Jagielski 	uno_any_construct( &aRet, &pSeq->elements[nIndex * pElemTypeDescr->nSize],
155*b1cdbd2cSJim Jagielski 					   pElemTypeDescr,
156*b1cdbd2cSJim Jagielski                        reinterpret_cast< uno_AcquireFunc >(cpp_acquire) );
157*b1cdbd2cSJim Jagielski 	TYPELIB_DANGER_RELEASE( pElemTypeDescr );
158*b1cdbd2cSJim Jagielski 	return aRet;
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
set(Any & rArray,sal_Int32 nIndex,const Any & rNewValue)162*b1cdbd2cSJim Jagielski void ArrayIdlClassImpl::set( Any & rArray, sal_Int32 nIndex, const Any & rNewValue )
163*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::ArrayIndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	TypeClass eTC = rArray.getValueTypeClass();
166*b1cdbd2cSJim Jagielski 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
167*b1cdbd2cSJim Jagielski 	{
168*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException(
169*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
170*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this, 0 );
171*b1cdbd2cSJim Jagielski 	}
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	uno_Sequence * pSeq = *(uno_Sequence **)rArray.getValue();
174*b1cdbd2cSJim Jagielski 	if (pSeq->nElements <= nIndex)
175*b1cdbd2cSJim Jagielski 	{
176*b1cdbd2cSJim Jagielski 		throw ArrayIndexOutOfBoundsException(
177*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal index given!") ),
178*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this );
179*b1cdbd2cSJim Jagielski 	}
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 	uno_Sequence ** ppSeq = (uno_Sequence **)rArray.getValue();
182*b1cdbd2cSJim Jagielski 	uno_sequence_reference2One(
183*b1cdbd2cSJim Jagielski         ppSeq, (typelib_TypeDescription *)getTypeDescr(),
184*b1cdbd2cSJim Jagielski         reinterpret_cast< uno_AcquireFunc >(cpp_acquire),
185*b1cdbd2cSJim Jagielski         reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
186*b1cdbd2cSJim Jagielski 	rArray.pData = ppSeq;
187*b1cdbd2cSJim Jagielski 	pSeq = *ppSeq;
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	typelib_TypeDescription * pElemTypeDescr = 0;
190*b1cdbd2cSJim Jagielski 	TYPELIB_DANGER_GET( &pElemTypeDescr, getTypeDescr()->pType );
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	if (! coerce_assign( &pSeq->elements[nIndex * pElemTypeDescr->nSize],
193*b1cdbd2cSJim Jagielski 						 pElemTypeDescr, rNewValue, getReflection() ))
194*b1cdbd2cSJim Jagielski 	{
195*b1cdbd2cSJim Jagielski 		TYPELIB_DANGER_RELEASE( pElemTypeDescr );
196*b1cdbd2cSJim Jagielski 		throw IllegalArgumentException(
197*b1cdbd2cSJim Jagielski 			OUString( RTL_CONSTASCII_USTRINGPARAM("sequence element is not assignable by given value!") ),
198*b1cdbd2cSJim Jagielski 			(XWeak *)(OWeakObject *)this, 2 );
199*b1cdbd2cSJim Jagielski 	}
200*b1cdbd2cSJim Jagielski 	TYPELIB_DANGER_RELEASE( pElemTypeDescr );
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski // ArrayIdlClassImpl
204*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
isAssignableFrom(const Reference<XIdlClass> & xType)205*b1cdbd2cSJim Jagielski sal_Bool ArrayIdlClassImpl::isAssignableFrom( const Reference< XIdlClass > & xType )
206*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski 	return (xType.is() &&
209*b1cdbd2cSJim Jagielski 			(equals( xType ) ||
210*b1cdbd2cSJim Jagielski 			 (xType->getTypeClass() == getTypeClass() && // must be sequence|array
211*b1cdbd2cSJim Jagielski 			  getComponentType()->isAssignableFrom( xType->getComponentType() ))));
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getComponentType()214*b1cdbd2cSJim Jagielski Reference< XIdlClass > ArrayIdlClassImpl::getComponentType()
215*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
216*b1cdbd2cSJim Jagielski {
217*b1cdbd2cSJim Jagielski 	return getReflection()->forType( getTypeDescr()->pType );
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski //__________________________________________________________________________________________________
getArray()220*b1cdbd2cSJim Jagielski Reference< XIdlArray > ArrayIdlClassImpl::getArray()
221*b1cdbd2cSJim Jagielski 	throw(::com::sun::star::uno::RuntimeException)
222*b1cdbd2cSJim Jagielski {
223*b1cdbd2cSJim Jagielski 	return this;
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 
229