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_comphelper.hxx" 26 #include <comphelper/namecontainer.hxx> 27 #include <cppuhelper/implbase1.hxx> 28 #include <osl/diagnose.h> 29 #include <osl/mutex.hxx> 30 #include <comphelper/stl_types.hxx> 31 32 DECLARE_STL_USTRINGACCESS_MAP( ::com::sun::star::uno::Any, SvGenericNameContainerMapImpl ); 33 34 namespace comphelper 35 { 36 class NameContainerImpl 37 { 38 public: 39 osl::Mutex maMutex; 40 }; 41 42 /** this is the base helper class for NameContainer that's also declared in this header. */ 43 class NameContainer : public ::cppu::WeakImplHelper1< ::com::sun::star::container::XNameContainer >, private NameContainerImpl 44 { 45 public: 46 NameContainer( ::com::sun::star::uno::Type aType ); 47 virtual ~NameContainer(); 48 49 // XNameContainer 50 virtual void SAL_CALL insertByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) 51 throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::ElementExistException, 52 ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 53 virtual void SAL_CALL removeByName( const ::rtl::OUString& Name ) 54 throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, 55 ::com::sun::star::uno::RuntimeException); 56 57 // XNameReplace 58 virtual void SAL_CALL replaceByName( const ::rtl::OUString& aName, const ::com::sun::star::uno::Any& aElement ) 59 throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::container::NoSuchElementException, 60 ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 61 62 // XNameAccess 63 virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) 64 throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, 65 ::com::sun::star::uno::RuntimeException); 66 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) 67 throw(::com::sun::star::uno::RuntimeException); 68 virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) 69 throw(::com::sun::star::uno::RuntimeException); 70 71 // XElementAccess 72 virtual sal_Bool SAL_CALL hasElements( ) 73 throw(::com::sun::star::uno::RuntimeException); 74 virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) 75 throw(::com::sun::star::uno::RuntimeException); 76 77 private: 78 SvGenericNameContainerMapImpl maProperties; 79 const ::com::sun::star::uno::Type maType; 80 }; 81 } 82 83 using namespace ::comphelper; 84 using namespace ::osl; 85 using namespace ::rtl; 86 using namespace ::com::sun::star::uno; 87 using namespace ::com::sun::star::container; 88 using namespace ::com::sun::star::lang; 89 90 91 NameContainer::NameContainer( ::com::sun::star::uno::Type aType ) 92 : maType( aType ) 93 { 94 } 95 96 NameContainer::~NameContainer() 97 { 98 } 99 100 // XNameContainer 101 void SAL_CALL NameContainer::insertByName( const rtl::OUString& aName, const Any& aElement ) 102 throw(IllegalArgumentException, ElementExistException, 103 WrappedTargetException, RuntimeException) 104 { 105 MutexGuard aGuard( maMutex ); 106 107 if( maProperties.find( aName ) != maProperties.end() ) 108 throw ElementExistException(); 109 110 if( aElement.getValueType() != maType ) 111 throw IllegalArgumentException(); 112 113 maProperties.insert( SvGenericNameContainerMapImpl::value_type(aName,aElement)); 114 } 115 116 void SAL_CALL NameContainer::removeByName( const ::rtl::OUString& Name ) 117 throw(NoSuchElementException, WrappedTargetException, 118 RuntimeException) 119 { 120 MutexGuard aGuard( maMutex ); 121 122 SvGenericNameContainerMapImpl::iterator aIter = maProperties.find( Name ); 123 if( aIter == maProperties.end() ) 124 throw NoSuchElementException(); 125 126 maProperties.erase( aIter ); 127 } 128 129 // XNameReplace 130 131 void SAL_CALL NameContainer::replaceByName( const ::rtl::OUString& aName, const Any& aElement ) 132 throw(IllegalArgumentException, NoSuchElementException, 133 WrappedTargetException, RuntimeException) 134 { 135 MutexGuard aGuard( maMutex ); 136 137 SvGenericNameContainerMapImpl::iterator aIter( maProperties.find( aName ) ); 138 if( aIter == maProperties.end() ) 139 throw NoSuchElementException(); 140 141 if( aElement.getValueType() != maType ) 142 throw IllegalArgumentException(); 143 144 (*aIter).second = aElement; 145 } 146 147 // XNameAccess 148 149 Any SAL_CALL NameContainer::getByName( const ::rtl::OUString& aName ) 150 throw(NoSuchElementException, WrappedTargetException, 151 RuntimeException) 152 { 153 MutexGuard aGuard( maMutex ); 154 155 SvGenericNameContainerMapImpl::iterator aIter = maProperties.find( aName ); 156 if( aIter == maProperties.end() ) 157 throw NoSuchElementException(); 158 159 return (*aIter).second; 160 } 161 162 Sequence< ::rtl::OUString > SAL_CALL NameContainer::getElementNames( ) 163 throw(RuntimeException) 164 { 165 MutexGuard aGuard( maMutex ); 166 167 SvGenericNameContainerMapImpl::iterator aIter = maProperties.begin(); 168 const SvGenericNameContainerMapImpl::iterator aEnd = maProperties.end(); 169 170 Sequence< rtl::OUString > aNames( maProperties.size() ); 171 rtl::OUString* pNames = aNames.getArray(); 172 173 while( aIter != aEnd ) 174 { 175 *pNames++ = (*aIter++).first; 176 } 177 178 return aNames; 179 } 180 181 sal_Bool SAL_CALL NameContainer::hasByName( const ::rtl::OUString& aName ) 182 throw(RuntimeException) 183 { 184 MutexGuard aGuard( maMutex ); 185 186 SvGenericNameContainerMapImpl::iterator aIter = maProperties.find( aName ); 187 return aIter != maProperties.end(); 188 } 189 190 sal_Bool SAL_CALL NameContainer::hasElements( ) 191 throw(RuntimeException) 192 { 193 MutexGuard aGuard( maMutex ); 194 195 return !maProperties.empty(); 196 } 197 198 Type SAL_CALL NameContainer::getElementType() 199 throw( RuntimeException ) 200 { 201 return maType; 202 } 203 204 Reference< XNameContainer > comphelper::NameContainer_createInstance( Type aType ) 205 { 206 return (XNameContainer*) new NameContainer( aType ); 207 } 208