1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef __FRAMEWORK_CLASSES_PROPERTYSETHELPER_HXX_ 25*b1cdbd2cSJim Jagielski #define __FRAMEWORK_CLASSES_PROPERTYSETHELPER_HXX_ 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 28*b1cdbd2cSJim Jagielski // my own includes 29*b1cdbd2cSJim Jagielski 30*b1cdbd2cSJim Jagielski #include <threadhelp/threadhelpbase.hxx> 31*b1cdbd2cSJim Jagielski #include <threadhelp/transactionbase.hxx> 32*b1cdbd2cSJim Jagielski #include <macros/debug.hxx> 33*b1cdbd2cSJim Jagielski #include <general.h> 34*b1cdbd2cSJim Jagielski #include <stdtypes.h> 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 37*b1cdbd2cSJim Jagielski // interface includes 38*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp> 39*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 40*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySetInfo.hpp> 41*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyExistException.hpp> 42*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/UnknownPropertyException.hpp> 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 45*b1cdbd2cSJim Jagielski // other includes 46*b1cdbd2cSJim Jagielski 47*b1cdbd2cSJim Jagielski #include <cppuhelper/weakref.hxx> 48*b1cdbd2cSJim Jagielski #include <fwidllapi.h> 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 51*b1cdbd2cSJim Jagielski // namespace 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski namespace framework{ 54*b1cdbd2cSJim Jagielski 55*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________ 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski /** supports the API XPropertySet and XPropertySetInfo. 58*b1cdbd2cSJim Jagielski * 59*b1cdbd2cSJim Jagielski * It must be used as baseclass. The internal list of supported 60*b1cdbd2cSJim Jagielski * properties can be changed everytimes so dynamic property set's 61*b1cdbd2cSJim Jagielski * can be implemented. 62*b1cdbd2cSJim Jagielski * 63*b1cdbd2cSJim Jagielski * Further the derived and this base class share the same lock. 64*b1cdbd2cSJim Jagielski * So it's possible to be threadsafe if it's needed. 65*b1cdbd2cSJim Jagielski */ 66*b1cdbd2cSJim Jagielski class FWI_DLLPUBLIC PropertySetHelper : public css::beans::XPropertySet 67*b1cdbd2cSJim Jagielski , public css::beans::XPropertySetInfo 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 70*b1cdbd2cSJim Jagielski /* types */ 71*b1cdbd2cSJim Jagielski protected: 72*b1cdbd2cSJim Jagielski 73*b1cdbd2cSJim Jagielski typedef BaseHash< css::beans::Property > TPropInfoHash; 74*b1cdbd2cSJim Jagielski 75*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 76*b1cdbd2cSJim Jagielski /* member */ 77*b1cdbd2cSJim Jagielski protected: 78*b1cdbd2cSJim Jagielski 79*b1cdbd2cSJim Jagielski css::uno::Reference< css::lang::XMultiServiceFactory > m_xSMGR; 80*b1cdbd2cSJim Jagielski 81*b1cdbd2cSJim Jagielski PropertySetHelper::TPropInfoHash m_lProps; 82*b1cdbd2cSJim Jagielski 83*b1cdbd2cSJim Jagielski ListenerHash m_lSimpleChangeListener; 84*b1cdbd2cSJim Jagielski ListenerHash m_lVetoChangeListener; 85*b1cdbd2cSJim Jagielski 86*b1cdbd2cSJim Jagielski sal_Bool m_bReleaseLockOnCall; 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski // hold it weak ... otherwhise this helper has to be "killed" explicitly .-) 89*b1cdbd2cSJim Jagielski css::uno::WeakReference< css::uno::XInterface > m_xBroadcaster; 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski LockHelper& m_rLock; 92*b1cdbd2cSJim Jagielski TransactionManager& m_rTransactionManager; 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 95*b1cdbd2cSJim Jagielski /* native interface */ 96*b1cdbd2cSJim Jagielski public: 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 99*b1cdbd2cSJim Jagielski /** initialize new instance of this helper. 100*b1cdbd2cSJim Jagielski * 101*b1cdbd2cSJim Jagielski * @param xSMGR 102*b1cdbd2cSJim Jagielski * points to an uno service manager, which is used internaly to create own 103*b1cdbd2cSJim Jagielski * needed uno services. 104*b1cdbd2cSJim Jagielski * 105*b1cdbd2cSJim Jagielski * @param pExternalLock 106*b1cdbd2cSJim Jagielski * this helper must be used as a baseclass ... 107*b1cdbd2cSJim Jagielski * but then it should synchronize its own calls 108*b1cdbd2cSJim Jagielski * with the same lock then it's superclass uses. 109*b1cdbd2cSJim Jagielski * 110*b1cdbd2cSJim Jagielski * @param pExternalTransactionManager 111*b1cdbd2cSJim Jagielski * this helper must be used as a baseclass ... 112*b1cdbd2cSJim Jagielski * but then it should synchronize its own calls 113*b1cdbd2cSJim Jagielski * with the same transaction manager then it's superclass. 114*b1cdbd2cSJim Jagielski * 115*b1cdbd2cSJim Jagielski * @param bReleaseLockOnCall 116*b1cdbd2cSJim Jagielski * see member m_bReleaseLockOnCall 117*b1cdbd2cSJim Jagielski */ 118*b1cdbd2cSJim Jagielski PropertySetHelper(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR , 119*b1cdbd2cSJim Jagielski LockHelper* pExternalLock , 120*b1cdbd2cSJim Jagielski TransactionManager* pExternalTransactionManager , 121*b1cdbd2cSJim Jagielski sal_Bool bReleaseLockOnCall ); 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 124*b1cdbd2cSJim Jagielski /** free all needed memory. 125*b1cdbd2cSJim Jagielski */ 126*b1cdbd2cSJim Jagielski virtual ~PropertySetHelper(); 127*b1cdbd2cSJim Jagielski 128*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 129*b1cdbd2cSJim Jagielski /** set a new owner for this helper. 130*b1cdbd2cSJim Jagielski * 131*b1cdbd2cSJim Jagielski * This owner is used as source for all broadcasted events. 132*b1cdbd2cSJim Jagielski * Further we hold it weak, because we dont wish to be disposed() .-) 133*b1cdbd2cSJim Jagielski */ 134*b1cdbd2cSJim Jagielski void impl_setPropertyChangeBroadcaster(const css::uno::Reference< css::uno::XInterface >& xBroadcaster); 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 137*b1cdbd2cSJim Jagielski /** add a new property info to the set of supported ones. 138*b1cdbd2cSJim Jagielski * 139*b1cdbd2cSJim Jagielski * @param aProperty 140*b1cdbd2cSJim Jagielski * describes the new property. 141*b1cdbd2cSJim Jagielski * 142*b1cdbd2cSJim Jagielski * @throw [com::sun::star::beans::PropertyExistException] 143*b1cdbd2cSJim Jagielski * if a property with the same name already exists. 144*b1cdbd2cSJim Jagielski * 145*b1cdbd2cSJim Jagielski * Note: The consistence of the whole set of properties is not checked here. 146*b1cdbd2cSJim Jagielski * Means e.g. ... a handle which exists more then once is not detected. 147*b1cdbd2cSJim Jagielski * The owner of this class has to be sure, that every new property does 148*b1cdbd2cSJim Jagielski * not clash with any existing one. 149*b1cdbd2cSJim Jagielski */ 150*b1cdbd2cSJim Jagielski virtual void SAL_CALL impl_addPropertyInfo(const css::beans::Property& aProperty) 151*b1cdbd2cSJim Jagielski throw(css::beans::PropertyExistException, 152*b1cdbd2cSJim Jagielski css::uno::Exception ); 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 155*b1cdbd2cSJim Jagielski /** remove an existing property info from the set of supported ones. 156*b1cdbd2cSJim Jagielski * 157*b1cdbd2cSJim Jagielski * @param sProperty 158*b1cdbd2cSJim Jagielski * the name of the property. 159*b1cdbd2cSJim Jagielski * 160*b1cdbd2cSJim Jagielski * @throw [com::sun::star::beans::UnknownPropertyException] 161*b1cdbd2cSJim Jagielski * if no property with the specified name exists. 162*b1cdbd2cSJim Jagielski */ 163*b1cdbd2cSJim Jagielski virtual void SAL_CALL impl_removePropertyInfo(const ::rtl::OUString& sProperty) 164*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 165*b1cdbd2cSJim Jagielski css::uno::Exception ); 166*b1cdbd2cSJim Jagielski 167*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 168*b1cdbd2cSJim Jagielski /** mark the object as "useable for working" or "dead". 169*b1cdbd2cSJim Jagielski * 170*b1cdbd2cSJim Jagielski * This correspond to the lifetime handling implemented by the base class TransactionBase. 171*b1cdbd2cSJim Jagielski * There is no chance to reactive a "dead" object by calling impl_enablePropertySet() 172*b1cdbd2cSJim Jagielski * again! 173*b1cdbd2cSJim Jagielski */ 174*b1cdbd2cSJim Jagielski virtual void SAL_CALL impl_enablePropertySet(); 175*b1cdbd2cSJim Jagielski virtual void SAL_CALL impl_disablePropertySet(); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------- 178*b1cdbd2cSJim Jagielski /** 179*b1cdbd2cSJim Jagielski */ 180*b1cdbd2cSJim Jagielski virtual void SAL_CALL impl_setPropertyValue(const ::rtl::OUString& sProperty, 181*b1cdbd2cSJim Jagielski sal_Int32 nHandle , 182*b1cdbd2cSJim Jagielski const css::uno::Any& aValue ) = 0; 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski virtual css::uno::Any SAL_CALL impl_getPropertyValue(const ::rtl::OUString& sProperty, 185*b1cdbd2cSJim Jagielski sal_Int32 nHandle ) = 0; 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 188*b1cdbd2cSJim Jagielski /* uno interface */ 189*b1cdbd2cSJim Jagielski public: 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski // XPropertySet 192*b1cdbd2cSJim Jagielski virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() 193*b1cdbd2cSJim Jagielski throw(css::uno::RuntimeException); 194*b1cdbd2cSJim Jagielski 195*b1cdbd2cSJim Jagielski virtual void SAL_CALL setPropertyValue(const ::rtl::OUString& sProperty, 196*b1cdbd2cSJim Jagielski const css::uno::Any& aValue ) 197*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 198*b1cdbd2cSJim Jagielski css::beans::PropertyVetoException , 199*b1cdbd2cSJim Jagielski css::lang::IllegalArgumentException , 200*b1cdbd2cSJim Jagielski css::lang::WrappedTargetException , 201*b1cdbd2cSJim Jagielski css::uno::RuntimeException ); 202*b1cdbd2cSJim Jagielski 203*b1cdbd2cSJim Jagielski virtual css::uno::Any SAL_CALL getPropertyValue(const ::rtl::OUString& sProperty) 204*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 205*b1cdbd2cSJim Jagielski css::lang::WrappedTargetException , 206*b1cdbd2cSJim Jagielski css::uno::RuntimeException ); 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski virtual void SAL_CALL addPropertyChangeListener(const ::rtl::OUString& sProperty, 209*b1cdbd2cSJim Jagielski const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) 210*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 211*b1cdbd2cSJim Jagielski css::lang::WrappedTargetException , 212*b1cdbd2cSJim Jagielski css::uno::RuntimeException ); 213*b1cdbd2cSJim Jagielski 214*b1cdbd2cSJim Jagielski virtual void SAL_CALL removePropertyChangeListener(const ::rtl::OUString& sProperty, 215*b1cdbd2cSJim Jagielski const css::uno::Reference< css::beans::XPropertyChangeListener >& xListener) 216*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 217*b1cdbd2cSJim Jagielski css::lang::WrappedTargetException , 218*b1cdbd2cSJim Jagielski css::uno::RuntimeException ); 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski virtual void SAL_CALL addVetoableChangeListener(const ::rtl::OUString& sProperty, 221*b1cdbd2cSJim Jagielski const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) 222*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 223*b1cdbd2cSJim Jagielski css::lang::WrappedTargetException , 224*b1cdbd2cSJim Jagielski css::uno::RuntimeException ); 225*b1cdbd2cSJim Jagielski 226*b1cdbd2cSJim Jagielski virtual void SAL_CALL removeVetoableChangeListener(const ::rtl::OUString& sProperty, 227*b1cdbd2cSJim Jagielski const css::uno::Reference< css::beans::XVetoableChangeListener >& xListener) 228*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 229*b1cdbd2cSJim Jagielski css::lang::WrappedTargetException , 230*b1cdbd2cSJim Jagielski css::uno::RuntimeException ); 231*b1cdbd2cSJim Jagielski 232*b1cdbd2cSJim Jagielski // XPropertySetInfo 233*b1cdbd2cSJim Jagielski virtual css::uno::Sequence< css::beans::Property > SAL_CALL getProperties() 234*b1cdbd2cSJim Jagielski throw(css::uno::RuntimeException); 235*b1cdbd2cSJim Jagielski 236*b1cdbd2cSJim Jagielski virtual css::beans::Property SAL_CALL getPropertyByName(const ::rtl::OUString& sName) 237*b1cdbd2cSJim Jagielski throw(css::beans::UnknownPropertyException, 238*b1cdbd2cSJim Jagielski css::uno::RuntimeException ); 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasPropertyByName(const ::rtl::OUString& sName) 241*b1cdbd2cSJim Jagielski throw(css::uno::RuntimeException); 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------- 244*b1cdbd2cSJim Jagielski /* internal helper */ 245*b1cdbd2cSJim Jagielski private: 246*b1cdbd2cSJim Jagielski 247*b1cdbd2cSJim Jagielski sal_Bool impl_existsVeto(const css::beans::PropertyChangeEvent& aEvent); 248*b1cdbd2cSJim Jagielski 249*b1cdbd2cSJim Jagielski void impl_notifyChangeListener(const css::beans::PropertyChangeEvent& aEvent); 250*b1cdbd2cSJim Jagielski }; 251*b1cdbd2cSJim Jagielski 252*b1cdbd2cSJim Jagielski } // namespace framework 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski #endif // #ifndef __FRAMEWORK_CLASSES_PROPERTYSETHELPER_HXX_ 255