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 #include "oox/helper/propertyset.hxx" 25 26 #include <osl/diagnose.h> 27 #include <rtl/strbuf.hxx> 28 #include "oox/helper/propertymap.hxx" 29 30 namespace oox { 31 32 // ============================================================================ 33 34 using namespace ::com::sun::star::beans; 35 using namespace ::com::sun::star::uno; 36 37 using ::rtl::OStringBuffer; 38 using ::rtl::OUString; 39 using ::rtl::OUStringToOString; 40 41 // ============================================================================ 42 43 void PropertySet::set( const Reference< XPropertySet >& rxPropSet ) 44 { 45 mxPropSet = rxPropSet; 46 mxMultiPropSet.set( mxPropSet, UNO_QUERY ); 47 if( mxPropSet.is() ) try 48 { 49 mxPropSetInfo = mxPropSet->getPropertySetInfo(); 50 } 51 catch( Exception& ) 52 { 53 } 54 } 55 56 bool PropertySet::hasProperty( sal_Int32 nPropId ) const 57 { 58 if( mxPropSetInfo.is() ) try 59 { 60 const OUString& rPropName = PropertyMap::getPropertyName( nPropId ); 61 return mxPropSetInfo->hasPropertyByName( rPropName ); 62 } 63 catch( Exception& ) 64 { 65 } 66 return false; 67 } 68 69 // Get properties ------------------------------------------------------------- 70 71 Any PropertySet::getAnyProperty( sal_Int32 nPropId ) const 72 { 73 Any aValue; 74 return implGetPropertyValue( aValue, PropertyMap::getPropertyName( nPropId ) ) ? aValue : Any(); 75 } 76 77 void PropertySet::getProperties( Sequence< Any >& orValues, const Sequence< OUString >& rPropNames ) const 78 { 79 if( mxMultiPropSet.is() ) try 80 { 81 orValues = mxMultiPropSet->getPropertyValues( rPropNames ); 82 return; 83 } 84 catch( Exception& ) 85 { 86 OSL_ENSURE( false, "PropertySet::getProperties - cannot get all property values - fallback to single mode" ); 87 } 88 89 if( mxPropSet.is() ) 90 { 91 sal_Int32 nLen = rPropNames.getLength(); 92 const OUString* pPropName = rPropNames.getConstArray(); 93 const OUString* pPropNameEnd = pPropName + nLen; 94 orValues.realloc( nLen ); 95 Any* pValue = orValues.getArray(); 96 for( ; pPropName != pPropNameEnd; ++pPropName, ++pValue ) 97 implGetPropertyValue( *pValue, *pPropName ); 98 } 99 } 100 101 // Set properties ------------------------------------------------------------- 102 103 bool PropertySet::setAnyProperty( sal_Int32 nPropId, const Any& rValue ) 104 { 105 return implSetPropertyValue( PropertyMap::getPropertyName( nPropId ), rValue ); 106 } 107 108 void PropertySet::setProperties( const Sequence< OUString >& rPropNames, const Sequence< Any >& rValues ) 109 { 110 OSL_ENSURE( rPropNames.getLength() == rValues.getLength(), 111 "PropertySet::setProperties - length of sequences different" ); 112 113 if( mxMultiPropSet.is() ) try 114 { 115 mxMultiPropSet->setPropertyValues( rPropNames, rValues ); 116 return; 117 } 118 catch( Exception& ) 119 { 120 OSL_ENSURE( false, "PropertySet::setProperties - cannot set all property values, fallback to single mode" ); 121 } 122 123 if( mxPropSet.is() ) 124 { 125 const OUString* pPropName = rPropNames.getConstArray(); 126 const OUString* pPropNameEnd = pPropName + rPropNames.getLength(); 127 const Any* pValue = rValues.getConstArray(); 128 for( ; pPropName != pPropNameEnd; ++pPropName, ++pValue ) 129 implSetPropertyValue( *pPropName, *pValue ); 130 } 131 } 132 133 void PropertySet::setProperties( const PropertyMap& rPropertyMap ) 134 { 135 if( !rPropertyMap.empty() ) 136 { 137 Sequence< OUString > aPropNames; 138 Sequence< Any > aValues; 139 rPropertyMap.fillSequences( aPropNames, aValues ); 140 setProperties( aPropNames, aValues ); 141 } 142 } 143 144 // private -------------------------------------------------------------------- 145 146 bool PropertySet::implGetPropertyValue( Any& orValue, const OUString& rPropName ) const 147 { 148 if( mxPropSet.is() ) try 149 { 150 orValue = mxPropSet->getPropertyValue( rPropName ); 151 return true; 152 } 153 catch( Exception& ) 154 { 155 OSL_ENSURE( false, OStringBuffer( "PropertySet::implGetPropertyValue - cannot get property \"" ). 156 append( OUStringToOString( rPropName, RTL_TEXTENCODING_ASCII_US ) ).append( '"' ).getStr() ); 157 } 158 return false; 159 } 160 161 bool PropertySet::implSetPropertyValue( const OUString& rPropName, const Any& rValue ) 162 { 163 if( mxPropSet.is() ) try 164 { 165 mxPropSet->setPropertyValue( rPropName, rValue ); 166 return true; 167 } 168 catch( Exception& ) 169 { 170 OSL_ENSURE( false, OStringBuffer( "PropertySet::implSetPropertyValue - cannot set property \"" ). 171 append( OUStringToOString( rPropName, RTL_TEXTENCODING_ASCII_US ) ).append( '"' ).getStr() ); 172 } 173 return false; 174 } 175 176 // ============================================================================ 177 178 } // namespace oox 179