1*647a425cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*647a425cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*647a425cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*647a425cSAndrew Rist  * distributed with this work for additional information
6*647a425cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*647a425cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*647a425cSAndrew Rist  * "License"); you may not use this file except in compliance
9*647a425cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*647a425cSAndrew Rist  *
11*647a425cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*647a425cSAndrew Rist  *
13*647a425cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*647a425cSAndrew Rist  * software distributed under the License is distributed on an
15*647a425cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*647a425cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*647a425cSAndrew Rist  * specific language governing permissions and limitations
18*647a425cSAndrew Rist  * under the License.
19*647a425cSAndrew Rist  *
20*647a425cSAndrew Rist  *************************************************************/
21*647a425cSAndrew Rist 
22*647a425cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_stoc.hxx"
26cdf0e10cSrcweir #include <typelib/typedescription.h>
27cdf0e10cSrcweir #include <uno/data.h>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "base.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir 
32cdf0e10cSrcweir namespace stoc_corefl
33cdf0e10cSrcweir {
34cdf0e10cSrcweir 
35cdf0e10cSrcweir // XInterface
36cdf0e10cSrcweir //__________________________________________________________________________________________________
queryInterface(const Type & rType)37cdf0e10cSrcweir Any ArrayIdlClassImpl::queryInterface( const Type & rType )
38cdf0e10cSrcweir 	throw(::com::sun::star::uno::RuntimeException)
39cdf0e10cSrcweir {
40cdf0e10cSrcweir 	Any aRet( ::cppu::queryInterface( rType, static_cast< XIdlArray * >( this ) ) );
41cdf0e10cSrcweir 	return (aRet.hasValue() ? aRet : IdlClassImpl::queryInterface( rType ));
42cdf0e10cSrcweir }
43cdf0e10cSrcweir //__________________________________________________________________________________________________
acquire()44cdf0e10cSrcweir void ArrayIdlClassImpl::acquire() throw()
45cdf0e10cSrcweir {
46cdf0e10cSrcweir 	IdlClassImpl::acquire();
47cdf0e10cSrcweir }
48cdf0e10cSrcweir //__________________________________________________________________________________________________
release()49cdf0e10cSrcweir void ArrayIdlClassImpl::release() throw()
50cdf0e10cSrcweir {
51cdf0e10cSrcweir 	IdlClassImpl::release();
52cdf0e10cSrcweir }
53cdf0e10cSrcweir 
54cdf0e10cSrcweir // XTypeProvider
55cdf0e10cSrcweir //__________________________________________________________________________________________________
getTypes()56cdf0e10cSrcweir Sequence< Type > ArrayIdlClassImpl::getTypes()
57cdf0e10cSrcweir 	throw (::com::sun::star::uno::RuntimeException)
58cdf0e10cSrcweir {
59cdf0e10cSrcweir 	static OTypeCollection * s_pTypes = 0;
60cdf0e10cSrcweir 	if (! s_pTypes)
61cdf0e10cSrcweir 	{
62cdf0e10cSrcweir 		MutexGuard aGuard( getMutexAccess() );
63cdf0e10cSrcweir 		if (! s_pTypes)
64cdf0e10cSrcweir 		{
65cdf0e10cSrcweir 			static OTypeCollection s_aTypes(
66cdf0e10cSrcweir 				::getCppuType( (const Reference< XIdlArray > *)0 ),
67cdf0e10cSrcweir 				IdlClassImpl::getTypes() );
68cdf0e10cSrcweir 			s_pTypes = &s_aTypes;
69cdf0e10cSrcweir 		}
70cdf0e10cSrcweir 	}
71cdf0e10cSrcweir 	return s_pTypes->getTypes();
72cdf0e10cSrcweir }
73cdf0e10cSrcweir //__________________________________________________________________________________________________
getImplementationId()74cdf0e10cSrcweir Sequence< sal_Int8 > ArrayIdlClassImpl::getImplementationId()
75cdf0e10cSrcweir 	throw (::com::sun::star::uno::RuntimeException)
76cdf0e10cSrcweir {
77cdf0e10cSrcweir 	static OImplementationId * s_pId = 0;
78cdf0e10cSrcweir 	if (! s_pId)
79cdf0e10cSrcweir 	{
80cdf0e10cSrcweir 		MutexGuard aGuard( getMutexAccess() );
81cdf0e10cSrcweir 		if (! s_pId)
82cdf0e10cSrcweir 		{
83cdf0e10cSrcweir 			static OImplementationId s_aId;
84cdf0e10cSrcweir 			s_pId = &s_aId;
85cdf0e10cSrcweir 		}
86cdf0e10cSrcweir 	}
87cdf0e10cSrcweir 	return s_pId->getImplementationId();
88cdf0e10cSrcweir }
89cdf0e10cSrcweir 
90cdf0e10cSrcweir // XIdlArray
91cdf0e10cSrcweir //__________________________________________________________________________________________________
realloc(Any & rArray,sal_Int32 nLen)92cdf0e10cSrcweir void ArrayIdlClassImpl::realloc( Any & rArray, sal_Int32 nLen )
93cdf0e10cSrcweir 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	TypeClass eTC = rArray.getValueTypeClass();
96cdf0e10cSrcweir 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
97cdf0e10cSrcweir 	{
98cdf0e10cSrcweir 		throw IllegalArgumentException(
99cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
100cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this, 0 );
101cdf0e10cSrcweir 	}
102cdf0e10cSrcweir 	if (nLen < 0)
103cdf0e10cSrcweir 	{
104cdf0e10cSrcweir 		throw IllegalArgumentException(
105cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal length given!") ),
106cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this, 1 );
107cdf0e10cSrcweir 	}
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 	uno_Sequence ** ppSeq = (uno_Sequence **)rArray.getValue();
110cdf0e10cSrcweir 	uno_sequence_realloc( ppSeq, (typelib_TypeDescription *)getTypeDescr(),
111cdf0e10cSrcweir 						  nLen,
112cdf0e10cSrcweir                           reinterpret_cast< uno_AcquireFunc >(cpp_acquire),
113cdf0e10cSrcweir                           reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
114cdf0e10cSrcweir 	rArray.pData = ppSeq;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir //__________________________________________________________________________________________________
getLen(const Any & rArray)117cdf0e10cSrcweir sal_Int32 ArrayIdlClassImpl::getLen( const Any & rArray )
118cdf0e10cSrcweir 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
119cdf0e10cSrcweir {
120cdf0e10cSrcweir 	TypeClass eTC = rArray.getValueTypeClass();
121cdf0e10cSrcweir 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
122cdf0e10cSrcweir 	{
123cdf0e10cSrcweir 		throw IllegalArgumentException(
124cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
125cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this, 0 );
126cdf0e10cSrcweir 	}
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 	return (*(uno_Sequence **)rArray.getValue())->nElements;
129cdf0e10cSrcweir }
130cdf0e10cSrcweir //__________________________________________________________________________________________________
get(const Any & rArray,sal_Int32 nIndex)131cdf0e10cSrcweir Any ArrayIdlClassImpl::get( const Any & rArray, sal_Int32 nIndex )
132cdf0e10cSrcweir 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::ArrayIndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
133cdf0e10cSrcweir {
134cdf0e10cSrcweir 	TypeClass eTC = rArray.getValueTypeClass();
135cdf0e10cSrcweir 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
136cdf0e10cSrcweir 	{
137cdf0e10cSrcweir 		throw IllegalArgumentException(
138cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
139cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this, 0 );
140cdf0e10cSrcweir 	}
141cdf0e10cSrcweir 
142cdf0e10cSrcweir 	uno_Sequence * pSeq = *(uno_Sequence **)rArray.getValue();
143cdf0e10cSrcweir 	if (pSeq->nElements <= nIndex)
144cdf0e10cSrcweir 	{
145cdf0e10cSrcweir 		throw ArrayIndexOutOfBoundsException(
146cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal index given!") ),
147cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this );
148cdf0e10cSrcweir 	}
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	Any aRet;
151cdf0e10cSrcweir 	typelib_TypeDescription * pElemTypeDescr = 0;
152cdf0e10cSrcweir 	TYPELIB_DANGER_GET( &pElemTypeDescr, getTypeDescr()->pType );
153cdf0e10cSrcweir 	uno_any_destruct( &aRet, reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
154cdf0e10cSrcweir 	uno_any_construct( &aRet, &pSeq->elements[nIndex * pElemTypeDescr->nSize],
155cdf0e10cSrcweir 					   pElemTypeDescr,
156cdf0e10cSrcweir                        reinterpret_cast< uno_AcquireFunc >(cpp_acquire) );
157cdf0e10cSrcweir 	TYPELIB_DANGER_RELEASE( pElemTypeDescr );
158cdf0e10cSrcweir 	return aRet;
159cdf0e10cSrcweir }
160cdf0e10cSrcweir 
161cdf0e10cSrcweir //__________________________________________________________________________________________________
set(Any & rArray,sal_Int32 nIndex,const Any & rNewValue)162cdf0e10cSrcweir void ArrayIdlClassImpl::set( Any & rArray, sal_Int32 nIndex, const Any & rNewValue )
163cdf0e10cSrcweir 	throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::ArrayIndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
164cdf0e10cSrcweir {
165cdf0e10cSrcweir 	TypeClass eTC = rArray.getValueTypeClass();
166cdf0e10cSrcweir 	if (eTC != TypeClass_SEQUENCE && eTC != TypeClass_ARRAY)
167cdf0e10cSrcweir 	{
168cdf0e10cSrcweir 		throw IllegalArgumentException(
169cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("no sequence given!") ),
170cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this, 0 );
171cdf0e10cSrcweir 	}
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 	uno_Sequence * pSeq = *(uno_Sequence **)rArray.getValue();
174cdf0e10cSrcweir 	if (pSeq->nElements <= nIndex)
175cdf0e10cSrcweir 	{
176cdf0e10cSrcweir 		throw ArrayIndexOutOfBoundsException(
177cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("illegal index given!") ),
178cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this );
179cdf0e10cSrcweir 	}
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 	uno_Sequence ** ppSeq = (uno_Sequence **)rArray.getValue();
182cdf0e10cSrcweir 	uno_sequence_reference2One(
183cdf0e10cSrcweir         ppSeq, (typelib_TypeDescription *)getTypeDescr(),
184cdf0e10cSrcweir         reinterpret_cast< uno_AcquireFunc >(cpp_acquire),
185cdf0e10cSrcweir         reinterpret_cast< uno_ReleaseFunc >(cpp_release) );
186cdf0e10cSrcweir 	rArray.pData = ppSeq;
187cdf0e10cSrcweir 	pSeq = *ppSeq;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 	typelib_TypeDescription * pElemTypeDescr = 0;
190cdf0e10cSrcweir 	TYPELIB_DANGER_GET( &pElemTypeDescr, getTypeDescr()->pType );
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 	if (! coerce_assign( &pSeq->elements[nIndex * pElemTypeDescr->nSize],
193cdf0e10cSrcweir 						 pElemTypeDescr, rNewValue, getReflection() ))
194cdf0e10cSrcweir 	{
195cdf0e10cSrcweir 		TYPELIB_DANGER_RELEASE( pElemTypeDescr );
196cdf0e10cSrcweir 		throw IllegalArgumentException(
197cdf0e10cSrcweir 			OUString( RTL_CONSTASCII_USTRINGPARAM("sequence element is not assignable by given value!") ),
198cdf0e10cSrcweir 			(XWeak *)(OWeakObject *)this, 2 );
199cdf0e10cSrcweir 	}
200cdf0e10cSrcweir 	TYPELIB_DANGER_RELEASE( pElemTypeDescr );
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
203cdf0e10cSrcweir // ArrayIdlClassImpl
204cdf0e10cSrcweir //__________________________________________________________________________________________________
isAssignableFrom(const Reference<XIdlClass> & xType)205cdf0e10cSrcweir sal_Bool ArrayIdlClassImpl::isAssignableFrom( const Reference< XIdlClass > & xType )
206cdf0e10cSrcweir 	throw(::com::sun::star::uno::RuntimeException)
207cdf0e10cSrcweir {
208cdf0e10cSrcweir 	return (xType.is() &&
209cdf0e10cSrcweir 			(equals( xType ) ||
210cdf0e10cSrcweir 			 (xType->getTypeClass() == getTypeClass() && // must be sequence|array
211cdf0e10cSrcweir 			  getComponentType()->isAssignableFrom( xType->getComponentType() ))));
212cdf0e10cSrcweir }
213cdf0e10cSrcweir //__________________________________________________________________________________________________
getComponentType()214cdf0e10cSrcweir Reference< XIdlClass > ArrayIdlClassImpl::getComponentType()
215cdf0e10cSrcweir 	throw(::com::sun::star::uno::RuntimeException)
216cdf0e10cSrcweir {
217cdf0e10cSrcweir 	return getReflection()->forType( getTypeDescr()->pType );
218cdf0e10cSrcweir }
219cdf0e10cSrcweir //__________________________________________________________________________________________________
getArray()220cdf0e10cSrcweir Reference< XIdlArray > ArrayIdlClassImpl::getArray()
221cdf0e10cSrcweir 	throw(::com::sun::star::uno::RuntimeException)
222cdf0e10cSrcweir {
223cdf0e10cSrcweir 	return this;
224cdf0e10cSrcweir }
225cdf0e10cSrcweir 
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir 
229