1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_framework.hxx" 30 #include <helper/propertysetcontainer.hxx> 31 #include <threadhelp/resetableguard.hxx> 32 33 #include <vcl/svapp.hxx> 34 35 #define WRONG_TYPE_EXCEPTION "Only XPropertSet allowed!" 36 37 using namespace rtl; 38 using namespace vos; 39 using namespace cppu; 40 using namespace com::sun::star::uno; 41 using namespace com::sun::star::container; 42 using namespace com::sun::star::lang; 43 using namespace com::sun::star::beans; 44 45 namespace framework 46 { 47 48 PropertySetContainer::PropertySetContainer( const Reference< XMultiServiceFactory >& ) 49 : ThreadHelpBase( &Application::GetSolarMutex() ) 50 , OWeakObject() 51 52 { 53 } 54 55 56 PropertySetContainer::~PropertySetContainer() 57 { 58 } 59 60 61 // XInterface 62 void SAL_CALL PropertySetContainer::acquire() throw () 63 { 64 OWeakObject::acquire(); 65 } 66 67 void SAL_CALL PropertySetContainer::release() throw () 68 { 69 OWeakObject::release(); 70 } 71 72 Any SAL_CALL PropertySetContainer::queryInterface( const Type& rType ) 73 throw ( RuntimeException ) 74 { 75 Any a = ::cppu::queryInterface( 76 rType , 77 SAL_STATIC_CAST( XIndexContainer*, this ), 78 SAL_STATIC_CAST( XIndexReplace*, this ), 79 SAL_STATIC_CAST( XIndexAccess*, this ), 80 SAL_STATIC_CAST( XElementAccess*, this ) ); 81 82 if( a.hasValue() ) 83 { 84 return a; 85 } 86 87 return OWeakObject::queryInterface( rType ); 88 } 89 90 // XIndexContainer 91 void SAL_CALL PropertySetContainer::insertByIndex( sal_Int32 Index, const ::com::sun::star::uno::Any& Element ) 92 throw ( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) 93 { 94 ResetableGuard aGuard( m_aLock ); 95 96 sal_Int32 nSize = m_aPropertySetVector.size(); 97 98 if ( nSize >= Index ) 99 { 100 Reference< XPropertySet > aPropertySetElement; 101 102 if ( Element >>= aPropertySetElement ) 103 { 104 if ( nSize == Index ) 105 m_aPropertySetVector.push_back( aPropertySetElement ); 106 else 107 { 108 PropertySetVector::iterator aIter = m_aPropertySetVector.begin(); 109 aIter += Index; 110 m_aPropertySetVector.insert( aIter, aPropertySetElement ); 111 } 112 } 113 else 114 { 115 throw IllegalArgumentException( 116 OUString( RTL_CONSTASCII_USTRINGPARAM( WRONG_TYPE_EXCEPTION )), 117 (OWeakObject *)this, 2 ); 118 } 119 } 120 else 121 throw IndexOutOfBoundsException( OUString(), (OWeakObject *)this ); 122 } 123 124 void SAL_CALL PropertySetContainer::removeByIndex( sal_Int32 Index ) 125 throw ( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) 126 { 127 ResetableGuard aGuard( m_aLock ); 128 129 if ( (sal_Int32)m_aPropertySetVector.size() > Index ) 130 { 131 PropertySetVector::iterator aIter = m_aPropertySetVector.begin(); 132 aIter += Index; 133 m_aPropertySetVector.erase( aIter ); 134 } 135 else 136 throw IndexOutOfBoundsException( OUString(), (OWeakObject *)this ); 137 } 138 139 // XIndexReplace 140 void SAL_CALL PropertySetContainer::replaceByIndex( sal_Int32 Index, const ::com::sun::star::uno::Any& Element ) 141 throw ( IllegalArgumentException, IndexOutOfBoundsException, WrappedTargetException, RuntimeException) 142 { 143 if ( (sal_Int32)m_aPropertySetVector.size() > Index ) 144 { 145 Reference< XPropertySet > aPropertySetElement; 146 147 if ( Element >>= aPropertySetElement ) 148 { 149 m_aPropertySetVector[ Index ] = aPropertySetElement; 150 } 151 else 152 { 153 throw IllegalArgumentException( 154 OUString( RTL_CONSTASCII_USTRINGPARAM( WRONG_TYPE_EXCEPTION )), 155 (OWeakObject *)this, 2 ); 156 } 157 } 158 else 159 throw IndexOutOfBoundsException( OUString(), (OWeakObject *)this ); 160 } 161 162 // XIndexAccess 163 sal_Int32 SAL_CALL PropertySetContainer::getCount() 164 throw ( RuntimeException ) 165 { 166 ResetableGuard aGuard( m_aLock ); 167 168 return m_aPropertySetVector.size(); 169 } 170 171 Any SAL_CALL PropertySetContainer::getByIndex( sal_Int32 Index ) 172 throw ( IndexOutOfBoundsException, WrappedTargetException, RuntimeException ) 173 { 174 ResetableGuard aGuard( m_aLock ); 175 176 if ( (sal_Int32)m_aPropertySetVector.size() > Index ) 177 { 178 Any a; 179 180 a <<= m_aPropertySetVector[ Index ]; 181 return a; 182 } 183 else 184 throw IndexOutOfBoundsException( OUString(), (OWeakObject *)this ); 185 } 186 187 // XElementAccess 188 sal_Bool SAL_CALL PropertySetContainer::hasElements() 189 throw (::com::sun::star::uno::RuntimeException) 190 { 191 ResetableGuard aGuard( m_aLock ); 192 193 return !( m_aPropertySetVector.empty() ); 194 } 195 196 } 197