1ecfe53c5SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3ecfe53c5SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4ecfe53c5SAndrew Rist * or more contributor license agreements. See the NOTICE file 5ecfe53c5SAndrew Rist * distributed with this work for additional information 6ecfe53c5SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7ecfe53c5SAndrew Rist * to you under the Apache License, Version 2.0 (the 8ecfe53c5SAndrew Rist * "License"); you may not use this file except in compliance 9ecfe53c5SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11ecfe53c5SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13ecfe53c5SAndrew Rist * Unless required by applicable law or agreed to in writing, 14ecfe53c5SAndrew Rist * software distributed under the License is distributed on an 15ecfe53c5SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16ecfe53c5SAndrew Rist * KIND, either express or implied. See the License for the 17ecfe53c5SAndrew Rist * specific language governing permissions and limitations 18ecfe53c5SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20ecfe53c5SAndrew Rist *************************************************************/ 21ecfe53c5SAndrew Rist 22ecfe53c5SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifndef _MULTI_PROPERTY_SET_HANDLER_HXX 25cdf0e10cSrcweir #define _MULTI_PROPERTY_SET_HANDLER_HXX 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <rtl/ustring.hxx> 28cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 29cdf0e10cSrcweir #include <com/sun/star/beans/XMultiPropertySet.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir 32cdf0e10cSrcweir /** @descr MultiPropertySetHandler handles the two slightly different 33cdf0e10cSrcweir interfaces XPropertySet and XMultiPorpertySet for accessing 34cdf0e10cSrcweir properties of an object. 35cdf0e10cSrcweir 36cdf0e10cSrcweir It uses the classes PropertyWrapperBase and the template 37cdf0e10cSrcweir PropertyWrapper for a type safe access to single properties. 38cdf0e10cSrcweir 39cdf0e10cSrcweir The function class OUStringComparison is used by a STL map to 40cdf0e10cSrcweir sort the properties by names. 41cdf0e10cSrcweir */ 42cdf0e10cSrcweir 43cdf0e10cSrcweir /** @descr Base class for the templated property wrappers. 44cdf0e10cSrcweir Having a common base class allows to set a variable to the 45cdf0e10cSrcweir property's value without explicit knowledge of its type. 46cdf0e10cSrcweir */ 47cdf0e10cSrcweir class PropertyWrapperBase 48cdf0e10cSrcweir { 49cdf0e10cSrcweir public: 50cdf0e10cSrcweir /** @descr Create a class instance and store the given name. 51cdf0e10cSrcweir @param rName The name of the property. 52cdf0e10cSrcweir */ 53cdf0e10cSrcweir PropertyWrapperBase (const ::rtl::OUString & rName) 54cdf0e10cSrcweir : msName (rName) 55cdf0e10cSrcweir {} 56cdf0e10cSrcweir virtual ~PropertyWrapperBase() 57cdf0e10cSrcweir {} 58cdf0e10cSrcweir 59cdf0e10cSrcweir /** @descr Abstract interface of a method for setting a variables 60cdf0e10cSrcweir value to that of the property. 61cdf0e10cSrcweir */ 62cdf0e10cSrcweir virtual void SetValue (const ::com::sun::star::uno::Any & rValue) = 0; 63cdf0e10cSrcweir 64cdf0e10cSrcweir const ::rtl::OUString msName; 65cdf0e10cSrcweir }; 66cdf0e10cSrcweir 67cdf0e10cSrcweir 68cdf0e10cSrcweir 69cdf0e10cSrcweir 70cdf0e10cSrcweir /** @descr For every property type there will be one instantiation of this 71cdf0e10cSrcweir template class with its own and type specific version of SetValue. 72cdf0e10cSrcweir */ 73cdf0e10cSrcweir template<class T> class PropertyWrapper : public PropertyWrapperBase 74cdf0e10cSrcweir { 75cdf0e10cSrcweir public: 76cdf0e10cSrcweir /** @descr Create a wrapper for a property of type T. 77cdf0e10cSrcweir */ 78cdf0e10cSrcweir PropertyWrapper (const ::rtl::OUString & rName, T & rValue) 79cdf0e10cSrcweir : PropertyWrapperBase (rName), 80cdf0e10cSrcweir mrValue (rValue) 81cdf0e10cSrcweir {} 82cdf0e10cSrcweir 83cdf0e10cSrcweir /** descr Set the given value inside an Any to the variable referenced 84cdf0e10cSrcweir by the data member. 85cdf0e10cSrcweir */ 86cdf0e10cSrcweir virtual void SetValue (const ::com::sun::star::uno::Any & rValue) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir rValue >>= mrValue; 89cdf0e10cSrcweir } 90cdf0e10cSrcweir 91cdf0e10cSrcweir private: 92cdf0e10cSrcweir /// Reference to a variable. Its value can be modified by a call to SetValue. 93cdf0e10cSrcweir T & mrValue; 94cdf0e10cSrcweir }; 95cdf0e10cSrcweir 96cdf0e10cSrcweir 97cdf0e10cSrcweir 98cdf0e10cSrcweir 99cdf0e10cSrcweir /** @descr Function object for comparing two OUStrings. 100cdf0e10cSrcweir */ 101cdf0e10cSrcweir class OUStringComparison 102cdf0e10cSrcweir { 103cdf0e10cSrcweir public: 104cdf0e10cSrcweir /// Compare two strings. Returns true if the first is before the second. 105cdf0e10cSrcweir inline bool operator() (const ::rtl::OUString & a, const ::rtl::OUString & b) const 106cdf0e10cSrcweir { 107cdf0e10cSrcweir return (a.compareTo (b) < 0); 108cdf0e10cSrcweir } 109cdf0e10cSrcweir }; 110cdf0e10cSrcweir 111cdf0e10cSrcweir 112cdf0e10cSrcweir 113cdf0e10cSrcweir 114cdf0e10cSrcweir /** @descr This class lets you get the values from an object that either 115cdf0e10cSrcweir supports the interface XPropertySet or XMultiPropertySet. If it 116cdf0e10cSrcweir supports both interfaces then XMultiPropertySet is preferred. 117cdf0e10cSrcweir 118cdf0e10cSrcweir Using it works in three steps. 119cdf0e10cSrcweir 1. Create an instance and pass a reference to the object from which to 120cdf0e10cSrcweir get the property values. 121cdf0e10cSrcweir 2. Make all properties whose values you want to get known to the object 122cdf0e10cSrcweir by using the Add method. This creates instances of a template class 123cdf0e10cSrcweir that stores the properties name and a reference to the variable in 124cdf0e10cSrcweir which to store its value. 125cdf0e10cSrcweir 3. Finally call GetProperties to store the properties values into the 126cdf0e10cSrcweir variables specified in step 2. This uses either the XPropertySet or 127cdf0e10cSrcweir (preferred) the XMultiPropertySet interface. 128cdf0e10cSrcweir */ 129cdf0e10cSrcweir class MultiPropertySetHandler 130cdf0e10cSrcweir { 131cdf0e10cSrcweir public: 132cdf0e10cSrcweir /** @descr Create a handler of the property set of the given 133cdf0e10cSrcweir object. 134cdf0e10cSrcweir @param xObject A reference to any of the object's interfaces. 13586e1cf34SPedro Giffuni not necessarily XPropertySet or XMultiPropertySet. It 136cdf0e10cSrcweir is casted later to one of the two of them. 137cdf0e10cSrcweir */ 138cdf0e10cSrcweir MultiPropertySetHandler (::com::sun::star::uno::Reference< 139cdf0e10cSrcweir ::com::sun::star::uno::XInterface> xObject); 140cdf0e10cSrcweir ~MultiPropertySetHandler (void); 141*c47da6eaSmseidel /** @descr Add a property to handle. The type given implicitly by the 142cdf0e10cSrcweir reference to a variable is used to create an instance of 143cdf0e10cSrcweir the PropertyWrapper template class. 144cdf0e10cSrcweir @param sName Name of the property. 145cdf0e10cSrcweir @param rValue Reference to a variable whose value is set by the 146cdf0e10cSrcweir call to GetProperties to the property's value. 147cdf0e10cSrcweir */ 148cdf0e10cSrcweir template<class T> void Add (const ::rtl::OUString & sName, T& rValue) 149cdf0e10cSrcweir { 150cdf0e10cSrcweir aPropertyList[sName] = new PropertyWrapper<T> (sName, rValue); 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir /** @descr Try to get the values for all properties added with the Add 154cdf0e10cSrcweir method. If possible it uses the XMultiPropertySet. If that fails 155cdf0e10cSrcweir (i.e. for an UnknownPropertyExcption) or if the interface is not 156cdf0e10cSrcweir supported it uses the XPropertySet interface. 157cdf0e10cSrcweir @return If none of the two interfaces is supported or using them both 158cdf0e10cSrcweir fails then sal_False is returned. Else True is returned. 159cdf0e10cSrcweir */ 160cdf0e10cSrcweir inline sal_Bool GetProperties (void); 161cdf0e10cSrcweir 162cdf0e10cSrcweir private: 163cdf0e10cSrcweir /** @descr Try to use the XMultiPropertySet interface to get the property 164cdf0e10cSrcweir values. 165cdf0e10cSrcweir @param rNameList A precomputed and sorted sequence of OUStrings 166cdf0e10cSrcweir containing the properties names. 167cdf0e10cSrcweir @return True if values could be derived. 168cdf0e10cSrcweir */ 169cdf0e10cSrcweir inline sal_Bool MultiGet (const ::com::sun::star::uno::Sequence< 170cdf0e10cSrcweir ::rtl::OUString> & rNameList); 171cdf0e10cSrcweir 172cdf0e10cSrcweir /** @descr Try to use the XPropertySet interface to get the property 173cdf0e10cSrcweir values. 174cdf0e10cSrcweir @param rNameList A precomputed and sorted sequence of OUStrings 175cdf0e10cSrcweir containing the properties names. 176cdf0e10cSrcweir @return True if values could be derived. 177cdf0e10cSrcweir */ 178cdf0e10cSrcweir inline sal_Bool SingleGet (const ::com::sun::star::uno::Sequence< 179cdf0e10cSrcweir ::rtl::OUString> & rNameList); 180cdf0e10cSrcweir 181cdf0e10cSrcweir /** @descr STL map that maps from property names to polymorphic instances of 182cdf0e10cSrcweir PropertyWrapper. It uses OUStringComparison for sorting 183cdf0e10cSrcweir the property names. 184cdf0e10cSrcweir */ 185cdf0e10cSrcweir ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison> aPropertyList; 186cdf0e10cSrcweir 187cdf0e10cSrcweir /// The object from which to get the property values. 188cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> mxObject; 189cdf0e10cSrcweir }; 190cdf0e10cSrcweir 191cdf0e10cSrcweir 192cdf0e10cSrcweir 193cdf0e10cSrcweir //===== Inline implementation of the methods declared above ========================== 194cdf0e10cSrcweir 195cdf0e10cSrcweir MultiPropertySetHandler::MultiPropertySetHandler (::com::sun::star::uno::Reference< 196cdf0e10cSrcweir ::com::sun::star::uno::XInterface> xObject) 197cdf0e10cSrcweir : mxObject (xObject) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir } 200cdf0e10cSrcweir 201cdf0e10cSrcweir 202cdf0e10cSrcweir 203cdf0e10cSrcweir 204cdf0e10cSrcweir MultiPropertySetHandler::~MultiPropertySetHandler (void) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; 207cdf0e10cSrcweir for (I=aPropertyList.begin(); I!=aPropertyList.end(); I++) 208cdf0e10cSrcweir delete I->second; 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir 212cdf0e10cSrcweir /* 213cdf0e10cSrcweir template<class T> void MultiPropertySetHandler::Add (const ::rtl::OUString & sName, T& pValue) 214cdf0e10cSrcweir { 215cdf0e10cSrcweir aPropertyList[sName] = new PropertyWrapper<T> (sName, pValue); 216cdf0e10cSrcweir } 217cdf0e10cSrcweir */ 218cdf0e10cSrcweir 219cdf0e10cSrcweir 220cdf0e10cSrcweir 221cdf0e10cSrcweir sal_Bool MultiPropertySetHandler::GetProperties (void) 222cdf0e10cSrcweir { 223cdf0e10cSrcweir ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; 224cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::rtl::OUString> aNameList (aPropertyList.size()); 225cdf0e10cSrcweir int i; 226cdf0e10cSrcweir for (I=aPropertyList.begin(),i=0; I!=aPropertyList.end(); I++) 227cdf0e10cSrcweir aNameList[i++] = I->second->msName; 228cdf0e10cSrcweir if ( ! MultiGet(aNameList)) 229cdf0e10cSrcweir if ( ! SingleGet(aNameList)) 230cdf0e10cSrcweir return sal_False; 231cdf0e10cSrcweir return sal_True; 232cdf0e10cSrcweir } 233cdf0e10cSrcweir 234cdf0e10cSrcweir 235cdf0e10cSrcweir 236cdf0e10cSrcweir 237cdf0e10cSrcweir sal_Bool MultiPropertySetHandler::MultiGet (const ::com::sun::star::uno::Sequence< 238cdf0e10cSrcweir ::rtl::OUString> & rNameList) 239cdf0e10cSrcweir { 240cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XMultiPropertySet> xMultiSet ( 241cdf0e10cSrcweir mxObject, ::com::sun::star::uno::UNO_QUERY); 242cdf0e10cSrcweir if (xMultiSet.is()) 243cdf0e10cSrcweir try 244cdf0e10cSrcweir { 245cdf0e10cSrcweir ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; 246cdf0e10cSrcweir int i; 247cdf0e10cSrcweir ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any> aValueList = 248cdf0e10cSrcweir xMultiSet->getPropertyValues (rNameList); 249cdf0e10cSrcweir for (I=aPropertyList.begin(),i=0; I!=aPropertyList.end(); I++) 250cdf0e10cSrcweir I->second->SetValue (aValueList[i++]); 251cdf0e10cSrcweir } 252cdf0e10cSrcweir catch (::com::sun::star::beans::UnknownPropertyException e) 253cdf0e10cSrcweir { 254cdf0e10cSrcweir return sal_False; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir else 257cdf0e10cSrcweir return sal_False; 258cdf0e10cSrcweir 259cdf0e10cSrcweir return sal_True; 260cdf0e10cSrcweir } 261cdf0e10cSrcweir 262cdf0e10cSrcweir 263cdf0e10cSrcweir 264cdf0e10cSrcweir 265cdf0e10cSrcweir sal_Bool MultiPropertySetHandler::SingleGet (const ::com::sun::star::uno::Sequence< 266cdf0e10cSrcweir ::rtl::OUString> & rNameList) 267cdf0e10cSrcweir { 268cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet> xSingleSet ( 269cdf0e10cSrcweir mxObject, ::com::sun::star::uno::UNO_QUERY); 270cdf0e10cSrcweir if (xSingleSet.is()) 271cdf0e10cSrcweir try 272cdf0e10cSrcweir { 273cdf0e10cSrcweir ::std::map< ::rtl::OUString, PropertyWrapperBase*, OUStringComparison>::iterator I; 274cdf0e10cSrcweir int i; 275cdf0e10cSrcweir for (I=aPropertyList.begin(),i=0; I!=aPropertyList.end(); I++) 276cdf0e10cSrcweir I->second->SetValue (xSingleSet->getPropertyValue (rNameList[i++])); 277cdf0e10cSrcweir } 278cdf0e10cSrcweir catch (::com::sun::star::beans::UnknownPropertyException e) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir return sal_False; 281cdf0e10cSrcweir } 282cdf0e10cSrcweir else 283cdf0e10cSrcweir return sal_False; 284cdf0e10cSrcweir 285cdf0e10cSrcweir return sal_True; 286cdf0e10cSrcweir } 287cdf0e10cSrcweir 288cdf0e10cSrcweir 289cdf0e10cSrcweir #endif 290cdf0e10cSrcweir 291