1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: propertymap.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 #include "oox/helper/propertymap.hxx"
32 #include <osl/mutex.hxx>
33 #include <cppuhelper/implbase2.hxx>
34 #include <com/sun/star/beans/PropertyValue.hpp>
35 #include <com/sun/star/beans/XPropertySet.hpp>
36 #include <com/sun/star/beans/XPropertySetInfo.hpp>
37 #include "properties.hxx"
38 #include "oox/token/propertylist.hxx"
40 using ::rtl::OUString
;
41 using ::com::sun::star::uno::Any
;
42 using ::com::sun::star::uno::Reference
;
43 using ::com::sun::star::uno::RuntimeException
;
44 using ::com::sun::star::uno::Sequence
;
45 using ::com::sun::star::lang::IllegalArgumentException
;
46 using ::com::sun::star::lang::WrappedTargetException
;
47 using ::com::sun::star::beans::Property
;
48 using ::com::sun::star::beans::PropertyValue
;
49 using ::com::sun::star::beans::PropertyVetoException
;
50 using ::com::sun::star::beans::UnknownPropertyException
;
51 using ::com::sun::star::beans::XPropertyChangeListener
;
52 using ::com::sun::star::beans::XPropertySet
;
53 using ::com::sun::star::beans::XPropertySetInfo
;
54 using ::com::sun::star::beans::XVetoableChangeListener
;
58 // ============================================================================
62 /** Thread-save singleton of a vector of all supported property names. */
63 struct StaticPropertyList
: public ::rtl::Static
< PropertyList
, StaticPropertyList
> {};
65 // ----------------------------------------------------------------------------
67 typedef ::cppu::WeakImplHelper2
< XPropertySet
, XPropertySetInfo
> GenericPropertySetImplBase
;
69 /** This class implements a generic XPropertySet.
71 Properties of all names and types can be set and later retrieved.
72 TODO: move this to comphelper or better find an existing implementation
74 class GenericPropertySet
: public GenericPropertySetImplBase
, private ::osl::Mutex
77 explicit GenericPropertySet();
78 explicit GenericPropertySet( const PropertyMap
& rPropMap
);
81 virtual Reference
< XPropertySetInfo
> SAL_CALL
getPropertySetInfo() throw (RuntimeException
);
82 virtual void SAL_CALL
setPropertyValue( const OUString
& aPropertyName
, const Any
& aValue
) throw (UnknownPropertyException
, PropertyVetoException
, IllegalArgumentException
, WrappedTargetException
, RuntimeException
);
83 virtual Any SAL_CALL
getPropertyValue( const OUString
& PropertyName
) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
);
84 virtual void SAL_CALL
addPropertyChangeListener( const OUString
& aPropertyName
, const Reference
< XPropertyChangeListener
>& xListener
) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
);
85 virtual void SAL_CALL
removePropertyChangeListener( const OUString
& aPropertyName
, const Reference
< XPropertyChangeListener
>& aListener
) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
);
86 virtual void SAL_CALL
addVetoableChangeListener( const OUString
& PropertyName
, const Reference
< XVetoableChangeListener
>& aListener
) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
);
87 virtual void SAL_CALL
removeVetoableChangeListener( const OUString
& PropertyName
, const Reference
< XVetoableChangeListener
>& aListener
) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
);
90 virtual Sequence
< Property
> SAL_CALL
getProperties() throw (RuntimeException
);
91 virtual Property SAL_CALL
getPropertyByName( const OUString
& aName
) throw (UnknownPropertyException
, RuntimeException
);
92 virtual sal_Bool SAL_CALL
hasPropertyByName( const OUString
& Name
) throw (RuntimeException
);
95 typedef ::std::map
< OUString
, Any
> PropertyNameMap
;
96 PropertyNameMap maPropMap
;
99 // ----------------------------------------------------------------------------
101 GenericPropertySet::GenericPropertySet()
105 GenericPropertySet::GenericPropertySet( const PropertyMap
& rPropMap
)
107 const PropertyList
& rPropNames
= StaticPropertyList::get();
108 for( PropertyMap::const_iterator aIt
= rPropMap
.begin(), aEnd
= rPropMap
.end(); aIt
!= aEnd
; ++aIt
)
109 maPropMap
[ rPropNames
[ aIt
->first
] ] = aIt
->second
;
112 Reference
< XPropertySetInfo
> SAL_CALL
GenericPropertySet::getPropertySetInfo() throw (RuntimeException
)
117 void SAL_CALL
GenericPropertySet::setPropertyValue( const OUString
& rPropertyName
, const Any
& rValue
) throw (UnknownPropertyException
, PropertyVetoException
, IllegalArgumentException
, WrappedTargetException
, RuntimeException
)
119 ::osl::MutexGuard
aGuard( *this );
120 maPropMap
[ rPropertyName
] = rValue
;
123 Any SAL_CALL
GenericPropertySet::getPropertyValue( const OUString
& rPropertyName
) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
)
125 PropertyNameMap::iterator aIt
= maPropMap
.find( rPropertyName
);
126 if( aIt
== maPropMap
.end() )
127 throw UnknownPropertyException();
131 // listeners are not supported by this implementation
132 void SAL_CALL
GenericPropertySet::addPropertyChangeListener( const OUString
& , const Reference
< XPropertyChangeListener
>& ) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
) {}
133 void SAL_CALL
GenericPropertySet::removePropertyChangeListener( const OUString
& , const Reference
< XPropertyChangeListener
>& ) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
) {}
134 void SAL_CALL
GenericPropertySet::addVetoableChangeListener( const OUString
& , const Reference
< XVetoableChangeListener
>& ) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
) {}
135 void SAL_CALL
GenericPropertySet::removeVetoableChangeListener( const OUString
& , const Reference
< XVetoableChangeListener
>& ) throw (UnknownPropertyException
, WrappedTargetException
, RuntimeException
) {}
138 Sequence
< Property
> SAL_CALL
GenericPropertySet::getProperties() throw (RuntimeException
)
140 Sequence
< Property
> aSeq( static_cast< sal_Int32
>( maPropMap
.size() ) );
141 Property
* pProperty
= aSeq
.getArray();
142 for( PropertyNameMap::iterator aIt
= maPropMap
.begin(), aEnd
= maPropMap
.end(); aIt
!= aEnd
; ++aIt
, ++pProperty
)
144 pProperty
->Name
= aIt
->first
;
145 pProperty
->Handle
= 0;
146 pProperty
->Type
= aIt
->second
.getValueType();
147 pProperty
->Attributes
= 0;
152 Property SAL_CALL
GenericPropertySet::getPropertyByName( const OUString
& rPropertyName
) throw (UnknownPropertyException
, RuntimeException
)
154 PropertyNameMap::iterator aIt
= maPropMap
.find( rPropertyName
);
155 if( aIt
== maPropMap
.end() )
156 throw UnknownPropertyException();
158 aProperty
.Name
= aIt
->first
;
159 aProperty
.Handle
= 0;
160 aProperty
.Type
= aIt
->second
.getValueType();
161 aProperty
.Attributes
= 0;
165 sal_Bool SAL_CALL
GenericPropertySet::hasPropertyByName( const OUString
& rPropertyName
) throw (RuntimeException
)
167 return maPropMap
.find( rPropertyName
) != maPropMap
.end();
172 // ============================================================================
174 PropertyMap::PropertyMap() :
175 mpPropNames( &StaticPropertyList::get() )
179 PropertyMap::~PropertyMap()
183 /*static*/ const OUString
& PropertyMap::getPropertyName( sal_Int32 nPropId
)
185 OSL_ENSURE( (0 <= nPropId
) && (nPropId
< PROP_COUNT
), "PropertyMap::getPropertyName - invalid property identifier" );
186 return StaticPropertyList::get()[ nPropId
];
189 const Any
* PropertyMap::getProperty( sal_Int32 nPropId
) const
191 const_iterator aIt
= find( nPropId
);
192 return (aIt
== end()) ? 0 : &aIt
->second
;
195 Sequence
< PropertyValue
> PropertyMap::makePropertyValueSequence() const
197 Sequence
< PropertyValue
> aSeq( static_cast< sal_Int32
>( size() ) );
200 PropertyValue
* pValues
= aSeq
.getArray();
201 for( const_iterator aIt
= begin(), aEnd
= end(); aIt
!= aEnd
; ++aIt
, ++pValues
)
203 OSL_ENSURE( (0 <= aIt
->first
) && (aIt
->first
< PROP_COUNT
), "PropertyMap::makePropertyValueSequence - invalid property identifier" );
204 pValues
->Name
= (*mpPropNames
)[ aIt
->first
];
205 pValues
->Value
= aIt
->second
;
206 pValues
->State
= ::com::sun::star::beans::PropertyState_DIRECT_VALUE
;
212 void PropertyMap::fillSequences( Sequence
< OUString
>& rNames
, Sequence
< Any
>& rValues
) const
214 rNames
.realloc( static_cast< sal_Int32
>( size() ) );
215 rValues
.realloc( static_cast< sal_Int32
>( size() ) );
218 OUString
* pNames
= rNames
.getArray();
219 Any
* pValues
= rValues
.getArray();
220 for( const_iterator aIt
= begin(), aEnd
= end(); aIt
!= aEnd
; ++aIt
, ++pNames
, ++pValues
)
222 OSL_ENSURE( (0 <= aIt
->first
) && (aIt
->first
< PROP_COUNT
), "PropertyMap::fillSequences - invalid property identifier" );
223 *pNames
= (*mpPropNames
)[ aIt
->first
];
224 *pValues
= aIt
->second
;
229 Reference
< XPropertySet
> PropertyMap::makePropertySet() const
231 return new GenericPropertySet( *this );
234 // ============================================================================