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