|  | /************************************************************** | 
|  | * | 
|  | * Licensed to the Apache Software Foundation (ASF) under one | 
|  | * or more contributor license agreements.  See the NOTICE file | 
|  | * distributed with this work for additional information | 
|  | * regarding copyright ownership.  The ASF licenses this file | 
|  | * to you under the Apache License, Version 2.0 (the | 
|  | * "License"); you may not use this file except in compliance | 
|  | * with the License.  You may obtain a copy of the License at | 
|  | * | 
|  | *   http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, | 
|  | * software distributed under the License is distributed on an | 
|  | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
|  | * KIND, either express or implied.  See the License for the | 
|  | * specific language governing permissions and limitations | 
|  | * under the License. | 
|  | * | 
|  | *************************************************************/ | 
|  |  | 
|  |  | 
|  |  | 
|  | // MARKER(update_precomp.py): autogen include statement, do not remove | 
|  | #include "precompiled_comphelper.hxx" | 
|  | #ifndef _COMPHELPER_CHAINABLEPROPERTYSETINFO_HXX_ | 
|  | #include <comphelper/MasterPropertySetInfo.hxx> | 
|  | #endif | 
|  | #include <comphelper/TypeGeneration.hxx> | 
|  |  | 
|  | using ::rtl::OUString; | 
|  | using ::comphelper::PropertyInfo; | 
|  | using ::comphelper::GenerateCppuType; | 
|  | using ::comphelper::MasterPropertySetInfo; | 
|  | using ::com::sun::star::uno::Any; | 
|  | using ::com::sun::star::uno::Type; | 
|  | using ::com::sun::star::uno::Sequence; | 
|  | using ::com::sun::star::uno::Reference; | 
|  | using ::com::sun::star::uno::XInterface; | 
|  | using ::com::sun::star::uno::RuntimeException; | 
|  | using ::com::sun::star::beans::Property; | 
|  | using ::com::sun::star::beans::XPropertySetInfo; | 
|  | using ::com::sun::star::beans::UnknownPropertyException; | 
|  |  | 
|  | MasterPropertySetInfo::MasterPropertySetInfo() | 
|  | throw() | 
|  | { | 
|  | } | 
|  |  | 
|  | MasterPropertySetInfo::MasterPropertySetInfo( PropertyInfo* pMap ) | 
|  | throw() | 
|  | { | 
|  | add ( pMap ); | 
|  | } | 
|  |  | 
|  | MasterPropertySetInfo::~MasterPropertySetInfo() | 
|  | throw() | 
|  | { | 
|  | PropertyDataHash::iterator aEnd = maMap.end(), aIter = maMap.begin(); | 
|  | while (aIter != aEnd ) | 
|  | { | 
|  | delete (*aIter).second; | 
|  | aIter++; | 
|  | } | 
|  | } | 
|  |  | 
|  | void MasterPropertySetInfo::add( PropertyInfo* pMap, sal_Int32 nCount, sal_uInt8 nMapId ) | 
|  | throw() | 
|  | { | 
|  | // nCount < 0	=> add all | 
|  | // nCount == 0	=> add nothing | 
|  | // nCount > 0	=> add at most nCount entries | 
|  | if( maProperties.getLength() ) | 
|  | maProperties.realloc( 0 ); | 
|  |  | 
|  | for ( ; pMap->mpName && ( ( nCount < 0 ) || ( nCount > 0 ) ); --nCount, ++pMap ) | 
|  | { | 
|  | OUString aName( pMap->mpName, pMap->mnNameLen, RTL_TEXTENCODING_ASCII_US ); | 
|  |  | 
|  | #ifdef DBG_UTIL | 
|  | PropertyDataHash::iterator aIter = maMap.find( aName ); | 
|  | if( aIter != maMap.end() ) | 
|  | OSL_ENSURE( sal_False, "Warning: PropertyInfo added twice, possible error!"); | 
|  | #endif | 
|  | maMap[aName] = new PropertyData ( nMapId, pMap ); | 
|  | } | 
|  | } | 
|  |  | 
|  | void MasterPropertySetInfo::add( PropertyInfoHash &rHash, sal_uInt8 nMapId ) | 
|  | throw() | 
|  | { | 
|  | if( maProperties.getLength() ) | 
|  | maProperties.realloc( 0 ); | 
|  | PropertyInfoHash::iterator aIter = rHash.begin(), aEnd = rHash.end(); | 
|  |  | 
|  | while ( aIter != aEnd ) | 
|  | { | 
|  | #ifdef DBG_UTIL | 
|  | PropertyDataHash::iterator aDebugIter = maMap.find( (*aIter).first ); | 
|  | if( aDebugIter != maMap.end() ) | 
|  | OSL_ENSURE( sal_False, "Warning: PropertyInfo added twice, possible error!"); | 
|  | #endif | 
|  | maMap[(*aIter).first] = new PropertyData ( nMapId, (*aIter).second ); | 
|  | aIter++; | 
|  | } | 
|  | } | 
|  |  | 
|  | void MasterPropertySetInfo::remove( const rtl::OUString& aName ) | 
|  | throw() | 
|  | { | 
|  | maMap.erase ( aName ); | 
|  | if ( maProperties.getLength() ) | 
|  | maProperties.realloc( 0 ); | 
|  | } | 
|  |  | 
|  | Sequence< ::Property > SAL_CALL MasterPropertySetInfo::getProperties() | 
|  | throw(::com::sun::star::uno::RuntimeException) | 
|  | { | 
|  | sal_Int32 nSize = maMap.size(); | 
|  | if( maProperties.getLength() != nSize ) | 
|  | { | 
|  | maProperties.realloc ( nSize ); | 
|  | Property* pProperties = maProperties.getArray(); | 
|  |  | 
|  | PropertyDataHash::iterator aIter = maMap.begin(); | 
|  | const PropertyDataHash::iterator aEnd = maMap.end(); | 
|  | for ( ; aIter != aEnd; ++aIter, ++pProperties) | 
|  | { | 
|  | PropertyInfo* pInfo = (*aIter).second->mpInfo; | 
|  |  | 
|  | pProperties->Name = OUString( pInfo->mpName, pInfo->mnNameLen, RTL_TEXTENCODING_ASCII_US ); | 
|  | pProperties->Handle = pInfo->mnHandle; | 
|  | const Type* pType; | 
|  | GenerateCppuType ( pInfo->meCppuType, pType); | 
|  | pProperties->Type = *pType; | 
|  | pProperties->Attributes = pInfo->mnAttributes; | 
|  | } | 
|  | } | 
|  | return maProperties; | 
|  | } | 
|  |  | 
|  | Property SAL_CALL MasterPropertySetInfo::getPropertyByName( const ::rtl::OUString& rName ) | 
|  | throw(::UnknownPropertyException, ::com::sun::star::uno::RuntimeException) | 
|  | { | 
|  | PropertyDataHash::iterator aIter = maMap.find( rName ); | 
|  |  | 
|  | if ( maMap.end() == aIter ) | 
|  | throw UnknownPropertyException( rName, *this ); | 
|  |  | 
|  | PropertyInfo *pInfo = (*aIter).second->mpInfo; | 
|  | Property aProperty; | 
|  | aProperty.Name   = OUString( pInfo->mpName, pInfo->mnNameLen, RTL_TEXTENCODING_ASCII_US ); | 
|  | aProperty.Handle = pInfo->mnHandle; | 
|  | const Type* pType; | 
|  | GenerateCppuType ( pInfo->meCppuType, pType ); | 
|  | aProperty.Type = *pType; | 
|  |  | 
|  | aProperty.Attributes = pInfo->mnAttributes; | 
|  | return aProperty; | 
|  | } | 
|  |  | 
|  | sal_Bool SAL_CALL MasterPropertySetInfo::hasPropertyByName( const ::rtl::OUString& rName ) | 
|  | throw(::com::sun::star::uno::RuntimeException) | 
|  | { | 
|  | return static_cast < sal_Bool > ( maMap.find ( rName ) != maMap.end() ); | 
|  | } |