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